1.添加抖音外显 2.修改统计 3.查看组员权限

master
wujingtao 2 years ago
parent f1fbc9ec4f
commit 272ac2f67f

@ -21,4 +21,8 @@ public class ReportStageAndTurnoverDto {
* id
*/
private List<Long> memberIds;
/**
* id
*/
private List<Long> organizeIds;
}

@ -77,8 +77,15 @@ public interface SourceClueClient {
ResponseEntity<List<ClueMiddle>> queryClueByCondition(@RequestParam(value = "startTime") String startTime,
@RequestParam(value = "endTime") String endTime,
@RequestParam(value = "memberId") Long memberId);
@ApiOperation("管理员获取当日所有意向数据")
@GetMapping(API_PREFIX+"/queryClueByAdmin")
CommonResponse<Integer> queryClueByAdmin(@RequestParam(value = "memberId") Long memberId) ;
@GetMapping(API_PREFIX + "/queryClueByAdmin")
CommonResponse<Integer> queryClueByAdmin(@RequestParam(value = "memberId") Long memberId);
@ApiOperation("按任务获取当日所有意向数据")
@GetMapping("/countClueByTaskId")
CommonResponse<Integer> countClueByTaskId(@RequestParam(value = "taskId") Long taskId,
@RequestParam(value = "beginTime") String beginTime,
@RequestParam(value = "endTime") String endTime);
}

@ -83,4 +83,9 @@ public class SourceClueClientFallback implements SourceClueClient {
return null;
}
@Override
public CommonResponse<Integer> countClueByTaskId(Long taskId, String beginTime, String endTime) {
return null;
}
}

@ -64,8 +64,10 @@ public class TaskReport implements Serializable {
@ApiModelProperty(value = "所属公司")
@Column(name = "company_id")
private Long companyId;
@ApiModelProperty(value = "意向数")
@Column(name = "intention_num")
private Integer intentionNum;
public TaskReport() {
}
}

@ -53,6 +53,9 @@ public class UploadTaskDTO implements Serializable {
@ExcelProperty(value = "平均通话时长(秒)", index = 6)
private Double breatheAverageDuration;
@ExcelProperty(value = "标签", index = 7)
@ExcelProperty(value = "意向数", index = 7)
private Integer intentionNum;
@ExcelProperty(value = "标签", index = 8)
private String label;
}

@ -108,7 +108,7 @@ public class QueryReportServiceImpl implements QueryReportService {
// TODO: 2022/5/6 0006 这里将统计今日的数据
boolean betweenDays = DateTimeUtil.betweenByDay(DateUtil.date(), DateUtil.parseDate(condition.getEndTime()));
if (betweenDays) {
if (!betweenDays) {
List<CallClueInfo> callClueInfos = callClueRepository.queryAllByTimeAndTaskId(DateUtil.beginOfDay(DateUtil.date()).toString(), DateUtil.date().toString(), condition.getIds());
List<TaskReport> list = reportSync.autoCountReportByTask(DateUtil.beginOfDay(DateUtil.date()).toString(), DateUtil.date().toString(), callClueInfos);
if (CollUtil.isEmpty(taskReports)) {
@ -121,13 +121,11 @@ public class QueryReportServiceImpl implements QueryReportService {
if (taskReports == null) {
return CommonResponse.createByErrorMessage("请检查时间类型是否错误");
}
Map<Long, List<TaskReport>> map = new HashMap<>();
//对查询的所有统计信息 按任务id分组
taskReports.stream().collect(Collectors.groupingBy(TaskReport::getTaskId, Collectors.toList())).forEach(map::put);
Map<Long, List<TaskReport>> map = new HashMap<>(taskReports.stream().collect(Collectors.groupingBy(TaskReport::getTaskId, Collectors.toList())));
Date begin = DateUtil.parseDate(condition.getBeginTime());
Date end = DateUtil.parseDate(condition.getEndTime());
//按月统计
if (s.getType() == DefaultNumberConstants.THREE_NUMBER) {
for (Long key : map.keySet()) {
@ -156,13 +154,21 @@ public class QueryReportServiceImpl implements QueryReportService {
//按时间分组
List<TaskReport> collect = map.get(key).stream().filter(c -> DateTimeUtil.betweenByDay(dateTime, c.getCreateTime())).collect(Collectors.toList());
dateMap.put("createTime", DateUtil.format(dateTime, "yyyy-MM-dd"));
double usrRate = 0.0;
// double usrRate = 0.0;
int usrNum = 0;
int turnOnNum = 0;
int intentionNum = 0;
if (collect.size() > 0) {
//只会有一条数据
TaskReport taskReport = collect.get(0);
usrRate = NumberUtil.div(taskReport.getUsrNum(), taskReport.getTotalNum(), 2).doubleValue();
usrNum += taskReport.getUsrNum();
turnOnNum += taskReport.getTurnOnNum();
intentionNum += taskReport.getIntentionNum();
// usrRate = NumberUtil.div(taskReport.getUsrNum(), taskReport.getTotalNum(), 2).doubleValue();
}
dateMap.put("usrRate", usrRate);
dateMap.put("usrNum", usrNum);
dateMap.put("turnOnNum", turnOnNum);
dateMap.put("intentionNum", intentionNum);
timeList.add(dateMap);
}
resultMap.put("data", timeList);
@ -199,7 +205,7 @@ public class QueryReportServiceImpl implements QueryReportService {
(id, transfer) -> {
transfer.stream().reduce((a, b) -> new TaskReport(a.getId(), null, a.getTaskId(), a.getTaskName(), a.getTotalNum(),
a.getUsrNum() + b.getUsrNum(), a.getTurnOnNum() + b.getTurnOnNum(), NumberUtil.div(a.getTurnOnNum() + b.getTurnOnNum(), a.getUsrNum() + b.getUsrNum(), 2), a.getBreatheTotalDuration() + b.getBreatheTotalDuration(), a.getBreatheAverageDuration() + b.getBreatheAverageDuration(),
a.getLabel(), a.getCompanyId()
a.getLabel(), a.getCompanyId(), a.getIntentionNum() + b.getIntentionNum()
)).ifPresent(list::add);
}
);
@ -745,13 +751,21 @@ public class QueryReportServiceImpl implements QueryReportService {
private void getMapByTime(Date time, List<TaskReport> collect, List<Map<String, Object>> list) {
Map<String, Object> mapByUsrRate = new HashMap<>(2);
double usrRate = 0;
int usrNum = 0;
int turnOnNum = 0;
int intentionNum = 0;
for (TaskReport info : collect) {
int usrNum = info.getUsrNum();
long totalNum = info.getTotalNum();
usrRate += NumberUtil.div(usrNum, totalNum, 2);
usrNum += info.getUsrNum();
turnOnNum += info.getTurnOnNum();
intentionNum += info.getIntentionNum();
// long totalNum = info.getTotalNum();
// usrRate += NumberUtil.div(usrNum, totalNum, 2);
}
mapByUsrRate.put("createTime", DateUtil.format(time, "yyyy-MM"));
mapByUsrRate.put("usrRate", usrRate);
// mapByUsrRate .put("usrRate", usrRate);
mapByUsrRate.put("usrNum", usrNum);
mapByUsrRate.put("turnOnNum", turnOnNum);
mapByUsrRate.put("intentionNum", intentionNum);
list.add(mapByUsrRate);
}
@ -881,8 +895,8 @@ public class QueryReportServiceImpl implements QueryReportService {
public static void main(String[] args) {
Long createTime = 1661762157L;
DateTime date = DateUtil.date(createTime);
int compare = DateUtil.compare( DateUtil.date(),date);
System.out.println(compare>30);
int compare = DateUtil.compare(DateUtil.date(), date);
System.out.println(compare > 30);
}
}

@ -145,6 +145,8 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/api/task/query").permitAll()
.antMatchers("/api/task/sendErrMessage").permitAll()
.antMatchers("/api/organize/queryAll").permitAll()
.antMatchers("/api/organize/findNameById").permitAll()
.antMatchers("/api/organize/findOrganizeIdByMember").permitAll()
.antMatchers("/api/back/cdrUrl").permitAll()
.antMatchers("/api/back/status").permitAll()
.antMatchers("/api/roll/cdrUrl").permitAll()

@ -3,6 +3,7 @@ package com.baiye.modules.system.domain;
import com.baiye.model.dto.UserDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@ -14,6 +15,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.io.Serializable;
import java.util.List;
/**
*
*
@ -27,58 +29,63 @@ import java.util.List;
@EntityListeners(AuditingEntityListener.class)
public class Organize implements Serializable {
private static final long serialVersionUID = 8623354712013889005L;
@Id
@ApiModelProperty(value = "ID")
@Column(name = "organize_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ApiModelProperty(value = "小组名称")
@NotBlank(message = "小组名称不能为空")
@Column(name = "organize_name")
private String organizeName;
@ApiModelProperty(value = "组呼叫方式0:双呼 1:点呼 2:AXB")
@NotNull(message = "请选择呼叫方式")
@Column(name = "call_mode")
private Integer callMode;
@ApiModelProperty(value = "创建人")
@Column(name = "create_by")
private Long createBy;
@ApiModelProperty(value = "更新人")
@Column(name = "update_by")
private Long updateBy;
@ApiModelProperty(value = "创建时间")
@Column(name = "create_time")
@CreationTimestamp
private java.util.Date createTime;
@ApiModelProperty(value = "更新时间")
@Column(name = "update_time")
@LastModifiedDate
private java.util.Date updateTime;
@Transient
@ApiModelProperty(value = "描述")
private String remark;
@Transient
private User user;
@Transient
@NotNull(message = "组长不能为空")
private Long userId;
@Transient
@ApiModelProperty(value = "用户列表")
private List<UserDto> userList;
@ApiModelProperty(value = "分配比例")
@Transient
private Double ratio;
private static final long serialVersionUID = 8623354712013889005L;
@Id
@ApiModelProperty(value = "ID")
@Column(name = "organize_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ApiModelProperty(value = "小组名称")
@NotBlank(message = "小组名称不能为空")
@Column(name = "organize_name")
private String organizeName;
@ApiModelProperty(value = "组呼叫方式0:双呼 1:点呼 2:AXB")
@NotNull(message = "请选择呼叫方式")
@Column(name = "call_mode")
private Integer callMode;
@ApiModelProperty(value = "创建人")
@Column(name = "create_by")
private Long createBy;
@ApiModelProperty(value = "更新人")
@Column(name = "update_by")
private Long updateBy;
@ApiModelProperty(value = "创建时间")
@Column(name = "create_time")
@CreationTimestamp
private java.util.Date createTime;
@ApiModelProperty(value = "更新时间")
@Column(name = "update_time")
@LastModifiedDate
private java.util.Date updateTime;
@ApiModelProperty(value = "是否可以查看组员线索0-false 1-true")
@Column(name = "is_enabled")
@NotNull
private Boolean isEnabled;
@Transient
@ApiModelProperty(value = "描述")
private String remark;
@Transient
private User user;
@Transient
@NotNull(message = "组长不能为空")
private Long userId;
@Transient
@ApiModelProperty(value = "用户列表")
private List<UserDto> userList;
@ApiModelProperty(value = "分配比例")
@Transient
private Double ratio;
}

@ -31,4 +31,14 @@ public interface OrganizeRepository extends JpaRepository<Organize, Long>, JpaSp
List<Organize> findAllByCreateBy(Long id);
Set<Organize> findByCreateBy(Long currentUserId);
/**
* idid()
* @param userId
* @param isEnabled
* @param isLeader
* @return
*/
@Query(value = "select o.* from tb_organize o left join tb_organize_user u on o.organize_id=u.organize_id where o.is_enabled =?2 and u.user_id = ?1 and u.is_leader=?3", nativeQuery = true)
Organize findOrganizeIdByMember(Long userId, Boolean isEnabled, Boolean isLeader);
}

@ -1,5 +1,6 @@
package com.baiye.modules.system.repository;
import com.baiye.modules.system.domain.Organize;
import com.baiye.modules.system.domain.OrganizeUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@ -117,4 +118,5 @@ public interface OrganizeUserRepository extends JpaRepository<OrganizeUser, Long
List<Long> findOrganizeByUserId(Long userId);
List<OrganizeUser> findByOrganizeIdIn(Set<Long> organizeIdAll);
}

@ -25,6 +25,7 @@ import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author YQY
@ -168,4 +169,15 @@ public class OrganizeController {
return new ResponseEntity<>(organizeService.selectAllOrganizeUser(), HttpStatus.OK);
}
@PostMapping("/findNameById")
@ApiOperation("根据id查询组名")
public Map<Long, String> findNameById(@RequestBody Set<Long> organizeIds) {
return organizeService.findNameById(organizeIds);
}
@GetMapping("/findOrganizeIdByMember")
@ApiOperation("根据用户id查询组id(有权限查看组员信息,并且是组长)")
public ResponseEntity<Long> findOrganizeIdByMember(@RequestParam("memberId") Long memberId) {
return organizeService.findOrganizeIdByMember(memberId);
}
}

@ -14,6 +14,7 @@ import org.springframework.http.ResponseEntity;
import java.util.List;
import java.util.Map;
import java.util.Set;
public interface OrganizeService {
@ -86,6 +87,7 @@ public interface OrganizeService {
/**
* ( + )
*
* @param organizeQueryCriteria
* @param pageable
* @return
@ -142,6 +144,7 @@ public interface OrganizeService {
/**
* ()
*
* @param clueDto
* @return
*/
@ -149,12 +152,14 @@ public interface OrganizeService {
/**
*
*
* @return
*/
List<Organize> selectAllOrganize();
/**
* id
*
* @param teamId
* @return
*/
@ -162,20 +167,37 @@ public interface OrganizeService {
/**
*
*
* @return
*/
Map<String, Object> selectCallMode();
/**
*
*
* @return
*/
Map<String, Object> selectAllOrganizeUser();
Map<String, Object> selectAllOrganizeUser();
/**
* id
*
* @param userId
* @return
*/
Organize getOrganizeByUserId(Long userId);
/**
* id
* @param organizeIds
* @return
*/
Map<Long, String> findNameById(Set<Long> organizeIds);
/**
* idid()
* @param memberId
* @return
*/
ResponseEntity<Long> findOrganizeIdByMember(Long memberId);
}

@ -17,9 +17,9 @@ import java.util.Map;
@Getter
@Setter
public class OrganizeDto implements Serializable {
public class OrganizeDto{
@JsonSerialize(using= ToStringSerializer.class)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
private String organizeName;
@ -34,6 +34,8 @@ public class OrganizeDto implements Serializable {
private String remark;
private Boolean isEnabled;
@ApiModelProperty(value = "用户id")
private Long userId;

@ -1,6 +1,7 @@
package com.baiye.modules.system.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.constant.RoleNumberConstants;
import com.baiye.exception.BadRequestException;
@ -82,7 +83,7 @@ public class OrganizeServiceImpl implements OrganizeService {
OrganizeUser organizeUser = new OrganizeUser();
organizeUser.setOrganizeId(saveOrganize.getId());
Long roleId = Collections.min(roleService.findByUsersId(organize.getUserId()).stream().map(RoleSmallDto::getId).collect(Collectors.toList()));
if (!roleId.equals(RoleNumberConstants.MINUS_NINE_NUMBER)){
if (!roleId.equals(RoleNumberConstants.MINUS_NINE_NUMBER)) {
throw new BadRequestException("指定组长必须是组长角色");
}
organizeUser.setUserId(organize.getUserId());
@ -107,7 +108,7 @@ public class OrganizeServiceImpl implements OrganizeService {
// 判断组长是否分配过资源
if (!organizeUser.getUserId().equals(organize.getUserId())) {
Long roleId = Collections.min(roleService.findByUsersId(organize.getUserId()).stream().map(RoleSmallDto::getId).collect(Collectors.toList()));
if (!roleId.equals(RoleNumberConstants.MINUS_NINE_NUMBER)){
if (!roleId.equals(RoleNumberConstants.MINUS_NINE_NUMBER)) {
throw new BadRequestException("指定组长必须是组长角色");
}
Boolean flag = sourceClueClient.judgeMember(organizeUser.getUserId()).getBody();
@ -129,8 +130,15 @@ public class OrganizeServiceImpl implements OrganizeService {
updateOrganize.setCallMode(organize.getCallMode());
// 设置一个无用的字段save方法会验证validation的验证参数
updateOrganize.setUserId(0L);
if (organize.getIsEnabled() != null) {
updateOrganize.setIsEnabled(organize.getIsEnabled());
}
organizeRepository.save(updateOrganize);
} else if (organize.getIsEnabled() != null) {
updateOrganize.setIsEnabled(organize.getIsEnabled());
organizeRepository.save(updateOrganize);
}
if (organize.getUserId() != null) {
// 修改所有组员的父ID(组长用户ID)
organizeUserRepository.updateUserId(organize.getId(), organize.getUserId());
@ -216,7 +224,7 @@ public class OrganizeServiceImpl implements OrganizeService {
*/
@Override
public Map<String, Object> queryMemberAll(OrganizeUserQueryCriteria organizeUserQueryCriteria, Pageable pageable) {
List<Map<String, Object>> maps = findMember(organizeUserQueryCriteria,false);
List<Map<String, Object>> maps = findMember(organizeUserQueryCriteria, false);
return PageUtil.toPage(
PageUtil.toPage(pageable.getPageNumber(), pageable.getPageSize(), maps),
maps.size()
@ -228,7 +236,7 @@ public class OrganizeServiceImpl implements OrganizeService {
*/
@Override
public List<Map<String, Object>> queryMember(OrganizeUserQueryCriteria organizeUserQueryCriteria) {
return findMember(organizeUserQueryCriteria,true);
return findMember(organizeUserQueryCriteria, true);
}
/**
@ -277,7 +285,7 @@ public class OrganizeServiceImpl implements OrganizeService {
task.setIsEncryption(organizeSaveDTO.getIsEncryption());
//插入标签
List<String> labelList = labelService.findLabelList(labelOrganizeId);
if (CollUtil.isNotEmpty(labelList)){
if (CollUtil.isNotEmpty(labelList)) {
task.setBaseLabel(labelList);
}
taskRepository.save(task);
@ -449,7 +457,7 @@ public class OrganizeServiceImpl implements OrganizeService {
Map<Long, List<Label>> collect = labelOrganizeService.organizeIdGroup(labelOrganizeIds);
for (TaskOrganizeDto taskOrganizeDto : taskOrganizeDtos) {
Long taskId = taskOrganizeDto.getTaskId();
if (taskMap.containsKey(taskId)){
if (taskMap.containsKey(taskId)) {
Task task = taskMap.get(taskId).get(0);
taskOrganizeDto.setBaseLabel(task.getBaseLabel());
//插入标签信息
@ -661,6 +669,27 @@ public class OrganizeServiceImpl implements OrganizeService {
return organizeRepository.findOrganize(userId);
}
@Override
public Map<Long, String> findNameById(Set<Long> organizeIds) {
Map<Long, String> map = new HashMap<>();
List<Organize> allById = organizeRepository.findAllById(organizeIds);
if (CollUtil.isNotEmpty(allById)) {
for (Organize organize : allById) {
map.put(organize.getId(), organize.getOrganizeName());
}
}
return map;
}
@Override
public ResponseEntity<Long> findOrganizeIdByMember(Long memberId) {
Organize organizeIdByMember = organizeRepository.findOrganizeIdByMember(memberId, true, true);
if (ObjectUtil.isNotEmpty(organizeIdByMember) && organizeIdByMember.getId() != null) {
return new ResponseEntity<>(organizeIdByMember.getId(), HttpStatus.OK);
}
return new ResponseEntity<>(null, HttpStatus.OK);
}
/**
* id
*/
@ -729,18 +758,19 @@ public class OrganizeServiceImpl implements OrganizeService {
/**
*
*
* @param organizeUserQueryCriteria
* @param isAddLeader
* @return
*/
public List<Map<String, Object>> findMember(OrganizeUserQueryCriteria organizeUserQueryCriteria,Boolean isAddLeader){
public List<Map<String, Object>> findMember(OrganizeUserQueryCriteria organizeUserQueryCriteria, Boolean isAddLeader) {
Long currentUserId = SecurityUtils.getCurrentUserId();
List<Long> userIds = Lists.newArrayList();
organizeUserQueryCriteria.setCreateBy(currentUserId);
organizeUserQueryCriteria.setIsLeader(false);
List<OrganizeUserDto> organizeUserDtos = organizeUserMapper.toDto(organizeUserRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, organizeUserQueryCriteria, criteriaBuilder)));
organizeUserDtos.forEach(c -> userIds.add(c.getUserId()));
if (isAddLeader){
if (isAddLeader) {
userIds.add(currentUserId);
}
return findUser(userIds, organizeUserQueryCriteria);

@ -28,12 +28,13 @@ public class ExtensionNumberController {
@ApiOperation("导入分机号和外显号")
public CommonResponse<String> addNumbers(@RequestParam(value = "file") MultipartFile file,
@RequestParam("display") Long display,
@RequestParam("dyDisplay") Long dyDisplay,
@RequestParam("companyId") Long companyId
) {
if (file == null || display == null || companyId == null) {
if (file == null || companyId == null || (display == null && dyDisplay == null)) {
return CommonResponse.createByErrorMessage("文件,外显号不能为空,请检查");
}
return extensionNumberService.addNumbers(file, display, companyId);
return extensionNumberService.addNumbers(file, display, dyDisplay,companyId);
}
@GetMapping("/get/extension")

@ -0,0 +1,18 @@
package com.baiye.modules.telemarkting.dao;
import com.baiye.modules.telemarkting.entity.ExtensionDisplay;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
@Repository
public interface ExtensionDisplayRepository extends JpaRepository<ExtensionDisplay, Long>, JpaSpecificationExecutor<ExtensionDisplay> {
/**
*
*
* @param companyId
* @return
*/
ExtensionDisplay findExtensionDisplayByCompanyId(Long companyId);
}

@ -17,19 +17,31 @@ import java.util.List;
public interface ExtensionNumberRepository extends JpaRepository<ExtensionNumber, Long>, JpaSpecificationExecutor<ExtensionNumber> {
/**
*
*
* @param status
* id
* @param status
* @param companyId id
* @return
*/
@Query(value = "SELECT number FROM tb_extension_number WHERE status = ?1 AND company_id = ?2 LIMIT 0, 1", nativeQuery = true)
Integer findIdByStatusAndCompanyId(Integer status, Long companyId);
/**
*
* @param status
* @param id
*/
@Modifying
@Query(value = "update ExtensionNumber c set c.status =?1 where c.number = ?2")
void updateStatusById(Integer status, Integer id);
@Query(value = "select n.* from tb_extension_number n left join tb_extension_user u on n.number = u.number where u.member_id = ?1", nativeQuery = true)
/**
*
* @param memberId
* @return
*/
@Query(value = "select n.*from tb_extension_number n " +
"left join tb_extension_user u on n.number = u.number " +
"where u.member_id = ?1 ", nativeQuery = true)
ExtensionNumber selectByMemberId(Long memberId);
@Modifying
@ -38,6 +50,7 @@ public interface ExtensionNumberRepository extends JpaRepository<ExtensionNumber
/**
* id
*
* @param companyId
* @return
*/

@ -0,0 +1,37 @@
package com.baiye.modules.telemarkting.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.io.Serializable;
/**
* @author jt
*/
@Getter
@Setter
@Entity
@Table(name = "tb_extension_display")
@EntityListeners(AuditingEntityListener.class)
public class ExtensionDisplay implements Serializable {
@Id
@ApiModelProperty(value = "主键id自动递增")
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "company_id")
@ApiModelProperty(value = "所属公司")
private Long companyId;
@Column(name = "display")
@ApiModelProperty(value = "去显号")
private Long display;
@Column(name = "dy_display")
@ApiModelProperty(value = "抖音去显号")
private Long dyDisplay;
}

@ -33,10 +33,6 @@ public class ExtensionNumber implements Serializable {
@ApiModelProperty(value = "分机号")
private Integer number;
@Column(name = "display")
@ApiModelProperty(value = "外显号")
private Long display;
@Column(name = "company_id")
@ApiModelProperty(value = "所属公司")
private Long companyId;
@ -45,4 +41,13 @@ public class ExtensionNumber implements Serializable {
@Column(name = "create_time")
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "外显号")
@Transient
private Long display;
@ApiModelProperty(value = "抖音外显号")
@Transient
private Long dyDisplay;
}

@ -25,7 +25,6 @@ public class TelephoneCallReqDTO implements Serializable {
@NotNull
private String telB;
@ApiModelProperty("telX")
private String telX;
@ -46,7 +45,6 @@ public class TelephoneCallReqDTO implements Serializable {
@NotNull
private Long taskId;
@ApiModelProperty("公司名称")
private String companyName;
@ -55,6 +53,10 @@ public class TelephoneCallReqDTO implements Serializable {
@ApiModelProperty(value = "组呼叫方式0:双呼 1:点呼 2:AXB")
private Integer callMode;
@ApiModelProperty("分机号")
private Long display;
@ApiModelProperty(value = "线索类型 0-正常任务得线索 1-飞鱼任务过来的线索")
private Integer clueType;
}

@ -11,7 +11,7 @@ import org.springframework.web.multipart.MultipartFile;
*/
public interface ExtensionNumberService {
CommonResponse<String> addNumbers(MultipartFile file, Long display, Long companyId);
CommonResponse<String> addNumbers(MultipartFile file, Long display, Long dyDisplay, Long companyId);
ExtensionNumber getExtension(Long memberId);

@ -1,6 +1,7 @@
package com.baiye.modules.telemarkting.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.baiye.constant.DefaultNumberConstants;
@ -8,14 +9,15 @@ import com.baiye.exception.BadRequestException;
import com.baiye.http.CommonResponse;
import com.baiye.modules.system.domain.User;
import com.baiye.modules.system.repository.UserRepository;
import com.baiye.modules.telemarkting.dao.ExtensionDisplayRepository;
import com.baiye.modules.telemarkting.dao.ExtensionNumberRepository;
import com.baiye.modules.telemarkting.dao.ExtensionUserRepository;
import com.baiye.modules.telemarkting.entity.ExtensionDisplay;
import com.baiye.modules.telemarkting.entity.ExtensionNumber;
import com.baiye.modules.telemarkting.entity.ExtensionUser;
import com.baiye.modules.telemarkting.service.ExtensionNumberService;
import com.baiye.util.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@ -38,10 +40,13 @@ public class ExtensionNumberServiceImpl implements ExtensionNumberService {
@Resource
private ExtensionUserRepository extensionUserRepository;
@Resource
private ExtensionDisplayRepository extensionDisplayRepository;
@Resource
private UserRepository userRepository;
@Override
public CommonResponse<String> addNumbers(MultipartFile file, Long display, Long companyId) {
@Transactional(rollbackFor = Exception.class)
public CommonResponse<String> addNumbers(MultipartFile file, Long display, Long dyDisplay, Long companyId) {
List<ExtensionNumber> list = new ArrayList<>();
try {
int lastIndexOf = Objects.requireNonNull(file.getOriginalFilename()).lastIndexOf(".");
@ -53,10 +58,10 @@ public class ExtensionNumberServiceImpl implements ExtensionNumberService {
String number = String.valueOf(objects.get(0));
ExtensionNumber extensionNumber = new ExtensionNumber();
extensionNumber.setNumber(Integer.valueOf(number));
extensionNumber.setDisplay(display);
extensionNumber.setCompanyId(companyId);
list.add(extensionNumber);
}
}
} catch (Exception e) {
log.error("读取文件错误:{}", e.getMessage());
@ -64,13 +69,36 @@ public class ExtensionNumberServiceImpl implements ExtensionNumberService {
}
if (list.size() > 0) {
extensionNumberRepository.saveAll(list);
ExtensionDisplay extensionDisplay = extensionDisplayRepository.findExtensionDisplayByCompanyId(companyId);
if (ObjectUtil.isEmpty(extensionDisplay)) {
extensionDisplay=new ExtensionDisplay();
extensionDisplay.setDisplay(display);
extensionDisplay.setCompanyId(companyId);
extensionDisplay.setDyDisplay(dyDisplay);
} else {
if (display != null) {
extensionDisplay.setDisplay(display);
}
if (dyDisplay != null) {
extensionDisplay.setDyDisplay(dyDisplay);
}
}
extensionDisplayRepository.save(extensionDisplay);
}
return CommonResponse.createBySuccess();
}
@Override
public ExtensionNumber getExtension(Long memberId) {
return extensionNumberRepository.selectByMemberId(memberId);
ExtensionNumber extensionNumber = extensionNumberRepository.selectByMemberId(memberId);
if (ObjectUtil.isNotEmpty(extensionNumber)) {
ExtensionDisplay extensionDisplay = extensionDisplayRepository.findExtensionDisplayByCompanyId(extensionNumber.getCompanyId());
if (ObjectUtil.isNotEmpty(extensionDisplay)) {
extensionNumber.setDisplay(extensionDisplay.getDisplay());
extensionNumber.setDyDisplay(extensionDisplay.getDyDisplay());
}
}
return extensionNumber;
}
@Override

@ -5,7 +5,6 @@ import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.feign.SourceClueClient;
@ -14,11 +13,9 @@ import com.baiye.model.enums.CallStatusEnum;
import com.baiye.modules.system.domain.Clue;
import com.baiye.modules.telemarkting.dao.AllCallInfoRepository;
import com.baiye.modules.telemarkting.dao.CallClueRepository;
import com.baiye.modules.telemarkting.dao.ExtensionDisplayRepository;
import com.baiye.modules.telemarkting.dao.ExtensionNumberRepository;
import com.baiye.modules.telemarkting.entity.AllCallInfo;
import com.baiye.modules.telemarkting.entity.CallClueInfo;
import com.baiye.modules.telemarkting.entity.ClueMiddle;
import com.baiye.modules.telemarkting.entity.ExtensionNumber;
import com.baiye.modules.telemarkting.entity.*;
import com.baiye.modules.telemarkting.entity.dto.*;
import com.baiye.modules.telemarkting.httpRequest.AxbRequest;
import com.baiye.modules.telemarkting.httpRequest.DoubleCallReq;
@ -57,6 +54,8 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
private SourceClueClient sourceClueClient;
@Resource
private ExtensionNumberRepository extensionNumberRepository;
@Resource
private ExtensionDisplayRepository extensionDisplayRepository;
@Override
public CommonResponse<String> doubleCallReq(TelephoneCallReqDTO doubleCallReq, Long companyId) {
@ -123,14 +122,10 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
callClueRepository.updateByStatus(status, userDate);
allCallInfoRepository.updateByStatus(status, sessionId);
//更新资源通话状态
CompletableFuture.runAsync(() -> {
updateSourceCallStatus(userDate, DefaultNumberConstants.TWO_NUMBER);
});
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.TWO_NUMBER));
} else {
//更新资源通话状态
CompletableFuture.runAsync(() -> {
updateSourceCallStatus(userDate, DefaultNumberConstants.ONE_NUMBER);
});
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.ONE_NUMBER));
}
}
@ -189,13 +184,29 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
telephoneCallReqDTO.setRequestId(requestId);
if (telephoneCallReqDTO.getDisplay() == null || telephoneCallReqDTO.getTelA() == null) {
//获取分机号
//TODO 新需求,外显号多个
ExtensionNumber extensionNumber = extensionNumberRepository.selectByMemberId(telephoneCallReqDTO.getMemberId());
if (extensionNumber == null) {
log.error("未配置分机号");
return CommonResponse.createByErrorMessage("未配置分机号");
}
ExtensionDisplay extensionDisplay = extensionDisplayRepository.findExtensionDisplayByCompanyId(extensionNumber.getCompanyId());
if (ObjectUtil.isNull(extensionDisplay)) {
return CommonResponse.createByErrorMessage("未配置去显号");
}
if (extensionDisplay.getDisplay() == null && extensionDisplay.getDyDisplay() == null) {
return CommonResponse.createByErrorMessage("未配置去显号");
}
telephoneCallReqDTO.setTelA(String.valueOf(extensionNumber.getNumber()));
telephoneCallReqDTO.setDisplay(extensionNumber.getDisplay());
if (extensionDisplay.getDisplay() != null) {
telephoneCallReqDTO.setDisplay(extensionDisplay.getDisplay());
}
if (telephoneCallReqDTO.getClueType() != null && telephoneCallReqDTO.getClueType() == DefaultNumberConstants.ONE_NUMBER) {
if (extensionDisplay.getDyDisplay() == null) {
return CommonResponse.createByErrorMessage("未配置抖音去显号");
}
telephoneCallReqDTO.setDisplay(extensionDisplay.getDyDisplay());
}
}
//获取线索号
Clue body;
@ -213,24 +224,24 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
String reqId = rollCallReq.startReq(telephoneCallReqDTO);
log.info("=============================reqId {}", reqId);
// if (StrUtil.isNotBlank(reqId)) {
AllCallInfo allCallInfo = new AllCallInfo();
allCallInfo.setSessionId(requestId);
allCallInfo.setRequestId(requestId);
allCallInfo.setClueId(Long.parseLong(telephoneCallReqDTO.getUserData()));
allCallInfo.setMemberId(telephoneCallReqDTO.getMemberId());
allCallInfo.setStatus(DefaultNumberConstants.ONE_NUMBER);
allCallInfo.setType(DefaultNumberConstants.TWO_NUMBER);
allCallInfo.setRecordFlag(DefaultNumberConstants.ZERO_NUMBER);
AllCallInfo allCallInfo = new AllCallInfo();
allCallInfo.setSessionId(requestId);
allCallInfo.setRequestId(requestId);
allCallInfo.setClueId(Long.parseLong(telephoneCallReqDTO.getUserData()));
allCallInfo.setMemberId(telephoneCallReqDTO.getMemberId());
allCallInfo.setStatus(DefaultNumberConstants.ONE_NUMBER);
allCallInfo.setType(DefaultNumberConstants.TWO_NUMBER);
allCallInfo.setRecordFlag(DefaultNumberConstants.ZERO_NUMBER);
CallClueInfo clueInfo = new CallClueInfo();
clueInfo.setClueId(Long.parseLong(telephoneCallReqDTO.getUserData()));
clueInfo.setTeamId(telephoneCallReqDTO.getTeamId());
clueInfo.setMemberId(telephoneCallReqDTO.getMemberId());
clueInfo.setStatus(DefaultNumberConstants.ONE_NUMBER);
clueInfo.setTaskId(telephoneCallReqDTO.getTaskId());
clueInfo.setCompanyId(companyId);
allCallInfoRepository.save(allCallInfo);
callClueRepository.save(clueInfo);
CallClueInfo clueInfo = new CallClueInfo();
clueInfo.setClueId(Long.parseLong(telephoneCallReqDTO.getUserData()));
clueInfo.setTeamId(telephoneCallReqDTO.getTeamId());
clueInfo.setMemberId(telephoneCallReqDTO.getMemberId());
clueInfo.setStatus(DefaultNumberConstants.ONE_NUMBER);
clueInfo.setTaskId(telephoneCallReqDTO.getTaskId());
clueInfo.setCompanyId(companyId);
allCallInfoRepository.save(allCallInfo);
callClueRepository.save(clueInfo);
// } else {
// return CommonResponse.createByError();
// }
@ -261,14 +272,10 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
callClueRepository.updateByStatus(DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueId());
allCallInfoRepository.updateByDurationAndStatus(DefaultNumberConstants.TWO_NUMBER, Integer.valueOf(rollCallBackDTO.getDuration()), allCallInfo.getId());
//更新资源通话状态
CompletableFuture.runAsync(() -> {
updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.TWO_NUMBER);
});
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.TWO_NUMBER));
} else {
//更新资源通话状态
CompletableFuture.runAsync(() -> {
updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.ONE_NUMBER);
});
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.ONE_NUMBER));
}
}
}

@ -7,6 +7,8 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.feign.SourceClueClient;
import com.baiye.http.CommonResponse;
import com.baiye.modules.report.dao.TaskReportRepository;
import com.baiye.modules.report.dao.UserReportRepository;
import com.baiye.modules.report.entity.TaskReport;
@ -46,6 +48,7 @@ public class ReportSync {
private final TaskReportRepository taskReportRepository;
private final UserRepository userRepository;
private final UserReportRepository userReportRepository;
private final SourceClueClient sourceClueClient;
/**
* 23
@ -70,9 +73,8 @@ public class ReportSync {
}
public List<TaskReport> autoCountReportByTask(String beginOfDay, String endOfDay, List<CallClueInfo> callClueInfos) {
HashMap<Long, List<CallClueInfo>> map = new HashMap<>();
//根据任务id分组
callClueInfos.stream().collect(Collectors.groupingBy(CallClueInfo::getTaskId, Collectors.toList())).forEach(map::put);
HashMap<Long, List<CallClueInfo>> map = new HashMap<>(callClueInfos.stream().collect(Collectors.groupingBy(CallClueInfo::getTaskId, Collectors.toList())));
List<TaskReport> list = new ArrayList<>();
for (Long key : map.keySet()) {
Task taskInfo = taskRepository.findByIsDistributionAndId(DefaultNumberConstants.ONE_NUMBER, key);
@ -102,15 +104,18 @@ public class ReportSync {
countInfo.setLabel(label.toString());
countInfo.setCreateTime(DateUtil.date());
countInfo.setCompanyId(map.get(key).get(0).getCompanyId());
//统计当日意向数
Integer intentionNum = sourceClueClient.countClueByTaskId(key, beginOfDay, endOfDay).getData();
countInfo.setIntentionNum(intentionNum);
list.add(countInfo);
}
return list;
}
public List<UserReport> autoCountReportByUser(String beginOfDay, String endOfDay, List<CallClueInfo> callClueInfos) {
HashMap<Long, List<CallClueInfo>> map = new HashMap<>();
//根据人员id分组
callClueInfos.stream().collect(Collectors.groupingBy(CallClueInfo::getMemberId, Collectors.toList())).forEach(map::put);
HashMap<Long, List<CallClueInfo>> map = new HashMap<>(callClueInfos.stream().collect(Collectors.groupingBy(CallClueInfo::getMemberId, Collectors.toList())));
List<UserReport> list = new ArrayList<>();
for (Long key : map.keySet()) {
Organize organize = organizeRepository.findOrganize(key);

@ -16,6 +16,7 @@ public class DateTimeUtil {
* @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);

@ -0,0 +1,43 @@
package com.baiye;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.sql.SQLOutput;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AdPlatformManagementApplication.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SyncTest {
@Test
public void test() {
String json = "{\"business\":[{\"display_value\":\"X1663888544588148\",\"field_name\":\"wcode\",\"value\":\"X1663888544588148\",\"key\":\"wcode\"}],\"方便接听电话的时间?\":\"任何时间都可以\",\"business_dict\":{\"wcode\":\"X1663888544588148\"},\"债务金额(工程款,私人借贷无法受理请勿填写)\":\"20w以上\",\"债务类型(工程款,私人借贷无法受理请勿填写)\":\"信用卡+网贷逾期\"}\n";
JSONObject jsonObject = JSONUtil.parseObj(json);
HashMap<String, Object> map = JSONUtil.toBean(jsonObject, HashMap.class);
StringBuilder stringBuilder = new StringBuilder();
for (String key : map.keySet()) {
if (checkCountName(key)) {
stringBuilder.append(key).append(": ").append(map.get(key)).append(" ; ");
}
}
System.out.println(stringBuilder);
}
public boolean checkCountName(String countName) {
Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
Matcher m = p.matcher(countName);
if (m.find()) {
return true;
}
return false;
}
}

@ -12,14 +12,16 @@ import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
import java.util.Set;
@FeignClient(value = "ad-platform-management",fallback = OrganizeClientFallback.class)
@FeignClient(value = "ad-platform-management", fallback = OrganizeClientFallback.class)
public interface OrganizeClient {
String PAY_PREFIX = "/api/organize";
/**
*
*
* @param clueDto
* @return
*/
@ -29,4 +31,12 @@ public interface OrganizeClient {
@ApiOperation("查询组")
@GetMapping(PAY_PREFIX + "/query")
ResponseEntity<Object> query(@RequestParam("id") Long organizeId);
@PostMapping(PAY_PREFIX + "/findNameById")
@ApiOperation("根据id查询组名")
Map<Long, String> findNameById(@RequestBody Set<Long> organizeIds);
@GetMapping(PAY_PREFIX+ "/findOrganizeIdByMember")
@ApiOperation("根据用户id查询组id(有权限查看组员信息,并且是组长)")
ResponseEntity<Long> findOrganizeIdByMember(@RequestParam("memberId") Long memberId);
}

@ -7,6 +7,7 @@ import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Component
public class OrganizeClientFallback implements OrganizeClient {
@ -21,4 +22,14 @@ public class OrganizeClientFallback implements OrganizeClient {
public ResponseEntity<Object> query(Long organizeId) {
return null;
}
@Override
public Map<Long, String> findNameById(Set<Long> organizeIds) {
return null;
}
@Override
public ResponseEntity<Long> findOrganizeIdByMember(Long memberId) {
return null;
}
}

@ -175,6 +175,14 @@ public class ClueController {
return CommonResponse.createBySuccess(clueService.queryClueByAdmin(memberId));
}
@ApiOperation("按任务获取当日所有意向数据")
@GetMapping("/countClueByTaskId")
public CommonResponse<Integer> countClueByTaskId(@RequestParam(value = "taskId") Long taskId,
@RequestParam(value = "beginTime") String beginTime,
@RequestParam(value = "endTime") String endTime) {
return CommonResponse.createBySuccess(clueService.countClueByTaskId(taskId, beginTime, endTime));
}
/**
*
*

@ -104,6 +104,9 @@ public class ClueJpa {
if (clueQueryCriteria.getMemberId() != null) {
sql.append("and cm.member_id = :memberId ");
}
if(clueQueryCriteria.getOrganizeId()!=null){
sql.append("and cm.organize_id = :organizeId ");
}
if (clueQueryCriteria.getMemberStatus() != null) {
sql.append("and cm.member_status = :memberStatus ");
}
@ -138,6 +141,9 @@ public class ClueJpa {
if (clueQueryCriteria.getMemberId() != null) {
query.setParameter("memberId", clueQueryCriteria.getMemberId());
}
if (clueQueryCriteria.getOrganizeId() != null) {
query.setParameter("organizeId", clueQueryCriteria.getOrganizeId());
}
if (clueQueryCriteria.getMemberStatus() != null) {
query.setParameter("memberStatus", clueQueryCriteria.getMemberStatus());
}

@ -162,6 +162,17 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, J
@Query(value = " select count(*) from tb_clue_middle as cm left join tb_task as t on cm.task_id=t.task_id where t.create_by =?1 and DATE_FORMAT( cm.clue_stage_time, '%Y-%m-%d') =?2 and cm.clue_stage in ?3", nativeQuery = true)
Integer queryClueByAdmin(Long memberId, String time, List<Integer> stages);
/**
*
* @param taskId
* @param beginTime
* @param endTime
* @param stages
* @return
*/
@Query(value = " select count(*) from tb_clue_middle where (create_time between ?2 and ?3) and task_id =?1 and clue_stage in ?4", nativeQuery = true)
Integer countClueByTaskId(Long taskId, String beginTime, String endTime, List<Integer> stages);
/**
* 线
* @param companyId
@ -179,4 +190,7 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, J
@Query(value = "select * from tb_clue_middle d where d.clue_stage_time >= ?1 and d.clue_stage_time< ?2 and d.member_id in ?3", nativeQuery = true)
List<ClueMiddle> queryAllByTimeAndMemberIds(String beginTime, String endTime,List<Long> memberIds);
@Query(value = "select * from tb_clue_middle d where d.clue_stage_time >= ?1 and d.clue_stage_time< ?2 and d.organize_id in ?3", nativeQuery = true)
List<ClueMiddle> queryAllByTimeAndorganizeIds(String beginTime, String endTime,List<Long> organizeIds);
}

@ -11,6 +11,7 @@ import com.baiye.module.service.dto.ClueRecordCriteria;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
@ -205,6 +206,16 @@ public interface ClueService {
*/
Integer queryClueByAdmin(Long memberId);
/**
*
*
* @param taskId
* @param beginTime
* @param endTime
* @return
*/
Integer countClueByTaskId(Long taskId, String beginTime, String endTime);
/**
*
*

@ -171,9 +171,18 @@ public class ClueServiceImpl implements ClueService {
*/
@Override
public Map<String, Object> queryAll(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
String nid = clueQueryCriteria.getNid();
if (clueQueryCriteria.getMemberId() != null) {
Long organizeId = organizeClient.findOrganizeIdByMember(clueQueryCriteria.getMemberId()).getBody();
//如果查询的小组id不为空 ,说明是组长并有权限查看组员信息
if (organizeId != null) {
clueQueryCriteria.setOrganizeId(organizeId);
clueQueryCriteria.setMemberId(null);
}
List<ClueDto> clueDtoList = clueJpa.getClueList(clueQueryCriteria, pageable);
if (StringUtils.isNotBlank(nid)) { //手机号搜索
clueDtoList = clueDtoList.stream().filter(ct -> ct.getNid().contains(nid)).collect(Collectors.toList());
}
@ -250,7 +259,10 @@ public class ClueServiceImpl implements ClueService {
//通过任务判断线索是否是飞鱼任务
Task task = taskClient.queryDetails(clueDto.getTaskId()).getBody();
if (ObjectUtil.isNotEmpty(task) && task.getIsForm() != null && task.getIsForm() == DefaultNumberConstants.THREE_NUMBER) {
//飞鱼任务得线索
clueDto.setClueType(DefaultNumberConstants.ONE_NUMBER);
} else {
clueDto.setClueType(DefaultNumberConstants.ZERO_NUMBER);
}
}
}
@ -569,6 +581,13 @@ public class ClueServiceImpl implements ClueService {
return clueMiddleRepository.queryClueByAdmin(memberId, DateUtil.today(), stages);
}
@Override
public Integer countClueByTaskId(Long taskId, String beginTime, String endTime) {
//有意向的阶段 3已加微信 4:高意向 5:邀约中 6到场
List<Integer> stages = Arrays.asList(ClueStageEnum.ADD_WECHAT.getKey(), ClueStageEnum.INTENTION.getKey(), ClueStageEnum.INVITING.getKey(), ClueStageEnum.INTERVIEW.getKey());
return clueMiddleRepository.countClueByTaskId(taskId, beginTime, endTime, stages);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void insertDynamicTask(DynamicTaskDto dynamicTaskDto) {
@ -632,16 +651,51 @@ public class ClueServiceImpl implements ClueService {
@Override
public CommonResponse<Object> reportClueStageAndTurnover(ReportStageAndTurnoverDto reportDto) {
if (ObjectUtil.isNull(reportDto) || CollUtil.isEmpty(reportDto.getMemberIds())) {
return CommonResponse.createByErrorMessage("查询人员不能为空");
if (ObjectUtil.isNull(reportDto)) {
return CommonResponse.createByErrorMessage("查询条件不能为空");
}
if (CollUtil.isEmpty(reportDto.getMemberIds()) && CollUtil.isEmpty(reportDto.getOrganizeIds())) {
return CommonResponse.createByErrorMessage("查询小组或人员不能为空");
}
String startTime = reportDto.getStartTime();
String endTime = reportDto.getEndTime();
if (StrUtil.isBlank(reportDto.getStartTime()) || StrUtil.isBlank(reportDto.getEndTime())) {
startTime = DateUtil.beginOfDay(DateUtil.date()).toString();
endTime = DateUtil.date().toString();
}
List<ClueMiddle> clueMiddles = clueMiddleRepository.queryAllByTimeAndMemberIds(startTime, endTime, reportDto.getMemberIds());
List<HashMap<String, Object>> list;
if (reportDto.getOrganizeIds() != null && reportDto.getOrganizeIds().size() > 0) {
list = getOrganizeInfo(startTime, endTime, reportDto.getOrganizeIds());
} else {
list = getMemberInfo(startTime, endTime, reportDto.getMemberIds());
}
return CommonResponse.createBySuccess(list);
}
private List<HashMap<String, Object>> getOrganizeInfo(String startTime, String endTime, List<Long> organizeIds) {
List<ClueMiddle> clueMiddles = clueMiddleRepository.queryAllByTimeAndorganizeIds(startTime, endTime, organizeIds);
Set<Long> ids = clueMiddles.stream().map(ClueMiddle::getOrganizeId).collect(Collectors.toSet());
Map<Long, String> organizeNameMap = organizeClient.findNameById(ids);
//根据组id分组
HashMap<Long, List<ClueMiddle>> map = new HashMap<>(clueMiddles.stream().collect(Collectors.groupingBy(ClueMiddle::getOrganizeId, Collectors.toList())));
List<HashMap<String, Object>> list = new ArrayList<>();
for (Long key : map.keySet()) {
List<ClueMiddle> clueMiddles1 = map.get(key);
HashMap<String, Object> reportMap = getReportMap(clueMiddles1);
reportMap.put("memberId", key);
String name = getMemberName(organizeNameMap.get(key));
reportMap.put("memberName", name);
//处理金额
List<Map<String, Object>> timeMap = getTimeMap(startTime, endTime, clueMiddles1);
reportMap.put("turnoverAmount", timeMap);
list.add(reportMap);
}
return list;
}
private List<HashMap<String, Object>> getMemberInfo(String startTime, String endTime, List<Long> memberIds) {
List<ClueMiddle> clueMiddles = clueMiddleRepository.queryAllByTimeAndMemberIds(startTime, endTime, memberIds);
Set<Long> userIds = clueMiddles.stream().map(ClueMiddle::getMemberId).collect(Collectors.toSet());
Map<Long, String> userNameList = userClient.findById(userIds);
//根据人员id分组
@ -658,10 +712,10 @@ public class ClueServiceImpl implements ClueService {
reportMap.put("turnoverAmount", timeMap);
list.add(reportMap);
}
return CommonResponse.createBySuccess(list);
return list;
}
private String getMemberName(String userName) {
String[] split = userName.split(":");
if (split.length > 1) {

@ -43,7 +43,7 @@ public class OceanEngineSync {
private final ClueRepository clueRepository;
private final ClueMiddleRepository clueMiddleRepository;
@Scheduled(cron = "0 0/15 * * * ?")
// @Scheduled(cron = "0 0/15 * * * ?")
public void getFeiYuSource() {
List<OceanEngineToken> oceanEngineTokens = oceanEngineClient.queryByStatus(1).getBody();
if (CollUtil.isEmpty(oceanEngineTokens)) {

Loading…
Cancel
Save