Merge remote-tracking branch 'origin/master'

master
bynt 11 months ago
commit 428496fda8

@ -11,14 +11,12 @@ import java.util.regex.Pattern;
public class MobileUtil {
/**
*
* 133,149,153,173,177,180,181,189,191,199,1349,1410,1700,1701,1702,193
* 133,149,153,173,177,180,181,189,191,199,1349,1410,1700,1701,1702,193,===广 192
**/
private static final String CHINA_TELECOM_PATTERN = "(?:^(?:\\+86)?1(?:33|49|53|7[37]|8[019]|9[139])\\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|92|49|53|7[37]|8[019]|9[139])\\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,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}$)";
@ -26,8 +24,6 @@ public class MobileUtil {
*
* 134,135,136,137,138,139,147,148,150,151,152,157,158,159,178,182,183,184,187,188,195,198,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|95)\\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]|6[5]|7[28]|8[2-478]|98|95)\\d{8}$)|(?:^(?:\\+86)?1440\\d{7}$)|(?:^(?:\\+86)?170[356]\\d{7}$)";
/**

@ -180,6 +180,12 @@ public interface SysUserMapper extends ExtendMapper<SysUser> {
return SqlHelper.retBool(count);
}
/**
* RoleCode
*
* @param roleCodes
* @return List<SysUser>
*/
List<SelectData<Void>> listSelectSonListData(@Param("userId") Long userId, @Param("roleCodes") Collection<String> roleCodes);
/**

@ -4,6 +4,7 @@ import cn.hutool.core.collection.ListUtil;
import com.baiye.security.constant.UserAttributeNameConstants;
import com.baiye.security.userdetails.User;
import com.baiye.security.util.SecurityUtils;
import com.baiye.system.checker.AdminUserChecker;
import com.baiye.system.enums.RoleCodeEnum;
import com.baiye.system.model.entity.SysRole;
import com.baiye.system.model.qo.SysRoleQO;
@ -32,6 +33,8 @@ public class SysRoleServiceImpl extends ExtendServiceImpl<SysRoleMapper, SysRole
private final SysRoleMenuService sysRoleMenuService;
private final AdminUserChecker adminUserChecker;
/**
*
*
@ -74,10 +77,10 @@ public class SysRoleServiceImpl extends ExtendServiceImpl<SysRoleMapper, SysRole
String salesExecutive = RoleCodeEnum.find(14L);
String storeExecutive = RoleCodeEnum.find(22L);
String entryClerk = RoleCodeEnum.find(15L);
String directExecutive = RoleCodeEnum.find(24L);
Set<String> list = new HashSet<>();
if (user.getUserId() == 1) {
list.add(salesExecutive);
list.add(storeExecutive);
if (adminUserChecker.isAdminUser(user.getUserId())) {
list.addAll(ListUtil.of(salesExecutive, storeExecutive, directExecutive));
}
if (roleCodeList.contains(salesExecutive)) {
list.add(entryClerk);
@ -87,6 +90,9 @@ public class SysRoleServiceImpl extends ExtendServiceImpl<SysRoleMapper, SysRole
List<String> collect = selectData.stream().map(SelectData::getValue).filter(value -> !excludeRoleCode.contains(String.valueOf(value))).map(String::valueOf).collect(Collectors.toList());
list.addAll(collect);
}
if (roleCodeList.contains(directExecutive)) {
list.addAll(ListUtil.of(RoleCodeEnum.find(25L), RoleCodeEnum.find(26L)));
}
return selectData.stream().filter(c -> list.contains(String.valueOf(c.getValue()))).collect(Collectors.toList());
}

@ -295,7 +295,6 @@ public class SysUserController {
: R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "充值失败");
}
@Operation(summary = "重审", description = "重审列表")
@GetMapping("/review/list")
public R<List<SelectData<Void>>> recharge() {
@ -303,5 +302,11 @@ public class SysUserController {
(SecurityUtils.getWhichUserId(), RoleCodeEnum.ROLE_REVIEWER.getRoleCode()));
}
@Operation(summary = "分发员获取公司下的直达业务员", description = "分发员获取公司下的直达业务员")
@GetMapping("/findDirectSalesman")
public R<Object> findDirectSalesman() {
String directSalesmanCode = RoleCodeEnum.find(26L);
return R.ok(sysUserService.listByRoleCodeAndUserId(directSalesmanCode, SecurityUtils.getWhichUserId()));
}
}

@ -50,7 +50,22 @@ public enum RoleCodeEnum {
/**
*
*/
ROLE_STORE_SALESMAN(23L, "ROLE_STORE_SALESMAN");
ROLE_STORE_SALESMAN(23L, "ROLE_STORE_SALESMAN"),
/**
*
*/
ROLE_DIRECT_EXECUTIVE(24L, "ROLE_DIRECT_EXECUTIVE"),
/**
*
*/
ROLE_DIRECT_DISTRIBUTE(25L, "ROLE_DIRECT_DISTRIBUTE"),
/**
*
*/
ROLE_DIRECT_SALESMAN(26L, "ROLE_DIRECT_SALESMAN");
private final Long id;

@ -0,0 +1,68 @@
package com.baiye.modules.distribute.controller;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.modules.distribute.dto.DirectClueDTO;
import com.baiye.modules.distribute.entity.DirectClueUserEntity;
import com.baiye.modules.distribute.qo.DirectClueQo;
import com.baiye.modules.distribute.service.DirectClueService;
import com.baiye.modules.distribute.service.OceanEngineClueService;
import com.baiye.modules.distribute.vo.DirectClueVO;
import com.baiye.result.BaseResultCode;
import com.baiye.result.R;
import com.baiye.security.util.SecurityUtils;
import com.baiye.validation.group.UpdateGroup;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
@RequiredArgsConstructor
@RestController
@Tag(name = "直达线索")
@RequestMapping("/directClue")
public class DirectClueController {
private final DirectClueService directClueService;
private final OceanEngineClueService oceanEngineClueService;
@GetMapping("/page")
@Operation(summary = "分页查询资源")
public R<PageResult<DirectClueVO>> getClueRecordPage(@Validated PageParam pageParam, DirectClueQo qo) {
Long salesmanUserId = qo.getSalesmanUserId();
Long distributeUserId = qo.getDistributeUserId();
if (salesmanUserId == null && distributeUserId == null) qo.setCreateBy(SecurityUtils.getCurrentUserId());
else qo.setCreateBy(SecurityUtils.getWhichUserId());
return R.ok(directClueService.queryPage(pageParam, qo));
}
@PostMapping("/update")
@Operation(summary = "修改", description = "修改")
public R<Object> update(@Validated({UpdateGroup.class}) @RequestBody DirectClueDTO directClueDTO) {
return directClueService.update(directClueDTO) ? R.ok() : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "修改失败");
}
@PostMapping("/distribute")
@Operation(summary = "分发员分发")
public R<Object> distribute(@Valid @RequestBody List<DirectClueUserEntity> directClueUserList) {
return R.ok(directClueService.distribute(directClueUserList));
}
@GetMapping("/test")
@Operation(summary = "分页查询资源")
public R<Object> test() {
DateTime date = DateUtil.parse("2023-11-02 00:00:00");
DateTime date2 = DateUtil.parse("2023-11-03 23:00:00");
oceanEngineClueService.getFeiYuSource(date, date2);
return R.ok();
}
}

@ -33,7 +33,6 @@ import java.io.IOException;
public class OceanEngineController {
private final OceanEngineService oceanEngineService;
private final OceanEngineClueService oceanEngineClueService;
@GetMapping(value = "/url")
public ResponseEntity<String> query(Long companyId, String authorizeName) {

@ -0,0 +1,20 @@
package com.baiye.modules.distribute.converter;
import com.baiye.modules.distribute.dto.DirectClueDTO;
import com.baiye.modules.distribute.entity.DirectClueEntity;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface DirectClueConverter {
DirectClueConverter INSTANCE = Mappers.getMapper(DirectClueConverter.class);
/**
* DTO PO
* @param dto DTO
* @return ClueEntity PO
*/
DirectClueEntity dtoToPo(DirectClueDTO dto);
}

@ -0,0 +1,22 @@
package com.baiye.modules.distribute.dto;
import com.baiye.validation.group.UpdateGroup;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class DirectClueDTO {
@Schema(title = "ID")
@NotNull(message = "ID不能为空", groups = { UpdateGroup.class })
private Long directClueId;
@Schema(title = "有效状态 0:有效 1:无效")
private Integer effectiveStatus;
@Schema(title = "标签")
private List<String> clueLabel;
}

@ -0,0 +1,23 @@
package com.baiye.modules.distribute.dto;
import cn.hutool.core.text.CharSequenceUtil;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* @author wjt
* @date 2023/11/10
*/
@Data
public class OceanEngineResponseDTO {
private Object data;
@JsonProperty("code")
private Integer code;
@JsonProperty("message")
private String message;
@JsonProperty("request_id")
private String requestId = CharSequenceUtil.EMPTY;
}

@ -0,0 +1,70 @@
package com.baiye.modules.distribute.entity;
import com.baiye.entity.BaseEntity;
import com.baiye.extend.mybatis.plus.alias.TableAlias;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDateTime;
@Getter
@Setter
@TableName("tb_direct_clue")
@TableAlias("dc")
@Schema(title = "直达线索表")
@AllArgsConstructor
@NoArgsConstructor
public class DirectClueEntity extends BaseEntity {
private static final long serialVersionUID = 1L;
@TableId
@Schema(title = "直达线索ID")
private Long directClueId;
@Schema(title = "编号")
private String batchNo;
@Schema(title = "客户名称")
private String customName;
@Schema(title = "nid")
private String nid;
@Schema(title = "来源 0:巨量")
private Integer originType;
@Schema(title = "有效状态 0:有效 1:无效")
private Integer effectiveStatus;
@Schema(title = "资源标签")
private String clueLabelName;
@Schema(title = "分发状态 0:未分发 1:已分发")
private Integer distributeType;
@Schema(title = "分发日期")
private LocalDateTime distributeDate;
@Schema(title = "资源分发的分发员用户ID")
private Long distributeUserId;
@Schema(title = "其它线索信息")
private String otherClue;
public DirectClueEntity(String batchNo, String customName, String nid, Integer originType, Integer effectiveStatus, Integer distributeType, LocalDateTime distributeDate, String otherClue) {
this.batchNo = batchNo;
this.customName = customName;
this.nid = nid;
this.originType = originType;
this.effectiveStatus = effectiveStatus;
this.distributeType = distributeType;
this.distributeDate = distributeDate;
this.otherClue = otherClue;
}
}

@ -0,0 +1,34 @@
package com.baiye.modules.distribute.entity;
import com.baiye.validation.group.CreateGroup;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotNull;
@Getter
@Setter
@TableName("tb_direct_clue_user")
@Schema(title = "直达线索表")
public class DirectClueUserEntity {
private static final long serialVersionUID = 1L;
@TableId
@Schema(title = "直达线索用户关联表ID")
private Long id;
@Schema(title = "线索ID")
@NotNull(message = "线索不能为空", groups = CreateGroup.class)
private Long clueId;
@Schema(title = "用户ID")
@NotNull(message = "用户不能为空", groups = CreateGroup.class)
private Long userId;
@Schema(title = "用户名")
private String userName;
}

@ -0,0 +1,41 @@
package com.baiye.modules.distribute.mapper;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.conditions.query.LambdaAliasQueryWrapperX;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.distribute.entity.DirectClueEntity;
import com.baiye.modules.distribute.qo.DirectClueQo;
import com.baiye.modules.distribute.vo.DirectClueVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.apache.ibatis.annotations.Param;
public interface DirectClueMapper extends ExtendMapper<DirectClueEntity> {
default PageResult<DirectClueVO> queryPage(PageParam pageParam, DirectClueQo qo) {
IPage<DirectClueVO> page = this.prodPage(pageParam);
LambdaAliasQueryWrapperX<DirectClueEntity> wrapperX = WrappersX.lambdaAliasQueryX(DirectClueEntity.class);
wrapperX.eqIfPresent(DirectClueEntity::getCreateBy, qo.getCreateBy())
.eqIfPresent(DirectClueEntity::getDistributeUserId, qo.getDistributeUserId())
.likeIfPresent(DirectClueEntity::getCustomName, qo.getCustomName())
.eqIfPresent(DirectClueEntity::getOriginType, qo.getOriginType())
.eqIfPresent(DirectClueEntity::getEffectiveStatus, qo.getEffectiveStatus())
.eqIfPresent(DirectClueEntity::getDistributeType, qo.getDistributeType());
if (qo.getSalesmanUserId() != null){
wrapperX.exists("SELECT 1 from tb_direct_clue_user dcu where dcu.user_id = "+ qo.getSalesmanUserId() +" and dc.direct_clue_id = dcu.clue_id");
}
if (StringUtils.isNotBlank(qo.getStartTime()) && StringUtils.isNotBlank(qo.getEndTime())) {
wrapperX.between(DirectClueEntity::getDistributeDate, qo.getStartTime(), qo.getEndTime());
}
this.selectByPage(page, wrapperX, qo.getSalesmanUserId());
return new PageResult<>(page.getRecords(), page.getTotal());
}
IPage<DirectClueVO> selectByPage(IPage<DirectClueVO> page, @Param(Constants.WRAPPER) Wrapper<DirectClueEntity> wrapper, @Param("userId") Long userId);
}

@ -0,0 +1,7 @@
package com.baiye.modules.distribute.mapper;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.modules.distribute.entity.DirectClueUserEntity;
public interface DirectClueUserMapper extends ExtendMapper<DirectClueUserEntity> {
}

@ -4,10 +4,6 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* @Author YQY
* @Date 2023/8/15
*/
@Data
public class ClueQo {

@ -0,0 +1,39 @@
package com.baiye.modules.distribute.qo;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class DirectClueQo {
@Parameter(description = "开始时间")
private String startTime;
@Parameter(description = "结束时间")
private String endTime;
@Parameter(description = "创建人")
private Long createBy;
@Schema(title = "资源分发的分发员用户ID")
private Long distributeUserId;
@Schema(title = "资源分发的业务员用户ID")
private Long salesmanUserId;
@Schema(title = "客户名称")
private String customName;
@Schema(title = "来源 0:巨量")
private Integer originType;
@Schema(title = "有效状态 0:有效 1:无效")
private Integer effectiveStatus;
@Schema(title = "分发状态 0:未分发 1:已分发")
private Integer distributeType;
@Schema(title = "属性")
private String attribute;
}

@ -0,0 +1,35 @@
package com.baiye.modules.distribute.service;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.distribute.dto.DirectClueDTO;
import com.baiye.modules.distribute.entity.DirectClueEntity;
import com.baiye.modules.distribute.entity.DirectClueUserEntity;
import com.baiye.modules.distribute.qo.DirectClueQo;
import com.baiye.modules.distribute.vo.DirectClueVO;
import java.util.List;
public interface DirectClueService extends ExtendService<DirectClueEntity> {
/**
*
*/
PageResult<DirectClueVO> queryPage(PageParam pageParam, DirectClueQo qo);
/**
*
*/
boolean update(DirectClueDTO directClueDTO);
/**
*
*/
void allocationClue(Long userId, List<DirectClueEntity> directClueEntityList);
/**
*
*/
boolean distribute(List<DirectClueUserEntity> directClueUserList);
}

@ -0,0 +1,135 @@
package com.baiye.modules.distribute.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.exception.BadRequestException;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.modules.distribute.converter.DirectClueConverter;
import com.baiye.modules.distribute.dto.DirectClueDTO;
import com.baiye.modules.distribute.entity.DirectClueEntity;
import com.baiye.modules.distribute.entity.DirectClueUserEntity;
import com.baiye.modules.distribute.mapper.DirectClueMapper;
import com.baiye.modules.distribute.mapper.DirectClueUserMapper;
import com.baiye.modules.distribute.qo.DirectClueQo;
import com.baiye.modules.distribute.service.DirectClueService;
import com.baiye.modules.distribute.vo.DirectClueVO;
import com.baiye.system.enums.RoleCodeEnum;
import com.baiye.system.model.dto.SysUserNameRoleDTO;
import com.baiye.system.service.SysUserService;
import com.baiye.util.AESUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.ballcat.security.properties.SecurityProperties;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class DirectClueServiceImpl extends ExtendServiceImpl<DirectClueMapper, DirectClueEntity> implements DirectClueService {
private static final Map<Long, Integer> userIndexMap = new HashMap<>();
private final SysUserService sysUserService;
private final DirectClueUserMapper directClueUserMapper;
private final SecurityProperties securityProperties;
@Override
public PageResult<DirectClueVO> queryPage(PageParam pageParam, DirectClueQo qo) {
Long distributeUserId = qo.getDistributeUserId();
PageResult<DirectClueVO> pageResult = baseMapper.queryPage(pageParam, qo);
List<DirectClueVO> recordList = pageResult.getRecords();
if (CollUtil.isNotEmpty(recordList)){
// 线索接收人映射信息
Map<Long, List<DirectClueUserEntity>> map = new HashMap<>();
if (qo.getDistributeUserId() != null){
List<Long> ids = recordList.stream().map(DirectClueVO::getDirectClueId).collect(Collectors.toList());
List<DirectClueUserEntity> userEntities = directClueUserMapper.selectList(new LambdaQueryWrapper<DirectClueUserEntity>().in(DirectClueUserEntity::getClueId, ids));
map = userEntities.stream().collect(Collectors.groupingBy(DirectClueUserEntity::getClueId));
}
for (DirectClueVO directClueVO : recordList) {
// 手机号解密 显示位数
String decryptNid = AESUtils.decrypt(directClueVO.getNid(), securityProperties.getPasswordSecretKey());
if (StringUtils.isNotBlank(decryptNid) && distributeUserId != null) {
StringBuilder stringBuilder = new StringBuilder(decryptNid);
decryptNid = stringBuilder.replace(1, 9, "****").toString();
}
directClueVO.setNid(decryptNid);
//标签类型转换
String clueLabelName = directClueVO.getClueLabelName();
if (StringUtils.isNotBlank(clueLabelName)){
directClueVO.setClueLabelName("");
directClueVO.setClueLabel(JSONUtil.toList(clueLabelName, String.class));
}
// 线索接收人
if (qo.getDistributeUserId() != null && map.containsKey(directClueVO.getDirectClueId())){
List<DirectClueUserEntity> directClueUserEntities = map.get(directClueVO.getDirectClueId());
List<String> userNames = directClueUserEntities.stream().map(DirectClueUserEntity::getUserName).collect(Collectors.toList());
directClueVO.setUserNameList(userNames);
}
// 其它线索信息转换
if (StringUtils.isNotBlank(directClueVO.getOtherClue())){
directClueVO.setOtherClueObj(JSONUtil.parseObj(directClueVO.getOtherClue()));
directClueVO.setOtherClue("");
}
}
}
return pageResult;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean update(DirectClueDTO directClueDTO) {
DirectClueEntity directClueEntity = DirectClueConverter.INSTANCE.dtoToPo(directClueDTO);
List<String> clueLabel = directClueDTO.getClueLabel();
if (CollUtil.isNotEmpty(clueLabel)) {
directClueEntity.setClueLabelName(JSONUtil.toJsonStr(clueLabel));
}
return SqlHelper.retBool(baseMapper.updateById(directClueEntity));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void allocationClue(Long userId, List<DirectClueEntity> directClueEntityList) {
if (userId != null && CollUtil.isNotEmpty(directClueEntityList)) {
List<SysUserNameRoleDTO> sysUserNameRoleDTOS = sysUserService.listByRoleCodeAndUserId(RoleCodeEnum.find(25L), userId);
List<Long> userIdList = sysUserNameRoleDTOS.stream().map(SysUserNameRoleDTO::getUserId).collect(Collectors.toList());
int index = 0;
if (userIndexMap.containsKey(userId)) index = userIndexMap.get(userId);
for (DirectClueEntity directClueEntity : directClueEntityList) {
directClueEntity.setDistributeUserId(userIdList.get(index));
if (index < userIdList.size() - 1) index++;
else index = 0;
}
userIndexMap.put(userId, index);
baseMapper.insertBatchSomeColumn(directClueEntityList);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean distribute(List<DirectClueUserEntity> directClueUserList) {
Long clueId = directClueUserList.get(0).getClueId();
DirectClueEntity clueEntity = baseMapper.selectById(clueId);
if (clueEntity.getDistributeType() != 0) throw new BadRequestException("线索已分发");
clueEntity.setDistributeType(1);
baseMapper.updateById(clueEntity);
return SqlHelper.retBool(directClueUserMapper.insertBatchSomeColumn(directClueUserList));
}
}

@ -1,7 +1,6 @@
package com.baiye.modules.distribute.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.http.HttpRequest;
@ -11,21 +10,27 @@ import cn.hutool.json.JSONUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.constant.UrlConstant;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.modules.distribute.dto.OceanEngineResponseDTO;
import com.baiye.modules.distribute.entity.DirectClueEntity;
import com.baiye.modules.distribute.entity.OceanEngineSourceEntity;
import com.baiye.modules.distribute.entity.OceanEngineToken;
import com.baiye.modules.distribute.mapper.OceanEngineSourceMapper;
import com.baiye.modules.distribute.service.DirectClueService;
import com.baiye.modules.distribute.service.OceanEngineClueService;
import com.baiye.modules.distribute.service.OceanEngineService;
import com.baiye.util.AESUtils;
import com.baiye.util.MobileUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.ballcat.security.properties.SecurityProperties;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.nio.charset.Charset;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author wjt
@ -38,6 +43,10 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl<OceanEngineSou
private final OceanEngineService oceanEngineService;
private final SecurityProperties securityProperties;
private final DirectClueService directClueService;
@Override
public void getFeiYuSource(Date startTime, Date endTime) {
@ -46,12 +55,10 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl<OceanEngineSou
if (CollUtil.isEmpty(oceanEngineTokens)) {
return;
}
for (OceanEngineToken oceanEngineToken : oceanEngineTokens) {
String accessToken = oceanEngineToken.getAccessToken();
//管家ids
List<String> advertiserIds = oceanEngineToken.getAdvertiserIds();
log.info("=================== 获取到的广告主ids {} ===================", JSONUtil.toJsonStr(advertiserIds));
CompletableFuture.runAsync(() -> getAdvertiser(oceanEngineToken.getUserId(), accessToken, advertiserIds, startTime, endTime));
}
}
@ -63,24 +70,25 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl<OceanEngineSou
* @param advertisers id
*/
private void getAdvertiser(Long userId, String accessToken, List<String> advertisers, Date startTime, Date endTime) {
log.info("=================== 巨量飞鱼,拉取用户{} ===================", userId);
if (CollUtil.isEmpty(advertisers)) {
log.info("=================== 巨量飞鱼,拉取用户{} 无管家 ===================", userId);
return;
}
List<String> advertiseList = getAdvertiseIds(accessToken, advertisers);
if (CollUtil.isEmpty(advertiseList)) {
log.info("=================== 巨量飞鱼,拉取用户{} 无广告商 ===================", userId);
return;
}
Map<String, Object> map = new HashMap<>(5);
map.put("advertiser_ids", advertiseList.toString());
map.put("start_time", startTime);
map.put("end_time", endTime);
log.info("=================== 巨量飞鱼请求 {} ===================", JSONUtil.toJsonStr(map));
JSONArray array = reqOceanEngineClue(accessToken, map);
log.info("=================== 巨量飞鱼,线索数量{} ===================", array.size());
if (CollUtil.isEmpty(array)) {
return;
}
log.info("=================== 巨量飞鱼返回{} ===================", array.size());
parseAndSaveData(userId, array);
}
@ -99,9 +107,10 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl<OceanEngineSou
header("Access-Token", accessToken).
execute().
body();
JSONObject response = JSONUtil.parseObj(body);
if (response.getInt("code") == 0 && response.getStr("data") != null) {
JSONObject json = JSONUtil.parseObj(response.getStr("data"));
OceanEngineResponseDTO response = JSONUtil.toBean(body, OceanEngineResponseDTO.class);
if (response.getCode() == 0) {
if (response.getData() != null) {
JSONObject json = JSONUtil.parseObj(response.getData());
JSONArray results = json.getJSONArray("list");
for (int i = 0; i < results.size(); i++) {
JSONObject jsonObject = results.getJSONObject(i);
@ -109,8 +118,10 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl<OceanEngineSou
advertiseList.add(advertiserId);
}
}
} else {
log.error("管家号:{},获取广告主失败 {}", id, response);
}
}
log.info("advertiseList===={}", advertiseList.size());
return advertiseList;
}
@ -142,9 +153,13 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl<OceanEngineSou
public static JSONObject getClueList(Map<String, Object> map, String accessToken) {
String body = HttpRequest.get(UrlConstant.SYNC_CLUE_URL + "?" + URLUtil.buildQuery(map, Charset.defaultCharset())).header("Access-Token", accessToken).execute().body();
JSONObject response = JSONUtil.parseObj(body);
if (response.getInt("code") == 0 && response.getStr("data") != null) {
return JSONUtil.parseObj(response.getStr("data"));
OceanEngineResponseDTO response = JSONUtil.toBean(body, OceanEngineResponseDTO.class);
if (response.getCode() == 0) {
if (response.getData() != null) {
return JSONUtil.parseObj(response.getData());
}
} else {
log.error("获取飞鱼线索失败 {}", response);
}
return null;
}
@ -152,46 +167,48 @@ public class OceanEngineClueServiceImpl extends ExtendServiceImpl<OceanEngineSou
/**
* 线
*
* @param userId
* @param array
* @param userId id
* @param array 线
*/
@Transactional(rollbackFor = Exception.class)
public void parseAndSaveData(Long userId, JSONArray array) {
List<OceanEngineSourceEntity> oceanEngineSources = new ArrayList<>();
List<DirectClueEntity> directClueEntityList = new ArrayList<>();
for (int i = 0; i < array.size(); i++) {
JSONObject json = array.getJSONObject(i);
Map<String, Object> map = new HashMap<>();
//飞鱼线索id
String clueId = json.getStr("clue_id");
String createTime = json.getStr("create_time_detail");
map.put("clueId", json.getStr("clue_id"));
map.put("createTimeDetail", json.getStr("create_time_detail"));
//广告商名称
String advertiserName = json.getStr("advertiser_name");
map.put("advertiserName", json.getStr("advertiser_name"));
map.put("wx", json.getStr("weixin"));
map.put("address", json.getStr("location"));
//线索留资(key-value形式的备注)
map.put("remarkDict", json.getStr("remark_dict"));
//线索名
String name = json.getStr("name");
String phone = json.getStr("telephone");
String weixin = json.getStr("weixin");
String address = json.getStr("location");
//线索留资(key-value形式的备注)
String remark_dict = json.getStr("remark_dict");
//===========原数据保存
OceanEngineSourceEntity oceanEngineSource = new OceanEngineSourceEntity();
oceanEngineSource.setUserId(userId);
oceanEngineSource.setContent(JSONUtil.toJsonStr(json));
oceanEngineSources.add(oceanEngineSource);
//todo =====传递线索
//传递线索
boolean bool = MobileUtil.checkPhone(phone);
if (bool) {
Date date = new Date();
LocalDateTime dateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
String nid = AESUtils.encrypt(phone, securityProperties.getPasswordSecretKey());
String jsonStr = JSONUtil.toJsonStr(map);
DirectClueEntity directClueEntity = new DirectClueEntity("", name, nid, 0, 0, 0, dateTime, jsonStr);
directClueEntity.setCreateBy(userId);
directClueEntityList.add(directClueEntity);
}
baseMapper.insertBatchSomeColumn(oceanEngineSources);
}
/**
*
*
* @param countName
*/
private boolean checkCountName(String countName) {
Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
Matcher m = p.matcher(countName);
return m.find();
directClueService.allocationClue(userId, directClueEntityList);
baseMapper.insertBatchSomeColumn(oceanEngineSources);
}
}

@ -0,0 +1,56 @@
package com.baiye.modules.distribute.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class DirectClueVO {
@Schema(title = "直达线索ID")
private Long directClueId;
@Schema(title = "编号")
private String batchNo;
@Schema(title = "客户名称")
private String customName;
@Schema(title = "nid")
private String nid;
@Schema(title = "来源 0:巨量")
private Integer originType;
@Schema(title = "有效状态 0:有效 1:无效")
private Integer effectiveStatus;
@Schema(title = "资源标签")
private String clueLabelName;
@Schema(title = "分发状态 0:未分发 1:已分发")
private Integer distributeType;
@Schema(title = "分发日期")
private LocalDateTime distributeDate;
@Schema(title = "资源分发的分发员用户ID")
private Long distributeUserId;
@Schema(title = "其它线索信息")
private String otherClue;
@Schema(title = "创建时间")
private LocalDateTime createTime;
@Schema(title = "标签")
private List<String> clueLabel;
@Schema(title = "线索接收人用户名")
private List<String> userNameList;
@Schema(title = "其它线索")
private Object otherClueObj;
}

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baiye.modules.distribute.mapper.DirectClueMapper">
<sql id="Base_Alias_Column_List">
dc.direct_clue_id,
dc.batch_no,
dc.nid,
dc.custom_name,
dc.origin_type,
dc.effective_status,
dc.clue_label_name,
dc.distribute_type,
dc.distribute_date,
dc.distribute_user_id,
dc.other_clue,
dc.create_time
</sql>
<select id="selectByPage" resultType="com.baiye.modules.distribute.vo.DirectClueVO">
SELECT
<include refid="Base_Alias_Column_List"/>
FROM
tb_direct_clue dc
${ew.customSqlSegment}
order by dc.create_time desc, dc.direct_clue_id desc
</select>
</mapper>

@ -0,0 +1,47 @@
import com.baiye.AdminApplication;
import com.baiye.modules.distribute.entity.DirectClueEntity;
import com.baiye.modules.distribute.service.DirectClueService;
import com.baiye.util.AESUtils;
import org.ballcat.security.properties.SecurityProperties;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AdminApplication.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class DirectClueTest {
@Resource
private DirectClueService directClueService;
@Resource
private SecurityProperties securityProperties;
@Test
public void test1(){
List<DirectClueEntity> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
DirectClueEntity directClueEntity = new DirectClueEntity();
directClueEntity.setCustomName("y" + i);
String nid = "1346263987" + i;
String phone = AESUtils.encrypt(nid, securityProperties.getPasswordSecretKey());
directClueEntity.setNid(phone);
directClueEntity.setEffectiveStatus(0);
directClueEntity.setDistributeType(0);
Date date = new Date();
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
directClueEntity.setDistributeDate(localDateTime);
directClueEntity.setCreateBy(182L);
list.add(directClueEntity);
}
directClueService.allocationClue(182L, list);
}
}
Loading…
Cancel
Save