diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseDoubleCallInfo.java b/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseDoubleCallInfo.java new file mode 100644 index 00000000..1d310820 --- /dev/null +++ b/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseDoubleCallInfo.java @@ -0,0 +1,102 @@ +package com.baiye.model.entity; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.Column; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import java.util.Date; + +/** + * @author wujingtao + * @date 2022/01/11 + */ +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +@Data +public class BaseDoubleCallInfo { + @Column(name = "request_id") + @ApiModelProperty(value = "请求的唯一id") + private String requestId; + @Column(name = "clue_id") + @ApiModelProperty(value = "线索id") + private String clueId; + @Column(name = "member_id") + @ApiModelProperty(value = "所属人id") + private Long memberId; + @LastModifiedDate + @Column(name = "create_time") + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @Column(name = "direction") + @ApiModelProperty(value = "通话的呼叫方向") + private Integer direction; + + @Column(name = "sp_id") + @ApiModelProperty(value = "客户的云服务账号") + private String spId; + + @Column(name = "app_key") + @ApiModelProperty(value = "隐私保护通话应用的 app_key") + private String appKey; + + @Column(name = "icid") + @ApiModelProperty(value = "呼叫记录的唯一标识") + private String icid; + + @Column(name = "bind_num") + @ApiModelProperty(value = "隐私保护号码") + private String bindNum; + + @Column(name = "caller_num") + @ApiModelProperty(value = "主叫号码") + private String callerNum; + + @Column(name = "callee_num") + @ApiModelProperty(value = "被叫号码") + private String calleeNum; + + @Column(name = "fwd_display_num") + @ApiModelProperty(value = "转接呼叫时的显示号") + private String fwdDisplayNum; + + @Column(name = "fwd_dst_num") + @ApiModelProperty(value = "转接呼叫时的转接号码") + private String fwdDstNum; + + @Column(name = "fwd_start_time") + @ApiModelProperty(value = "被叫呼叫操作的开始时间") + private String fwdStartTime; + + @Column(name = "call_end_time") + @ApiModelProperty(value = "呼叫结束时间") + private String callEndTime; + + @Column(name = "call_out_start_time") + @ApiModelProperty(value = "主叫呼叫开始时间") + private String callOutStartTime; + + @Column(name = "call_out_answer_time") + @ApiModelProperty(value = "主叫呼叫应答时间") + private String callOutAnswerTime; + + @Column(name = "duration") + @ApiModelProperty(value = "通话时长") + private Integer duration; + + @Column(name = "record_flag") + @ApiModelProperty(value = "该字段用于录音标识 0:未有 1:有") + private Integer recordFlag; + + @Column(name = "record_file_download_url") + @ApiModelProperty(value = "录音下载地址") + private String recordFileDownloadUrl; + + @Column(name = "binding_id") + @ApiModelProperty(value = "绑定 id,同绑定请求中的 bindingId") + private String bindingId; +} diff --git a/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseTimeTask.java b/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseTimeTask.java index 9efab55d..fda438b4 100644 --- a/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseTimeTask.java +++ b/ad-platform-pojo/src/main/java/com/baiye/model/entity/BaseTimeTask.java @@ -25,14 +25,17 @@ public class BaseTimeTask { private Date executeTime; @ApiModelProperty(value = "是否重复执行 0-否 1-是") @Column(name = "is_repeat") - private Integer isRepeat; + private Integer isRepeat = 1; @ApiModelProperty(value = "执行状态(针对一次性的任务) 0-未执行,1-完成") @Column(name = "status") - private Integer status; + private Integer status = 0; @ApiModelProperty(value = "执行内容") @Column(name = "message") private String message; @ApiModelProperty(value = "执行人") @Column(name = "user_id") private Long userId; + @ApiModelProperty(value = "消息id") + @Column(name = "message_id") + private Long messageId; } diff --git a/manage/ad-platform-management/pom.xml b/manage/ad-platform-management/pom.xml index e010a8c9..e1e46956 100644 --- a/manage/ad-platform-management/pom.xml +++ b/manage/ad-platform-management/pom.xml @@ -112,7 +112,28 @@ com.spring4all swagger-spring-boot-starter - + + + com.alibaba + easyexcel + 2.2.7 + + + + + + + + + + + + + + + + + diff --git a/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClient.java b/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClient.java index 42dcdbe0..7d9c1e39 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClient.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClient.java @@ -3,6 +3,7 @@ package com.baiye.feign; import com.baiye.model.dto.ClueQueryCriteria; import com.baiye.model.dto.DistributeResponseDTO; import com.baiye.model.dto.OrganizeQueryCriteria; +import com.baiye.modules.system.service.dto.ClueMiddleTo; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.ResponseEntity; @@ -44,6 +45,14 @@ public interface SourceClueClient { @ApiOperation("查询组员ID") @PostMapping(API_PREFIX + "/findMemberIdList") - ResponseEntity> findMemberIdList(OrganizeQueryCriteria organizeQueryCriteria); + ResponseEntity> findMemberIdList(@RequestBody ClueMiddleTo clueMiddleTo); + + @ApiOperation("查询组员资源总数") + @GetMapping("/source/clue/queryMemberNum") + ResponseEntity queryMemberNum(@RequestParam("memberId") Long memberId); + + @ApiOperation("根据小组id统计小组资源数") + @GetMapping("/source/clue/count") + ResponseEntity countClueByGroupId(@RequestParam("groupId") Long groupId); } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClientFallback.java b/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClientFallback.java index 35b83a51..901b3344 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClientFallback.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/feign/SourceClueClientFallback.java @@ -2,11 +2,14 @@ package com.baiye.feign; import com.baiye.model.dto.ClueQueryCriteria; import com.baiye.model.dto.DistributeResponseDTO; +import com.baiye.model.dto.OrganizeQueryCriteria; +import com.baiye.modules.system.service.dto.ClueMiddleTo; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; +import java.util.Set; @Component public class SourceClueClientFallback implements SourceClueClient { @@ -36,4 +39,19 @@ public class SourceClueClientFallback implements SourceClueClient { } + @Override + public ResponseEntity> findMemberIdList(ClueMiddleTo clueMiddleTo) { + return null; + } + + @Override + public ResponseEntity queryMemberNum(Long memberId) { + return null; + } + + @Override + public ResponseEntity countClueByGroupId(Long groupId) { + return null; + } + } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/api/ReportController.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/api/ReportController.java new file mode 100644 index 00000000..fa5a2d3a --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/api/ReportController.java @@ -0,0 +1,121 @@ +package com.baiye.modules.report.api; + + +import cn.hutool.json.JSONUtil; +import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.ExcelWriter; + +import com.baiye.http.CommonResponse; +import com.baiye.modules.report.entity.dto.StatisticalReportDTO; +import com.baiye.modules.report.entity.dto.UploadTaskDTO; +import com.baiye.modules.report.service.ReportService; +import com.baiye.util.ExportExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + + +/** + * @author wjt + * @date 2021/12/14 + */ +@RestController +@RequestMapping("/api") +@Slf4j +@Api(tags = "获取统计信息") +public class ReportController { + @Resource + private ReportService reportService; + + @GetMapping("/report/all") + @ApiOperation("按任务分组的统计信息") + public CommonResponse getReportByAll() { + return reportService.getReportByAll(); + } + + @PostMapping("/report/task") + @ApiOperation("按任务的统计信息") + public CommonResponse getReportByTask(@RequestBody StatisticalReportDTO s) { + return reportService.getReportByTask(s); + } + + @GetMapping("/download/task") + @ApiOperation("导出任务统计信息") + public void downloadTaskReport(HttpServletResponse response, String s) { + StatisticalReportDTO statisticalReportDTO = JSONUtil.toBean(s, StatisticalReportDTO.class); + reportService.downloadTaskReport(response, statisticalReportDTO); + } + +// @GetMapping("/download/task") +// @ApiOperation("hutool导出测试") +// public void downloadTaskReport(HttpServletResponse response) { +// UploadTask uploadTaskDTO = new UploadTask(); +// uploadTaskDTO.setCreateTime("2020"); +// uploadTaskDTO.setTaskName("ww"); +// uploadTaskDTO.setUsrNum(1); +// UploadTask uploadTaskDTO1 = new UploadTask(); +// uploadTaskDTO1.setCreateTime("2022"); +// uploadTaskDTO1.setTaskName("wwww"); +// uploadTaskDTO1.setUsrNum(2); +// List list = new ArrayList<>(); +// list.add(uploadTaskDTO1); +// list.add(uploadTaskDTO); +// +// try { +// ExcelWriter excelWriter = ExcelUtil.getWriter(true); +// excelWriter.write(list); +// response.reset(); +// response.setContentType("application/vnd.ms-excel"); +// response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("test.xlsx", "UTF-8")); +// excelWriter.flush(response.getOutputStream()); +// excelWriter.close(); +// } catch (Exception e) { +// log.error("{}", e.getMessage()); +// } +// } +// +// @Data +// class UploadTask { +// private String createTime; +// private String taskName; +// private Integer usrNum; +// } +// +// @PostMapping("/report/organize") +// @ApiOperation("按组的统计信息") +// public CommonResponse getReportByOrganize(@RequestBody StatisticalReportDTO s) { +// return reportService.getReportByOrganize(s); +// } + + @PostMapping("/download/organize") + @ApiOperation("导出组成员统计信息") + public void downloadOrganizeReport(@RequestBody StatisticalReportDTO s) { + HttpServletResponse response = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getResponse(); + reportService.downloadOrganizeReport(response, s); + } + + @GetMapping("/report/member") + @ApiOperation("获取单个成员统计信息") + public CommonResponse getMemberReport(String beginTime, String endTime, Long memberId) { + return reportService.getMemberReport(beginTime, endTime, memberId); + } + + @GetMapping("/download/member") + @ApiOperation("导出单个成员统计信息") + public void downloadMemberReport(HttpServletResponse response, String beginTime, String endTime, Long memberId) { + reportService.downloadMemberReport(response, beginTime, endTime, memberId); + } +} diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/dao/ReportDayRepository.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/dao/ReportDayRepository.java new file mode 100644 index 00000000..747c310b --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/dao/ReportDayRepository.java @@ -0,0 +1,34 @@ +package com.baiye.modules.report.dao; + +import com.baiye.modules.report.entity.ReportTask; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @author wjt + * @date 2021/12/13 + */ +@Repository +public interface ReportDayRepository extends JpaRepository, JpaSpecificationExecutor { + /** + * 通过任务id 查询所有的日报 + * + * @param taskId + * @return + */ + List findAllByTaskId(Long taskId); + + /** + * 通过条件查询记录 + * @param beginTime + * @param endTime + * @param ids + * @return + */ + @Query(value = "select * from tb_report_task d where (d.create_time between ?1 and ?2) and (coalesce (?3,null) is null or d.task_id in (?3))", nativeQuery = true) + List selectAllByCondition(String beginTime, String endTime, List ids); +} diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/dao/ReportOrganizeRepository.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/dao/ReportOrganizeRepository.java new file mode 100644 index 00000000..5fab35c8 --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/dao/ReportOrganizeRepository.java @@ -0,0 +1,27 @@ +package com.baiye.modules.report.dao; + +import com.baiye.modules.report.entity.ReportOrganize; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @author wujingtao + * @date 2022/01/11 + */ +@Repository +public interface ReportOrganizeRepository extends JpaRepository, JpaSpecificationExecutor { + /** + * 通过条件查询记录 + * + * @param beginTime + * @param endTime + * @param ids + * @return + */ + @Query(value = "select * from tb_report_organize d where (d.create_time between ?1 and ?2) and (coalesce (?3,null) is null or d.organize_id in (?3))", nativeQuery = true) + List selectAllByCondition(String beginTime, String endTime, List ids); +} diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/ReportOrganize.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/ReportOrganize.java new file mode 100644 index 00000000..5055935e --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/ReportOrganize.java @@ -0,0 +1,39 @@ +package com.baiye.modules.report.entity; + +import cn.hutool.core.date.DatePattern; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +/** + * @author wujingtao + * @date 2022/01/11 + */ +@Data +@Entity +@Table(name = "tb_report_organize") +@EntityListeners(AuditingEntityListener.class) +public class ReportOrganize implements Serializable { + + private static final long serialVersionUID = 9034474268733855182L; + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String organizeName; + private Long organizeId; + private Integer turnOnNum; + private Double turnOnRate; + private Double usrRate; + private Integer totalNum; + private Integer usrNum; + @CreatedDate + @Column(name = "create_time") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATE_PATTERN, timezone = "GMT+8") + private Date createTime; +} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/ReportDay.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/ReportTask.java similarity index 72% rename from manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/ReportDay.java rename to manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/ReportTask.java index 17cb19fe..28019c1b 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/ReportDay.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/ReportTask.java @@ -1,5 +1,7 @@ package com.baiye.modules.report.entity; +import cn.hutool.core.date.DatePattern; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -14,24 +16,24 @@ import java.util.Date; */ @Data @Entity -@Table(name = "tb_report_day") +@Table(name = "tb_report_task") @EntityListeners(AuditingEntityListener.class) -public class ReportDay implements Serializable { +public class ReportTask implements Serializable { private static final long serialVersionUID = 4019826389911404260L; @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String taskName; - private Long memberId; private Long taskId; private Integer turnOnNum; private Double turnOnRate; private Double usrRate; + private Integer usrNum; private Integer totalNum; @CreatedDate @Column(name = "create_time") - + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATE_PATTERN, timezone = "GMT+8") private Date createTime; } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/dto/StatisticalReportDTO.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/dto/StatisticalReportDTO.java new file mode 100644 index 00000000..28900713 --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/dto/StatisticalReportDTO.java @@ -0,0 +1,27 @@ +package com.baiye.modules.report.entity.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author wujingtao + * @date 2022/01/10 + */ +@Data +public class StatisticalReportDTO { + /** + * 开始时间 + */ + private String beginTime; + /** + * 结束时间 + */ + private String endTime; + /** + * 时间精确度(小时 =1、天=2、月=3) + */ + private Integer type; + + private List ids; +} diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/dto/UploadTaskDTO.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/dto/UploadTaskDTO.java new file mode 100644 index 00000000..6fc7d028 --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/dto/UploadTaskDTO.java @@ -0,0 +1,54 @@ +package com.baiye.modules.report.entity.dto; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * @author wujingtao + * @date 2022/01/14 + */ +@Data +public class UploadTaskDTO { + /** + * 平均时长 + */ + @ExcelProperty(value = "日期", index = 0) + private String createTime; + +// @ExcelIgnore + private Long taskId; + + @ExcelProperty(value = "任务名称", index = 1) + private String taskName; + /** + * 外呼数 + */ + @ExcelProperty(value = "外呼数量", index = 2) + private Integer usrNum; + /** + * 接通数 + */ + @ExcelProperty(value = "外呼接通量", index = 3) + private Integer turnOnNum; + /** + * 接通率 + */ + @ExcelProperty(value = "外呼接通率", index = 4) + private Double turnOnRate; + + /** + * 外呼总时长 + */ + @ExcelProperty(value = "外呼总时长", index = 5) + private Integer breatheTotalDuration; + + /** + * 平均时长 + */ + @ExcelProperty(value = "平均通话时长", index = 6) + private Double breatheAverageDuration; + + @ExcelProperty(value = "标签", index = 7) + private String label; +} diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/MemberInfoVO.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/MemberInfoVO.java new file mode 100644 index 00000000..dc208179 --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/MemberInfoVO.java @@ -0,0 +1,70 @@ +package com.baiye.modules.report.entity.vo; + +//import com.alibaba.excel.annotation.ExcelIgnore; +//import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author wjt + * @date 2021/12/09 + */ +@Data +@EqualsAndHashCode +public class MemberInfoVO { + + /** + * 成员id + */ + @ExcelIgnore + private Long memberId; + /** + * 成员名称 + */ + @ExcelProperty(value = "姓名", index = 2) + private String memberName; + /** + * 小组id + */ + @ExcelIgnore + private Long organizeId; + /** + * 小组名 + */ + @ExcelProperty(value = "小组", index = 1) + private String organizeName; + /** + * 接通数 + */ + @ExcelProperty(value = "外呼接通量", index = 4) + private Integer turnOnNum; + /** + * 接通率 + */ + @ExcelProperty(value = "外呼接通率", index = 5) + private Double turnOnRate; + /** + * 外呼数 + */ + @ExcelProperty(value = "外呼数量", index = 3) + private Integer usrNum; + /** + * 外呼总时长 + */ + @ExcelProperty(value = "外呼总时长", index = 6) + private Integer breatheTotalDuration; + + /** + * 平均时长 + */ + @ExcelProperty(value = "平均通话时长", index = 7) + private Double breatheAverageDuration; + + /** + * 平均时长 + */ + @ExcelProperty(value = "日期", index = 0) + private String createTime; +} diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/OrganizeInfosVO.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/OrganizeInfosVO.java new file mode 100644 index 00000000..fc229116 --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/OrganizeInfosVO.java @@ -0,0 +1,19 @@ +package com.baiye.modules.report.entity.vo; + +import com.baiye.modules.report.entity.ReportOrganize; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author wujingtao + * @date 2022/01/11 + */ +@Data +public class OrganizeInfosVO implements Serializable { + private static final long serialVersionUID = 133887339450743290L; + private Long organizationId; + private String organizationName; + private List data; +} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/vo/TaskInfosVO.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/TaskInfosVO.java similarity index 80% rename from manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/vo/TaskInfosVO.java rename to manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/TaskInfosVO.java index c595d2be..ee40647b 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/vo/TaskInfosVO.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/entity/vo/TaskInfosVO.java @@ -1,6 +1,6 @@ package com.baiye.modules.report.entity.vo; -import com.baiye.modules.report.entity.ReportDay; +import com.baiye.modules.report.entity.ReportTask; import lombok.Data; import java.io.Serializable; @@ -15,5 +15,5 @@ public class TaskInfosVO implements Serializable { private static final long serialVersionUID = 1546722887341864964L; private Long taskId; private String taskName; - private List data; + private List data; } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/ReportService.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/ReportService.java new file mode 100644 index 00000000..9added2a --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/ReportService.java @@ -0,0 +1,74 @@ +package com.baiye.modules.report.service; + +import com.baiye.http.CommonResponse; +import com.baiye.modules.report.entity.dto.StatisticalReportDTO; + +import javax.servlet.http.HttpServletResponse; + +/** + * @author wjt + * @date 2021/12/10 + */ +public interface ReportService { + + /** + * 所有资源 + * + * @return + */ + CommonResponse getReportByAll(); + + + /** + * 按条件获取任务统计信息 + * + * @param s + * @return + */ + CommonResponse getReportByTask(StatisticalReportDTO s); + + /** + * 导出任务文件 + * + * @param response + * @param s + */ + void downloadTaskReport(HttpServletResponse response, StatisticalReportDTO s); + + /** + * 管理员按小组统计 + * + * @param s + * @return + */ + CommonResponse getReportByOrganize(StatisticalReportDTO s); + + /** + * 导出小组文件 + * + * @param response + * @param s + */ + void downloadOrganizeReport(HttpServletResponse response, StatisticalReportDTO s); + + /** + * 获取成员接通信息 + * + * @param beginTime + * @param endTime + * @param memberId + * @return + */ + CommonResponse getMemberReport(String beginTime, String endTime, Long memberId); + + /** + * 导出成员统计 + * + * @param response + * @param beginTime + * @param endTime + * @param memberId + * @return + */ + void downloadMemberReport(HttpServletResponse response, String beginTime, String endTime, Long memberId); +} diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/impl/ReportServiceImpl.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/impl/ReportServiceImpl.java new file mode 100644 index 00000000..b1d8f42a --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/report/service/impl/ReportServiceImpl.java @@ -0,0 +1,531 @@ +package com.baiye.modules.report.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.http.CommonResponse; +import com.baiye.model.enums.CallStatusEnum; +import com.baiye.modules.report.entity.dto.StatisticalReportDTO; +import com.baiye.modules.report.entity.dto.UploadTaskDTO; +import com.baiye.modules.report.entity.vo.MemberInfoVO; +import com.baiye.modules.report.service.ReportService; +import com.baiye.modules.system.domain.Organize; +import com.baiye.modules.system.domain.Task; +import com.baiye.modules.system.domain.User; +import com.baiye.modules.system.repository.OrganizeRepository; +import com.baiye.modules.system.repository.TaskRepository; +import com.baiye.modules.system.repository.UserRepository; +import com.baiye.modules.telemarkting.dao.CallClueRepository; +import com.baiye.modules.telemarkting.dao.DoubleCallRepository; +import com.baiye.modules.telemarkting.entity.CallClueInfo; +import com.baiye.modules.telemarkting.entity.DoubleCallInfo; +import com.baiye.util.DateTimeUtil; +import com.baiye.util.ExportExcelUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author wjt + * @date 2021/12/10 + */ +@Service +@Slf4j +public class ReportServiceImpl implements ReportService { + @Resource + private CallClueRepository callClueRepository; + @Resource + private DoubleCallRepository doubleCallRepository; + @Resource + private TaskRepository taskRepository; + @Resource + private OrganizeRepository organizeRepository; + @Resource + private UserRepository userRepository; + + @Override + public CommonResponse getReportByAll() { + List all = callClueRepository.selectByDay(DateTimeUtil.getBeginTimeByDay(DateUtil.today()), DateTimeUtil.getEndTimeByDay(DateUtil.today())); + if (CollUtil.isEmpty(all)) { + return CommonResponse.createByErrorMessage("没有呼叫记录"); + } + MemberInfoVO messageInfo = getMessageInfo(DateTimeUtil.getBeginTimeByDay(DateUtil.today()), DateTimeUtil.getEndTimeByDay(DateUtil.today()), all); + return CommonResponse.createBySuccess(messageInfo); + } + + @Override + public CommonResponse getReportByTask(StatisticalReportDTO s) { + StatisticalReportDTO dto = getStatisticalReportDTO(s); + List callClueInfos = getCallClueInfos(dto.getBeginTime(), dto.getEndTime(), dto.getType(), dto.getIds()); + if (callClueInfos == null) { + return CommonResponse.createByErrorMessage("请检查时间类型是否错误"); + } + //以任务分组 + List> mapByTask = getMapByTask(dto, getGroupTask(dto.getIds(), callClueInfos)); + return CommonResponse.createBySuccess(mapByTask); + } + + @Override + public void downloadTaskReport(HttpServletResponse response, StatisticalReportDTO s) { + StatisticalReportDTO dto = getStatisticalReportDTO(s); + List callClueInfos = getCallClueInfos(dto.getBeginTime(), dto.getEndTime(), dto.getType(), dto.getIds()); + List mapByTaskUpload = getMapByTaskUpload(dto, getGroupTask(dto.getIds(), callClueInfos)); + ExportExcelUtil.downloadEasyExcel(response, UploadTaskDTO.class, mapByTaskUpload); + } + + @Override + public CommonResponse getReportByOrganize(StatisticalReportDTO s) { + String beginTime = s.getBeginTime(); + String endTime = s.getEndTime(); + + if (StrUtil.isBlank(beginTime) || StrUtil.isBlank(endTime)) { + beginTime = DateTimeUtil.getBeginTimeByDay(DateUtil.today()); + endTime = DateTimeUtil.getEndTimeByDay(DateUtil.today()); + } else { + beginTime = DateTimeUtil.getBeginTimeByDay(beginTime); + endTime = DateTimeUtil.getEndTimeByDay(endTime); + } + //按时间和组id查询拨打线索记录 + List callClueInfos = callClueRepository.selectAllByTimeAndTeamId(beginTime, endTime, s.getIds()); + + Map> map = new HashMap<>(16); + callClueInfos.stream().collect(Collectors.groupingBy(CallClueInfo::getTeamId, Collectors.toList())).forEach(map::put); + List memberInfoVos = new ArrayList<>(); + for (long key : map.keySet()) { + List list = map.get(key); + String organizationName = null; + if (CollUtil.isNotEmpty(list)) { + Long organizeId = list.get(0).getTeamId(); + Organize organizeById = organizeRepository.findOrganizeById(organizeId); + if (ObjectUtil.isNotNull(organizeById)) { + organizationName = organizeById.getOrganizeName(); + } + } + MemberInfoVO messageInfo = getMessageInfo(beginTime, endTime, list); + messageInfo.setOrganizeName(organizationName); + memberInfoVos.add(messageInfo); + } + return CommonResponse.createBySuccess(memberInfoVos); + } + + @Override + public void downloadOrganizeReport(HttpServletResponse response, StatisticalReportDTO s) { + String beginTime = s.getBeginTime(); + String endTime = s.getEndTime(); + + if (StrUtil.isBlank(beginTime) || StrUtil.isBlank(endTime)) { + beginTime = DateTimeUtil.getBeginTimeByDay(DateUtil.today()); + endTime = DateTimeUtil.getEndTimeByDay(DateUtil.today()); + } else { + beginTime = DateTimeUtil.getBeginTimeByDay(beginTime); + endTime = DateTimeUtil.getEndTimeByDay(endTime); + } + //按时间和组id查询拨打线索记录 + List callClueInfos = callClueRepository.selectAllByTimeAndTeamId(beginTime, endTime, s.getIds()); + + //按人分组 + Map> mapByMember = new HashMap<>(16); + callClueInfos.stream().collect(Collectors.groupingBy(CallClueInfo::getMemberId, Collectors.toList())).forEach(mapByMember::put); + + List memberInfoVos = new ArrayList<>(); + for (long key : mapByMember.keySet()) { + //每个人的数据 + List list = mapByMember.get(key); + + User userById = userRepository.findUserById(key); + String userName = null; + if (ObjectUtil.isNotNull(userById)) { + userName = userById.getUsername(); + } + String organizationName = null; + if (CollUtil.isNotEmpty(list)) { + Long organizeId = list.get(0).getTeamId(); + Organize organizeById = organizeRepository.findOrganizeById(organizeId); + if (ObjectUtil.isNotNull(organizeById)) { + organizationName = organizeById.getOrganizeName(); + } + } + MemberInfoVO messageInfo = getMessageInfo(beginTime, endTime, list); + messageInfo.setOrganizeName(organizationName); + messageInfo.setMemberName(userName); + messageInfo.setCreateTime(beginTime + "至" + endTime); + memberInfoVos.add(messageInfo); + } + HashMap> mapByTeam = new HashMap<>(8); + memberInfoVos.stream().collect(Collectors.groupingBy(MemberInfoVO::getOrganizeName, Collectors.toList())).forEach(mapByTeam::put); + ExportExcelUtil.exportPackByDate(response, mapByTeam, "小组统计"); + + } + + @Override + public CommonResponse getMemberReport(String beginTime, String endTime, Long memberId) { + String begin; + String end; + if (StrUtil.isBlank(beginTime) || StrUtil.isBlank(endTime)) { + begin = DateTimeUtil.getBeginTimeByDay(DateUtil.today()); + end = DateTimeUtil.getEndTimeByDay(DateUtil.today()); + } else { + begin = DateTimeUtil.getBeginTimeByDay(beginTime); + end = DateTimeUtil.getEndTimeByDay(endTime); + } + if (memberId == null) { + log.error("成员id为空"); + return CommonResponse.createByErrorMessage("成员id为空"); + } + List callClueInfos = callClueRepository.selectAllByTimeAndMemberId(begin, end, memberId); + + MemberInfoVO messageInfo = getMessageInfo(begin, end, callClueInfos); + messageInfo.setMemberId(memberId); + return CommonResponse.createBySuccess(messageInfo); + } + + @Override + public void downloadMemberReport(HttpServletResponse response, String beginTime, String endTime, Long memberId) { + String begin; + String end; + if (StrUtil.isBlank(beginTime) || StrUtil.isBlank(endTime)) { + begin = DateTimeUtil.getBeginTimeByDay(DateUtil.today()); + end = DateTimeUtil.getEndTimeByDay(DateUtil.today()); + } else { + begin = DateTimeUtil.getBeginTimeByDay(beginTime); + end = DateTimeUtil.getEndTimeByDay(endTime); + } + if (memberId == null) { + log.error("成员id为空"); + return; + } + List callClueInfos = callClueRepository.selectAllByTimeAndMemberId(begin, end, memberId); + if (CollUtil.isEmpty(callClueInfos)) { + return; + } + User userById = userRepository.findUserById(memberId); + String userName = null; + if (ObjectUtil.isNotNull(userById)) { + userName = userById.getUsername(); + } + String organizationName = null; + Long organizeId = callClueInfos.get(0).getTeamId(); + Organize organizeById = organizeRepository.findOrganizeById(organizeId); + if (ObjectUtil.isNotNull(organizeById)) { + organizationName = organizeById.getOrganizeName(); + } + + //按时间分组 + HashMap> clues = getGroupByTime(begin, end, callClueInfos, 2); + List list = new ArrayList<>(); + for (String key : clues.keySet()) { + List clueInfos = clues.get(key); + if (CollUtil.isEmpty(clueInfos)) { + continue; + } + MemberInfoVO messageInfo = getMessageInfo(begin, end, clueInfos); + messageInfo.setMemberName(userName); + messageInfo.setOrganizeName(organizationName); + messageInfo.setCreateTime(key); + list.add(messageInfo); + } + ExportExcelUtil.downloadEasyExcel(response, MemberInfoVO.class, list); + } + + /** + * 对传入得条件进行处理 + * + * @param s + * @return + */ + private StatisticalReportDTO getStatisticalReportDTO(StatisticalReportDTO s) { + List ids = s.getIds(); + if (CollUtil.isEmpty(ids)) { + ids = new ArrayList<>(); + getTaskId(ids); + s.setIds(ids); + } + String beginTime = s.getBeginTime(); + String endTime = s.getEndTime(); + Integer type = s.getType(); + if (StrUtil.isBlank(beginTime) && StrUtil.isBlank(endTime)) { + endTime = DateUtil.today(); + beginTime = DateUtil.format(DateUtil.offsetDay(DateUtil.date(), -7), "yyyy-MM-dd"); + type = 2; + s.setBeginTime(beginTime); + s.setEndTime(endTime); + s.setType(type); + } + return s; + } + + /** + * 按时间范围 查询所有满足的呼叫记录 + * + * @param beginTime + * @param endTime + * @param type + * @param ids + * @return + */ + private List getCallClueInfos(String beginTime, String endTime, Integer type, List ids) { + List callClueInfos = new ArrayList<>(); + String begin; + String end; + switch (type) { + case 2: + begin = DateTimeUtil.getBeginTimeByDay(beginTime); + end = DateTimeUtil.getEndTimeByDay(endTime); + callClueInfos = callClueRepository.selectAllByTimeAndTaskId(begin, end, ids); + break; + case 3: + int monthEnd = DateUtil.parse(endTime).month(); + int monthBegin = DateUtil.parse(beginTime).month(); + if (monthEnd - monthBegin > 1) { + log.error("---------接受参数类型为月。时间范围超出2个月 "); + return null; + } + begin = DateTimeUtil.getBeginTimeByMonth(beginTime); + end = DateTimeUtil.getEndTimeByMonth(endTime); + callClueInfos = callClueRepository.selectAllByTimeAndTaskId(begin, end, ids); + break; + case 1: + int betweenHour = (int) DateUtil.between(DateUtil.parse(beginTime), DateUtil.parse(endTime), DateUnit.HOUR); + if (betweenHour > 48) { + log.error("---------接受参数类型为小时。时间范围超出48小时 "); + return null; + } + begin = DateTimeUtil.getBeginTimeByHour(beginTime); + end = DateTimeUtil.getEndTimeByHour(endTime); + callClueInfos = callClueRepository.selectAllByTimeAndTaskId(begin, end, ids); + break; + default: + break; + } + return callClueInfos; + } + + /** + * 以任务id为key分组 + * + * @param ids + * @param callClueInfos + * @return + */ + private HashMap> getGroupTask(List ids, List callClueInfos) { + HashMap> map = new HashMap<>(); + for (long id : ids) { + List collect = callClueInfos.stream().filter(c -> c.getTaskId() != null && c.getTaskId() == id).collect(Collectors.toList()); + if (CollUtil.isEmpty(collect)) { + map.put(id, new ArrayList<>()); + } else { + map.put(id, collect); + } + } + return map; + } + + /** + * 统计日期时间范围内,以时间为key分组 + * + * @param beginTime + * @param endTime + * @param callClueInfos + * @param type + * @return + */ + private HashMap> getGroupByTime(String beginTime, String endTime, List callClueInfos, Integer type) { + Date begin = DateUtil.parse(beginTime); + Date end = DateUtil.parse(endTime); + HashMap> map = new HashMap<>(); + switch (type) { + case 2: + int betweenDay = (int) DateUtil.between(begin, end, DateUnit.DAY); + for (int i = 1; i <= betweenDay; i++) { + Date dateTime = DateUtil.offsetDay(begin, i); + List collect = callClueInfos.stream().filter(c -> DateTimeUtil.betweenByDay(dateTime, c.getCreateTime())).collect(Collectors.toList()); + map.put(DateTimeUtil.getTimeType(dateTime, type), collect); + } + break; + case 3: + List collect = callClueInfos.stream().filter(c -> DateTimeUtil.betweenByMonth(c.getCreateTime(), begin)).collect(Collectors.toList()); + List collect1 = callClueInfos.stream().filter(c -> DateTimeUtil.betweenByMonth(c.getCreateTime(), end)).collect(Collectors.toList()); + map.put(DateTimeUtil.getTimeType(begin, type), collect); + map.put(DateTimeUtil.getTimeType(end, type), collect1); + break; + case 1: + int betweenHour = (int) DateUtil.between(begin, end, DateUnit.HOUR); + for (int i = 1; i <= betweenHour; i++) { + Date dateTime = DateUtil.offsetHour(begin, i); + List collectByHour = callClueInfos.stream().filter(c -> + DateTimeUtil.betweenByHour(dateTime, c.getCreateTime()) + ).collect(Collectors.toList()); + map.put(DateTimeUtil.getTimeType(dateTime, type), collectByHour); + } + break; + default: + return map; + } + return map; + } + + /** + * 当参数为空,默认查询5条taskid + * + * @param ids + */ + private void getTaskId(List ids) { + List allByIsAndIsDistribution = taskRepository.findAllByIsAndIsDistributionAndId(DefaultNumberConstants.ONE_NUMBER, ids); + if (CollUtil.isNotEmpty(allByIsAndIsDistribution)) { + int flag = 0; + for (int i = allByIsAndIsDistribution.size() - 1; i >= 0; i--) { + if (flag == 5) { + break; + } + flag += 1; + ids.add(allByIsAndIsDistribution.get(i).getId()); + } + } + } + + /** + * 按task统计 使用率 + * + * @param s + * @param mapByTask + * @return + */ + private List> getMapByTask(StatisticalReportDTO s, Map> mapByTask) { + List> listMap = new ArrayList<>(); + List tasks = taskRepository.findAllByIsAndIsDistributionAndId(DefaultNumberConstants.ONE_NUMBER, s.getIds()); + //按id分组 + Map taskInfos = new HashMap<>(8); + for (Task info : tasks) { + taskInfos.put(info.getId(), info); + } + + for (Long key : mapByTask.keySet()) { + HashMap mapVo = new HashMap(); + //按时间分 + HashMap> mapByTime = getGroupByTime(s.getBeginTime(), s.getEndTime(), mapByTask.get(key), s.getType()); + int total = taskInfos.get(key).getTotalNumber(); + String taskName = taskInfos.get(key).getTaskName(); + + double usrRate = 0; + ArrayList list = new ArrayList(); + for (String keyId : mapByTime.keySet()) { + Map mapByUsrRate = new HashMap<>(); + //使用数 + long count = mapByTime.get(keyId).stream().filter(c -> c.getStatus() != 0).count(); + if (total != 0) { + //使用率 + usrRate = NumberUtil.div(count, total, 2); + } + mapByUsrRate.put("usrRate", usrRate); + mapByUsrRate.put("createTime", keyId); + list.add(mapByUsrRate); + } + list.sort(new Comparator>() { + @Override + public int compare(Map o1, Map o2) { + String time1 = (String) o1.get("createTime"); + String time2 = (String) o2.get("createTime"); + return time1.compareTo(time2); + } + }); + mapVo.put("taskName", taskName); + mapVo.put("data", list); + listMap.add(mapVo); + } + return listMap; + } + + /** + * 按task统计呼叫信息,生成报表 + * + * @param s + * @param mapByTask + * @return + */ + private List getMapByTaskUpload(StatisticalReportDTO s, Map> mapByTask) { + List list = new ArrayList<>(); + List tasks = taskRepository.findAllByIsAndIsDistributionAndId(DefaultNumberConstants.ONE_NUMBER, s.getIds()); + //按id分组 + Map taskInfos = new HashMap<>(8); + for (Task info : tasks) { + taskInfos.put(info.getId(), info); + } + for (Long key : mapByTask.keySet()) { + Task task = taskInfos.get(key); + String taskName = task.getTaskName(); + List baseLabel = task.getBaseLabel(); + StringBuilder label = new StringBuilder(); + if (baseLabel.size() > 0) { + for (int i = 0; i < baseLabel.size(); i++) { + if (i == baseLabel.size() - 1) { + label.append(baseLabel.get(i)); + } else { + label.append(baseLabel.get(i)).append(","); + } + } + } + + List clueInfos = mapByTask.get(key); + if (CollUtil.isEmpty(clueInfos)) { + continue; + } + MemberInfoVO messageInfo = getMessageInfo(s.getBeginTime(), s.getEndTime(), clueInfos); + UploadTaskDTO upload = new UploadTaskDTO(); + BeanUtil.copyProperties(messageInfo, upload); + upload.setTaskName(taskName); + upload.setLabel(label.toString()); + upload.setCreateTime(s.getBeginTime() + "至" + s.getEndTime()); + list.add(upload); + } + return list; + } + + /** + * 计算时间范围内 的统计信息 + * + * @param callClueInfos + * @return + */ + private MemberInfoVO getMessageInfo(String begin, String end, List callClueInfos) { + int usrNum = 0; + int turnOnNum = 0; + double turnOnRate = 0.00; + int breatheTotalDuration = 0; + double breatheAverageDuration = 0; + if (CollUtil.isNotEmpty(callClueInfos)) { + for (CallClueInfo info : callClueInfos) { + if (info.getStatus() != 0) { + usrNum++; + if (info.getStatus() == CallStatusEnum.ANSWER.getValue()) { + turnOnNum++; + } + } + long clueId = info.getClueId(); + List doubleCallInfo = doubleCallRepository.selectAllByTimeAndClueId(begin, end, clueId); + int doubleClueTime = doubleCallInfo.stream().mapToInt(DoubleCallInfo::getDuration).sum(); + breatheTotalDuration += doubleClueTime; + } + breatheAverageDuration = NumberUtil.div(breatheTotalDuration, callClueInfos.size(), 2); + } + if (usrNum != 0) { + //接通率=接通数/使用数 + turnOnRate = NumberUtil.div(turnOnNum, usrNum, 2); + } + MemberInfoVO memberInfoVO = new MemberInfoVO(); + memberInfoVO.setTurnOnNum(turnOnNum); + memberInfoVO.setTurnOnRate(turnOnRate); + memberInfoVO.setUsrNum(usrNum); + memberInfoVO.setBreatheAverageDuration(breatheAverageDuration); + memberInfoVO.setBreatheTotalDuration(breatheTotalDuration); + return memberInfoVO; + } +} diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/security/config/SpringSecurityConfig.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/security/config/SpringSecurityConfig.java index f0e443ed..7c7d1924 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/security/config/SpringSecurityConfig.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/security/config/SpringSecurityConfig.java @@ -130,6 +130,8 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers( "/api/users/admin").permitAll() .antMatchers( "/api/task/query").permitAll() .antMatchers( "/api/organize/queryAll").permitAll() + .antMatchers( "/api/report/organize").permitAll() + .antMatchers( "/api/download/task").permitAll() // 自定义匿名访问所有url放行:允许匿名和带Token访问,细腻化到每个 Request 类型 // GET .antMatchers(HttpMethod.GET, anonymousUrls.get(RequestMethodEnum.GET.getType()).toArray(new String[0])).permitAll() diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/repository/OrganizeRepository.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/repository/OrganizeRepository.java index 4e287f29..ac1e8fd1 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/repository/OrganizeRepository.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/repository/OrganizeRepository.java @@ -20,4 +20,7 @@ public interface OrganizeRepository extends JpaRepository, JpaSp */ @Query(value = "select * from tb_organize where organize_id = (select organize_id from tb_organize_user where user_id = ?1)", nativeQuery = true) Organize findOrganize(Long currentUserId); + + @Query(value = "select t from Organize t where t.id =?1") + Organize findOrganizeById(Long id); } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/repository/TaskRepository.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/repository/TaskRepository.java index 8356e9fd..4c380b08 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/repository/TaskRepository.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/repository/TaskRepository.java @@ -10,13 +10,23 @@ import org.springframework.stereotype.Repository; import java.util.List; /** -* @author YQY -* @date 2021-12-10 -*/ + * @author YQY + * @date 2021-12-10 + */ @Repository public interface TaskRepository extends JpaRepository, JpaSpecificationExecutor { @Modifying - @Query(value = "update tb_task set is_distribution = ?1 where id = ?2",nativeQuery = true) - void updateIsDistribution(int isDistribution,Long taskId); + @Query(value = "update tb_task set is_distribution = ?1 where id = ?2", nativeQuery = true) + void updateIsDistribution(int isDistribution, Long taskId); + + /** + * 查询所有分配到任务 + * + * @param isDistribution + * @param ids + * @return + */ + @Query(value = "select * from tb_task t where t.is_distribution = ?1 and (coalesce (?2,null) is null or t.task_id in (?2))", nativeQuery = true) + List findAllByIsAndIsDistributionAndId(Integer isDistribution, List ids); } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/repository/UserRepository.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/repository/UserRepository.java index 396ed55f..3991c18e 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/repository/UserRepository.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/repository/UserRepository.java @@ -39,6 +39,15 @@ public interface UserRepository extends JpaRepository, JpaSpecificat */ User findByUsername(String username); + /** + * 根据id查询 + * + * @param id + * @return + */ + @Query(value = "select u from User u where u.id = ?1") + User findUserById(Long id); + /** * 根据邮箱查询 * @@ -154,6 +163,7 @@ public interface UserRepository extends JpaRepository, JpaSpecificat /** * 查询用户id + * * @param aTrue * @return */ @@ -162,6 +172,7 @@ public interface UserRepository extends JpaRepository, JpaSpecificat /** * 管理员id查询所有组 + * * @param managerId managerId * @return */ diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/rest/OrganizeController.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/rest/OrganizeController.java index 86f4ced5..437b0daf 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/rest/OrganizeController.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/rest/OrganizeController.java @@ -141,4 +141,9 @@ public class OrganizeController { return new ResponseEntity<>(organizeService.getLabel(taskId, organizeId), HttpStatus.OK); } + @ApiOperation("查询所有的组和组线索数量") + @GetMapping("/selectAll") + public ResponseEntity selectAllOrganize() { + return new ResponseEntity<>(organizeService.selectAllOrganize(), HttpStatus.OK); + } } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/OrganizeService.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/OrganizeService.java index 67218477..e6623c8a 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/OrganizeService.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/OrganizeService.java @@ -136,4 +136,10 @@ public interface OrganizeService { * @return */ Map> getLabel(Long taskId, Long organizeId); + + /** + * 查询所有组 + * @return + */ + List selectAllOrganize(); } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/dto/ClueMiddleTo.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/dto/ClueMiddleTo.java new file mode 100644 index 00000000..6fc7d9f2 --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/dto/ClueMiddleTo.java @@ -0,0 +1,15 @@ +package com.baiye.modules.system.service.dto; + +import lombok.Data; + +/** + * @author wujingtao + * @date 2022/01/18 + */ +@Data +public class ClueMiddleTo { + + private Long organizeId; + + private Long taskId; +} diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/OrganizeServiceImpl.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/OrganizeServiceImpl.java index 9eed0fcd..e9b37d62 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/OrganizeServiceImpl.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/OrganizeServiceImpl.java @@ -315,9 +315,12 @@ public class OrganizeServiceImpl implements OrganizeService { @Override public TaskOrganize queryDetails(OrganizeQueryCriteria organizeQueryCriteria) { TaskOrganize updateTaskOrganize = taskOrganizeRepository.findByOrganizeIdAndTaskId(organizeQueryCriteria.getOrganizeId(), organizeQueryCriteria.getTaskId()); - Set memberIdList = sourceClueClient.findMemberIdList(organizeQueryCriteria).getBody(); + ClueMiddleTo clueMiddleTo = new ClueMiddleTo(); + clueMiddleTo.setOrganizeId(organizeQueryCriteria.getOrganizeId()); + clueMiddleTo.setTaskId(organizeQueryCriteria.getTaskId()); + Set memberIdList = sourceClueClient.findMemberIdList(clueMiddleTo).getBody(); List memberIds = new ArrayList<>(memberIdList); - List> list = findUser(memberIds, null); + List> list = findUser(memberIds, new OrganizeUserQueryCriteria()); updateTaskOrganize.setUserList(list); return updateTaskOrganize; } @@ -471,6 +474,11 @@ public class OrganizeServiceImpl implements OrganizeService { return map; } + @Override + public List selectAllOrganize() { + return organizeRepository.findAll(); + } + /** * 小组id查询组员用户信息 */ diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/api/DoubleCallController.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/api/DoubleCallController.java index ad94dc28..787d07a5 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/api/DoubleCallController.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/api/DoubleCallController.java @@ -11,6 +11,7 @@ import com.baiye.modules.telemarkting.service.DoubleCallService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -30,7 +31,7 @@ public class DoubleCallController { @PostMapping("/double/req") @ApiOperation("请求接入双呼") - public CommonResponse doubleCallReq(@RequestBody DoubleCallReqDTO doubleCallReq) { + public CommonResponse doubleCallReq(@Validated @RequestBody DoubleCallReqDTO doubleCallReq) { if (ObjectUtil.isEmpty(doubleCallReq)) { return CommonResponse.createByError(); } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/dao/CallClueRepository.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/dao/CallClueRepository.java index 5fdccf1f..59e6d0b2 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/dao/CallClueRepository.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/dao/CallClueRepository.java @@ -30,4 +30,48 @@ public interface CallClueRepository extends JpaRepository, J */ @Query("select d from CallClueInfo d where d.memberId=?1 ") List selectByMember(Long memberId); + + /** + * 按时间查询线索记录 + * + * @param beginTime + * @param endTime + * @return + */ + @Query(value = "select * from tb_call_clue d where (d.create_time between ?1 and ?2)", nativeQuery = true) + List selectByDay(String beginTime, String endTime); + + + /** + * 通过条件查询记录 + * + * @param beginTime + * @param endTime + * @param id + * @return + */ + @Query(value = "select * from tb_call_clue d where (d.create_time between ?1 and ?2) and d.member_id = ?3", nativeQuery = true) + List selectAllByTimeAndMemberId(String beginTime, String endTime, Long id); + + /** + * 通过时间和组id查询记录 + * + * @param beginTime + * @param endTime + * @param id + * @return + */ + @Query(value = "select * from tb_call_clue d where (d.create_time between ?1 and ?2) and (coalesce (?3,null) is null or d.team_id in (?3))", nativeQuery = true) + List selectAllByTimeAndTeamId(String beginTime, String endTime, List id); + + /** + * 通过时间和任务id查询记录 + * + * @param beginTime + * @param endTime + * @param id + * @return + */ + @Query(value = "select * from tb_call_clue d where (d.create_time between ?1 and ?2) and (coalesce (?3,null) is null or d.task_id in (?3))", nativeQuery = true) + List selectAllByTimeAndTaskId(String beginTime, String endTime, List id); } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/dao/DoubleCallRepository.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/dao/DoubleCallRepository.java index 2f126c76..a2fe4a77 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/dao/DoubleCallRepository.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/dao/DoubleCallRepository.java @@ -30,4 +30,15 @@ public interface DoubleCallRepository extends JpaRepository selectByMemberAndStatus(Long memberId); + + /** + * 通过条件查询记录 + * + * @param beginTime + * @param endTime + * @param id + * @return + */ + @Query(value = "select * from tb_double_call d where (d.create_time between ?1 and ?2) and d.clue_id = ?3", nativeQuery = true) + List selectAllByTimeAndClueId(String beginTime, String endTime, Long id); } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/entity/CallClueInfo.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/entity/CallClueInfo.java index 0804318a..2ec4c281 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/entity/CallClueInfo.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/entity/CallClueInfo.java @@ -3,6 +3,7 @@ package com.baiye.modules.telemarkting.entity; import cn.hutool.core.date.DatePattern; import com.baiye.model.entity.BaseCallClueInfo; import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -26,8 +27,12 @@ public class CallClueInfo extends BaseCallClueInfo implements Serializable { @Id @Column(name = "clue_id") private Long clueId; + @LastModifiedDate @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN, timezone = "GMT+8") @Column(name = "create_time") private Date createTime; + @Transient + @ApiModelProperty(value = "通话总时长") + private Integer breatheTotalDuration; } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/entity/DoubleCallInfo.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/entity/DoubleCallInfo.java index 1939fbce..2d376ccb 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/entity/DoubleCallInfo.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/entity/DoubleCallInfo.java @@ -1,5 +1,6 @@ package com.baiye.modules.telemarkting.entity; +import com.baiye.model.entity.BaseDoubleCallInfo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.data.annotation.LastModifiedDate; @@ -17,91 +18,11 @@ import java.util.Date; @Entity @Table(name = "tb_double_call") @EntityListeners(AuditingEntityListener.class) -public class DoubleCallInfo implements Serializable { +public class DoubleCallInfo extends BaseDoubleCallInfo implements Serializable { private static final long serialVersionUID = -1452118686043669994L; @Id @Column(name = "id") @ApiModelProperty(value = "id,双呼请求/回调的sessionId") private String id; - @Column(name = "request_id") - @ApiModelProperty(value = "请求的唯一id") - private String requestId; - @Column(name = "clue_id") - @ApiModelProperty(value = "线索id") - private String clueId; - @Column(name = "member_id") - @ApiModelProperty(value = "所属人id") - private Long memberId; - @LastModifiedDate - @Column(name = "create_time") - @ApiModelProperty(value = "创建时间") - private Date createTime; - @Column(name = "direction") - @ApiModelProperty(value = "通话的呼叫方向") - private Integer direction; - - @Column(name = "sp_id") - @ApiModelProperty(value = "客户的云服务账号") - private String spId; - - @Column(name = "app_key") - @ApiModelProperty(value = "隐私保护通话应用的 app_key") - private String appKey; - - @Column(name = "icid") - @ApiModelProperty(value = "呼叫记录的唯一标识") - private String icid; - - @Column(name = "bind_num") - @ApiModelProperty(value = "隐私保护号码") - private String bindNum; - - @Column(name = "caller_num") - @ApiModelProperty(value = "主叫号码") - private String callerNum; - - @Column(name = "callee_num") - @ApiModelProperty(value = "被叫号码") - private String calleeNum; - - @Column(name = "fwd_display_num") - @ApiModelProperty(value = "转接呼叫时的显示号") - private String fwdDisplayNum; - - @Column(name = "fwd_dst_num") - @ApiModelProperty(value = "转接呼叫时的转接号码") - private String fwdDstNum; - - @Column(name = "fwd_start_time") - @ApiModelProperty(value = "被叫呼叫操作的开始时间") - private String fwdStartTime; - - @Column(name = "call_end_time") - @ApiModelProperty(value = "呼叫结束时间") - private String callEndTime; - - @Column(name = "call_out_start_time") - @ApiModelProperty(value = "主叫呼叫开始时间") - private String callOutStartTime; - - @Column(name = "call_out_answer_time") - @ApiModelProperty(value = "主叫呼叫应答时间") - private String callOutAnswerTime; - - @Column(name = "duration") - @ApiModelProperty(value = "通话时长") - private Integer duration; - - @Column(name = "record_flag") - @ApiModelProperty(value = "该字段用于录音标识 0:未有 1:有") - private Integer recordFlag; - - @Column(name = "record_file_download_url") - @ApiModelProperty(value = "录音下载地址") - private String recordFileDownloadUrl; - - @Column(name = "binding_id") - @ApiModelProperty(value = "绑定 id,同绑定请求中的 bindingId") - private String bindingId; } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/entity/dto/DoubleCallReqDTO.java b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/entity/dto/DoubleCallReqDTO.java index 1902334f..e98dec87 100644 --- a/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/entity/dto/DoubleCallReqDTO.java +++ b/manage/ad-platform-management/src/main/java/com/baiye/modules/telemarkting/entity/dto/DoubleCallReqDTO.java @@ -1,8 +1,11 @@ package com.baiye.modules.telemarkting.entity.dto; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import lombok.NonNull; +import javax.validation.constraints.NotNull; import java.io.Serializable; /** @@ -14,20 +17,30 @@ import java.io.Serializable; public class DoubleCallReqDTO implements Serializable { private static final long serialVersionUID = 8037829549747968861L; - /** - * 真实主叫 - */ + + @ApiModelProperty("真实主叫号码") + @NotNull private String telA; - /** - * 真实被叫 - */ + + @ApiModelProperty("真实被叫号码") + @NotNull private String telB; + private String requestId; - /** - * 线索id - */ + + @ApiModelProperty("具体线索id") + @NotNull private String userData; + + @ApiModelProperty("小组id") + @NotNull private Long teamId; + + @ApiModelProperty("成员id") + @NotNull private Long memberId; + + @ApiModelProperty("主任务id") + @NotNull private Long taskId; } diff --git a/manage/ad-platform-management/src/main/java/com/baiye/util/DateTimeUtil.java b/manage/ad-platform-management/src/main/java/com/baiye/util/DateTimeUtil.java new file mode 100644 index 00000000..3d190570 --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/util/DateTimeUtil.java @@ -0,0 +1,114 @@ +package com.baiye.util; + +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; + +import java.util.Date; + +/** + * @author wujingtao + * @date 2022/01/13 + */ +public class DateTimeUtil { + + /** + * 获取当天开始时间 + * + * @param beginTime + * @return + */ + public static String getBeginTimeByDay(String beginTime) { + return DateUtil.format(DateUtil.beginOfDay(DateUtil.parse(beginTime)), "yyyy-MM-dd HH:mm:dd"); + } + + public static String getEndTimeByDay(String endTime) { + return DateUtil.format(DateUtil.endOfDay(DateUtil.parse(endTime)), "yyyy-MM-dd HH:mm:dd"); + } + + public static String getBeginTimeByMonth(String beginTime) { + return DateUtil.format(DateUtil.beginOfMonth(DateUtil.parse(beginTime)), "yyyy-MM-dd HH:mm:dd"); + } + + public static String getEndTimeByMonth(String endTime) { + return DateUtil.format(DateUtil.endOfMonth(DateUtil.parse(endTime)), "yyyy-MM-dd HH:mm:dd"); + } + + public static String getBeginTimeByHour(String beginTime) { + return DateUtil.format(DateUtil.beginOfHour(DateUtil.parse(beginTime)), "yyyy-MM-dd HH:mm:dd"); + } + + public static String getEndTimeByHour(String endTime) { + return DateUtil.format(DateUtil.endOfHour(DateUtil.parse(endTime)), "yyyy-MM-dd HH:mm:dd"); + } + + public static String getTimeType(Date dateTime, Integer timeType) { + if (timeType == 2) { + return DateUtil.format(dateTime, "yyyy-MM-dd"); + } else if (timeType == 3) { + return DateUtil.format(dateTime, "yyyy-MM"); + } else { + return DateUtil.format(dateTime, "yyyy-MM-dd HH"); + } + + + } + + /** + * 比较两个日期是否同年同月同一天 + * + * @return + */ + public static Boolean betweenByDay(Date begin, Date end) { + begin = DateUtil.parse(DateUtil.format(begin, "yyyy-MM-dd")); + end = DateUtil.parse(DateUtil.format(end, "yyyy-MM-dd")); + long between = DateUtil.between(begin, end, DateUnit.DAY); + if (between == 0) { + return true; + } + return false; + } + + /** + * 比较两个日期是否同一年同一月 + * + * @param begin + * @param end + * @return + */ + public static Boolean betweenByMonth(Date begin, Date end) { + int beginYear = DateUtil.year(begin); + int endYear = DateUtil.year(end); + int beginMonth = DateUtil.month(begin); + int endMonth = DateUtil.month(end); + if (beginYear == endYear) { + if (beginMonth == endMonth) { + return true; + } + } + return false; + } + + /** + * 比较两个日期是否同年同月同一天 + * + * @return + */ + public static Boolean betweenByHour(Date begin, Date end) { + if (betweenByDay(begin, end)) { + int hour1 = DateUtil.hour(begin, true); + int hour2 = DateUtil.hour(end, true); + if (hour1 == hour2) { + return true; + } + } + return false; + } + + public static void main(String[] args) { + Date begin = DateUtil.beginOfDay(DateUtil.parse("2022-01-06 12:04:59")); + Date end = DateUtil.endOfDay(DateUtil.parse("2022-1-5")); + long between = DateUtil.between(begin, end, DateUnit.DAY); + System.out.println(between); + + } +} diff --git a/manage/ad-platform-management/src/main/java/com/baiye/util/ExportExcelUtil.java b/manage/ad-platform-management/src/main/java/com/baiye/util/ExportExcelUtil.java new file mode 100644 index 00000000..c14acfa7 --- /dev/null +++ b/manage/ad-platform-management/src/main/java/com/baiye/util/ExportExcelUtil.java @@ -0,0 +1,85 @@ +package com.baiye.util; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.metadata.style.WriteFont; +import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; +import com.baiye.modules.report.entity.dto.UploadTaskDTO; +import com.baiye.modules.report.entity.vo.MemberInfoVO; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream; + +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.util.List; +import java.util.Map; + +@Slf4j +public class ExportExcelUtil { + /** + * 导出excel + */ + @SneakyThrows + public static void downloadEasyExcel(HttpServletResponse response, Object obj, List list) { + String fileName = URLEncoder.encode("表单", "UTF-8"); + response.reset(); + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); + // excel头策略 + WriteCellStyle headWriteCellStyle = new WriteCellStyle(); + WriteFont headWriteFont = new WriteFont(); + headWriteFont.setFontHeightInPoints((short) 11); + headWriteFont.setBold(false); + headWriteCellStyle.setWriteFont(headWriteFont); + // excel内容策略 + WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); + WriteFont contentWriteFont = new WriteFont(); + //内容水平对齐 + contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.RIGHT); + contentWriteFont.setFontHeightInPoints((short) 11); + contentWriteCellStyle.setWriteFont(contentWriteFont); + // 设置handler + HorizontalCellStyleStrategy styleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); + //写出 + EasyExcel.write(response.getOutputStream(), (Class) obj) + .autoCloseStream(Boolean.FALSE) + .sheet("sheet1") + .registerWriteHandler(styleStrategy) + //自动设置列的宽tm +// .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + .doWrite(list); + } + + public static void exportPackByDate(HttpServletResponse response, Map> params, String fileName) { + ExcelWriter excelWriter = null; + try { + // 防止中文乱码 + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx"); + //工作簿对象 + excelWriter = EasyExcel.write(response.getOutputStream()).build(); + int i = 0; + for (String key : params.keySet()) { + //sheet对象 + WriteSheet sheet = EasyExcel.writerSheet(i, key).head(MemberInfoVO.class).build(); + //写出 + excelWriter.write(params.get(key), sheet); + + i += 1; + } + } catch (Exception e) { + log.error(e.getMessage()); + } finally { + if (excelWriter != null) { + excelWriter.finish(); + } + } + } + +} diff --git a/manage/ad-platform-task/pom.xml b/manage/ad-platform-task/pom.xml index 5b194336..57f18866 100644 --- a/manage/ad-platform-task/pom.xml +++ b/manage/ad-platform-task/pom.xml @@ -30,17 +30,17 @@ ad-platform-pojo 1.0-SNAPSHOT - - - - - - - - - - - + + + + + + + + + + + org.springframework.boot spring-boot-configuration-processor diff --git a/manage/ad-platform-task/src/main/java/com/baiye/config/SimpleJobAutoConfig.java b/manage/ad-platform-task/src/main/java/com/baiye/config/SimpleJobAutoConfig.java index a49eac87..1ed23eba 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/config/SimpleJobAutoConfig.java +++ b/manage/ad-platform-task/src/main/java/com/baiye/config/SimpleJobAutoConfig.java @@ -1,6 +1,6 @@ package com.baiye.config; -import com.baiye.modules.elsaticjob.entity.jobInstance.ElasticSimpleJob; +import com.baiye.modules.timetask.entity.jobInstance.ElasticSimpleJob; import com.dangdang.ddframe.job.config.JobCoreConfiguration; import com.dangdang.ddframe.job.config.JobTypeConfiguration; import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration; diff --git a/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectManageFeign.java b/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectManageFeign.java index 1d1a7172..5ea41091 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectManageFeign.java +++ b/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectManageFeign.java @@ -10,7 +10,6 @@ import org.springframework.web.bind.annotation.RequestParam; import java.util.List; - /** * @author wujingtao * @date 2021/12/27 diff --git a/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectManageFeignFallBack.java b/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectManageFeignFallBack.java index 356906ef..949c6eaf 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectManageFeignFallBack.java +++ b/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectManageFeignFallBack.java @@ -12,6 +12,8 @@ import java.util.List; */ @Component public class ConnectManageFeignFallBack implements ConnectManageFeign { + + @Override public ResponseEntity query(TaskQueryCriteria taskQueryCriteria) { return null; diff --git a/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectSourceFeign.java b/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectSourceFeign.java deleted file mode 100644 index 9369fc28..00000000 --- a/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectSourceFeign.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baiye.feign; - -import io.swagger.annotations.ApiOperation; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - - -/** - * @author wujingtao - * @date 2021/12/23 - */ -@FeignClient(name = "ad-platform-source") -public interface ConnectSourceFeign { - - - @ApiOperation("查询组员资源总数") - @GetMapping("/source/clue/queryMemberNum") - ResponseEntity queryMemberNum(@RequestParam("memberId") Long memberId); -} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectSourceFeignFallBack.java b/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectSourceFeignFallBack.java deleted file mode 100644 index 8d2df4c4..00000000 --- a/manage/ad-platform-task/src/main/java/com/baiye/feign/ConnectSourceFeignFallBack.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baiye.feign; - -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Component; - - -/** - * @author wujingtao - * @date 2021/12/23 - */ -@Component -public class ConnectSourceFeignFallBack implements ConnectSourceFeign { - - @Override - public ResponseEntity queryMemberNum(Long memberId) { - return null; - } -} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/job/AutomaticReminderJob.java b/manage/ad-platform-task/src/main/java/com/baiye/job/AutomaticReminderJob.java index 9a0eab02..1395afd3 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/job/AutomaticReminderJob.java +++ b/manage/ad-platform-task/src/main/java/com/baiye/job/AutomaticReminderJob.java @@ -1,7 +1,7 @@ package com.baiye.job; -import com.baiye.modules.elsaticjob.entity.jobInstance.ElasticSimpleJob; -import com.baiye.modules.elsaticjob.service.impl.AutoReminderServiceImpl; +import com.baiye.modules.timetask.entity.jobInstance.ElasticSimpleJob; +import com.baiye.modules.timetask.service.impl.AutoReminderServiceImpl; import com.dangdang.ddframe.job.api.ShardingContext; import com.dangdang.ddframe.job.api.simple.SimpleJob; import lombok.extern.slf4j.Slf4j; @@ -13,6 +13,7 @@ import javax.annotation.Resource; /** * @author wujingtao * @date 2022/01/05 + * 自动提醒消息 */ @Slf4j @Component diff --git a/manage/ad-platform-task/src/main/java/com/baiye/job/StatisticsHourJob.java b/manage/ad-platform-task/src/main/java/com/baiye/job/StatisticsHourJob.java deleted file mode 100644 index ed48afc2..00000000 --- a/manage/ad-platform-task/src/main/java/com/baiye/job/StatisticsHourJob.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baiye.job; - -import com.baiye.modules.elsaticjob.entity.jobInstance.ElasticSimpleJob; -import com.baiye.modules.report.service.ReportService; -import com.dangdang.ddframe.job.api.ShardingContext; -import com.dangdang.ddframe.job.api.simple.SimpleJob; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; - -/** - * @author wjt - * @date 2021/12/10 - * 每小时调用一次 - */ -@Slf4j -@Component -@ElasticSimpleJob(jobName = "StatisticsHourJob", cron = "0 0 0/1 * * ?", jobExceptionHandler = "com.baiye.exception.ElasticException", overwrite = true) -public class StatisticsHourJob implements SimpleJob { - @Resource - private ReportService reportService; - private static StatisticsHourJob statisticsHourJob; - - @PostConstruct - public void init() { - statisticsHourJob = this; - } - - @Override - public void execute(ShardingContext shardingContext) { - statisticsHourJob.reportService.reportHour(); - } -} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/job/WebSocketHeartbeat.java b/manage/ad-platform-task/src/main/java/com/baiye/job/WebSocketHeartbeat.java index 65d4cc6e..fdc2b00c 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/job/WebSocketHeartbeat.java +++ b/manage/ad-platform-task/src/main/java/com/baiye/job/WebSocketHeartbeat.java @@ -3,7 +3,7 @@ package com.baiye.job; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baiye.constant.DefaultNumberConstants; -import com.baiye.modules.elsaticjob.entity.jobInstance.ElasticSimpleJob; +import com.baiye.modules.timetask.entity.jobInstance.ElasticSimpleJob; import com.baiye.socket.WebSocketServer; import com.dangdang.ddframe.job.api.ShardingContext; import com.dangdang.ddframe.job.api.simple.SimpleJob; @@ -16,6 +16,7 @@ import javax.annotation.Resource; /** * @author wujingtao * @date 2021/12/28 + * 发送websocket心跳 */ @Slf4j @Component diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/service/impl/AutoReminderServiceImpl.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/service/impl/AutoReminderServiceImpl.java deleted file mode 100644 index ffa31cb3..00000000 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/service/impl/AutoReminderServiceImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.baiye.modules.elsaticjob.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.DateUnit; -import cn.hutool.core.date.DateUtil; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import com.baiye.constant.DefaultNumberConstants; -import com.baiye.http.CommonResponse; -import com.baiye.modules.elsaticjob.dao.AutoReminderRepository; -import com.baiye.modules.elsaticjob.entity.AutoReminder; -import com.baiye.modules.elsaticjob.service.AutoReminderService; -import com.baiye.socket.WebSocketServer; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.util.List; - -/** - * @author wujingtao - * @date 2022/01/05 - */ -@Slf4j -@Service -public class AutoReminderServiceImpl implements AutoReminderService { - @Resource - private AutoReminderRepository timeTaskRepository; - @Resource - private WebSocketServer webSocketServer; - - @Override - public CommonResponse addTimeTask(AutoReminder timeTask) { - if (timeTaskRepository.save(timeTask).getId() == null) { - return CommonResponse.createByErrorMessage("保存定时任务失败"); - } - return CommonResponse.createBySuccess(); - } - - /** - * 执行自体醒任务 - */ - @Transactional(rollbackFor = Exception.class) - public void runAutomaticReminder() { - List allByStatus = timeTaskRepository.findAllByStatus(DefaultNumberConstants.ZERO_NUMBER); - if (CollUtil.isEmpty(allByStatus)) { - return; - } - JSONObject object = new JSONObject(); - object.putOpt("type", ""); - object.putOpt("code", DefaultNumberConstants.TWO_HUNDRED); - for (AutoReminder info : allByStatus) { - if (DateUtil.between(info.getExecuteTime(), DateUtil.date(), DateUnit.HOUR) == 0) { - object.putOpt("message", info.getUserId()); - try { - webSocketServer.sendMessage(JSONUtil.toJsonStr(object), String.valueOf(info.getUserId())); - } catch (Exception e) { - log.info("执行自提醒任务 id:{} 发送websocket失败 {}", info.getId(), e.getMessage()); - continue; - } - if (info.getIsRepeat() == DefaultNumberConstants.ZERO_NUMBER) { - timeTaskRepository.updateTimeTaskStatus(DefaultNumberConstants.ONE_NUMBER, info.getId()); - } - } - } - } -} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/api/ReportController.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/report/api/ReportController.java deleted file mode 100644 index 417451b3..00000000 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/api/ReportController.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baiye.modules.report.api; - -import com.baiye.http.CommonResponse; -import com.baiye.modules.report.entity.vo.MemberInfoVO; -import com.baiye.modules.report.service.ReportService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - - -/** - * @author wjt - * @date 2021/12/14 - */ -@RestController -@RequestMapping("/api") -@Slf4j -@Api(tags = "获取统计信息") -public class ReportController { - @Resource - private ReportService reportService; - - @GetMapping("/report/member") - @ApiOperation("获取单个成员统计信息") - public CommonResponse getMemberReport(Long memberId) { - MemberInfoVO memberReport = reportService.getMemberReport(memberId); - return CommonResponse.createBySuccess(memberReport); - } - - @GetMapping("/report/manager") - @ApiOperation("手动触发websocket,发送管理员统计信息") - public CommonResponse autoTriggerReport() { - reportService.reportHour(); - return CommonResponse.createBySuccess(); - } -} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/dao/CallClueRepository.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/report/dao/CallClueRepository.java deleted file mode 100644 index 3979b345..00000000 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/dao/CallClueRepository.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baiye.modules.report.dao; - -import com.baiye.modules.report.entity.CallClueInfo; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; - -import java.util.List; - -/** - * @author wjt - * @date 2021/12/13 - */ -@Repository -public interface CallClueRepository extends JpaRepository, JpaSpecificationExecutor { - /** - * 主键查询 - * - * @param id - * @return - */ - CallClueInfo findByClueId(Long id); - - /** - * 按条件查询 - * - * @param memberId - * @return - */ - @Query("select d from CallClueInfo d where d.memberId=?1 ") - List selectByMember(Long memberId); - - /** - * 按条件查询 - * - * @param taskId - * @param day - * @return - */ - @Query("select d from CallClueInfo d where d.taskId=?1 and concat(d.createTime,'') =?2 ") - List selectByCondition(Long taskId, String day); -} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/dao/ReportDayRepository.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/report/dao/ReportDayRepository.java deleted file mode 100644 index d8f0e242..00000000 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/dao/ReportDayRepository.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baiye.modules.report.dao; - -import com.baiye.modules.report.entity.ReportDay; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; -import org.springframework.stereotype.Repository; - -import java.util.List; - -/** - * @author wjt - * @date 2021/12/13 - */ -@Repository -public interface ReportDayRepository extends JpaRepository, JpaSpecificationExecutor { - /** - * 通过任务id 查询所有的日报 - * - * @param taskId - * @return - */ - List findAllByTaskId(Long taskId); -} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/CallClueInfo.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/CallClueInfo.java deleted file mode 100644 index 3e9e4d0d..00000000 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/CallClueInfo.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baiye.modules.report.entity; - -import cn.hutool.core.date.DatePattern; -import com.baiye.model.entity.BaseCallClueInfo; -import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; - -import javax.persistence.*; -import java.io.Serializable; -import java.util.Date; - -/** - * @author wjt - * @date 2021/12/13 - * 线索中间表 - */ -@Data -@Entity -@Table(name = "tb_call_clue") -@EntityListeners(AuditingEntityListener.class) -public class CallClueInfo extends BaseCallClueInfo implements Serializable { - private static final long serialVersionUID = -2063303635710762496L; - - @Id - @Column(name = "clue_id") - private Long clueId; - @LastModifiedDate - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN, timezone = "GMT+8") - @Column(name = "create_time") - private Date createTime; -} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/vo/MemberInfoVO.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/vo/MemberInfoVO.java deleted file mode 100644 index 822d1181..00000000 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/vo/MemberInfoVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baiye.modules.report.entity.vo; - -import cn.hutool.core.date.DatePattern; -import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Data; - -import java.util.Date; - -/** - * @author wjt - * @date 2021/12/09 - */ -@Data -public class MemberInfoVO { - /** - * 成员id - */ - private Long memberId; - /** - * 接通数 - */ - private Integer turnOnNum; - /** - * 接通率 - */ - private Double turnOnRate; - /** - * 使用率 - */ - private Double usrRate; - /** - * 总数 - */ - private Integer totalNum; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN, timezone = "GMT+8") - private Date date; -} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/vo/ReportMessageInfoVO.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/vo/ReportMessageInfoVO.java deleted file mode 100644 index aa24b8d4..00000000 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/entity/vo/ReportMessageInfoVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baiye.modules.report.entity.vo; - -import cn.hutool.json.JSONObject; -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * @author wjt - * @date 2021/12/13 - */ -@Data -public class ReportMessageInfoVO implements Serializable { - private static final long serialVersionUID = -4455400757718138363L; - /** - * 用户id - */ - private Integer code; - private Long userId; - private String type; - private List data; - private JSONObject totalData; -} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/service/ReportService.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/report/service/ReportService.java deleted file mode 100644 index 6b361713..00000000 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/service/ReportService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baiye.modules.report.service; - -import com.baiye.modules.report.entity.vo.MemberInfoVO; - -/** - * @author wjt - * @date 2021/12/10 - */ -public interface ReportService { - /** - * 推送管理员统计信息 - */ - void reportHour(); - - /** - * 获取成员接通信息 - * - * @param memberId - * @return - */ - MemberInfoVO getMemberReport(Long memberId); -} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/service/impl/ReportServiceImpl.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/report/service/impl/ReportServiceImpl.java deleted file mode 100644 index e88f0734..00000000 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/report/service/impl/ReportServiceImpl.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.baiye.modules.report.service.impl; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.DateUnit; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import com.baiye.constant.DefaultNumberConstants; -import com.baiye.feign.ConnectManageFeign; -import com.baiye.feign.ConnectSourceFeign; -import com.baiye.model.dto.TaskQueryCriteria; -import com.baiye.model.enums.CallStatusEnum; -import com.baiye.modules.report.dao.CallClueRepository; -import com.baiye.modules.report.dao.ReportDayRepository; -import com.baiye.modules.report.entity.CallClueInfo; -import com.baiye.modules.report.entity.ReportDay; -import com.baiye.modules.report.entity.vo.MemberInfoVO; -import com.baiye.modules.report.entity.vo.ReportMessageInfoVO; -import com.baiye.modules.report.entity.vo.TaskInfosVO; -import com.baiye.modules.report.service.ReportService; -import com.baiye.socket.WebSocketServer; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.*; -import java.util.stream.Collectors; - -/** - * @author wjt - * @date 2021/12/10 - */ -@Service -@Slf4j -public class ReportServiceImpl implements ReportService { - @Resource - private WebSocketServer webSocketServer; - @Resource - private CallClueRepository callClueRepository; - @Resource - private ReportDayRepository reportDayRepository; - @Resource - private ConnectSourceFeign connectSourceFeign; - @Resource - private ConnectManageFeign connectManageFeign; - - @Override - public void reportHour() { - //所有线索总数 - int total = 0; - - //查询所有的拨打线索记录 - List all = callClueRepository.findAll(); - Map> callClueInfoMap = new HashMap<>(16); - all.stream().collect(Collectors.groupingBy(CallClueInfo::getTaskId, Collectors.toList())).forEach(callClueInfoMap::put); - - //查询所有的分配任务 - TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria(); - taskQueryCriteria.setIsDistribution(1); - ResponseEntity query = connectManageFeign.query(taskQueryCriteria); - JSONArray array = JSONUtil.parseArray(query.getBody()); - if (CollUtil.isEmpty(array)) { - log.info("资源池里没有任务="); - return; - } - //发送websocket信息 - ReportMessageInfoVO reportMessageInfoVO = new ReportMessageInfoVO(); - List taskInfos = new ArrayList<>(); - - for (Object o : array) { - JSONObject jsonObject = (JSONObject) o; - Long id = jsonObject.getLong("id"); - int clueTotal = jsonObject.getInt("totalNumber"); - String taskName = jsonObject.getStr("taskName"); - total += clueTotal; - if (callClueInfoMap.containsKey(id)) { - //获取今天产生的记录 - List callClueInfos = callClueInfoMap.get(id).stream().filter(c -> DateUtil.between(c.getCreateTime(), DateUtil.date(), DateUnit.DAY) == 0).collect(Collectors.toList()); - JSONObject json = getMessageInfo(callClueInfos, clueTotal); - ReportDay reportDay = saveReport(id, clueTotal, json); - //任务保存到每天的数据 - List allByTaskId = reportDayRepository.findAllByTaskId(id); - allByTaskId.add(reportDay); - allByTaskId.sort(Comparator.comparing(ReportDay::getCreateTime)); - //每个任务对应的所有日期的数据 - TaskInfosVO taskInfo = new TaskInfosVO(); - taskInfo.setTaskId(id); - taskInfo.setTaskName(taskName); - taskInfo.setData(allByTaskId); - taskInfos.add(taskInfo); - } - } - JSONObject totalData = getTotalData(all, total); - reportMessageInfoVO.setData(taskInfos); - reportMessageInfoVO.setTotalData(totalData); - sendAllManage(reportMessageInfoVO); - } - - @Override - public MemberInfoVO getMemberReport(Long memberId) { - //查询此员工的所有线索 - ResponseEntity objectResponseEntity = connectSourceFeign.queryMemberNum(memberId); - int total = (int) objectResponseEntity.getBody(); - MemberInfoVO memberInfoVO = new MemberInfoVO(); - memberInfoVO.setMemberId(memberId); - memberInfoVO.setTotalNum(total); - memberInfoVO.setDate(DateUtil.date()); - memberInfoVO.setTurnOnNum(0); - memberInfoVO.setTurnOnRate(0.00); - memberInfoVO.setUsrRate(0.00); - if (total == 0) { - return memberInfoVO; - } - List callClueInfos = callClueRepository.selectByMember(memberId); - if (CollUtil.isEmpty(callClueInfos)) { - return memberInfoVO; - } - JSONObject json = getMessageInfo(callClueInfos, total); - memberInfoVO.setTurnOnNum(json.getInt("turnOnNum")); - memberInfoVO.setTurnOnRate(json.getDouble("turnOnRate")); - memberInfoVO.setUsrRate(json.getDouble("usrRate")); - return memberInfoVO; - } - - /** - * 获取总线索情况 - * - * @return - */ - private JSONObject getTotalData(List all, Integer totalNum) { - JSONObject messageInfo = getMessageInfo(all, totalNum); - messageInfo.putOpt("totalNum", totalNum); - return messageInfo; - } - - /** - * 发送所有管理员身份的人 - * - * @param reportMessageInfoVO - * @return - */ - private void sendAllManage(ReportMessageInfoVO reportMessageInfoVO) { - try { - //todo 这里8为管理员 1为超级管理员。。后面改进 - List roleIds = new ArrayList<>(); - roleIds.add(1L); - roleIds.add(8L); - ResponseEntity adminInfo = connectManageFeign.getAdminInfo(roleIds); - JSONArray jsonArray = JSONUtil.parseArray(adminInfo.getBody()); - for (Object o : jsonArray) { - JSONObject jsonObject = (JSONObject) o; - reportMessageInfoVO.setUserId(jsonObject.getLong("id")); - reportMessageInfoVO.setType("adminStatistics"); - webSocketServer.sendMessage(reportMessageInfoVO); - } - } catch (Exception e) { - log.error("发生websocket异常 {}", e.getMessage()); - } - } - - /** - * 保存当日的统计信息 - * - * @return - */ - private ReportDay saveReport(Long id, Integer clueTotal, JSONObject json) { - ReportDay reportDay = new ReportDay(); - reportDay.setTaskId(id); - reportDay.setTotalNum(clueTotal); - reportDay.setTurnOnNum(json.getInt("turnOnNum")); - reportDay.setTurnOnRate(json.getDouble("turnOnRate")); - reportDay.setUsrRate(json.getDouble("usrRate")); - reportDay.setCreateTime(DateUtil.date()); - if (DateUtil.hour(DateUtil.date(), true) == DefaultNumberConstants.TWENTY_THREE) { - //每天23点的统计 保存在数据库 - reportDayRepository.save(reportDay); - } - return reportDay; - } - - /** - * 计算当日信息 - * - * @param callClueInfos - * @param total - * @return - */ - private JSONObject getMessageInfo(List callClueInfos, int total) { - int usrNum = 0; - int turnOnNum = 0; - double turnOnRate = 0.00; - double usrRate = 0.00; - for (CallClueInfo info : callClueInfos) { - if (info.getStatus() != 0) { - usrNum++; - if (info.getStatus() == CallStatusEnum.ANSWER.getValue()) { - turnOnNum++; - } - } - } - //使用率 =使用数/总数 - usrRate = NumberUtil.div(usrNum, total, 2); - if (usrNum != 0) { - //接通率=接通数/使用数 - turnOnRate = NumberUtil.div(turnOnNum, usrNum, 2); - } - JSONObject json = new JSONObject(); - json.putOpt("turnOnNum", turnOnNum); - json.putOpt("turnOnRate", turnOnRate); - json.putOpt("usrRate", usrRate); - return json; - } -} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/api/AutoReminderController.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/api/AutoReminderController.java similarity index 74% rename from manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/api/AutoReminderController.java rename to manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/api/AutoReminderController.java index 1a8baf8b..d4bd8c2f 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/api/AutoReminderController.java +++ b/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/api/AutoReminderController.java @@ -1,10 +1,9 @@ package com.baiye.modules.elsaticjob.api; - import cn.hutool.core.bean.BeanUtil; import com.baiye.http.CommonResponse; import com.baiye.model.entity.BaseTimeTask; -import com.baiye.modules.elsaticjob.entity.AutoReminder; -import com.baiye.modules.elsaticjob.service.AutoReminderService; +import com.baiye.modules.timetask.entity.AutoReminder; +import com.baiye.modules.timetask.service.AutoReminderService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -24,11 +23,7 @@ public class AutoReminderController { @Resource private AutoReminderService timeTaskService; - /** - * 注册新任务 - * - * @param timeTask - */ + @PostMapping("/add") @ApiOperation("新增") public CommonResponse addTimeTask(@RequestBody BaseTimeTask timeTask) { @@ -36,4 +31,10 @@ public class AutoReminderController { BeanUtil.copyProperties(timeTask, autoReminder); return timeTaskService.addTimeTask(autoReminder); } + + @PostMapping("/update") + @ApiOperation("修改") + public CommonResponse updateTimeTask(@RequestBody AutoReminder timeTask) { + return timeTaskService.updateTimeTask(timeTask); + } } diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/api/ElasticJobController.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/api/ElasticJobController.java similarity index 92% rename from manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/api/ElasticJobController.java rename to manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/api/ElasticJobController.java index a91cba9c..71bd8548 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/api/ElasticJobController.java +++ b/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/api/ElasticJobController.java @@ -1,8 +1,8 @@ -package com.baiye.modules.elsaticjob.api; +package com.baiye.modules.timetask.api; -import com.baiye.modules.elsaticjob.entity.Job; -import com.baiye.modules.elsaticjob.entity.JobBriefInfo; -import com.baiye.modules.elsaticjob.service.ElasticJobService; +import com.baiye.modules.timetask.entity.Job; +import com.baiye.modules.timetask.entity.JobBriefInfo; +import com.baiye.modules.timetask.service.ElasticJobService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/dao/AutoReminderRepository.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/dao/AutoReminderRepository.java similarity index 78% rename from manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/dao/AutoReminderRepository.java rename to manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/dao/AutoReminderRepository.java index b5a8ada4..4aa2d61b 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/dao/AutoReminderRepository.java +++ b/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/dao/AutoReminderRepository.java @@ -1,6 +1,6 @@ -package com.baiye.modules.elsaticjob.dao; +package com.baiye.modules.timetask.dao; -import com.baiye.modules.elsaticjob.entity.AutoReminder; +import com.baiye.modules.timetask.entity.AutoReminder; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Modifying; @@ -32,4 +32,12 @@ public interface AutoReminderRepository extends JpaRepository addTimeTask(AutoReminder timeTask); + + CommonResponse updateTimeTask(AutoReminder timeTask); } diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/service/ElasticJobService.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/service/ElasticJobService.java similarity index 87% rename from manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/service/ElasticJobService.java rename to manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/service/ElasticJobService.java index eec2c623..114187b0 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/service/ElasticJobService.java +++ b/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/service/ElasticJobService.java @@ -1,7 +1,7 @@ -package com.baiye.modules.elsaticjob.service; +package com.baiye.modules.timetask.service; -import com.baiye.modules.elsaticjob.entity.Job; -import com.baiye.modules.elsaticjob.entity.JobBriefInfo; +import com.baiye.modules.timetask.entity.Job; +import com.baiye.modules.timetask.entity.JobBriefInfo; import java.util.List; diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/service/impl/AutoReminderServiceImpl.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/service/impl/AutoReminderServiceImpl.java new file mode 100644 index 00000000..cea440d9 --- /dev/null +++ b/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/service/impl/AutoReminderServiceImpl.java @@ -0,0 +1,111 @@ +package com.baiye.modules.timetask.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.feign.ConnectManageFeign; +import com.baiye.http.CommonResponse; +import com.baiye.modules.timetask.dao.AutoReminderRepository; +import com.baiye.modules.timetask.entity.AutoReminder; +import com.baiye.modules.timetask.service.AutoReminderService; +import com.baiye.socket.WebSocketServer; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Repository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.sql.Connection; +import java.util.ArrayList; +import java.util.List; + +/** + * @author wujingtao + * @date 2022/01/05 + */ +@Slf4j +@Service +public class AutoReminderServiceImpl implements AutoReminderService { + @Resource + private AutoReminderRepository timeTaskRepository; + @Resource + private WebSocketServer webSocketServer; + @Resource + private ConnectManageFeign connectManageFeign; + + @Override + public CommonResponse addTimeTask(AutoReminder timeTask) { + if (timeTaskRepository.save(timeTask).getId() == null) { + log.error("method [addTimeTask] 保存定时任务失败"); + return CommonResponse.createByErrorMessage("保存定时任务失败"); + } + return CommonResponse.createBySuccess(); + } + + @Override + public CommonResponse updateTimeTask(AutoReminder timeTask) { + if (ObjectUtil.isNull(timeTask) || timeTask.getMessageId() == null) { + log.error("method [updateTimeTask] 参数不能为空"); + return CommonResponse.createByErrorMessage("参数不能为空"); + } + AutoReminder autoReminderByMessageId = timeTaskRepository.findAutoReminderByMessageId(timeTask.getMessageId()); + BeanUtil.copyProperties(timeTask, autoReminderByMessageId); + timeTaskRepository.save(autoReminderByMessageId); + return CommonResponse.createBySuccess(); + } + + /** + * 执行自提醒任务,生成消息信息,发送给websocket和消息服务 + */ + @Transactional(rollbackFor = Exception.class) + public void runAutomaticReminder() { + //所有状态为0(可执行) 的自定义消息 + List allByStatus = timeTaskRepository.findAllByStatus(DefaultNumberConstants.ZERO_NUMBER); + if (CollUtil.isEmpty(allByStatus)) { + return; + } + JSONObject webSocketData = new JSONObject(); + webSocketData.putOpt("type", ""); + webSocketData.putOpt("code", DefaultNumberConstants.TWO_HUNDRED); + JSONArray jsonArray = new JSONArray(); + for (AutoReminder info : allByStatus) { + + if (DateUtil.between(info.getExecuteTime(), DateUtil.date(), DateUnit.HOUR) == 0) { + JSONObject jsonObject = forwardMessage(info.getMessage()); + webSocketData.putOpt("data", jsonObject); + try { + webSocketServer.sendMessage(JSONUtil.toJsonStr(webSocketData), String.valueOf(info.getUserId())); + } catch (Exception e) { + log.info("执行自提醒任务 id:{} 发送websocket失败 {}", info.getId(), e.getMessage()); + continue; + } + jsonObject.putOpt("userId", info.getUserId()); + jsonArray.add(jsonObject); + if (info.getIsRepeat() == DefaultNumberConstants.ZERO_NUMBER) { + timeTaskRepository.updateTimeTaskStatus(DefaultNumberConstants.ONE_NUMBER, info.getId()); + } + } + } + try { + connectManageFeign.createMessage(JSONUtil.toJsonStr(jsonArray)); + } catch (Exception e) { + log.info("Method 【runAutomaticReminder】 转发消息到 management 服务失败 {}", e.getMessage()); + } + } + + private JSONObject forwardMessage(String message) { + JSONObject json = new JSONObject(); + json.putOpt("messageId", Long.valueOf(DateUtil.format(DateUtil.date(), "hhmmss") + RandomUtil.randomNumbers(4))); + json.putOpt("message", message); + return json; + } +} diff --git a/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/service/impl/ElasticJobServiceImpl.java b/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/service/impl/ElasticJobServiceImpl.java similarity index 97% rename from manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/service/impl/ElasticJobServiceImpl.java rename to manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/service/impl/ElasticJobServiceImpl.java index bbc119a8..01983b60 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/modules/elsaticjob/service/impl/ElasticJobServiceImpl.java +++ b/manage/ad-platform-task/src/main/java/com/baiye/modules/timetask/service/impl/ElasticJobServiceImpl.java @@ -1,9 +1,9 @@ -package com.baiye.modules.elsaticjob.service.impl; +package com.baiye.modules.timetask.service.impl; import cn.hutool.core.util.StrUtil; -import com.baiye.modules.elsaticjob.entity.Job; -import com.baiye.modules.elsaticjob.entity.JobBriefInfo; -import com.baiye.modules.elsaticjob.service.ElasticJobService; +import com.baiye.modules.timetask.entity.Job; +import com.baiye.modules.timetask.entity.JobBriefInfo; +import com.baiye.modules.timetask.service.ElasticJobService; import com.dangdang.ddframe.job.config.JobCoreConfiguration; import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration; import com.dangdang.ddframe.job.executor.handler.JobProperties; diff --git a/manage/ad-platform-task/src/main/java/com/baiye/socket/WebSocketServer.java b/manage/ad-platform-task/src/main/java/com/baiye/socket/WebSocketServer.java index bbeee226..83cbc920 100644 --- a/manage/ad-platform-task/src/main/java/com/baiye/socket/WebSocketServer.java +++ b/manage/ad-platform-task/src/main/java/com/baiye/socket/WebSocketServer.java @@ -3,16 +3,11 @@ package com.baiye.socket; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baiye.constant.DefaultNumberConstants; -import com.baiye.feign.ConnectManageFeign; import com.baiye.model.dto.SendWebSocketDTO; -import com.baiye.model.enums.WebSocketEnums; -import com.baiye.modules.report.entity.vo.ReportMessageInfoVO; -import com.baiye.modules.report.service.impl.ReportServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; -import javax.annotation.Resource; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; @@ -30,17 +25,10 @@ import java.util.concurrent.atomic.AtomicInteger; @ServerEndpoint(value = "/task/prosperous/{userId}") public class WebSocketServer { private static String user; - @Resource - private ReportServiceImpl reportServiceImpl; - @Resource - private ConnectManageFeign connectManageFeign; - - private static WebSocketServer webSocketServer; @PostConstruct public void init() { log.info("websocket 加载"); - webSocketServer = this; } private static final AtomicInteger ONLINE_COUNT = new AtomicInteger(0); @@ -87,28 +75,6 @@ public class WebSocketServer { @OnMessage public void onMessage(String message, Session session) { log.info("来自客户端的消息:{}", message); - JSONObject jsonObject = JSONUtil.parseObj(message); - //todo 后面建常量类 - String adminStatistics = "adminStatistics"; - String type = "type"; - if (adminStatistics.equals(jsonObject.getStr(type))) { - webSocketServer.reportServiceImpl.reportHour(); - } - switch (WebSocketEnums.find(jsonObject.getStr(type))) { - case DefaultNumberConstants.TWO_NUMBER: - connectManageFeign.changeMessage(message); - break; - case DefaultNumberConstants.THREE_NUMBER: - connectManageFeign.userMessageRead(message); - break; - case DefaultNumberConstants.FIVE_NUMBER: - connectManageFeign.createMessage(message); - break; - default: - break; - - } - } /** @@ -170,30 +136,12 @@ public class WebSocketServer { } } - - public void sendMessage(ReportMessageInfoVO reportMessageInfoVO) throws IOException { - Session session = null; - for (String key : SESSIONS.keySet()) { - if (key.equals(String.valueOf(reportMessageInfoVO.getUserId()))) { - session = SESSIONS.get(key); - break; - } - - } - - if (session != null) { - reportMessageInfoVO.setCode(DefaultNumberConstants.TWO_HUNDRED); - session.getBasicRemote().sendText(JSONUtil.toJsonStr(reportMessageInfoVO)); - } else { - log.warn("没有找到你指定ID的会话:{}", reportMessageInfoVO.getUserId()); - } - } - public void sendMessage(SendWebSocketDTO.SendMessage data, List ids) throws IOException { for (long id : ids) { if (SESSIONS.containsKey(String.valueOf(id))) { Session session = SESSIONS.get(String.valueOf(id)); data.setCode(DefaultNumberConstants.TWO_HUNDRED); + log.info(" 发送给 id:{} 的websocket 信息为:{}", id, data); session.getBasicRemote().sendText(JSONUtil.toJsonStr(data)); } else { log.warn("没有找到你指定ID的会话:{}", id); diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java b/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java index 812b136e..7f216f48 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/controller/ClueController.java @@ -116,4 +116,10 @@ public class ClueController { public void exportClueList(HttpServletResponse response, ClueQueryCriteria clueQueryCriteria) { clueService.exportClueList(response, clueQueryCriteria); } + + @ApiOperation("根据小组id统计小组资源数") + @GetMapping("/count") + public ResponseEntity countClueByGroupId(@RequestParam("groupId") Long groupId) { + return new ResponseEntity<>(clueService.countClueByGroupId(groupId), HttpStatus.OK); + } } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueJpa.java b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueJpa.java index efe72916..17701ea9 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueJpa.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueJpa.java @@ -4,9 +4,11 @@ import cn.hutool.json.JSONArray; import cn.hutool.json.JSONUtil; import com.baiye.model.dto.ClueDto; import com.baiye.model.dto.ClueQueryCriteria; +import com.baiye.util.AESUtils; import org.apache.commons.lang.StringUtils; import org.hibernate.query.internal.NativeQueryImpl; import org.hibernate.transform.Transformers; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -26,6 +28,10 @@ public class ClueJpa { @PersistenceContext EntityManager entityManager; + @Value("${aes.secret}") + private String secret; + + /** * 分页查询,不分页传null */ @@ -125,7 +131,11 @@ public class ClueJpa { clueDto.setMemberStatus((Integer) row.get("memberStatus")); clueDto.setName((String) row.get("name")); clueDto.setCreateTime((Date) row.get("createTime")); - clueDto.setNid((String) row.get("nid")); + String phone = (String) row.get("nid"); + if (StringUtils.isNotBlank(phone)) { + String nid = AESUtils.decrypt(phone, secret); + clueDto.setNid(nid); + } clueDto.setWx((String) row.get("wx")); clueDto.setAddress((String) row.get("address")); clueDto.setRemark((String) row.get("remark")); diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueMiddleRepository.java b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueMiddleRepository.java index 7d83d777..c8982896 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueMiddleRepository.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/dao/ClueMiddleRepository.java @@ -66,6 +66,13 @@ public interface ClueMiddleRepository extends JpaRepository, J */ Long countByMemberId(Long memberId); + /** + * 查询组员资源总数 + * @param organizeId + * @return + */ + Integer countByOrganizeId(Long organizeId); + /** * 更新资源所属组 * diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java index 3a0ff9d4..42c753a0 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/ClueService.java @@ -123,4 +123,11 @@ public interface ClueService { * @return */ Set findMemberIdList(ClueMiddle clueMiddle); + + /** + * 统计小组资源数 + * @param groupId + * @return + */ + Integer countClueByGroupId(Long groupId); } diff --git a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java index 2a90a117..254d7d20 100644 --- a/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java +++ b/services/ad-platform-source/src/main/java/com/baiye/module/service/impl/ClueServiceImpl.java @@ -248,4 +248,9 @@ public class ClueServiceImpl implements ClueService { } return null; } + + @Override + public Integer countClueByGroupId(Long groupId) { + return clueMiddleRepository.countByOrganizeId(groupId); + } } diff --git a/services/ad-platform-source/src/main/resources/logback.xml b/services/ad-platform-source/src/main/resources/logback.xml index cbf30111..c7bb9eb0 100644 --- a/services/ad-platform-source/src/main/resources/logback.xml +++ b/services/ad-platform-source/src/main/resources/logback.xml @@ -34,7 +34,7 @@ ${LOG_PATTERN} - utf- + utf-8