Merge remote-tracking branch 'origin/master'

master
ninftao 2 years ago
commit d2b0779b0e

@ -0,0 +1,26 @@
package com.baiye.util;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* http
*
* @author pangu
*/
public class HttpContextUtil {
/**
* request
*
* @return HttpServletRequest
*/
public static HttpServletRequest getHttpServletRequest() {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
return (requestAttributes == null) ? null : ((ServletRequestAttributes) requestAttributes).getRequest();
}
}

@ -12,20 +12,20 @@ import java.util.regex.Pattern;
public class MobileUtil {
/**
* 133,149,153,173,177,180,181,189,199,1349,1410,1700,1701,1702
* 133,149,153,173,177,180,181,189,199,191,193,197,1349,1410,1700,1701,1702
**/
private static final String CHINA_TELECOM_PATTERN = "(?:^(?:\\+86)?1(?:33|49|53|7[37]|8[019]|99)\\d{8}$)|(?:^(?:\\+86)?1349\\d{7}$)|(?:^(?:\\+86)?1410\\d{7}$)|(?:^(?:\\+86)?170[0-2]\\d{7}$)";
private static final String CHINA_TELECOM_PATTERN = "(?:^(?:\\+86)?1(?:33|49|53|7[37]|8[019]|9[1379])\\d{8}$)|(?:^(?:\\+86)?1349\\d{7}$)|(?:^(?:\\+86)?1410\\d{7}$)|(?:^(?:\\+86)?170[0-2]\\d{7}$)";
/**
* 130,131,132,145,146,155,156,166,171,175,176,185,186,1704,1707,1708,1709
* 130,131,132,145,146,155,156,166,171,175,176,185,186,196,1704,1707,1708,1709
**/
private static final String CHINA_UNICOM_PATTERN = "(?:^(?:\\+86)?1(?:3[0-2]|4[56]|5[56]|66|7[156]|8[56])\\d{8}$)|(?:^(?:\\+86)?170[47-9]\\d{7}$)";
private static final String CHINA_UNICOM_PATTERN = "(?:^(?:\\+86)?1(?:3[0-2]|4[56]|5[56]|66|7[156]|8[56]|96)\\d{8}$)|(?:^(?:\\+86)?170[47-9]\\d{7}$)";
/**
*
* 134,135,136,137,138,139,147,148,150,151,152,157,158,159,178,182,183,184,187,188,198,1440,1703,1705,1706
* 134,135,136,137,138,139,147,148,150,151,152,157,158,159,178,182,183,184,187,188,198,195,172,148,1440,1703,1705,1706
**/
private static final String CHINA_MOBILE_PATTERN = "(?:^(?:\\+86)?1(?:3[4-9]|4[78]|5[0-27-9]|78|8[2-478]|98)\\d{8}$)|(?:^(?:\\+86)?1440\\d{7}$)|(?:^(?:\\+86)?170[356]\\d{7}$)";
private static final String CHINA_MOBILE_PATTERN = "(?:^(?:\\+86)?1(?:3[4-9]|4[78]|5[0-27-9]|78|8[2-478]|98|95|72|48)\\d{8}$)|(?:^(?:\\+86)?1440\\d{7}$)|(?:^(?:\\+86)?170[356]\\d{7}$)";
/**
*
@ -36,9 +36,7 @@ public class MobileUtil {
*/
public static boolean checkPhone(String phone) {
if (StringUtils.isNotBlank(phone)) {
if (checkChinaMobile(phone) || checkChinaUnicom(phone) || checkChinaTelecom(phone)) {
return true;
}
return checkChinaMobile(phone) || checkChinaUnicom(phone) || checkChinaTelecom(phone);
}
return false;
}
@ -53,9 +51,7 @@ public class MobileUtil {
public static boolean checkChinaMobile(String phone) {
if (StringUtils.isNotBlank(phone)) {
Pattern regexp = Pattern.compile(CHINA_MOBILE_PATTERN);
if (regexp.matcher(phone).matches()) {
return true;
}
return regexp.matcher(phone).matches();
}
return false;
}
@ -70,9 +66,7 @@ public class MobileUtil {
public static boolean checkChinaUnicom(String phone) {
if (StringUtils.isNotBlank(phone)) {
Pattern regexp = Pattern.compile(CHINA_UNICOM_PATTERN);
if (regexp.matcher(phone).matches()) {
return true;
}
return regexp.matcher(phone).matches();
}
return false;
}
@ -87,9 +81,7 @@ public class MobileUtil {
public static boolean checkChinaTelecom(String phone) {
if (StringUtils.isNotBlank(phone)) {
Pattern regexp = Pattern.compile(CHINA_TELECOM_PATTERN);
if (regexp.matcher(phone).matches()) {
return true;
}
return regexp.matcher(phone).matches();
}
return false;
}

@ -51,6 +51,16 @@ public class FileConstant {
*/
public static final int ONE_MILLION_NUMBER = 1000000;
/**
* BY
*/
public static final String BY = "BY";
/**
* MM
*/
public static final String MM = "MM";
/**
* uc
*/
@ -93,4 +103,10 @@ public class FileConstant {
public static final String CSV_FILE_SUB_NAME = "csv";
/**
* zip
*/
public static final String ZIP_FILE_SUB_NAME = ".zip";
}

@ -25,6 +25,7 @@ public class ClueQueryCriteria {
@ApiModelProperty(value = "任务id")
private Long taskId;
private Set<Long> taskIds;
@ApiModelProperty(value = "所属组员id")
private Long memberId;
@ -73,6 +74,4 @@ public class ClueQueryCriteria {
private String nid;
private Integer clueType;
private List<Integer> clueTypes;
}

@ -82,11 +82,11 @@ public class BaseClueMiddle implements Serializable {
@ApiModelProperty(value = "是否移入到公海")
@Column(name = "public_pool_status")
private Integer publicPoolStatus;
private Integer publicPoolStatus = 0;
@ApiModelProperty(value = "成交金额")
@Column(name = "turnover_amount")
private Double turnoverAmount;
private Double turnoverAmount = 0.00;
@ApiModelProperty(value = "线索来源 1-表单推送 2-个人上传 3-抖音 4-投流 5-拓客 6-拓客回流 7-投流回流")
@Column(name = "clue_type")

@ -7,6 +7,7 @@ import com.baiye.model.vo.ResSourceLabel;
import com.baiye.modules.system.domain.Clue;
import com.baiye.modules.system.service.dto.ClueMiddleTo;
import com.baiye.modules.telemarkting.entity.ClueMiddle;
import com.baiye.socket.filter.FeignConfiguration;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;

@ -578,7 +578,6 @@ public class QueryReportServiceImpl implements QueryReportService {
int turnOnNum = 0;
int validNum = 0;
//查询线索的所有通话记录 (7天内7天外的录音会被迁移无法下载)
// List<AllCallInfo> allByClueId = allCallInfoRepository.findAllByClueId(clueId);
String beginOfDay = DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.date(), -7)).toString();
String endOfDay = DateUtil.date().toString();
List<AllCallInfo> allByClueId = allCallInfoRepository.queryAllByTime(beginOfDay, endOfDay, clueId);

@ -67,6 +67,7 @@ public class TokenFilter extends GenericFilterBean {
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String token = resolveToken(httpServletRequest);
logger.info(httpServletRequest.getRequestURI());
// 对于 Token 为空的不需要去查 Redis
if (CharSequenceUtil.isNotBlank(token)) {
OnlineUserDto onlineUserDto = null;

@ -0,0 +1,32 @@
package com.baiye.modules.system.domain;
import com.baiye.model.entity.BaseClueMiddle;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
/**
* @author jt
*/
@Getter
@Setter
@Entity
@Table(name = "tb_clue_talk")
@ApiModel(value = "ClueTalk")
public class ClueTalk extends BaseClueMiddle {
private static final long serialVersionUID = -2426343637629328905L;
@Id
@ApiModelProperty(value = "线索id")
@Column(name = "clue_id")
@NotNull(message = "资源id不能为空")
private Long clueId;
}

@ -0,0 +1,25 @@
package com.baiye.modules.system.repository;
import com.baiye.modules.system.domain.ClueTalk;
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;
/**
* @author jt
*/
@Repository
public interface ClueTalkRepository extends JpaRepository<ClueTalk, Long>, JpaSpecificationExecutor<ClueTalk> {
/**
*
* @param taskId
* @param num
* @return
*/
@Query(value = "select count(1) from tb_clue_talk where" +
" to_days(create_time) = to_days(now()) and task_id = ?1 and clue_type = ?2", nativeQuery = true)
Integer countByTaskId(Long taskId, Integer num);
}

@ -42,6 +42,7 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
/**
*
*
* @param userId
* @return
*/
@ -50,6 +51,16 @@ public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificat
/**
* ID
* @param taskIds
* @return
*/
Set<Task> findByIdIn(Set<Long> taskIds);
/**
*
*
* @param userId
* @param isForm
* @return
*/
List<Task> findByCreateByAndIsForm(Long userId, Integer isForm);
}

@ -31,7 +31,7 @@ public class LabelOrganizeController {
@ApiOperation("新增标签组和标签")
@PostMapping("/add")
public CommonResponse<Object> save(@Validated({AddGroup.class}) @RequestBody LabelOrganize labelOrganize){
public CommonResponse<Object> save(@Validated({AddGroup.class}) @RequestBody LabelOrganize labelOrganize) {
labelOrganizeService.save(labelOrganize);
return CommonResponse.createBySuccess();
}
@ -52,13 +52,13 @@ public class LabelOrganizeController {
@ApiOperation("查询标签组列表")
@GetMapping("/query")
public ResponseEntity<Object> query(LabelOrganizeQueryCriteria labelOrganizeQueryCriteria){
public ResponseEntity<Object> query(LabelOrganizeQueryCriteria labelOrganizeQueryCriteria) {
return new ResponseEntity<>(labelOrganizeService.query(labelOrganizeQueryCriteria), HttpStatus.OK);
}
@ApiOperation("查询标签组列表(分页,返回数据中插入了组中标签信息)")
@GetMapping("/queryAll")
public ResponseEntity<Object> queryAll(LabelOrganizeQueryCriteria labelOrganizeQueryCriteria, Pageable pageable){
return new ResponseEntity<>(labelOrganizeService.queryAll(labelOrganizeQueryCriteria, pageable),HttpStatus.OK);
public ResponseEntity<Object> queryAll(LabelOrganizeQueryCriteria labelOrganizeQueryCriteria, Pageable pageable) {
return new ResponseEntity<>(labelOrganizeService.queryAll(labelOrganizeQueryCriteria, pageable), HttpStatus.OK);
}
}

@ -0,0 +1,17 @@
package com.baiye.modules.system.service;
/**
* @author Enzo
* @date : 2022/12/6
*/
public interface ClueTalkService {
/**
*
* @param taskId
* @param num
* @return
*/
Integer countByTaskIdAndDate(Long taskId, Integer num);
}

@ -13,24 +13,28 @@ public interface LabelOrganizeService {
/**
*
*
* @param labelOrganize
*/
void save(LabelOrganize labelOrganize);
/**
*
*
* @param labelOrganize
*/
void update(LabelOrganize labelOrganize);
/**
*
*
* @param ids
*/
void del(Set<Long> ids);
/**
*
*
* @param labelOrganizeQueryCriteria
* @return
*/
@ -38,6 +42,7 @@ public interface LabelOrganizeService {
/**
* (,)
*
* @param labelOrganizeQueryCriteria
* @param pageable
* @return
@ -46,8 +51,16 @@ public interface LabelOrganizeService {
/**
* IDID
*
* @param labelOrganizeIds
* @return
*/
Map<Long, List<Label>> organizeIdGroup(Set<Long> labelOrganizeIds);
/**
*
* @param userId
* @return
*/
Long saveDefault(Long userId);
}

@ -1,6 +1,5 @@
package com.baiye.modules.system.service;
import cn.hutool.core.date.DateTime;
import com.baiye.modules.system.domain.TaskImei;
import com.baiye.modules.system.service.dto.PlatformTransmitDTO;

@ -73,7 +73,7 @@ public class CallDeductServiceImpl implements CallDeductService {
String year = String.valueOf(vo.getYear());
CallDeductResponseVO deductResponseVO = new CallDeductResponseVO();
String format = year.concat(StrPool.DASHED.concat(String.valueOf(vo.getMonth())));
DateTime parse = DateUtil.parse(format, "yyyy-MM");
DateTime parse = DateUtil.parse(format, DatePattern.NORM_MONTH_PATTERN);
DateTime dateTime =
DateUtil.beginOfMonth(DateUtil.offsetMonth(parse,
DefaultNumberConstants.ONE_NUMBER));
@ -90,7 +90,7 @@ public class CallDeductServiceImpl implements CallDeductService {
public Map<String, Object> queryMonthList(CallDeductMonthQueryCriteria criteria, Pageable pageable, Long companyId) {
Map<String, Object> map = Maps.newHashMap();
String queryTime = criteria.getQueryTime();
DateTime parse = DateUtil.parse(queryTime, "yyyy-MM");
DateTime parse = DateUtil.parse(queryTime, DatePattern.NORM_MONTH_PATTERN);
DateTime endDate = DateUtil.offsetMonth(parse, DefaultNumberConstants.ONE_NUMBER);
List<CallDeduct> deductList =
callDeductRepository.queryByCompanyIdAndTime

@ -0,0 +1,25 @@
package com.baiye.modules.system.service.impl;
import com.baiye.modules.system.repository.ClueTalkRepository;
import com.baiye.modules.system.service.ClueTalkService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class ClueTalkServiceImpl implements ClueTalkService {
private final ClueTalkRepository clueTalkRepository;
@Override
public Integer countByTaskIdAndDate(Long taskId, Integer num) {
return clueTalkRepository.countByTaskId(taskId, num);
}
}

@ -73,6 +73,7 @@ public class CompanyServiceImpl implements CompanyService {
BeanUtil.copyProperties(companyDto, byUserId);
byUserId.setApplicationTime(DateUtil.date());
byUserId.setCompanyCode(byUserId.getCompanyName().trim());
byUserId.setSonUserNum(100);
userRepository.updateStatusById(Boolean.FALSE, SecurityUtils.getCurrentUserId());
return companyMapper.toDto(companyRepository.save(byUserId));
}
@ -105,7 +106,7 @@ public class CompanyServiceImpl implements CompanyService {
public CompanyDto createCompany(CompanyDto companyDto) {
Company company = new Company();
BeanUtil.copyProperties(companyDto, company);
company.setSonUserNum((int) DefaultNumberConstants.ONE_HUNDRED);
company.setSonUserNum(100);
return companyMapper.toDto(companyRepository.save(company));
}

@ -31,6 +31,7 @@
import com.baiye.modules.system.service.dto.DeptQueryCriteria;
import com.baiye.modules.system.service.mapstruct.DeptMapper;
import com.baiye.util.*;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -71,10 +72,7 @@
criteria.setPidIsNull(true);
}
List<Field> fields = QueryHelp.getAllFields(criteria.getClass(), new ArrayList<>());
List<String> fieldNames = new ArrayList<String>() {{
add("pidIsNull");
add("enabled");
}};
List<String> fieldNames = Lists.newArrayList("pidIsNull", "pidIsNull");
for (Field field : fields) {
//设置对象的访问权限保证对private的属性的访问
field.setAccessible(true);

@ -51,8 +51,6 @@ public class DownRecordServiceImpl implements DownRecordService {
private final RedisUtils redisUtils;
private final TaskService taskService;
private final DeliveryProperties deliveryProperties;
private final DownRecordRepository downRecordRepository;
@ -93,7 +91,7 @@ public class DownRecordServiceImpl implements DownRecordService {
String format = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN);
Integer num = (Integer) redisUtils.get(CacheKey.DMP_MANUAL_ID.concat(format));
Integer batch = ObjectUtil.isNull(num) ? DefaultNumberConstants.ONE_NUMBER : num + DefaultNumberConstants.ONE_NUMBER;
String taskImeiName = "MM".concat(StrPool.UNDERLINE).concat(format).concat(StrPool.UNDERLINE).concat(String.valueOf(batch));
String taskImeiName = FileConstant.MM.concat(StrPool.UNDERLINE).concat(format).concat(StrPool.UNDERLINE).concat(String.valueOf(batch));
// 发送邮件
MailUtil.sendMail(deliveryProperties.getEmailAddress(),
deliveryProperties.getEmailPassword(), deliveryProperties.getToEmailAddress(), downRecord.getDownUrl(), taskImeiName);
@ -157,11 +155,11 @@ public class DownRecordServiceImpl implements DownRecordService {
String file = deliveryProperties.getFileUrl().concat(StrPool.SLASH).concat(uuid);
Integer num = (Integer) redisUtils.get(CacheKey.DMP_MANUAL_ID.concat(format));
Integer batch = ObjectUtil.isNull(num) ? DefaultNumberConstants.ONE_NUMBER : num + DefaultNumberConstants.ONE_NUMBER;
String taskImeiName = "MM".concat(StrPool.UNDERLINE).concat(format).concat(StrPool.UNDERLINE).concat(String.valueOf(batch));
String taskImeiName = FileConstant.MM.concat(StrPool.UNDERLINE).concat(format).concat(StrPool.UNDERLINE).concat(String.valueOf(batch));
// 保存文件
String csvPath = file.concat(".csv");
String csvPath = file.concat(StrPool.DOT).concat(FileConstant.CSV_FILE_SUB_NAME);
CSVFileUtil.createCsvFile(dtoArrayList, csvPath);
String zipPath = file.concat(".zip");
String zipPath = file.concat(FileConstant.ZIP_FILE_SUB_NAME);
// 设置压缩文件
CompressUtil.decryptionCompression
(zipPath, csvPath, deliveryProperties.getZipPassword());
@ -172,7 +170,7 @@ public class DownRecordServiceImpl implements DownRecordService {
redisUtils.set(CacheKey.DMP_MANUAL_ID.concat(format), batch, DefaultNumberConstants.ONE_NUMBER, TimeUnit.DAYS);
Long recordId = deliveryRecordService.saveDeliveryRecord(zipPath, taskImeiName, dtoArrayList.size(), null,
SecurityUtils.getCurrentUserId(), DefaultNumberConstants.TWO_NUMBER);
String filePath = deliveryProperties.getDmpDownPath().concat(uuid).concat(".zip");
String filePath = deliveryProperties.getDmpDownPath().concat(uuid).concat(FileConstant.ZIP_FILE_SUB_NAME);
this.createRecord(dtoArrayList.size(), "超级管理员", taskName, zipPath, filePath, recordId, DefaultNumberConstants.TWO_NUMBER);
return Boolean.TRUE;
}

@ -42,7 +42,7 @@ public class LabelOrganizeServiceImpl implements LabelOrganizeService {
LabelOrganize saveLabelOrganize = labelOrganizeRepository.save(labelOrganize);
Long saveLabelOrganizeId = saveLabelOrganize.getId();
List<Label> labelList = labelOrganize.getLabelList();
if (CollUtil.isNotEmpty(labelList)){
if (CollUtil.isNotEmpty(labelList)) {
for (Label label : labelList) {
label.setUserId(currentUserId);
label.setLabelOrganizeId(saveLabelOrganizeId);
@ -60,27 +60,27 @@ public class LabelOrganizeServiceImpl implements LabelOrganizeService {
List<Label> labelList = labelOrganize.getLabelList();
Long currentUserId = SecurityUtils.getCurrentUserId();
//1、删除标签信息
if (CollUtil.isNotEmpty(delLabelIds)){
if (CollUtil.isNotEmpty(delLabelIds)) {
labelRepository.deleteAllByIdIn(delLabelIds);
}
//2、查询并修改标签组信息
LabelOrganize updateLabelOrganize = labelOrganizeRepository.findById(organizeId).orElseGet(LabelOrganize::new);
if (StringUtils.isNotBlank(name)){
if (StringUtils.isNotBlank(name)) {
updateLabelOrganize.setName(name);
}
labelOrganizeRepository.save(updateLabelOrganize);
//3、是否有新增标签
if (CollUtil.isNotEmpty(labelList)){
if (CollUtil.isNotEmpty(labelList)) {
List<Label> list = new ArrayList<>();
for (Label label : labelList) {
String labelName = label.getLabelName();
if (label.getId() == null && StringUtils.isNotBlank(labelName)){
if (label.getId() == null && StringUtils.isNotBlank(labelName)) {
label.setUserId(currentUserId);
label.setLabelOrganizeId(organizeId);
list.add(label);
}
}
if (CollUtil.isNotEmpty(list)){
if (CollUtil.isNotEmpty(list)) {
labelRepository.saveAll(list);
}
}
@ -89,7 +89,7 @@ public class LabelOrganizeServiceImpl implements LabelOrganizeService {
@Override
@Transactional(rollbackOn = Exception.class)
public void del(Set<Long> ids) {
if (CollUtil.isNotEmpty(ids)){
if (CollUtil.isNotEmpty(ids)) {
//1、删除组信息
labelOrganizeRepository.deleteAllByIdIn(ids);
//2、删除标签信息
@ -121,7 +121,7 @@ public class LabelOrganizeServiceImpl implements LabelOrganizeService {
for (LabelOrganizeDto labelOrganizeDto : map) {
Long id = labelOrganizeDto.getId();
//6、取出组ID相同的标签集合并set值
if (collect.containsKey(id)){
if (collect.containsKey(id)) {
labelOrganizeDto.setLabelList(collect.get(id));
}
}
@ -130,14 +130,46 @@ public class LabelOrganizeServiceImpl implements LabelOrganizeService {
/**
* IDID
*
* @param labelOrganizeIds
* @return
*/
public Map<Long, List<Label>> organizeIdGroup(Set<Long> labelOrganizeIds){
if (CollUtil.isNotEmpty(labelOrganizeIds)){
@Override
public Map<Long, List<Label>> organizeIdGroup(Set<Long> labelOrganizeIds) {
if (CollUtil.isNotEmpty(labelOrganizeIds)) {
Set<Label> labels = labelRepository.findByLabelOrganizeIdIn(labelOrganizeIds);
return labels.stream().collect(Collectors.groupingBy(Label::getLabelOrganizeId));
}
return new HashMap<>();
}
/**
*
*/
@Override
public Long saveDefault(Long userId) {
LabelOrganize labelOrganize = new LabelOrganize();
labelOrganize.setCreateBy(userId);
labelOrganize.setName("默认标签");
LabelOrganize saveLabelOrganize = labelOrganizeRepository.save(labelOrganize);
Long saveLabelOrganizeId = saveLabelOrganize.getId();
List<Label> labelList = new ArrayList<>();
Label label = new Label();
label.setLabelName("男");
label.setUserId(userId);
label.setLabelOrganizeId(saveLabelOrganizeId);
Label label1 = new Label();
label1.setLabelName("女");
label1.setUserId(userId);
label1.setLabelOrganizeId(saveLabelOrganizeId);
labelList.add(label);
labelList.add(label1);
labelRepository.saveAll(labelList);
return saveLabelOrganizeId;
}
}

@ -601,8 +601,15 @@ public class OrganizeServiceImpl implements OrganizeService {
TaskOrganizeDto taskOrganizeDto = taskOrganizeDtos.get(0);
map.put("organizeLabel", taskOrganizeDto.getOrganizeLabel());
}
Task task = taskRepository.findById(taskId).orElseGet(Task::new);
map.put("baseLabel", task.getBaseLabel());
Long labelOrganizeId = task.getLabelOrganizeId();
if (labelOrganizeId != null) {
List<String> labelList = labelService.findLabelList(labelOrganizeId);
map.put("baseLabel", labelList);
} else {
map.put("baseLabel", task.getBaseLabel());
}
return map;
}

@ -267,12 +267,13 @@ public class TaskServiceImpl implements TaskService {
//查询所有标签
Set<Long> labelOrganizeIds = taskDtoMap.stream().map(TaskDto::getLabelOrganizeId).collect(Collectors.toSet());
Map<Long, List<Label>> collect = labelOrganizeService.organizeIdGroup(labelOrganizeIds);
Map<Long, Integer> taskIdCount = new HashMap<>();
Map<Long, Integer> taskIdCount = new HashMap<>(8);
//未分配数
if (taskDtoMap.getTotalPages() > 0) {
ClueQueryCriteria clueQueryCriteria = new ClueQueryCriteria();
clueQueryCriteria.setTaskIds(taskDtoMap.stream().map(TaskDto::getId).collect(Collectors.toSet()));
clueQueryCriteria.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueQueryCriteria.setClueType(taskQueryCriteria.getIsForm());
taskIdCount = sourceClueClient.countClueByMemberStatus(clueQueryCriteria).getData();
}

@ -93,6 +93,7 @@ public class UserServiceImpl implements UserService {
private final TaskRepository taskRepository;
private final CallDeductService callDeductService;
private final LabelOrganizeService labelOrganizeService;
@Override
@Transactional(rollbackFor = Exception.class)
@ -218,15 +219,17 @@ public class UserServiceImpl implements UserService {
//todo 如果是管理员 则创建任务
if (flag) {
if (userDTO.getCompanyType() == 1) {
//todo 新建标签组
Long labelOrganizeId = labelOrganizeService.saveDefault(userCreateResult.getId());
if (userDTO.getCompanyType() != null && userDTO.getCompanyType() == 1) {
//抖音(飞鱼)
createTask(userCreateResult.getId(), "抖音任务", DefaultNumberConstants.THREE_NUMBER);
createTask(userCreateResult.getId(), "抖音任务", DefaultNumberConstants.THREE_NUMBER, labelOrganizeId);
}
//公司名称做的对应,所以将公司名设为表单任务名
createTask(userCreateResult.getId(), userCreateResult.getUsername(), DefaultNumberConstants.ONE_NUMBER);
createTask(userCreateResult.getId(), "员工上传任务", DefaultNumberConstants.TWO_NUMBER);
createTask(userCreateResult.getId(), "投流回流任务", DefaultNumberConstants.SEVEN_NUMBER);
createTask(userCreateResult.getId(), "拓客回流任务", DefaultNumberConstants.SIX_NUMBER);
createTask(userCreateResult.getId(), userCreateResult.getUsername(), DefaultNumberConstants.ONE_NUMBER, labelOrganizeId);
createTask(userCreateResult.getId(), "员工上传任务", DefaultNumberConstants.TWO_NUMBER, labelOrganizeId);
createTask(userCreateResult.getId(), "拓客模块-投流回流池", DefaultNumberConstants.SEVEN_NUMBER, labelOrganizeId);
createTask(userCreateResult.getId(), "拓客模块-拓客回流池", DefaultNumberConstants.SIX_NUMBER, labelOrganizeId);
}
MultipartFile file = userDTO.getFile();
@ -247,7 +250,7 @@ public class UserServiceImpl implements UserService {
*
* @param username
*/
private void createTask(Long id, String username, Integer isForm) {
private void createTask(Long id, String username, Integer isForm, Long labelOrganizeId) {
Long taskId = IdUtil.getSnowflake(9, 9).nextId();
Task task = new Task();
task.setId(taskId);
@ -263,6 +266,7 @@ public class UserServiceImpl implements UserService {
task.setIsForm(isForm);
task.setCreateBy(id);
task.setLabelOrganizeId(null);
task.setLabelOrganizeId(labelOrganizeId);
taskRepository.save(task);
}
@ -461,6 +465,13 @@ public class UserServiceImpl implements UserService {
}
if (ObjectUtil.isNotNull(resources.getCompanyType())) {
companyService.updateCompanyTypeById(resources.getCompanyType(), user.getCompanyId());
if (resources.getCompanyType() == DefaultNumberConstants.ONE_NUMBER) {
//抖音授权
List<Task> tasks = taskRepository.findByCreateByAndIsForm(user.getId(), DefaultNumberConstants.THREE_NUMBER);
if (CollUtil.isEmpty(tasks)) {
createTask(user.getId(), "抖音任务", DefaultNumberConstants.THREE_NUMBER, null);
}
}
}
user.setIsReview(resources.getIsReview());

@ -43,7 +43,7 @@ public class TelephoneCallController {
@PostMapping("/telephone/req")
@ApiOperation("拨打电话")
public CommonResponse<String> doubleCallReq(@Validated @RequestBody TelephoneCallReqDTO telephoneCallReqDTO) {
public CommonResponse<TelephoneCallStopDTO> doubleCallReq(@Validated @RequestBody TelephoneCallReqDTO telephoneCallReqDTO) {
if (ObjectUtil.isEmpty(telephoneCallReqDTO)) {
return CommonResponse.createByError();
}
@ -132,7 +132,11 @@ public class TelephoneCallController {
public CommonResponse<Object> doubleCallStop(@RequestBody TelephoneCallStopDTO telephoneCallStopDTO) {
return telephoneCallService.doubleCallStop(telephoneCallStopDTO);
}
@PostMapping("/roll/stop")
@ApiOperation("点呼挂断呼叫")
public CommonResponse<Object> rollCallStop(@RequestBody TelephoneCallStopDTO telephoneCallStopDTO) {
return telephoneCallService.rollCallStop(telephoneCallStopDTO);
}
@PostMapping("/roll/cdrUrl")
@ApiOperation("点呼系统回调话单")

@ -6,6 +6,8 @@ import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
@ -13,6 +15,7 @@ import com.baiye.http.RollCallResponse;
import com.baiye.model.enums.ResponseCode;
import com.baiye.modules.telemarkting.entity.dto.RollCallSystemDTO;
import com.baiye.modules.telemarkting.entity.dto.TelephoneCallReqDTO;
import com.baiye.modules.telemarkting.entity.dto.TelephoneCallStopDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@ -36,6 +39,8 @@ public class RollCallReq {
private String appId;
@Value("${roll.call.accountSid}")
private String accountSid;
@Value("${roll.call.stopUrl}")
private String stopUrl;
public String startReq(TelephoneCallReqDTO doubleCallReq) {
log.info("=======================RollCallReq start in {}", DateUtil.date());
@ -66,7 +71,7 @@ public class RollCallReq {
log.info("点呼返回值为 {}", httpResponse);
RollCallResponse doubleCallResponse = JSONUtil.toBean(httpResponse, RollCallResponse.class);
if (String.valueOf
(DefaultNumberConstants.ZERO_NUMBER)
(DefaultNumberConstants.ZERO_NUMBER)
.equals(doubleCallResponse.getResult())) {
return doubleCallResponse.getReqid();
} else {
@ -82,6 +87,33 @@ public class RollCallReq {
throw new BadRequestException(ResponseCode.CALL_ERROR.getDesc());
}
public Boolean stopReq(TelephoneCallStopDTO telephoneCallStopDTO) {
return stopTask(telephoneCallStopDTO);
}
private Boolean stopTask(TelephoneCallStopDTO telephoneCallStopDTO) {
int count = 0;
int flag = 3;
while (count <= flag) {
JSONObject json = new JSONObject();
json.putOpt("callid", telephoneCallStopDTO.getSessionid());
JSONObject jsonObject = new JSONObject();
jsonObject.putOpt("req_id",telephoneCallStopDTO.getCallId());
jsonObject.putOpt("type", "hangup");
jsonObject.putOpt("bsname", "aibot");
jsonObject.putOpt("body", json);
HttpResponse httpResponse = HttpRequest.post(stopUrl).body(JSONUtil.toJsonPrettyStr(jsonObject)).execute();
if (httpResponse.isOk()) {
log.info("请求挂断成功,返回值:{}", httpResponse.body());
return Boolean.TRUE;
} else {
count++;
log.error("请求失败,response==={}", httpResponse.body());
}
}
return Boolean.FALSE;
}
private String sendCallReq(Map<String, Object> json, String url, String authorization) {
return HttpRequest.post(url).
header(Header.AUTHORIZATION, authorization).

@ -11,53 +11,41 @@ public interface TelephoneCallService {
/**
*
*
* @param telephoneCallReqDTO
* @return
*/
CommonResponse<String> doubleCallReq(TelephoneCallReqDTO telephoneCallReqDTO, Long companyId);
CommonResponse<TelephoneCallStopDTO> doubleCallReq(TelephoneCallReqDTO telephoneCallReqDTO, Long companyId);
/**
*
* @param telephoneCallBackDTO
*/
void doubleCallBack(TelephoneCallBackDTO telephoneCallBackDTO);
/**
*
*
* @param telephoneCallBackStatusDTO
*/
void doubleCallBackStatus(TelephoneCallBackStatusDTO telephoneCallBackStatusDTO);
/**
*
*
* @param telephoneCallStopDTO
* @return
*
*/
CommonResponse<Object> doubleCallStop(TelephoneCallStopDTO telephoneCallStopDTO);
/**
*
*/
CommonResponse<Object> rollCallStop(TelephoneCallStopDTO telephoneCallStopDTO);
/**
* axb
*
* @param telephoneCallReqDTO
* @return
*/
CommonResponse<String> axbDialNumber(TelephoneCallReqDTO telephoneCallReqDTO, Long companyId);
CommonResponse<TelephoneCallStopDTO> axbDialNumber(TelephoneCallReqDTO telephoneCallReqDTO, Long companyId);
/**
*
*
* @param telephoneCallReqDTO
* @return
*/
CommonResponse<String> rollCallReq(TelephoneCallReqDTO telephoneCallReqDTO, Long companyId);
CommonResponse<TelephoneCallStopDTO> rollCallReq(TelephoneCallReqDTO telephoneCallReqDTO, Long companyId);
/**
*
*
* @param rollCallBackDTO
*/
void rollCallBack(RollCallBackDTO rollCallBackDTO);
}

@ -67,7 +67,7 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
private UserService userService;
@Override
public CommonResponse<String> doubleCallReq(TelephoneCallReqDTO doubleCallReq, Long companyId) {
public CommonResponse<TelephoneCallStopDTO> doubleCallReq(TelephoneCallReqDTO doubleCallReq, Long companyId) {
String requestId = RandomUtil.randomString(10);
doubleCallReq.setRequestId(requestId);
Clue body;
@ -106,7 +106,10 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
} else {
return CommonResponse.createByError();
}
return CommonResponse.createBySuccess(sessionId);
TelephoneCallStopDTO telephoneCallStopDTO = new TelephoneCallStopDTO();
telephoneCallStopDTO.setSessionid(sessionId);
telephoneCallStopDTO.setCallId(requestId);
return CommonResponse.createBySuccess(telephoneCallStopDTO);
}
@Override
@ -127,21 +130,20 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
String sessionId = doubleCallBackStatus.getSessionId();
long userDate = Long.parseLong(doubleCallBackStatus.getUserData());
String flag = Objects.requireNonNull(CallStatusEnum.find(doubleCallBackStatus.getStatus())).getDescription();
AllCallInfo allCallInfo = allCallInfoRepository.findBySessionId(sessionId);
if (CallStatusEnum.ANSWER.getDescription().equals(flag)) {
int status = CallStatusEnum.ANSWER.getValue();
callClueRepository.updateByStatus(status, userDate);
// allCallInfoRepository.updateByStatus(status, sessionId);
AllCallInfo allCallInfo = allCallInfoRepository.findBySessionId(sessionId);
allCallInfo.setStatus(status);
allCallInfoRepository.save(allCallInfo);
//实时扣费
callCostCount(allCallInfo.getMemberId(), allCallInfo.getClueId(), allCallInfo.getClueType(), allCallInfo.getDuration(), DefaultNumberConstants.TWO_NUMBER);
//更新资源通话状态
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.TWO_NUMBER));
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.TWO_NUMBER, allCallInfo.getClueType()));
} else {
//更新资源通话状态
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.ONE_NUMBER));
CompletableFuture.runAsync(() -> updateSourceCallStatus(userDate, DefaultNumberConstants.ONE_NUMBER, allCallInfo.getClueType()));
}
}
@ -154,7 +156,7 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
}
@Override
public CommonResponse<String> axbDialNumber(TelephoneCallReqDTO doubleCallReq, Long companyId) {
public CommonResponse<TelephoneCallStopDTO> axbDialNumber(TelephoneCallReqDTO doubleCallReq, Long companyId) {
long originalNumber = Long.parseLong(doubleCallReq.getUserData());
ResponseEntity<Clue> body;
try {
@ -189,14 +191,17 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
clueInfo.setCompanyId(companyId);
allCallInfoRepository.save(allCallInfo);
callClueRepository.save(clueInfo);
return CommonResponse.createBySuccess(sessionId);
TelephoneCallStopDTO telephoneCallStopDTO = new TelephoneCallStopDTO();
telephoneCallStopDTO.setSessionid(sessionId);
telephoneCallStopDTO.setCallId(randomString);
return CommonResponse.createBySuccess(telephoneCallStopDTO);
}
}
return CommonResponse.createByError();
}
@Override
public CommonResponse<String> rollCallReq(TelephoneCallReqDTO telephoneCallReqDTO, Long companyId) {
public CommonResponse<TelephoneCallStopDTO> rollCallReq(TelephoneCallReqDTO telephoneCallReqDTO, Long companyId) {
String requestId = RandomUtil.randomString(10);
telephoneCallReqDTO.setRequestId(requestId);
if (telephoneCallReqDTO.getDisplay() == null || telephoneCallReqDTO.getTelA() == null) {
@ -252,8 +257,7 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
}
telephoneCallReqDTO.setTelB(body.getNid());
String reqId = rollCallReq.startReq(telephoneCallReqDTO);
log.info("=============================reqId {}", reqId);
// if (StrUtil.isNotBlank(reqId)) {
AllCallInfo allCallInfo = new AllCallInfo();
allCallInfo.setSessionId(requestId);
allCallInfo.setRequestId(requestId);
@ -273,9 +277,18 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
clueInfo.setCompanyId(companyId);
allCallInfoRepository.save(allCallInfo);
callClueRepository.save(clueInfo);
return CommonResponse.createBySuccess(requestId);
TelephoneCallStopDTO telephoneCallStopDTO = new TelephoneCallStopDTO();
telephoneCallStopDTO.setSessionid(reqId);
telephoneCallStopDTO.setCallId(requestId);
return CommonResponse.createBySuccess(telephoneCallStopDTO);
}
@Override
public CommonResponse<Object> rollCallStop(TelephoneCallStopDTO telephoneCallStopDTO) {
if (rollCallReq.stopReq(telephoneCallStopDTO)) {
return CommonResponse.createBySuccess();
}
return CommonResponse.createByError();
}
/**
* ()
*
@ -300,12 +313,12 @@ 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, allCallInfo.getClueType()));
//TODO 实时扣除话费
callCostCount(allCallInfo.getMemberId(), allCallInfo.getClueId(), allCallInfo.getClueType(), Integer.valueOf(rollCallBackDTO.getDuration()), 2);
} else {
//更新资源通话状态
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.ONE_NUMBER));
CompletableFuture.runAsync(() -> updateSourceCallStatus(allCallInfo.getClueId(), DefaultNumberConstants.ONE_NUMBER, allCallInfo.getClueType()));
}
}
}
@ -317,12 +330,13 @@ public class TelephoneCallServiceImpl implements TelephoneCallService {
* @param clueId ID
* @param status 1 2
*/
private void updateSourceCallStatus(Long clueId, Integer status) {
private void updateSourceCallStatus(Long clueId, Integer status, Integer clueType) {
ClueMiddle clueMiddle = new ClueMiddle();
clueMiddle.setClueId(clueId);
clueMiddle.setClueCallStatus(status);
clueMiddle.setOptimisticVersion(DefaultNumberConstants.THREE_NUMBER);
clueMiddle.setNewestCallTime(new Date());
clueMiddle.setClueType(clueType);
sourceClueClient.update(clueMiddle);
}

@ -11,11 +11,13 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baiye.config.properties.DeliveryProperties;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.constant.FileConstant;
import com.baiye.modules.system.domain.Company;
import com.baiye.modules.system.domain.TaskImei;
import com.baiye.modules.system.service.*;
import com.baiye.modules.system.service.dto.ImeiDTO;
import com.baiye.modules.system.service.dto.TaskTagDto;
import com.baiye.modules.telemarkting.entity.ClueMiddle;
import com.baiye.util.*;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
@ -48,12 +50,15 @@ public class DeliveryBalanceTask {
private final TaskImeiService taskImeiService;
private final ClueTalkService clueTalkService;
private final DownRecordService downRecordService;
private final DeliveryProperties deliveryProperties;
private final DeliveryRecordService deliveryRecordService;
/**
* 821
*/
@ -64,8 +69,7 @@ public class DeliveryBalanceTask {
List<TaskImei> imeiList = taskImeiService.findByStatus(DefaultNumberConstants.ZERO_NUMBER);
if (CollUtil.isNotEmpty(imeiList)) {
// 根据任务id分组
Map<Long, List<TaskImei>> listMap = imeiList.stream()
.collect(Collectors.groupingBy(TaskImei::getTaskId));
Map<Long, List<TaskImei>> listMap = imeiList.stream().collect(Collectors.groupingBy(TaskImei::getTaskId));
for (Map.Entry<Long, List<TaskImei>> map : listMap.entrySet()) {
Long taskId = map.getKey();
List<TaskImei> list = listMap.get(taskId);
@ -76,110 +80,120 @@ public class DeliveryBalanceTask {
if (ObjectUtil.isNotNull(companyByUserId) &&
// 判断价格
ObjectUtil.isNotNull(companyByUserId.getDmpDeliveryFee())) {
Integer dmpLimitNum = companyByUserId.getDmpLimitNum();
// 判断余额
if (companyByUserId.getUserBalance() <= DefaultNumberConstants.ZERO_NUMBER
|| companyByUserId.getDmpLimitNum().equals(DefaultNumberConstants.ZERO_NUMBER)) {
if (companyByUserId.getUserBalance() <= DefaultNumberConstants.ZERO_NUMBER) {
continue;
}
// 截取数据
if (ObjectUtil.isNotNull(companyByUserId.getDmpLimitNum())
&& companyByUserId.getDmpLimitNum() > DefaultNumberConstants.ZERO_NUMBER
&& list.size() > companyByUserId.getDmpLimitNum()) {
downList = CollUtil.sub(list, companyByUserId.getDmpLimitNum(), list.size());
list = CollUtil.sub(list, DefaultNumberConstants.ZERO_NUMBER, companyByUserId.getDmpLimitNum());
if (ObjectUtil.isNotNull(dmpLimitNum)
&& dmpLimitNum > DefaultNumberConstants.ZERO_NUMBER) {
// 统计今天数量
Integer count = taskImeiService.countByUserIdAndDate(taskId, DefaultNumberConstants.FOUR_NUMBER);
downList = CollUtil.sub(list, count >=
dmpLimitNum ? DefaultNumberConstants.ZERO_NUMBER : dmpLimitNum, list.size());
list = CollUtil.sub(list, DefaultNumberConstants.ZERO_NUMBER,
count >= dmpLimitNum ? DefaultNumberConstants.ZERO_NUMBER : dmpLimitNum);
}
// 每次100000 数据
List<List<TaskImei>> lists = Lists.partition
(list, DefaultNumberConstants.ONE_HUNDRED_THOUSAND);
// 批量发送
for (List<TaskImei> taskImeiList : lists) {
Long minId = (long) DefaultNumberConstants.ZERO_NUMBER;
Long maxId = (long) DefaultNumberConstants.ZERO_NUMBER;
// 大于100 进行兑换
if (taskImeiList.size() >= DefaultNumberConstants.ONE_HUNDRED) {
String fileUrl = deliveryProperties.getFileUrl();
Comparator<TaskImei> comparing = Comparator.comparing(TaskImei::getId);
String format = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN);
Integer num = (Integer) redisUtils.get(CacheKey.DMP_REQUEST_ID.concat(format));
// 最小id
Optional<TaskImei> min = taskImeiList.stream().min(comparing);
if (min.isPresent()) {
minId = min.get().getId();
}
// 最大id
Optional<TaskImei> max = taskImeiList.stream().max(comparing);
if (max.isPresent()) {
maxId = max.get().getId();
}
if (minId > DefaultNumberConstants.ZERO_NUMBER
&& maxId > DefaultNumberConstants.ZERO_NUMBER) {
// 转换DTO
List<ImeiDTO> toList = Convert.toList(ImeiDTO.class, taskImeiList);
Integer batch = ObjectUtil.isNull(num) ?
DefaultNumberConstants.ONE_NUMBER : num + DefaultNumberConstants.ONE_NUMBER;
String taskImeiName = "BY".concat(StrPool.UNDERLINE).concat
(format).concat(StrPool.UNDERLINE).concat(String.valueOf(batch));
String file = fileUrl.concat(StrPool.SLASH).concat(taskImeiName);
// 保存文件
String csvPath = file.concat(".csv");
CSVFileUtil.createCsvFile(toList, csvPath);
String zipPath = file.concat(".zip");
// 设置压缩文件
CompressUtil.decryptionCompression
(zipPath, csvPath, deliveryProperties.getZipPassword());
// 发送邮件
MailUtil.sendMail(deliveryProperties.getEmailAddress(),
deliveryProperties.getEmailPassword(),
deliveryProperties.getToEmailAddress(), zipPath, taskImeiName);
// 保存发送记录
deliveryRecordService.saveDeliveryRecord(zipPath, taskImeiName, taskImeiList.size(), taskId, userId, DefaultNumberConstants.ONE_NUMBER);
// 保存批次号
redisUtils.set(CacheKey.DMP_REQUEST_ID.concat(format), batch, DefaultNumberConstants.ONE_NUMBER, TimeUnit.DAYS);
// 批次修改状态
taskImeiService.updateBath(taskId, CharSequenceUtil.EMPTY, DefaultNumberConstants.ONE_NUMBER, minId, maxId);
// 删除文件
boolean csvResult = FileUtil.del(csvPath);
boolean zipResult = FileUtil.del(zipPath);
log.info("=========================== the csv path as {}, zip path as {} " +
" csvResult as {} zipResult as {} ========================", csvPath, zipPath, csvResult, zipResult);
if (CollUtil.isNotEmpty(list)) {
// 每次100000 数据
List<List<TaskImei>> lists = Lists.partition
(list, DefaultNumberConstants.ONE_HUNDRED_THOUSAND);
// 批量发送
for (List<TaskImei> taskImeiList : lists) {
Long minId = (long) DefaultNumberConstants.ZERO_NUMBER;
Long maxId = (long) DefaultNumberConstants.ZERO_NUMBER;
// 大于100 进行兑换
if (taskImeiList.size() >= DefaultNumberConstants.ONE_HUNDRED) {
String fileUrl = deliveryProperties.getFileUrl();
Comparator<TaskImei> comparing = Comparator.comparing(TaskImei::getId);
String format = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN);
Integer num = (Integer) redisUtils.get(CacheKey.DMP_REQUEST_ID.concat(format));
// 最小id
Optional<TaskImei> min = taskImeiList.stream().min(comparing);
if (min.isPresent()) {
minId = min.get().getId();
}
// 最大id
Optional<TaskImei> max = taskImeiList.stream().max(comparing);
if (max.isPresent()) {
maxId = max.get().getId();
}
if (minId > DefaultNumberConstants.ZERO_NUMBER &&
maxId > DefaultNumberConstants.ZERO_NUMBER) {
// 转换DTO
List<ImeiDTO> toList = Convert.toList(ImeiDTO.class, taskImeiList);
Integer batch = ObjectUtil.isNull(num) ?
DefaultNumberConstants.ONE_NUMBER : num + DefaultNumberConstants.ONE_NUMBER;
String taskImeiName = FileConstant.BY.concat(StrPool.UNDERLINE).
concat(format).concat(StrPool.UNDERLINE).concat(String.valueOf(batch));
String file = fileUrl.concat(StrPool.SLASH).concat(taskImeiName);
// 保存文件
String csvPath = file.concat(StrPool.DOT).concat(FileConstant.CSV_FILE_SUB_NAME);
CSVFileUtil.createCsvFile(toList, csvPath);
String zipPath = file.concat(FileConstant.ZIP_FILE_SUB_NAME);
// 设置压缩文件
CompressUtil.decryptionCompression(zipPath, csvPath, deliveryProperties.getZipPassword());
// 发送邮件
MailUtil.sendMail(deliveryProperties.getEmailAddress(),
deliveryProperties.getEmailPassword(), deliveryProperties.getToEmailAddress(), zipPath, taskImeiName);
// 保存发送记录
deliveryRecordService.saveDeliveryRecord(zipPath, taskImeiName,
taskImeiList.size(), taskId, userId, DefaultNumberConstants.ONE_NUMBER);
// 保存批次号
redisUtils.set(CacheKey.DMP_REQUEST_ID.concat(format), batch, DefaultNumberConstants.ONE_NUMBER, TimeUnit.DAYS);
// 批次修改状态
taskImeiService.updateBath(taskId, CharSequenceUtil.EMPTY, DefaultNumberConstants.ONE_NUMBER, minId, maxId);
// 删除文件
boolean csvResult = FileUtil.del(csvPath);
boolean zipResult = FileUtil.del(zipPath);
log.info("=========================== the csv path as {}, zip path as {} " + " csvResult as {} zipResult as {} ========================", csvPath, zipPath, csvResult, zipResult);
}
}
}
}
if (CollUtil.isNotEmpty(downList)) {
log.info("============================= down list size as {} =============================", downList.size());
Long minId = (long) DefaultNumberConstants.ZERO_NUMBER;
Long maxId = (long) DefaultNumberConstants.ZERO_NUMBER;
TaskTagDto taskTagDto = taskService.queryDmpTask(taskId);
Comparator<TaskImei> comparing = Comparator.comparing(TaskImei::getId);
// 最小id
Optional<TaskImei> min = downList.stream().min(comparing);
if (min.isPresent()) {
minId = min.get().getId();
}
// 最大id
Optional<TaskImei> max = downList.stream().max(comparing);
if (max.isPresent()) {
maxId = max.get().getId();
}
String uuid = IdUtil.fastSimpleUUID();
String file = deliveryProperties.getFileUrl().concat(StrPool.SLASH).concat(uuid);
// 转换DTO
List<ImeiDTO> toList = Convert.toList(ImeiDTO.class, downList);
// 保存文件
String csvPath = file.concat(".csv");
CSVFileUtil.createCsvFile(toList, csvPath);
String zipPath = file.concat(".zip");
String filePath = deliveryProperties.getDmpDownPath().concat(uuid).concat(".zip");
// 设置压缩文件
CompressUtil.decryptionCompression(zipPath, csvPath, deliveryProperties.getZipPassword());
downRecordService.createRecord(downList.size(), companyByUserId.getCompanyName(), taskTagDto.getTaskName(), zipPath, filePath, null, DefaultNumberConstants.ONE_NUMBER);
// 修改状态
taskImeiService.updateBath(taskId, CharSequenceUtil.EMPTY, DefaultNumberConstants.ONE_NUMBER, minId, maxId);
// 处理下载包
zipDownList(taskId, downList, companyByUserId);
}
}
}
}
}
private void zipDownList(Long taskId, List<TaskImei> downList, Company companyByUserId) {
log.info("============================= down list size as {} =============================", downList.size());
Long minId = (long) DefaultNumberConstants.ZERO_NUMBER;
Long maxId = (long) DefaultNumberConstants.ZERO_NUMBER;
TaskTagDto taskTagDto = taskService.queryDmpTask(taskId);
Comparator<TaskImei> comparing = Comparator.comparing(TaskImei::getId);
// 最小id
Optional<TaskImei> min = downList.stream().min(comparing);
if (min.isPresent()) {
minId = min.get().getId();
}
// 最大id
Optional<TaskImei> max = downList.stream().max(comparing);
if (max.isPresent()) {
maxId = max.get().getId();
}
String uuid = IdUtil.fastSimpleUUID();
String file = deliveryProperties.getFileUrl().concat(StrPool.SLASH).concat(uuid);
// 转换DTO
List<ImeiDTO> toList = Convert.toList(ImeiDTO.class, downList);
// 保存文件
String csvPath = file.concat(StrPool.DOT).concat(FileConstant.CSV_FILE_SUB_NAME);
CSVFileUtil.createCsvFile(toList, csvPath);
String zipPath = file.concat(FileConstant.ZIP_FILE_SUB_NAME);
String filePath = deliveryProperties.getDmpDownPath().concat(uuid).concat(FileConstant.ZIP_FILE_SUB_NAME);
// 设置压缩文件
CompressUtil.decryptionCompression(zipPath, csvPath, deliveryProperties.getZipPassword());
downRecordService.createRecord(downList.size(), companyByUserId.getCompanyName(), taskTagDto.getTaskName(), zipPath, filePath, null, DefaultNumberConstants.ONE_NUMBER);
// 修改状态
taskImeiService.updateBath(taskId, CharSequenceUtil.EMPTY, DefaultNumberConstants.ONE_NUMBER, minId, maxId);
}
}

@ -69,7 +69,7 @@ public class CSVFileUtil {
// 去除重复
List<String> phoneSets = Lists.newArrayList(Sets.newHashSet(phoneList));
File csvFile = new File("C:\\Users\\a\\Desktop\\11-24-dmp.csv");
File csvFile = new File("C:\\Users\\a\\Desktop\\12-6-dmp.csv");
//导入HuTool中CSV工具包的CsvWriter类
//设置导出字符类型, CHARSET_UTF_8
CsvWriter writer = CsvUtil.getWriter(csvFile, CharsetUtil.CHARSET_UTF_8);

@ -3,8 +3,8 @@ spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:8.130.96.163}:${NACOS_PORT:8848}
# server-addr: localhost:8848
# server-addr: ${NACOS_HOST:8.130.96.163}:${NACOS_PORT:8848}
server-addr: localhost:8848
redis:
database: 2
host: 8.130.96.163
@ -83,8 +83,8 @@ login:
font-size: 25
business:
ids:
- 8
- 10
- 8
- 10
#是否允许生成代码生产环境设置为false
@ -141,7 +141,7 @@ roll:
cdrUrl: http://8.130.96.163:8866/api/roll/cdrUrl
#cdrUrl: https://baiyee.vip/api/roll/cdrUrl
#cdrUrl: http://localhost:8866/api/roll/cdrUrl
stopUrl: http://api.hzdaba.cn/v3/Accounts/default/Esl/Process
alipay:
protocol: https
# 不需要加/gateway.do这是新旧SDK的区别切记

@ -145,7 +145,7 @@ roll:
accountSid: dbby_hangzhoubaiyehl
appId: app1
cdrUrl: https://baiyee.vip/api/roll/cdrUrl
stopUrl: http://api.hzdaba.cn/v3/Accounts/default/Esl/Process
alipay:
protocol: https

@ -151,8 +151,8 @@ public class ClueController {
@ApiOperation("撤回动态资源")
@PostMapping("/withdrawSource")
public ResponseEntity<Object> withdrawSource(@RequestBody List<Long> clueIds) {
return new ResponseEntity<>(clueService.withdrawSource(clueIds), HttpStatus.OK);
public ResponseEntity<Object> withdrawSource(@RequestBody ClueQueryCriteria clueQueryCriteria) {
return new ResponseEntity<>(clueService.withdrawSource(clueQueryCriteria), HttpStatus.OK);
}
@ApiOperation("查询管理员下(本公司内)所有资源,资源公海")
@ -183,12 +183,6 @@ public class ClueController {
return CommonResponse.createBySuccess(clueService.countClueByTaskId(taskId, beginTime, endTime));
}
/**
*
*
* @param dynamicTaskDto
* @return
*/
@PostMapping("/dynamic/task")
@ApiOperation("表单上传动态任务")
public CommonResponse<Object> insertDynamicTask(@Validated @RequestBody DynamicTaskDto dynamicTaskDto) {
@ -215,13 +209,11 @@ public class ClueController {
return CommonResponse.createBySuccess(clueService.countClueByMemberStatus(clueQueryCriteria));
}
@GetMapping("/backFlow")
@ApiOperation("拓客线索回流crm")
public CommonResponse<Object> clueBackFlow(@RequestParam(value = "taskId") Long taskId,
@RequestParam(value = "clueId") Long clueId,
@RequestParam(value = "userId") Long userId,
@RequestParam(value = "clueType") Integer clueType) {
clueService.clueBackFlow(taskId, clueId, userId, clueType);
return CommonResponse.createBySuccess();
}
// @GetMapping("/backFlow")
// @ApiOperation("拓客线索回流crm")
// public CommonResponse<Object> clueBackFlow(@RequestParam(value = "clueId") Long clueId,
// @RequestParam(value = "clueType") Integer clueType) {
// clueService.clueBackFlow(clueId, clueType);
// return CommonResponse.createBySuccess();
// }
}

@ -53,7 +53,7 @@ public class ClueJpa {
/**
* null
* crm线null
*/
public List<ClueDto> getClueList(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
StringBuilder sql = new StringBuilder();
@ -66,13 +66,40 @@ public class ClueJpa {
return getTradeInfo(confirmReceipt, clueQueryCriteria.getClueType());
}
/**
* 线null
*/
public List<ClueDto> getTalkClueList(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
StringBuilder sql = new StringBuilder();
sql.append("select c.id as id,c.name as name,c.nid as nid,c.wx as wx,c.origin as origin,c.collect_time as collectTime,c.address as address,c.record_id as recordId," +
"c.create_time as createTime,c.amount as amount,c.platform as platform,c.tag as tag,c.audio_url as audioUrl,c.cast_info as castInfo,c.is_encryption as isEncryption, cm.remark as remark,cm.member_status as memberStatus,cm.organize_id as organizeId,cm.member_id as memberId," +
"cm.optimistic_version as optimisticVersion,cm.source_label as sourceLabel,cm.task_id as taskId,cm.clue_stage as clueStage,cm.clue_call_status as clueCallStatus," +
"cm.newest_call_time as newestCallTime ,cm.turnover_amount as turnoverAmount ,cm.clue_type as clueType " +
"from tb_clue as c LEFT JOIN tb_clue_talk as cm on c.id = cm.clue_id where 1=1 ");
List confirmReceipt = getConfirmReceipt(clueQueryCriteria, sql, pageable);
return getTradeInfo(confirmReceipt, clueQueryCriteria.getClueType());
}
/**
*
*/
public Long getCount(ClueQueryCriteria clueQueryCriteria) {
StringBuilder sql = new StringBuilder("select count(*) as countNum from tb_clue as c LEFT JOIN tb_clue_middle as cm on c.id = cm.clue_id where 1=1 ");
return executeSql(clueQueryCriteria, sql);
}
/**
*
*/
public Long getTalkCount(ClueQueryCriteria clueQueryCriteria) {
StringBuilder sql = new StringBuilder("select count(*) as countNum from tb_clue as c LEFT JOIN tb_clue_talk as cm on c.id = cm.clue_id where 1=1 ");
return executeSql(clueQueryCriteria, sql);
}
private Long executeSql(ClueQueryCriteria clueQueryCriteria, StringBuilder sql) {
List confirmReceipt = getConfirmReceipt(clueQueryCriteria, sql, null);
Long count = 0L;
long count = 0L;
for (Object obj : confirmReceipt) {
Map row = (Map) obj;
BigInteger countBig = (BigInteger) row.get("countNum");
@ -117,7 +144,7 @@ public class ClueJpa {
if (clueQueryCriteria.getMemberStatus() != null) {
sql.append("and cm.member_status = :memberStatus ");
}
if (clueQueryCriteria.getLabel() != null) {
if (StrUtil.isNotEmpty(clueQueryCriteria.getLabel())) {
sql.append("and cm.source_label like :sourceLabel ");
}
if (clueQueryCriteria.getClueCallStatus() != null) {
@ -131,8 +158,9 @@ public class ClueJpa {
}
if (clueType != null) {
sql.append("AND cm.clue_type = :clueType ");
} else {
sql.append("AND cm.clue_type in :clueTypes ");
}
if (CollUtil.isNotEmpty(clueQueryCriteria.getTaskIds())) {
sql.append("and cm.task_id in :taskIds ");
}
//拼接最后加入时间排序,没加id排序出现数据重复问题(注意空格)
sql.append("ORDER BY c.create_time desc ,c.id ");
@ -166,7 +194,7 @@ public class ClueJpa {
if (clueQueryCriteria.getClueStage() != null) {
query.setParameter("clueStage", clueQueryCriteria.getClueStage());
}
if (clueQueryCriteria.getLabel() != null) {
if (StrUtil.isNotEmpty(clueQueryCriteria.getLabel())) {
query.setParameter("sourceLabel", "%" + clueQueryCriteria.getLabel() + "%");
}
if (clueQueryCriteria.getClueCallStatus() != null) {
@ -184,8 +212,9 @@ public class ClueJpa {
}
if (clueType != null) {
query.setParameter("clueType", clueType);
} else {
query.setParameter("clueTypes", clueQueryCriteria.getClueTypes());
}
if (CollUtil.isNotEmpty(clueQueryCriteria.getTaskIds())) {
query.setParameter("taskIds", clueQueryCriteria.getTaskIds());
}
query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return query.getResultList();
@ -269,10 +298,10 @@ public class ClueJpa {
clueDto.setNewestCallTime((Date) row.get("newestCallTime"));
clueDto.setAmount((String) row.get("amount"));
clueDto.setPlatform((String) row.get("platform"));
clueDtoList.add(clueDto);
clueDto.setTurnoverAmount((Double) row.get("turnoverAmount"));
clueDto.setCastInfo((String) row.get("castInfo"));
clueDto.setClueType((Integer) row.get("clueType"));
clueDtoList.add(clueDto);
}
return clueDtoList;
}
@ -327,14 +356,24 @@ public class ClueJpa {
Integer clueCallStatus = clueQueryCriteria.getClueCallStatus();
StringBuilder sql = new StringBuilder();
sql.append("SELECT tc.id as id,tc.nid as nid,tc.audio_url as audioUrl,tc.create_time as createTime,tc.name as name,tc.origin as origin,tc.cast_info as castInfo, tc.is_encryption as isEncryption, tcm.task_id as taskId,tcm.member_status as memberStatus," +
"tcm.clue_stage as clueStage,tcm.clue_call_status as clueCallStatus,tcm.member_id as memberId,tcm.source_label as sourceLabel ,tcm.turnover_amount as turnoverAmount " +
"FROM tb_clue_middle tcm LEFT JOIN tb_clue tc ON tcm.clue_id = tc.id WHERE 1 = 1 ");
if (clueType == null) {
sql.append("SELECT tc.id as id,tc.nid as nid,tc.audio_url as audioUrl,tc.create_time as createTime,tc.name as name,tc.origin as origin,tc.cast_info as castInfo, tc.is_encryption as isEncryption, tcm.task_id as taskId,tcm.member_status as memberStatus," +
"tcm.clue_stage as clueStage,tcm.clue_call_status as clueCallStatus,tcm.member_id as memberId,tcm.source_label as sourceLabel ,tcm.turnover_amount as turnoverAmount " +
"FROM tb_clue_middle tcm LEFT JOIN tb_clue tc ON tcm.clue_id = tc.id WHERE 1 = 1 ");
} else {
sql.append("SELECT tc.id as id,tc.nid as nid,tc.audio_url as audioUrl,tc.create_time as createTime,tc.name as name,tc.origin as origin,tc.cast_info as castInfo, tc.is_encryption as isEncryption, tcm.task_id as taskId,tcm.member_status as memberStatus," +
"tcm.clue_stage as clueStage,tcm.clue_call_status as clueCallStatus,tcm.member_id as memberId,tcm.source_label as sourceLabel ,tcm.turnover_amount as turnoverAmount " +
"FROM tb_clue_talk tcm LEFT JOIN tb_clue tc ON tcm.clue_id = tc.id WHERE 1 = 1 ");
}
if (CollUtil.isNotEmpty(taskIds)) {
sql.append("AND tcm.task_id IN (:taskId) ");
}
if (pageable != null) {
Integer memberStatus = clueQueryCriteria.getMemberStatus();
if (clueQueryCriteria.getUserId() != null) {
sql.append("AND tc.create_by = :userId ");
}
if (memberStatus != null && memberStatus == 0) {
sql.append("AND tcm.member_id is null ");
}
@ -358,8 +397,6 @@ public class ClueJpa {
}
if (clueType != null) {
sql.append("AND tcm.clue_type = :clueType ");
} else {
sql.append("AND tcm.clue_type in :clueTypes ");
}
if (clueCallStatus != null) {
sql.append("AND tcm.clue_call_status = :clueCallStatus ");
@ -373,6 +410,9 @@ public class ClueJpa {
query.setParameter("taskId", taskIds);
}
if (pageable != null) {
if (clueQueryCriteria.getUserId() != null) {
query.setParameter("userId", clueQueryCriteria.getUserId());
}
if (origin != null) {
query.setParameter("origin", origin);
}
@ -393,8 +433,6 @@ public class ClueJpa {
}
if (clueType != null) {
query.setParameter("clueType", clueType);
} else {
query.setParameter("clueTypes", clueQueryCriteria.getClueTypes());
}
if (clueCallStatus != null) {
query.setParameter("clueCallStatus", clueCallStatus);
@ -461,68 +499,77 @@ public class ClueJpa {
Integer clueStage = clueQueryCriteria.getClueStage();
List<Timestamp> createTimeList = clueQueryCriteria.getCreateTime();
Integer clueType = clueQueryCriteria.getClueType();
StringBuilder sql = new StringBuilder("select count(*) as countNum from tb_clue as c LEFT JOIN tb_clue_middle as cm on c.id = cm.clue_id where 1=1 ");
StringBuilder sql = new StringBuilder();
if (clueType == null) {
sql.append("select count(*) as countNum from tb_clue as c LEFT JOIN tb_clue_middle as cm on c.id = cm.clue_id where 1=1 ");
} else {
sql.append("select count(*) as countNum from tb_clue as c LEFT JOIN tb_clue_talk as cm on c.id = cm.clue_id where 1=1 ");
}
if (CollUtil.isNotEmpty(taskIds)) {
sql.append("AND cm.task_id IN (:taskId) ");
Integer memberStatus = clueQueryCriteria.getMemberStatus();
if (memberStatus != null && memberStatus == 0) {
sql.append("AND cm.member_id is null ");
}
if (memberStatus != null && memberStatus > 0) {
sql.append("AND cm.member_id is not null ");
}
if (StringUtils.isNotBlank(name)) {
sql.append("and c.name like :name ");
}
if (origin != null) {
sql.append("and c.origin = :origin ");
}
if (createTimeList != null && createTimeList.size() == 2) {
sql.append("and c.create_time between :createTimeBegin and :createTimeEnd ");
}
}
if (clueQueryCriteria.getUserId() != null) {
sql.append("AND c.create_by = :userId ");
}
Integer memberStatus = clueQueryCriteria.getMemberStatus();
if (memberStatus != null && memberStatus == 0) {
sql.append("AND cm.member_id is null ");
}
if (memberStatus != null && memberStatus > 0) {
sql.append("AND cm.member_id is not null ");
}
if (StringUtils.isNotBlank(name)) {
sql.append("and c.name like :name ");
}
if (origin != null) {
sql.append("and c.origin = :origin ");
}
if (createTimeList != null && createTimeList.size() == 2) {
sql.append("and c.create_time between :createTimeBegin and :createTimeEnd ");
}
if (userIdList != null && userIdList.size() > 0) {
sql.append("and cm.member_id in (:userIdList)");
}
if (clueStage != null) {
sql.append("AND cm.clue_stage = :clueStage ");
}
if (clueType != null) {
sql.append("AND cm.clue_type = :clueType ");
} else {
sql.append("AND cm.clue_type < :clueType ");
}
if (userIdList != null && userIdList.size() > 0) {
sql.append("and cm.member_id in (:userIdList)");
}
if (clueStage != null) {
sql.append("AND cm.clue_stage = :clueStage ");
}
if (clueType != null) {
sql.append("AND cm.clue_type = :clueType ");
}
Query query = entityManager.createNativeQuery(sql.toString());
if (CollUtil.isNotEmpty(taskIds)) {
query.setParameter("taskId", taskIds);
if (origin != null) {
query.setParameter("origin", origin);
}
if (StringUtils.isNotBlank(name)) {
query.setParameter("name", "%" + name + "%");
}
if (createTimeList != null && createTimeList.size() == 2) {
String createTimeBegin = this.format.format(createTimeList.get(0));
String createTimeEnd = this.format.format(createTimeList.get(1));
query.setParameter("createTimeBegin", createTimeBegin);
query.setParameter("createTimeEnd", createTimeEnd);
}
if (clueStage != null) {
query.setParameter("clueStage", clueStage);
}
if (userIdList != null && userIdList.size() > 0) {
query.setParameter("userIdList", userIdList);
}
if (clueType != null) {
query.setParameter("clueType", clueType);
} else {
query.setParameter("clueType", DefaultNumberConstants.FOUR_NUMBER);
}
}
if (clueQueryCriteria.getUserId() != null) {
query.setParameter("userId", clueQueryCriteria.getUserId());
}
if (origin != null) {
query.setParameter("origin", origin);
}
if (StringUtils.isNotBlank(name)) {
query.setParameter("name", "%" + name + "%");
}
if (createTimeList != null && createTimeList.size() == 2) {
String createTimeBegin = this.format.format(createTimeList.get(0));
String createTimeEnd = this.format.format(createTimeList.get(1));
query.setParameter("createTimeBegin", createTimeBegin);
query.setParameter("createTimeEnd", createTimeEnd);
}
if (clueStage != null) {
query.setParameter("clueStage", clueStage);
}
if (userIdList != null && userIdList.size() > 0) {
query.setParameter("userIdList", userIdList);
}
if (clueType != null) {
query.setParameter("clueType", clueType);
}
query.unwrap(NativeQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List confirmReceipt = query.getResultList();
Long count = 0L;
long count = 0L;
for (Object obj : confirmReceipt) {
Map row = (Map) obj;
BigInteger countBig = (BigInteger) row.get("countNum");
@ -547,7 +594,7 @@ public class ClueJpa {
public Long getPoolCount(PublicCluePoolQueryCriteria clueQueryCriteria) {
StringBuilder sql = new StringBuilder("select count(*) as countNum from tb_public_clue_pool as p left join tb_clue_middle as cm on p.clue_id=cm.clue_id where 1=1 ");
List confirmReceipt = getCluePoolListCondition(clueQueryCriteria, sql, null);
Long count = 0L;
long count = 0L;
for (Object obj : confirmReceipt) {
Map row = (Map) obj;
BigInteger countBig = (BigInteger) row.get("countNum");

@ -1,6 +1,5 @@
package com.baiye.module.dao;
import com.baiye.module.entity.Clue;
import com.baiye.module.entity.ClueMiddle;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@ -201,18 +200,9 @@ public interface ClueMiddleRepository extends JpaRepository<ClueMiddle, Long>, J
@Query(value = "select d.task_id from tb_clue_middle d where d.member_status = ?1 and d.task_id in ?2", nativeQuery = true)
List<Long> selectClueMiddleByMember(Integer memberStatus, Set<Long> taskIds);
/**
* 线线
*
* @param startTime
* @param endTime
* @param clueType 线
* @return
*/
@Query(value = " select * from tb_clue_middle as t where t.label_time >= ?1 and t.label_time< ?2 and t.clue_type in ?3", nativeQuery = true)
List<ClueMiddle> queryClueByClueType(String startTime, String endTime, List<Integer> clueType);
List<ClueMiddle> findByTaskIdAndMemberStatus(Long taskId, int memberStatus);
@Query(value = "select clue_id from tb_clue_middle where task_id = ?1 and member_status =?2", nativeQuery = true)
List<Long> findByTaskIdAndMemberStatus(Long taskId, int memberStatus);
/**
* 线

@ -0,0 +1,69 @@
package com.baiye.module.dao;
import com.baiye.module.entity.ClueTalk;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Set;
/**
* @author jt
*/
@Repository
public interface ClueTalkRepository extends JpaRepository<ClueTalk, Long>, JpaSpecificationExecutor<ClueTalk> {
/**
* 线
*
* @param startTime
* @param endTime
* @return
*/
@Query(value = " select * from tb_clue_talk where label_time between ?1 and ?2", nativeQuery = true)
List<ClueTalk> queryClueByLabelTime(String startTime, String endTime);
/**
* 线
*
* @param startTime
* @param endTime
* @param taskIds
* @param memberId
* @return
*/
@Query(value = " select * from tb_clue_talk where (label_time between ?1 and ?2) and task_id in ?3 and (coalesce (?4,null) is null or member_id = ?4)", nativeQuery = true)
List<ClueTalk> queryClueByLabelTimeAndTaskIds(String startTime, String endTime, List<Long> taskIds,Long memberId);
/**
* 线
*
* @param userId
* @return
*/
@Query(value = " select tcm.* from tb_clue_talk as tcm left join tb_clue as tc on tcm.clue_id =tc.id" +
" where tc.create_by = ?1", nativeQuery = true)
List<ClueTalk> findClueTalkByCreateBy(Long userId);
/**
*
*
* @param taskId
* @return
*/
@Query(value = "select count(*) from tb_clue_talk where task_id = ?1", nativeQuery = true)
Integer findTaskNum(Long taskId);
@Query(value = "select clue_id from tb_clue_talk where task_id = ?1 and member_status =?2", nativeQuery = true)
List<Long> findByTaskIdAndMemberStatus(Long taskId, int memberStatus);
@Modifying
@Query(value = " update tb_clue_talk set member_id = ?2, member_status = 1 where clue_id in ?1 ", nativeQuery = true)
void updateMemberIdByClueIdIn(List<Long> clueIdList, Long userId);
@Query(value = "select d.task_id from tb_clue_talk d where d.member_status = ?1 and d.task_id in ?2", nativeQuery = true)
List<Long> selectClueTalkByMember(Integer memberStatus, Set<Long> taskIds);
}

@ -0,0 +1,29 @@
package com.baiye.module.entity;
import com.baiye.model.entity.BaseClueMiddle;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
/**
* @author jt
*/
@Data
@Entity
@Table(name = "tb_clue_talk")
@ApiModel(value = "ClueTalk")
public class ClueTalk extends BaseClueMiddle {
@Id
@ApiModelProperty(value = "线索id")
@Column(name = "clue_id")
@NotNull(message = "资源id不能为空")
private Long clueId;
@Transient
private String clueName;
@Transient
private String memberName;
}

@ -175,10 +175,10 @@ public interface ClueService {
/**
* ,
*
* @param clueIds
* @param clueQueryCriteria
* @return
*/
Object withdrawSource(List<Long> clueIds);
Object withdrawSource(ClueQueryCriteria clueQueryCriteria);
/**
* (),
@ -267,17 +267,16 @@ public interface ClueService {
*/
void saveClue(List<String> tagList, List<String> phoneList, Long taskId, Long userId, Integer num);
/**
* 线crm
*
* @param taskId
* @param clueId
* @param clueType
*/
void clueBackFlow(Long taskId, Long clueId, Long userId, Integer clueType);
// /**
// * 将拓客的线索回流到crm
// *
// * @param clueId
// * @param clueType
// */
// void clueBackFlow( Long clueId, Integer clueType);
/**
*
*/
void dynamicTaskDistribution(Long taskId);
void dynamicTaskDistribution(Long taskId,Integer uploadType);
}

@ -1,9 +1,9 @@
package com.baiye.module.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 cn.hutool.json.JSONArray;
@ -11,12 +11,12 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.ClueTypeConstants;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.constant.SourceLabelConstants;
import com.baiye.enums.ClueStageEnum;
import com.baiye.exception.BadRequestException;
import com.baiye.feign.*;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.*;
import com.baiye.model.entity.BaseClue;
import com.baiye.model.vo.ResSourceLabel;
import com.baiye.constant.FileConstant;
import com.baiye.module.dao.*;
@ -43,7 +43,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@ -58,6 +57,7 @@ public class ClueServiceImpl implements ClueService {
private final ClueRecordRepository clueRecordRepository;
private final ClueRecordMapper clueRecordMapper;
private final ClueMiddleRepository clueMiddleRepository;
private final ClueTalkRepository clueTalkRepository;
private final ClueJpa clueJpa;
private final OrganizeClient organizeClient;
private final RedisUtils redisUtils;
@ -111,20 +111,37 @@ public class ClueServiceImpl implements ClueService {
clueFailRecordRepository.saveAll(failRecords);
}
List<Clue> clueListAll = clueRepository.saveAll(clueList);
//插入中间表数据
List<ClueMiddle> clueMiddleList = new ArrayList<>();
for (Clue clue : clueListAll) {
ClueMiddle clueMiddle = new ClueMiddle();
clueMiddle.setClueId(clue.getId());
clueMiddle.setTaskId(taskId);
clueMiddle.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueStage(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueType(clueType);
clueMiddleList.add(clueMiddle);
if (Arrays.asList(ClueTypeConstants.TOKER_TYPE).contains(clueType)) {
List<ClueTalk> clueTalks = new ArrayList<>();
for (Clue clue : clueListAll) {
ClueTalk clueTalk = new ClueTalk();
clueTalk.setClueId(clue.getId());
clueTalk.setTaskId(taskId);
clueTalk.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setClueStage(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setClueType(clueType);
clueTalks.add(clueTalk);
}
clueTalkRepository.saveAll(clueTalks);
} else {
//插入中间表数据
List<ClueMiddle> clueMiddleList = new ArrayList<>();
for (Clue clue : clueListAll) {
ClueMiddle clueMiddle = new ClueMiddle();
clueMiddle.setClueId(clue.getId());
clueMiddle.setTaskId(taskId);
clueMiddle.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueStage(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueType(clueType);
clueMiddleList.add(clueMiddle);
}
clueMiddleRepository.saveAll(clueMiddleList);
}
clueMiddleRepository.saveAll(clueMiddleList);
}
}
@ -205,23 +222,37 @@ public class ClueServiceImpl implements ClueService {
String nid = clueQueryCriteria.getNid();
if (clueQueryCriteria.getMemberId() != null) {
if (StrUtil.isNotEmpty(clueQueryCriteria.getTaskName())) {
TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria();
taskQueryCriteria.setCreateBy(clueQueryCriteria.getMemberId());
taskQueryCriteria.setBlurry(clueQueryCriteria.getTaskName());
Set<Long> taskIds = findTaskId(taskQueryCriteria);
clueQueryCriteria.setTaskIds(taskIds);
}
List<Long> userIds = organizeClient.findOrganizeIdByMember(clueQueryCriteria.getMemberId()).getBody();
//如果查询的小组id不为空 ,说明是组长并有权限查看组员信息
if (CollUtil.isNotEmpty(userIds)) {
clueQueryCriteria.setUserIdList(userIds);
clueQueryCriteria.setMemberId(null);
}
List<ClueDto> clueDtoList;
Long count;
//线索类型为空 查询的是crm线索
if (clueQueryCriteria.getClueType() == null) {
//4 dmp 5拓客 是特殊的任务,单独处理
clueQueryCriteria.setClueTypes(Arrays.asList(ClueTypeConstants.SCREEN_TYPE));
clueDtoList = clueJpa.getClueList(clueQueryCriteria, pageable);
count = clueJpa.getCount(clueQueryCriteria);
} else {
//拓客,投流
clueDtoList = clueJpa.getTalkClueList(clueQueryCriteria, pageable);
count = clueJpa.getTalkCount(clueQueryCriteria);
}
List<ClueDto> clueDtoList = clueJpa.getClueList(clueQueryCriteria, pageable);
//手机号搜索
if (StringUtils.isNotBlank(nid)) {
clueDtoList = clueDtoList.stream().filter(ct -> ct.getNid().contains(nid)).collect(Collectors.toList());
}
Long count = clueJpa.getCount(clueQueryCriteria);
//查询线索记录
Set<Long> clueIdList = clueDtoList.stream().map(ClueDto::getId).collect(Collectors.toSet());
List<ConductRecord> conductRecords = conductRecordRepository.findByClueIdIn(clueIdList);
@ -258,11 +289,12 @@ public class ClueServiceImpl implements ClueService {
@Override
public List<ClueDto> query(ClueQueryCriteria clueQueryCriteria) {
if (clueQueryCriteria.getMemberId() != null) {
List<ClueDto> clueDtoList;
if (clueQueryCriteria.getClueType() == null) {
//4 dmp 5拓客 是特殊的任务,单独处理
clueQueryCriteria.setClueTypes(Arrays.asList(ClueTypeConstants.SCREEN_TYPE));
clueDtoList = clueJpa.getClueList(clueQueryCriteria, null);
} else {
clueDtoList = clueJpa.getTalkClueList(clueQueryCriteria, null);
}
List<ClueDto> clueDtoList = clueJpa.getClueList(clueQueryCriteria, null);
Set<Long> memberIds = clueDtoList.stream().map(ClueDto::getMemberId).collect(Collectors.toSet());
Map<Long, String> userNickNameMap = userClient.findById(memberIds);
// id查询(详情查询)时返回标签信息
@ -293,14 +325,6 @@ public class ClueServiceImpl implements ClueService {
clueDto.setAddWeChatStatus(recordDTO.getStatus());
clueDto.setAddWeChatTime(recordDTO.getAddFriendTime());
}
//通过任务判断线索是否是飞鱼任务
// 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);
// }
}
}
return clueDtoList;
@ -337,6 +361,11 @@ public class ClueServiceImpl implements ClueService {
@Override
@Transactional(rollbackFor = Exception.class)
public void update(ClueMiddle clueMiddle) {
if (Arrays.asList(ClueTypeConstants.TOKER_TYPE).contains(clueMiddle.getClueType())) {
//执行拓客线索处理
executeTalkClue(clueMiddle);
return;
}
//更新通话状态时不加锁
if (clueMiddle.getClueCallStatus() == null) {
//乐观锁,不用jpa查询(jpa有缓存这个坑)
@ -375,7 +404,6 @@ public class ClueServiceImpl implements ClueService {
callbackOceanEngine(clueMiddle.getClueId(), stage);
}
}
}
if (clueMiddle.getClueCallStatus() != null) {
clueMiddleOne.setClueCallStatus(clueMiddle.getClueCallStatus());
@ -390,7 +418,29 @@ public class ClueServiceImpl implements ClueService {
clueMiddleOne.setOptimisticVersion(clueMiddle.getOptimisticVersion() + 1);
}
clueMiddleRepository.save(clueMiddleOne);
}
private void executeTalkClue(ClueMiddle clueMiddle) {
ClueTalk clueTalk = clueTalkRepository.findById(clueMiddle.getClueId()).orElseGet(ClueTalk::new);
if (clueMiddle.getClueCallStatus() != null) {
clueTalk.setClueCallStatus(clueMiddle.getClueCallStatus());
clueTalk.setMemberStatus(DefaultNumberConstants.TWO_NUMBER);
}
if (clueMiddle.getNewestCallTime() != null) {
clueTalk.setNewestCallTime(clueMiddle.getNewestCallTime());
}
if (CollUtil.isNotEmpty(clueMiddle.getSourceLabel())) {
List<String> sourceLabelList = clueMiddle.getSourceLabel();
// 标签去重
List<String> sourceLabel = new ArrayList<>(new TreeSet<>(sourceLabelList));
clueTalk.setSourceLabel(sourceLabel);
clueTalk.setLabelTime(new Date());
if (SourceLabelConstants.INTENTION.equals(sourceLabel.get(0))) {
//如果转有意向 转crm
clueBackFlow(clueTalk);
}
}
clueTalkRepository.save(clueTalk);
}
/**
@ -435,7 +485,11 @@ public class ClueServiceImpl implements ClueService {
if (clueIds.size() <= 0) {
throw new BadRequestException("用户分配比率过低,请减少分配用户");
}
clueMiddleRepository.updateMemberIdByClueIdIn(clueIds, userId);
if (clueQueryCriteria.getClueType() != null && clueQueryCriteria.getClueType() == DefaultNumberConstants.NINETY_NINE) {
clueTalkRepository.updateMemberIdByClueIdIn(clueIds, userId);
} else {
clueMiddleRepository.updateMemberIdByClueIdIn(clueIds, userId);
}
}
}
}
@ -493,7 +547,12 @@ public class ClueServiceImpl implements ClueService {
Long taskId = baseExcelListenerDto.getTaskId();
Long userId = baseExcelListenerDto.getUserId();
Integer origin = baseExcelListenerDto.getOrigin();
Integer taskNum = clueMiddleRepository.findTaskNum(taskId);
Integer taskNum;
if (origin == DefaultNumberConstants.SIX_NUMBER) {
taskNum = clueTalkRepository.findTaskNum(taskId);
} else {
taskNum = clueMiddleRepository.findTaskNum(taskId);
}
if (taskNum == null || taskNum == 0) {
try {
taskClient.sendErrMessage("导入资源合规条数0条,请检查文件重新导入", userId);
@ -543,16 +602,23 @@ public class ClueServiceImpl implements ClueService {
@Override
public Map<String, Object> queryCluePool(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
if (clueQueryCriteria.getMemberId() != null) {
clueQueryCriteria.setUserId(clueQueryCriteria.getMemberId());
Set<Long> taskIds;
TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria();
taskQueryCriteria.setCreateBy(clueQueryCriteria.getMemberId());
taskQueryCriteria.setTaskType(1);
if (clueQueryCriteria.getTaskName() != null) {
taskQueryCriteria.setBlurry(clueQueryCriteria.getTaskName());
}
if (clueQueryCriteria.getTaskId() != null) {
taskQueryCriteria.setId(clueQueryCriteria.getTaskId());
}
return findClueList(taskQueryCriteria, clueQueryCriteria, pageable);
if (clueQueryCriteria.getTaskId() == null && clueQueryCriteria.getTaskName() != null) {
taskQueryCriteria.setBlurry(clueQueryCriteria.getTaskName());
}
if (clueQueryCriteria.getClueType() == null) {
taskQueryCriteria.setIsForms(Arrays.asList(ClueTypeConstants.SCREEN_TYPE));
} else {
taskQueryCriteria.setIsForms(Arrays.asList(ClueTypeConstants.TOKER_TYPE));
}
taskIds = findTaskId(taskQueryCriteria);
return findClueList(taskIds, clueQueryCriteria, pageable);
} else {
log.info("========================用户id为空============================");
throw new BadRequestException("刷新后重试");
@ -560,51 +626,60 @@ public class ClueServiceImpl implements ClueService {
}
@Override
public Object withdrawSource(List<Long> clueIds) {
List<String> phoneList = new ArrayList<>();
if (CollUtil.isNotEmpty(clueIds)) {
// 查询已打过电话的
List<Long> list = reportClient.getTurnOnIds(clueIds).getData();
if (CollUtil.isNotEmpty(list)) {
//过滤掉打过电话的线索ID
clueIds = clueIds.stream().filter(num -> !list.contains(num)).collect(Collectors.toList());
phoneList = clueRepository.findAllById(list).stream().map(BaseClue::getNid).collect(Collectors.toList());
}
if (CollUtil.isNotEmpty(clueIds)) {
public Object withdrawSource(ClueQueryCriteria clueQueryCriteria) {
if (CollUtil.isNotEmpty(clueQueryCriteria.getClueIdList())) {
if (clueQueryCriteria.getClueType() != null && clueQueryCriteria.getClueType() == DefaultNumberConstants.NINETY_NINE) {
List<ClueTalk> clueList = new ArrayList<>();
List<ClueTalk> clueAll = clueTalkRepository.findAllById(clueQueryCriteria.getClueIdList());
for (ClueTalk clueTalk : clueAll) {
if (clueTalk.getClueCallStatus() == DefaultNumberConstants.ZERO_NUMBER) {
clueTalk.setSourceLabel(null);
clueTalk.setOptimisticVersion(0);
clueTalk.setRemark(null);
clueTalk.setMemberStatus(0);
clueTalk.setMemberId(null);
clueTalk.setOrganizeId(null);
clueTalk.setClueStage(0);
clueList.add(clueTalk);
} else {
throw new BadRequestException("存在已通话资源,无法撤回");
}
}
clueTalkRepository.saveAll(clueList);
} else {
List<ClueMiddle> clueList = new ArrayList<>();
List<ClueMiddle> clueAll = clueMiddleRepository.findAllById(clueIds);
List<ClueMiddle> clueAll = clueMiddleRepository.findAllById(clueQueryCriteria.getClueIdList());
for (ClueMiddle clueMiddle : clueAll) {
clueMiddle.setSourceLabel(null);
clueMiddle.setOptimisticVersion(0);
clueMiddle.setRemark(null);
clueMiddle.setMemberStatus(0);
clueMiddle.setMemberId(null);
clueMiddle.setOrganizeId(null);
clueMiddle.setClueStage(0);
clueList.add(clueMiddle);
if (clueMiddle.getClueCallStatus() == DefaultNumberConstants.ZERO_NUMBER) {
clueMiddle.setSourceLabel(null);
clueMiddle.setOptimisticVersion(0);
clueMiddle.setRemark(null);
clueMiddle.setMemberStatus(0);
clueMiddle.setMemberId(null);
clueMiddle.setOrganizeId(null);
clueMiddle.setClueStage(0);
clueList.add(clueMiddle);
} else {
throw new BadRequestException("存在已通话资源,无法撤回");
}
}
clueMiddleRepository.saveAll(clueList);
}
}
if (CollUtil.isNotEmpty(phoneList)) {
String str = "";
for (String phone : phoneList) {
str = str + phone + ",";
}
str = str.substring(0, str.length() - 1);
throw new BadRequestException(str + " 已通话,无法撤回");
}
return new ResponseEntity<>(HttpStatus.OK);
}
@Override
public Object findCompanyClue(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria();
taskQueryCriteria.setCreateBy(clueQueryCriteria.getUserId());
Set<Long> taskIds = new HashSet<>();
if (clueQueryCriteria.getTaskName() != null) {
TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria();
taskQueryCriteria.setCreateBy(clueQueryCriteria.getUserId());
taskQueryCriteria.setBlurry(clueQueryCriteria.getTaskName());
taskIds = findTaskId(taskQueryCriteria);
}
return findClueList(taskQueryCriteria, clueQueryCriteria, pageable);
return findClueList(taskIds, clueQueryCriteria, pageable);
}
@Override
@ -728,50 +803,23 @@ public class ClueServiceImpl implements ClueService {
String endTime = reportDto.getEndTime();
List<ClueMiddle> clueMiddles;
if (StrUtil.isBlank(reportDto.getStartTime()) || StrUtil.isBlank(reportDto.getEndTime())) {
// startTime = DateUtil.beginOfDay(DateUtil.date()).toString();
// endTime = DateUtil.date().toString();
clueMiddles = clueMiddleRepository.findByMemberId(reportDto.getMemberId());
} else {
clueMiddles = clueMiddleRepository.queryAllByTimeAndMemberId(startTime, endTime, reportDto.getMemberId());
}
HashMap<String, Object> reportMap = getReportMap(clueMiddles);
// List<Integer> stages = Arrays.asList(ClueStageEnum.EFFICIENT.getKey(), ClueStageEnum.ADD_WECHAT.getKey(), ClueStageEnum.INTENTION.getKey(), ClueStageEnum.INVITING.getKey(), ClueStageEnum.INTERVIEW.getKey());
// double dealRate = 0.00;
// double communicatRate = 0.00;
// double intentionRate = 0.00;
// if (CollUtil.isNotEmpty(clueMiddles)) {
// //无意向
// int noIntention = (int) reportMap.get(ClueStageEnum.NO_INTENTION.getValue());
// int size = clueMiddles.size() - noIntention;
// //成交
// int deal = (int) reportMap.get(ClueStageEnum.DEAL.getValue());
// dealRate = NumberUtil.div(deal, size, 2);
//
// //待跟进
// int communicat = (int) reportMap.get(ClueStageEnum.NEW_CLUE.getValue()) + (int) reportMap.get(ClueStageEnum.COMMUNICAT.getValue());
// communicatRate = NumberUtil.div(communicat, size, 2);
//
// //有意向
// int i = (int) reportMap.get(ClueStageEnum.EFFICIENT.getValue());
// int i1 = (int) reportMap.get(ClueStageEnum.ADD_WECHAT.getValue());
// int i2 = (int) reportMap.get(ClueStageEnum.INTENTION.getValue());
// int i3 = (int) reportMap.get(ClueStageEnum.INVITING.getValue());
// int i4 = (int) reportMap.get(ClueStageEnum.INTERVIEW.getValue());
// int intention = i + i1 + i2 + i3 + i4;
// intentionRate = NumberUtil.div(intention, size, 2);
//
// }
// reportMap.put("dealRate", dealRate);
// reportMap.put("communicatRate", communicatRate);
// reportMap.put("intentionRate", intentionRate);
return CommonResponse.createBySuccess(reportMap);
}
@Override
public Map<Long, Integer> countClueByMemberStatus(ClueQueryCriteria clueQueryCriteria) {
List<Long> longs = clueMiddleRepository.selectClueMiddleByMember(clueQueryCriteria.getMemberStatus(), clueQueryCriteria.getTaskIds());
List<Long> longs;
if (clueQueryCriteria.getClueType() != null) {
longs = clueTalkRepository.selectClueTalkByMember(clueQueryCriteria.getMemberStatus(), clueQueryCriteria.getTaskIds());
} else {
longs = clueMiddleRepository.selectClueMiddleByMember(clueQueryCriteria.getMemberStatus(), clueQueryCriteria.getTaskIds());
}
Map<Long, Integer> map = new HashMap<>();
for (Long key : longs) {
if (map.containsKey(key)) {
@ -789,34 +837,45 @@ public class ClueServiceImpl implements ClueService {
return clueMiddleRepository.findTaskNum(taskId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void clueBackFlow(Long taskId, Long clueId, Long userId, Integer clueType) {
ClueMiddle clueMiddle = clueMiddleRepository.findById(clueId).orElseGet(ClueMiddle::new);
Integer userCount = turnCrmLogRepository.findByUserIdCount(clueMiddle.getMemberId()) + DefaultNumberConstants.ONE_NUMBER;
UserDto userInfo = userClient.findUserInfo(clueMiddle.getMemberId());
if (userCount != null && userCount > userInfo.getTurnCrmNum()) {
/**
* 线crm
*/
public void clueBackFlow(ClueTalk clueTalk) {
if (clueTalk.getMemberStatus() == DefaultNumberConstants.FOUR_NUMBER) {
throw new BadRequestException("已经转为crm,请勿重复操作");
}
if (clueTalk.getClueCallStatus() == null || clueTalk.getClueCallStatus() != DefaultNumberConstants.TWO_NUMBER) {
throw new BadRequestException("未拨打有效电话,不能转crm");
}
int userCount = turnCrmLogRepository.findByUserIdCount(clueTalk.getMemberId()) + DefaultNumberConstants.ONE_NUMBER;
UserDto userInfo = userClient.findUserInfo(clueTalk.getMemberId());
if (userCount > userInfo.getTurnCrmNum()) {
throw new BadRequestException("回流失败,每天上限" + userInfo.getTurnCrmNum() + "条,请联系管理员");
}
// 记录转crm日志
TurnCrmLog turnCrmLog = new TurnCrmLog();
turnCrmLog.setClueId(clueId);
turnCrmLog.setUserId(clueMiddle.getMemberId());
turnCrmLog.setClueId(clueTalk.getClueId());
turnCrmLog.setUserId(clueTalk.getMemberId());
turnCrmLogRepository.save(turnCrmLog);
// 初始化线索加密字段
Clue clue = clueRepository.findById(clueId).orElseGet(Clue::new);
Clue clue = clueRepository.findById(clueTalk.getClueId()).orElseGet(Clue::new);
clue.setIsEncryption(DefaultNumberConstants.ZERO_NUMBER);
//查看crm任务
clueRepository.save(clue);
//查看crm的回流任务
TaskQueryCriteria taskQueryCriteria = new TaskQueryCriteria();
int crmClueType = 0;
if (clueType == DefaultNumberConstants.FOUR_NUMBER) {
if (clueTalk.getClueType() == DefaultNumberConstants.FOUR_NUMBER) {
crmClueType = DefaultNumberConstants.SEVEN_NUMBER;
taskQueryCriteria.setIsForm(DefaultNumberConstants.SEVEN_NUMBER);
} else if (clueType == DefaultNumberConstants.FIVE_NUMBER) {
} else if (clueTalk.getClueType() == DefaultNumberConstants.FIVE_NUMBER) {
crmClueType = DefaultNumberConstants.SIX_NUMBER;
taskQueryCriteria.setIsForm(DefaultNumberConstants.SIX_NUMBER);
}
taskQueryCriteria.setCreateBy(userId);
taskQueryCriteria.setCreateBy(clue.getCreateBy());
Object body = taskClient.query(taskQueryCriteria).getBody();
JSONArray taskList = JSONUtil.parseArray(body);
Long crmTaskId;
@ -827,32 +886,40 @@ public class ClueServiceImpl implements ClueService {
} else {
throw new BadRequestException("回流失败");
}
Task crmTask = new Task();
crmTask.setId(crmTaskId);
crmTask.setTotalNumber(crmTotalNumber + 1);
taskClient.updateTask(crmTask);
//初始化线索
ClueMiddle clueMiddle = new ClueMiddle();
BeanUtil.copyProperties(clueTalk, clueMiddle);
clueMiddle.setTaskId(crmTaskId);
clueMiddle.setSourceLabel(null);
clueMiddle.setClueType(crmClueType);
clueMiddle.setMemberStatus(DefaultNumberConstants.TWO_NUMBER);
clueMiddle.setClueStage(DefaultNumberConstants.TWO_NUMBER);
clueMiddle.setClueStageTime(new Date());
clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueMiddleRepository.save(clueMiddle);
//todo 改变两个任务的总数量
Task crmTask = new Task();
crmTask.setId(crmTaskId);
crmTask.setTotalNumber(crmTotalNumber + 1);
taskClient.updateTask(crmTask);
Integer taskNum = clueMiddleRepository.findTaskNum(taskId);
Task task = new Task();
task.setId(taskId);
task.setTotalNumber(taskNum);
taskClient.updateTask(task);
clueTalk.setMemberStatus(DefaultNumberConstants.FOUR_NUMBER);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void dynamicTaskDistribution(Long taskId) {
List<ClueMiddle> clueAll = clueMiddleRepository.findByTaskIdAndMemberStatus(taskId, DefaultNumberConstants.ZERO_NUMBER);
List<Long> clueIds = clueAll.stream().map(ClueMiddle::getClueId).collect(Collectors.toList());
public void dynamicTaskDistribution(Long taskId, Integer uploadType) {
List<Long> clueIds;
if (uploadType == 6) {
clueIds = clueTalkRepository.findByTaskIdAndMemberStatus(taskId, DefaultNumberConstants.ZERO_NUMBER);
} else {
clueIds = clueMiddleRepository.findByTaskIdAndMemberStatus(taskId, DefaultNumberConstants.ZERO_NUMBER);
}
CommonResponse<DynamicTaskDistributionDTO> response = taskClient.findTaskDistribution(taskId);
if (response.getStatus() == DefaultNumberConstants.ZERO_NUMBER) {
DynamicTaskDistributionDTO dynamicTaskDistributionDTO = response.getData();
// 开启了自动分配
@ -880,9 +947,14 @@ public class ClueServiceImpl implements ClueService {
distributeDTO.setWeights(weights);
distributeDTO.setResourceList(clueIds);
CommonResponse<List<DistributeResponseDTO>> distributeResponse = assignDataClient.dataDistribution(distributeDTO);
if (distributeResponse.getStatus() == DefaultNumberConstants.ZERO_NUMBER) {
for (DistributeResponseDTO data : distributeResponse.getData()) {
clueMiddleRepository.updateMemberIdByClueIdIn(data.getResponseList(), data.getDeptId());
if (uploadType == 6) {
clueTalkRepository.updateMemberIdByClueIdIn(data.getResponseList(), data.getDeptId());
} else {
clueMiddleRepository.updateMemberIdByClueIdIn(data.getResponseList(), data.getDeptId());
}
}
}
}
@ -890,7 +962,6 @@ public class ClueServiceImpl implements ClueService {
}
}
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());
@ -1013,9 +1084,6 @@ public class ClueServiceImpl implements ClueService {
double turnoverAmount = 0;
for (ClueMiddle clueMiddle : clueMiddles) {
Date clueStageTime = clueMiddle.getClueStageTime();
// if (DateUtil.between(date, clueStageTime, DateUnit.DAY) == 0) {
// turnoverAmount += clueMiddle.getTurnoverAmount();
// }
if (clueStageTime != null && clueMiddle.getTurnoverAmount() != null && Objects.equals(DateUtil.formatDate(date), DateUtil.formatDate(clueStageTime))) {
turnoverAmount += clueMiddle.getTurnoverAmount();
}
@ -1035,31 +1103,22 @@ public class ClueServiceImpl implements ClueService {
* @param pageable
* @return
*/
private Map<String, Object> findClueList(TaskQueryCriteria taskQueryCriteria, ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
//获取所有任务id
Set<Long> taskIds = findTaskId(taskQueryCriteria);
if (CollUtil.isNotEmpty(taskIds)) {
if (clueQueryCriteria.getClueType() == null) {
//4 dmp 5拓客 是特殊的任务,单独处理
clueQueryCriteria.setClueTypes(Arrays.asList(ClueTypeConstants.SCREEN_TYPE));
}
List<Clue> clueAll = clueJpa.findClue(taskIds, pageable, clueQueryCriteria);
Set<Long> memberIds = clueAll.stream().map(Clue::getMemberId).collect(Collectors.toSet());
Map<Long, String> userNickNameMap = userClient.findById(memberIds);
for (Clue clue : clueAll) {
//获取缓存中任务名称
String str = findTaskName(clue.getTaskId());
clue.setTaskName(str);
//查询分配人的用户名称
Long memberId = clue.getMemberId();
if (memberId != null && userNickNameMap.containsKey(memberId)) {
clue.setDistributeUserName(userNickNameMap.get(memberId));
}
private Map<String, Object> findClueList(Set<Long> taskIds, ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
List<Clue> clueAll = clueJpa.findClue(taskIds, pageable, clueQueryCriteria);
Set<Long> memberIds = clueAll.stream().map(Clue::getMemberId).collect(Collectors.toSet());
Map<Long, String> userNickNameMap = userClient.findById(memberIds);
for (Clue clue : clueAll) {
//获取缓存中任务名称
String str = findTaskName(clue.getTaskId());
clue.setTaskName(str);
//查询分配人的用户名称
Long memberId = clue.getMemberId();
if (memberId != null && userNickNameMap.containsKey(memberId)) {
clue.setDistributeUserName(userNickNameMap.get(memberId));
}
Long count = clueJpa.getTaskCount(taskIds, clueQueryCriteria);
return PageUtil.toPage(clueAll, count);
}
return PageUtil.toPage(new ArrayList<>(), 0);
Long count = clueJpa.getTaskCount(taskIds, clueQueryCriteria);
return PageUtil.toPage(clueAll, count);
}
/**
@ -1089,7 +1148,8 @@ public class ClueServiceImpl implements ClueService {
if (str == null || "null".equals(str) || StringUtils.isBlank(str)) {
Task body = taskClient.queryDetails(taskId).getBody();
if (ObjectUtil.isNotEmpty(body)) {
redisUtils.set(taskNameKey, body.getTaskName(), 2592000);// 缓存三十天
// 缓存三十天
redisUtils.set(taskNameKey, body.getTaskName(), 2592000);
return body.getTaskName();
}
}
@ -1113,18 +1173,20 @@ public class ClueServiceImpl implements ClueService {
clue.setNid(phone);
clue.setCreateBy(userId);
clue.setCastInfo(tagList.get(i));
clue.setOrigin(DefaultNumberConstants.FIVE_NUMBER);
clue.setOrigin(DefaultNumberConstants.SIX_NUMBER);
clue.setIsEncryption(DefaultNumberConstants.ONE_NUMBER);
Clue save = clueRepository.save(clue);
ClueMiddle clueMiddle = new ClueMiddle();
clueMiddle.setClueId(save.getId());
clueMiddle.setClueType(num);
clueMiddle.setTaskId(taskId);
clueMiddle.setClueStage(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueMiddleRepository.save(clueMiddle);
ClueTalk clueTalk = new ClueTalk();
clueTalk.setClueId(save.getId());
clueTalk.setClueType(num);
clueTalk.setTaskId(taskId);
clueTalk.setClueStage(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setClueStageTime(new Date());
clueTalk.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER);
clueTalk.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueTalkRepository.save(clueTalk);
clueNumber++;
}
}

@ -6,7 +6,6 @@ import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.baiye.constant.ClueTypeConstants;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.feign.TaskClient;
@ -14,8 +13,10 @@ import com.baiye.feign.UserClient;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.HomePageReportDTO;
import com.baiye.module.dao.ClueMiddleRepository;
import com.baiye.module.dao.ClueTalkRepository;
import com.baiye.module.dao.ReportTokerRepository;
import com.baiye.module.entity.ClueMiddle;
import com.baiye.module.entity.ClueTalk;
import com.baiye.module.entity.ReportToker;
import com.baiye.module.entity.Task;
import com.baiye.module.entity.dto.ReportTokerDTO;
@ -45,19 +46,19 @@ public class ReportTokerServiceImpl implements ReportTokerService {
private final ReportSync reportSync;
private final ClueMiddleRepository clueMiddleRepository;
private final ClueTalkRepository clueTalkRepository;
@Override
public Map<String, Object> reportTokerBroken(ReportTokerDTO reportTokerDTO) {
dealTime(reportTokerDTO);
String beginTime = reportTokerDTO.getBeginTime();
String endTime = reportTokerDTO.getEndTime();
if (reportTokerDTO.getTaskId() == null) {
throw new BadRequestException("请选择任务");
}
List<ReportToker> reportTokers = reportTokerRepository.queryAllByTimeAndTaskId(beginTime, endTime, reportTokerDTO.getTaskId(), reportTokerDTO.getMemberId());
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime());
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime(), Collections.singletonList(reportTokerDTO.getTaskId()), reportTokerDTO.getMemberId());
reportTokers.addAll(todayData);
return dealReportData(beginTime, endTime, reportTokerDTO.getTaskId(), reportTokerDTO.getMemberId(), reportTokers);
}
@ -69,7 +70,7 @@ public class ReportTokerServiceImpl implements ReportTokerService {
throw new BadRequestException("请选择任务");
}
List<ReportToker> reportTokers = reportTokerRepository.queryAllByTimeAndTaskId(reportTokerDTO.getBeginTime(), reportTokerDTO.getEndTime(), reportTokerDTO.getTaskId(), null);
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime());
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime(), reportTokerDTO.getTaskIds(), null);
reportTokers.addAll(todayData);
List<UploadTokerDTO> list = new ArrayList<>();
for (ReportToker reportToker : reportTokers) {
@ -100,11 +101,12 @@ public class ReportTokerServiceImpl implements ReportTokerService {
/**
*
*/
private List<ReportToker> getTodayData(String endTime) {
private List<ReportToker> getTodayData(String endTime, List<Long> taskIds, Long memberId) {
long between = DateUtil.between(DateUtil.parseDate(endTime), DateUtil.parseDate(DateUtil.today()), DateUnit.DAY);
// 需要实时查询当天的统计
if (between == DefaultNumberConstants.ZERO_NUMBER) {
return reportSync.dealData(DateUtil.beginOfDay(DateUtil.date()).toString(), DateUtil.endOfDay(DateUtil.date()).toString());
List<ClueTalk> clueTalks = clueTalkRepository.queryClueByLabelTimeAndTaskIds(DateUtil.beginOfDay(DateUtil.date()).toString(), DateUtil.endOfDay(DateUtil.date()).toString(), taskIds, memberId);
return reportSync.dealData(clueTalks);
}
return new ArrayList<>();
}
@ -180,7 +182,7 @@ public class ReportTokerServiceImpl implements ReportTokerService {
}
List<HashMap<String, Object>> list = new ArrayList<>();
List<ReportToker> tokers = reportTokerRepository.queryAllByTimeAndTaskIds(reportTokerDTO.getBeginTime(), reportTokerDTO.getEndTime(), reportTokerDTO.getTaskIds());
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime());
List<ReportToker> todayData = getTodayData(reportTokerDTO.getEndTime(), reportTokerDTO.getTaskIds(), null);
tokers.addAll(todayData);
Map<Long, List<ReportToker>> tokerByTaskId = tokers.stream().collect(Collectors.groupingBy(ReportToker::getTaskId, Collectors.toList()));
HashMap<String, Object> map = new HashMap<>(5);
@ -210,16 +212,21 @@ public class ReportTokerServiceImpl implements ReportTokerService {
Map<String, HomePageReportDTO> map = new HashMap<>(2);
List<ClueMiddle> clueMiddles = clueMiddleRepository.findClueMiddleByCreateBy(userId);
HomePageReportDTO crmReport = new HomePageReportDTO().init();
HomePageReportDTO talkReport = new HomePageReportDTO().init();
//crm
if (CollUtil.isNotEmpty(clueMiddles)) {
crmReport.setTotalNum(clueMiddles.size());
for (ClueMiddle clueMiddle : clueMiddles) {
//crm
if (Arrays.asList(ClueTypeConstants.SCREEN_TYPE).contains(clueMiddle.getClueType())) {
dealData(clueMiddle, crmReport, 1);
} else if (Arrays.asList(ClueTypeConstants.TOKER_TYPE).contains(clueMiddle.getClueType())) {
//拓客投流
dealData(clueMiddle, talkReport, 2);
}
dealCrmData(clueMiddle, crmReport);
}
}
//拓客
List<ClueTalk> clueTalks = clueTalkRepository.findClueTalkByCreateBy(userId);
HomePageReportDTO talkReport = new HomePageReportDTO().init();
if (CollUtil.isNotEmpty(clueTalks)) {
talkReport.setTotalNum(clueTalks.size());
for (ClueTalk clueTalk : clueTalks) {
dealTalkData(clueTalk, talkReport);
}
}
map.put("crm", rate(crmReport));
@ -241,41 +248,23 @@ public class ReportTokerServiceImpl implements ReportTokerService {
return report;
}
private void dealData(ClueMiddle clueMiddle, HomePageReportDTO report, Integer flag) {
private void dealCrmData(ClueMiddle clueMiddle, HomePageReportDTO report) {
Integer clueType = clueMiddle.getClueType();
report.setTotalNum(report.getTotalNum() + 1);
//来源
if (flag == 1) {
//投流来源
if (clueType == DefaultNumberConstants.SEVEN_NUMBER) {
report.setDeliveryNum(report.getDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.SIX_NUMBER) {
report.setTalkNum(report.getTalkNum() + 1);
}
} else {
//拓客来源
if (clueType == DefaultNumberConstants.FOUR_NUMBER) {
report.setDeliveryNum(report.getDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.FIVE_NUMBER) {
report.setTalkNum(report.getTalkNum() + 1);
}
if (clueType == DefaultNumberConstants.SEVEN_NUMBER) {
report.setDeliveryNum(report.getDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.SIX_NUMBER) {
report.setTalkNum(report.getTalkNum() + 1);
}
//昨日新增
DateTime yesterday = DateUtil.yesterday();
if (clueMiddle.getCreateTime() != null && DateUtil.betweenDay(clueMiddle.getCreateTime(), yesterday, true) == DefaultNumberConstants.ZERO_NUMBER) {
report.setAddTotalNum(report.getAddTotalNum() + 1);
if (flag == 1) {
if (clueType == DefaultNumberConstants.SEVEN_NUMBER) {
report.setAddDeliveryNum(report.getAddDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.SIX_NUMBER) {
report.setAddTalkNum(report.getAddTalkNum() + 1);
}
} else {
if (clueType == DefaultNumberConstants.FOUR_NUMBER) {
report.setAddDeliveryNum(report.getAddDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.FIVE_NUMBER) {
report.setAddTalkNum(report.getAddTalkNum() + 1);
}
if (clueType == DefaultNumberConstants.SEVEN_NUMBER) {
report.setAddDeliveryNum(report.getAddDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.SIX_NUMBER) {
report.setAddTalkNum(report.getAddTalkNum() + 1);
}
}
//今日实时
@ -289,4 +278,33 @@ public class ReportTokerServiceImpl implements ReportTokerService {
}
}
}
private void dealTalkData(ClueTalk clueTalk, HomePageReportDTO report) {
Integer clueType = clueTalk.getClueType();
if (clueType == DefaultNumberConstants.FOUR_NUMBER) {
report.setDeliveryNum(report.getDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.FIVE_NUMBER) {
report.setTalkNum(report.getTalkNum() + 1);
}
//昨日新增
DateTime yesterday = DateUtil.yesterday();
if (clueTalk.getCreateTime() != null && DateUtil.betweenDay(clueTalk.getCreateTime(), yesterday, true) == DefaultNumberConstants.ZERO_NUMBER) {
report.setAddTotalNum(report.getAddTotalNum() + 1);
if (clueType == DefaultNumberConstants.FOUR_NUMBER) {
report.setAddDeliveryNum(report.getAddDeliveryNum() + 1);
} else if (clueType == DefaultNumberConstants.FIVE_NUMBER) {
report.setAddTalkNum(report.getAddTalkNum() + 1);
}
}
//今日实时
DateTime today = DateUtil.date();
if (clueTalk.getNewestCallTime() != null && DateUtil.betweenDay(clueTalk.getNewestCallTime(), today, true) == DefaultNumberConstants.ZERO_NUMBER) {
if (clueTalk.getClueCallStatus() == DefaultNumberConstants.ONE_NUMBER) {
report.setUsrNum(report.getUsrNum() + 1);
} else if (clueTalk.getClueCallStatus() == DefaultNumberConstants.TWO_NUMBER) {
report.setTurnOnNum(report.getTurnOnNum() + 1);
report.setUsrNum(report.getUsrNum() + 1);
}
}
}
}

@ -6,10 +6,7 @@ import com.baiye.exception.BadRequestException;
import com.baiye.feign.TaskClient;
import com.baiye.model.dto.ClueQueryCriteria;
import com.baiye.constant.FileConstant;
import com.baiye.module.dao.ClueJpa;
import com.baiye.module.dao.ClueMiddleRepository;
import com.baiye.module.dao.ClueRecordRepository;
import com.baiye.module.dao.ClueRepository;
import com.baiye.module.dao.*;
import com.baiye.module.entity.Clue;
import com.baiye.module.entity.ClueRecord;
import com.baiye.module.entity.Task;
@ -46,6 +43,8 @@ public class FileAnalysisTask {
private TaskClient taskClient;
@Resource
private ClueRecordRepository clueRecordRepository;
@Resource
private ClueTalkRepository clueTalkRepository;
/**
*
@ -96,14 +95,20 @@ public class FileAnalysisTask {
Integer uploadType = clueRecords.get(0).getUploadType();
if (uploadType == FileConstant.FIVE_NUMBER || (uploadType == FileConstant.SIX_NUMBER && !isCreateTask)) {
Long taskId = clueRecords.get(0).getTaskId();
Integer taskNum = clueMiddleRepository.findTaskNum(taskId);
Integer taskNum;
if (uploadType == FileConstant.SIX_NUMBER) {
taskNum = clueTalkRepository.findTaskNum(taskId);
} else {
taskNum = clueMiddleRepository.findTaskNum(taskId);
}
Task task = new Task();
task.setId(taskId);
task.setTotalNumber(taskNum);
task.setIsDistribution(1);
taskClient.updateTask(task);
// 查看此任务是否开启自动分配,开启了就分配掉
clueService.dynamicTaskDistribution(taskId);
clueService.dynamicTaskDistribution(taskId,uploadType);
return;
}
//创建任务

@ -16,6 +16,7 @@ import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.feign.DownRecordClient;
import com.baiye.feign.TaskClient;
import com.baiye.module.dao.ClueTalkRepository;
import com.baiye.module.entity.DeliveryRecord;
import com.baiye.module.entity.Task;
import com.baiye.module.service.ClueService;
@ -64,6 +65,8 @@ public class MailSourceTask {
private final DownRecordClient downRecordClient;
private final ClueTalkRepository clueTalkRepository;
private final DeliveryProperties deliveryProperties;
private final DeliveryRecordService deliveryRecordService;
@ -142,7 +145,7 @@ public class MailSourceTask {
clueService.saveClue(tagList, decryptList, byTaskName.getTaskId(),
byTaskName.getUserId(), DefaultNumberConstants.FOUR_NUMBER);
// 修改任务总条数
Integer taskNum = clueService.findTaskNum(taskId);
Integer taskNum = clueTalkRepository.findTaskNum(taskId);
task.setId(taskId);
task.setTotalNumber(taskNum);
task.setIsDistribution(DefaultNumberConstants.ONE_NUMBER);
@ -182,7 +185,7 @@ public class MailSourceTask {
(deliveryProperties.getEmailAddress(), deliveryProperties.getEmailPassword());
for (Message message : list) {
Date sentDate = message.getSentDate();
// 时间偏移三十天
// 时间偏移
DateTime dateTime = DateUtil.offsetDay(DateUtil.date(), -DefaultNumberConstants.FIVE_NUMBER);
if (dateTime.after(sentDate)) {
// 删除邮件

@ -1,12 +1,11 @@
package com.baiye.task;
import cn.hutool.core.date.DateUtil;
import com.baiye.constant.ClueTypeConstants;
import com.baiye.constant.SourceLabelConstants;
import com.baiye.feign.UserClient;
import com.baiye.module.dao.ClueMiddleRepository;
import com.baiye.module.dao.ClueTalkRepository;
import com.baiye.module.dao.ReportTokerRepository;
import com.baiye.module.entity.ClueMiddle;
import com.baiye.module.entity.ClueTalk;
import com.baiye.module.entity.ReportToker;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -23,9 +22,9 @@ import java.util.stream.Collectors;
@Component
@Slf4j
public class ReportSync {
private final ClueMiddleRepository clueMiddleRepository;
private final UserClient userClient;
private final ReportTokerRepository reportTokerRepository;
private final ClueTalkRepository clueTalkRepository;
/**
* 23
@ -37,35 +36,32 @@ public class ReportSync {
//当前时间
String beginOfDay = DateUtil.formatDateTime(DateUtil.yesterday());
String endOfDay = DateUtil.formatDateTime(DateUtil.date());
List<ReportToker> list = dealData(beginOfDay, endOfDay);
List<ClueTalk> clueTalks = clueTalkRepository.queryClueByLabelTime(beginOfDay, endOfDay);
List<ReportToker> list = dealData(clueTalks);
reportTokerRepository.saveAll(list);
log.info("拓客投流统计 结束------------------{}", DateUtil.date());
}
public List<ReportToker> dealData(String beginOfDay, String endOfDay) {
//只统计拓客和投流的 clueTypes 为 4和5 的
List<Integer> clueTypes = Arrays.asList(ClueTypeConstants.TOKER_TYPE);
List<ClueMiddle> clueMiddles = clueMiddleRepository.queryClueByClueType(beginOfDay, endOfDay, clueTypes);
public List<ReportToker> dealData(List<ClueTalk> clueTalks) {
List<ReportToker> list = new ArrayList<>();
//按人员id分组
HashMap<Long, List<ClueMiddle>> mapByUserId = new HashMap<>(clueMiddles.stream().collect(Collectors.groupingBy(ClueMiddle::getMemberId, Collectors.toList())));
HashMap<Long, List<ClueTalk>> mapByUserId = new HashMap<>(clueTalks.stream().collect(Collectors.groupingBy(ClueTalk::getMemberId, Collectors.toList())));
Set<Long> userIds = mapByUserId.keySet();
Map<Long, String> userNameList = userClient.findById(userIds);
for (Long memberId : mapByUserId.keySet()) {
List<ClueMiddle> clueMiddlesByUserId = mapByUserId.get(memberId);
List<ClueTalk> clueByUserId = mapByUserId.get(memberId);
//任务分组
HashMap<Long, List<ClueMiddle>> mapByTaskId = new HashMap<>(clueMiddlesByUserId.stream().collect(Collectors.groupingBy(ClueMiddle::getTaskId, Collectors.toList())));
HashMap<Long, List<ClueTalk>> mapByTaskId = new HashMap<>(clueByUserId.stream().collect(Collectors.groupingBy(ClueTalk::getTaskId, Collectors.toList())));
for (Long taskId : mapByTaskId.keySet()) {
List<ClueMiddle> clueMiddlesByTaskId = mapByTaskId.get(taskId);
List<ClueTalk> clueByTaskId = mapByTaskId.get(taskId);
int intention = 0;
int notIntention = 0;
int notTurnOn = 0;
for (ClueMiddle clueMiddle : clueMiddlesByTaskId) {
for (ClueTalk clueTalk : clueByTaskId) {
//标签
String sourceLabel = "";
if (clueMiddle.getSourceLabel().size() > 0) {
sourceLabel = clueMiddle.getSourceLabel().get(0);
if (clueTalk.getSourceLabel().size() > 0) {
sourceLabel = clueTalk.getSourceLabel().get(0);
}
switch (sourceLabel) {
case SourceLabelConstants.INTENTION:

Loading…
Cancel
Save