添加elastic-job

master
wjt 1 year ago
parent 99649611c1
commit 598777b8b0

@ -16,19 +16,10 @@
<maven.compiler.target>8</maven.compiler.target> <maven.compiler.target>8</maven.compiler.target>
</properties> </properties>
<dependencies> <dependencies>
<!--xxl job-->
<dependency> <dependency>
<groupId>com.xuxueli</groupId> <groupId>com.example</groupId>
<artifactId>xxl-job-core</artifactId> <artifactId>elastic-job-springboot-core</artifactId>
</dependency> <version>3.0-SNAPSHOT</version>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

@ -1,96 +0,0 @@
package com.baiye.ballcat.common.job;
import com.baiye.ballcat.common.job.properties.XxlExecutorProperties;
import com.baiye.ballcat.common.job.properties.XxlJobProperties;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.util.StringUtils;
/**
* @author lengleng
* @date 2019-09-18
* <p>
* xxl
*/
@Slf4j
@AutoConfiguration
@EnableConfigurationProperties(XxlJobProperties.class)
@ConditionalOnProperty(prefix = XxlJobProperties.PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
@RequiredArgsConstructor
public class XxlJobAutoConfiguration {
private final Environment environment;
@Bean
public XxlJobSpringExecutor xxlJobSpringExecutor(XxlJobProperties xxlJobProperties) {
if (log.isInfoEnabled()) {
log.info(">>>>>>>>>>> xxl-job config init.");
}
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(xxlJobProperties.getAdmin().getAddresses());
XxlExecutorProperties executorProperties = xxlJobProperties.getExecutor();
xxlJobSpringExecutor.setAppname(getExecutorName(executorProperties));
xxlJobSpringExecutor.setIp(executorProperties.getIp());
xxlJobSpringExecutor.setPort(executorProperties.getPort());
xxlJobSpringExecutor.setAccessToken(getAccessToken(xxlJobProperties));
xxlJobSpringExecutor.setLogPath(getLogPath(executorProperties));
xxlJobSpringExecutor.setLogRetentionDays(executorProperties.getLogRetentionDays());
xxlJobSpringExecutor.setAddress(executorProperties.getAddress());
return xxlJobSpringExecutor;
}
/**
* Spring Boot
*
* @param properties
* @return
*/
private String getExecutorName(XxlExecutorProperties properties) {
String appName = properties.getAppname();
if (StringUtils.hasText(appName)) {
return appName;
} else {
return environment.getProperty("spring.application.name");
}
}
/**
* xxl-job
*
* @param properties
* @return
*/
private String getAccessToken(XxlJobProperties properties) {
if (StringUtils.hasText(properties.getAccessToken())) {
return properties.getAccessToken();
} else {
log.warn("为提升系统安全性,生产环境建议启用调度中心和执行器安全性校验!可通过配置项 “xxl.job.accessToken” 进行AccessToken的设置");
return null;
}
}
/**
*
*
* @param properties
* @return
*/
private String getLogPath(XxlExecutorProperties properties) {
String logPath = properties.getLogPath();
if (StringUtils.hasText(logPath)) {
return logPath;
}
return environment.getProperty("logging.file.path", "logs")
.concat("/")
.concat(environment.getProperty("spring.application.name"))
.concat("/jobs");
}
}

@ -1,19 +0,0 @@
package com.baiye.ballcat.common.job.properties;
import lombok.Data;
/**
* @author lengleng
* @date 2019-09-18
* <p>
* xxl
*/
@Data
public class XxlAdminProperties {
/**
* [] 使"执行器心跳注册""任务结果回调"
*/
private String addresses;
}

@ -1,43 +0,0 @@
package com.baiye.ballcat.common.job.properties;
import lombok.Data;
/**
* @author lengleng
* @date 2019-09-18
*/
@Data
public class XxlExecutorProperties {
/**
* AppName []spring
*/
private String appname;
/**
* 使使 IP:PORT IP
*/
private String address;
/**
* IP []IPIP IPHost "执行器注册"
* "调度中心请求并触发任务"
*/
private String ip;
/**
* []0
*/
private Integer port = 0;
/**
* [] 使
*/
private String logPath;
/**
* [] 3Log, -1,
*/
private Integer logRetentionDays = 30;
}

@ -1,33 +0,0 @@
package com.baiye.ballcat.common.job.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
/**
* @author lengleng
* @date 2019-09-18
*/
@Data
@ConfigurationProperties(prefix = XxlJobProperties.PREFIX)
public class XxlJobProperties {
public static final String PREFIX = "ballcat.xxl.job";
/**
*
*/
private boolean enabled = true;
/**
* TOKEN []
*/
private String accessToken;
@NestedConfigurationProperty
private XxlAdminProperties admin = new XxlAdminProperties();
@NestedConfigurationProperty
private XxlExecutorProperties executor = new XxlExecutorProperties();
}

@ -1,4 +0,0 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.baiye.ballcat.common.job.XxlJobAutoConfiguration

@ -157,4 +157,10 @@ public interface SysUserService extends ExtendService<SysUser> {
*/ */
boolean existsForOrganization(Long organizationId); boolean existsForOrganization(Long organizationId);
/**
* id
* @param id
* @return
*/
SysUser findById(Long id);
} }

@ -37,6 +37,7 @@ import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -75,8 +76,9 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* QueryObject * QueryObject
*
* @param pageParam * @param pageParam
* @param qo * @param qo
* @return PageResult<SysUserVO> * @return PageResult<SysUserVO>
*/ */
@Override @Override
@ -86,7 +88,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
List<SysUser> sysUsers = baseMapper.selectList(new LambdaQueryWrapper<>()); List<SysUser> sysUsers = baseMapper.selectList(new LambdaQueryWrapper<>());
List<SysUserPageVO> userAll = Convert.toList(SysUserPageVO.class, sysUsers); List<SysUserPageVO> userAll = Convert.toList(SysUserPageVO.class, sysUsers);
Map<Long, List<SysUserPageVO>> userGroup = userAll.stream() Map<Long, List<SysUserPageVO>> userGroup = userAll.stream()
.collect(Collectors.groupingBy(SysUserPageVO::getWhichUserId)); .collect(Collectors.groupingBy(SysUserPageVO::getWhichUserId));
result.getRecords().forEach(user -> { result.getRecords().forEach(user -> {
List<SysUserPageVO> byWhichUserId = userGroup.get(user.getUserId()); List<SysUserPageVO> byWhichUserId = userGroup.get(user.getUserId());
@ -104,6 +106,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* *
*
* @param username * @param username
* @return * @return
*/ */
@ -114,6 +117,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* *
*
* @param sysUser * @param sysUser
* @return * @return
*/ */
@ -126,8 +130,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
List<SysRole> roleList; List<SysRole> roleList;
if (adminUserChecker.isAdminUser(sysUser)) { if (adminUserChecker.isAdminUser(sysUser)) {
roleList = sysRoleService.list(); roleList = sysRoleService.list();
} } else {
else {
roleList = sysUserRoleService.listRoles(sysUser.getUserId()); roleList = sysUserRoleService.listRoles(sysUser.getUserId());
} }
@ -146,9 +149,9 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
List<SysMenu> sysMenuList = sysMenuService.listByRoleCode(roleCode); List<SysMenu> sysMenuList = sysMenuService.listByRoleCode(roleCode);
menus.addAll(sysMenuList); menus.addAll(sysMenuList);
List<String> permissionList = sysMenuList.stream() List<String> permissionList = sysMenuList.stream()
.map(SysMenu::getPermission) .map(SysMenu::getPermission)
.filter(StrUtil::isNotEmpty) .filter(StrUtil::isNotEmpty)
.collect(Collectors.toList()); .collect(Collectors.toList());
permissions.addAll(permissionList); permissions.addAll(permissionList);
} }
userInfoDTO.setMenus(menus); userInfoDTO.setMenus(menus);
@ -159,6 +162,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* *
*
* @param sysUserDto DTO * @param sysUserDto DTO
* @return true , false * @return true , false
*/ */
@ -198,6 +202,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* *
*
* @param sysUserDTO DTO * @param sysUserDTO DTO
* @return true: false * @return true: false
*/ */
@ -226,7 +231,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
// 如果修改了组织且修改成功,则发送用户组织更新事件 // 如果修改了组织且修改成功,则发送用户组织更新事件
if (isUpdateSuccess && organizationIdModified) { if (isUpdateSuccess && organizationIdModified) {
publisher publisher
.publishEvent(new UserOrganizationChangeEvent(userId, originOrganizationId, currentOrganizationId)); .publishEvent(new UserOrganizationChangeEvent(userId, originOrganizationId, currentOrganizationId));
} }
return isUpdateSuccess; return isUpdateSuccess;
@ -234,7 +239,8 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* *
* @param userId Id *
* @param userId Id
* @param sysUserScope * @param sysUserScope
* @return true * @return true
*/ */
@ -247,6 +253,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* userId * userId
*
* @param userId ID * @param userId ID
* @return true * @return true
*/ */
@ -258,7 +265,8 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* *
* @param userId ID *
* @param userId ID
* @param rawPassword * @param rawPassword
* @return true * @return true
*/ */
@ -272,6 +280,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* *
*
* @param userIds ID * @param userIds ID
* @return true * @return true
*/ */
@ -283,7 +292,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
// 移除无权限更改的用户id // 移除无权限更改的用户id
Map<Long, SysUser> userMap = userList.stream() Map<Long, SysUser> userMap = userList.stream()
.collect(Collectors.toMap(SysUser::getUserId, Function.identity())); .collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
userIds.removeIf(id -> !adminUserChecker.hasModifyPermission(userMap.get(id))); userIds.removeIf(id -> !adminUserChecker.hasModifyPermission(userMap.get(id)));
Assert.notEmpty(userIds, "更新用户状态失败,无权限更新用户"); Assert.notEmpty(userIds, "更新用户状态失败,无权限更新用户");
@ -315,6 +324,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* *
*
* @param roleCode * @param roleCode
* @return * @return
*/ */
@ -325,6 +335,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* *
*
* @param roleCodes * @param roleCodes
* @return List<SysUser> * @return List<SysUser>
*/ */
@ -335,6 +346,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* ID * ID
*
* @param organizationIds id * @param organizationIds id
* @return * @return
*/ */
@ -345,6 +357,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* *
*
* @param userTypes * @param userTypes
* @return * @return
*/ */
@ -355,6 +368,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* Id * Id
*
* @param userIds Id * @param userIds Id
* @return * @return
*/ */
@ -366,8 +380,9 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* select name=> username value => userId * select name=> username value => userId
* @return List<SelectData> *
* @param userTypes * @param userTypes
* @return List<SelectData>
*/ */
@Override @Override
public List<SelectData<Void>> listSelectData(Collection<Integer> userTypes) { public List<SelectData<Void>> listSelectData(Collection<Integer> userTypes) {
@ -376,6 +391,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* Code * Code
*
* @param userId id * @param userId id
* @return List<String> * @return List<String>
*/ */
@ -386,6 +402,7 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
/** /**
* *
*
* @param organizationId id * @param organizationId id
* @return boolean true * @return boolean true
*/ */
@ -394,4 +411,8 @@ public class SysUserServiceImpl extends ExtendServiceImpl<SysUserMapper, SysUser
return baseMapper.existsForOrganization(organizationId); return baseMapper.existsForOrganization(organizationId);
} }
@Override
public SysUser findById(Long id) {
return baseMapper.selectById(id);
}
} }

@ -17,6 +17,11 @@
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<artifactId>ad-distribute-starter-job</artifactId>
<groupId>com.baiye</groupId>
<version>1.1.0</version>
</dependency>
<!-- 基于 spring authorization server 的授权服务器 --> <!-- 基于 spring authorization server 的授权服务器 -->
<dependency> <dependency>
<groupId>com.baiye</groupId> <groupId>com.baiye</groupId>

@ -0,0 +1,34 @@
package com.baiye.job;
import cn.hutool.core.date.DateUtil;
import com.baiye.modules.distribute.service.DistributeReportService;
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.example.jobInstance.ElasticSimpleJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author wjt
* @date 2023/8/14
*
* 0/5 * * * * ?
*/
@Component
@Slf4j
@ElasticSimpleJob(
jobName = "DistributeRecordReportJob", cron = "0 30 23 * * ?")
public class DistributeRecordReportJob implements SimpleJob {
@Resource
private DistributeReportService distributeReportService;
@Override
public void execute(ShardingContext shardingContext) {
log.info("流量分布定时任务开始-----{}", DateUtil.date());
distributeReportService.distributeReport();
log.info("流量分布定时任务结束-----{}", DateUtil.date());
}
}

@ -0,0 +1,37 @@
package com.baiye.modules.distribute.controller;
import com.baiye.modules.distribute.service.DistributeReportService;
import com.baiye.result.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author wjt
* @date 2023/8/11
*/
@RequiredArgsConstructor
@RestController
@Tag(name = "分配信息统计")
@RequestMapping("/report")
public class DistributeReportController {
private final DistributeReportService distributeReportService;
@GetMapping("/report")
public void distributeReport() {
distributeReportService.distributeReport();
}
@GetMapping("/flow")
@Operation(summary = "流量分布统计")
public R<Object> reportFlow(@RequestParam(value = "userId", required = false) Long userId,
@RequestParam(value = "channel", required = false) String channel,
@RequestParam(value = "type", required = true) Integer type
) {
return R.ok(distributeReportService.reportFlow(userId, channel, type));
}
}

@ -0,0 +1,67 @@
package com.baiye.modules.distribute.entity;
import cn.hutool.core.date.DateUtil;
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 lombok.ToString;
import java.io.Serializable;
import java.util.Date;
/**
* @author wjt
* @date 2023/8/11
*/
@Getter
@Setter
@ToString
@TableName("tb_distribute_report_channel")
@Schema(title = "导入线索分配统计-渠道")
public class DistributeReportChannelEntity implements Serializable {
@TableId
@Schema(title = "ID")
private Long id;
@Schema(title = "用户id")
private Long userId;
@Schema(title = "用户名")
private String username;
@Schema(title = "渠道")
private String channel;
@Schema(title = "当日量")
private Integer todayNum=0;
@Schema(title = "总量")
private Integer totalNum=0;
@Schema(title = "分配量")
private Integer distributeNum=0;
@Schema(title = "占比")
private double ratio;
@Schema(title = "日环比")
private double ratioDay;
@Schema(title = "统计日期")
private Date createTime;
public DistributeReportChannelEntity createDistributeReportChannel(Long userId, String username, String channel, Integer todayNum, Integer totalNum, Integer distributeNum, Double ratio, Double ratioDay) {
this.setUserId(userId);
this.setUsername(username);
this.setChannel(channel);
this.setTodayNum(todayNum);
this.setTotalNum(totalNum);
this.setDistributeNum(distributeNum);
this.setRatio(ratio);
this.setRatioDay(ratioDay);
this.setCreateTime(DateUtil.date());
return this;
}
}

@ -0,0 +1,60 @@
package com.baiye.modules.distribute.entity;
import cn.hutool.core.date.DateUtil;
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 lombok.ToString;
import java.io.Serializable;
import java.util.Date;
/**
* @author wjt
* @date 2023/8/11
*/
@Getter
@Setter
@ToString
@TableName("tb_distribute_report")
@Schema(title = "导入线索分配统计")
public class DistributeReportEntity implements Serializable {
@TableId
@Schema(title = "ID")
private Long id;
@Schema(title = "用户id")
private Long userId;
@Schema(title = "用户名")
private String username;
@Schema(title = "渠道")
private String channel;
@Schema(title = "总量")
private Integer todayNum = 0;
@Schema(title = "占比")
private double ratio;
@Schema(title = "日环比")
private double ratioDay;
@Schema(title = "统计日期")
private Date createTime;
public DistributeReportEntity createDistributeReport(Long userId, String username, String channel, Integer todayNum, Double ratio, Double ratioDay) {
this.setUserId(userId);
this.setUsername(username);
this.setChannel(channel);
this.setTodayNum(todayNum);
this.setRatio(ratio);
this.setRatioDay(ratioDay);
this.setCreateTime(DateUtil.date());
return this;
}
}

@ -0,0 +1,63 @@
package com.baiye.modules.distribute.entity;
import cn.hutool.core.date.DateUtil;
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 lombok.ToString;
import java.io.Serializable;
import java.util.Date;
/**
* @author wjt
* @date 2023/8/11
*/
@Getter
@Setter
@ToString
@TableName("tb_distribute_report_user")
@Schema(title = "导入线索分配统计-用户")
public class DistributeReportUserEntity implements Serializable {
@TableId
@Schema(title = "ID")
private Long id;
@Schema(title = "用户id")
private Long userId;
@Schema(title = "用户名")
private String username;
@Schema(title = "当日量")
private Integer todayNum=0;
@Schema(title = "总量")
private Integer totalNum=0;
@Schema(title = "分配量")
private Integer distributeNum=0;
@Schema(title = "占比")
private double ratio;
@Schema(title = "日环比")
private double ratioDay;
@Schema(title = "统计日期")
private Date createTime;
public DistributeReportUserEntity createDistributeReportUser(Long userId, String username, Integer todayNum, Integer totalNum, Integer distributeNum, Double ratio, Double ratioDay) {
this.setUserId(userId);
this.setUsername(username);
this.setTodayNum(todayNum);
this.setTotalNum(totalNum);
this.setDistributeNum(distributeNum);
this.setRatio(ratio);
this.setRatioDay(ratioDay);
this.setCreateTime(DateUtil.date());
return this;
}
}

@ -0,0 +1,11 @@
package com.baiye.modules.distribute.mapper;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.modules.distribute.entity.DistributeReportChannelEntity;
/**
* @author wjt
* @date 2023/8/11
*/
public interface DistributeReportChannelMapper extends ExtendMapper<DistributeReportChannelEntity> {
}

@ -0,0 +1,11 @@
package com.baiye.modules.distribute.mapper;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.modules.distribute.entity.DistributeReportEntity;
/**
* @author wjt
* @date 2023/8/11
*/
public interface DistributeReportMapper extends ExtendMapper<DistributeReportEntity> {
}

@ -0,0 +1,11 @@
package com.baiye.modules.distribute.mapper;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.modules.distribute.entity.DistributeReportUserEntity;
/**
* @author wjt
* @date 2023/8/11
*/
public interface DistributeReportUserMapper extends ExtendMapper<DistributeReportUserEntity> {
}

@ -6,6 +6,9 @@ import com.baiye.modules.distribute.qo.ClueRecordQo;
import com.baiye.domain.PageParam; import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult; import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.service.ExtendService; import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import java.util.List;
public interface ClueRecordService extends ExtendService<ClueRecordEntity> { public interface ClueRecordService extends ExtendService<ClueRecordEntity> {
@ -19,4 +22,9 @@ public interface ClueRecordService extends ExtendService<ClueRecordEntity> {
*/ */
boolean deleteByUserId(Long clueRecordId); boolean deleteByUserId(Long clueRecordId);
/**
*
*/
List<ClueRecordEntity> selectByWrapper(LambdaQueryWrapper<ClueRecordEntity> wrapper);
} }

@ -0,0 +1,23 @@
package com.baiye.modules.distribute.service;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.distribute.entity.DistributeReportEntity;
import java.util.Map;
/**
* @author wjt
* @date 2023/8/11
*/
public interface DistributeReportService extends ExtendService<DistributeReportEntity> {
/**
*
*/
Map<String, Object> reportFlow(Long userId, String channel, Integer type);
/**
* 线
*/
void distributeReport();
}

@ -6,6 +6,7 @@ import com.baiye.modules.distribute.service.ClueRecordService;
import com.baiye.modules.distribute.vo.ClueRecordVO; import com.baiye.modules.distribute.vo.ClueRecordVO;
import com.baiye.modules.distribute.qo.ClueRecordQo; import com.baiye.modules.distribute.qo.ClueRecordQo;
import com.baiye.security.util.SecurityUtils; import com.baiye.security.util.SecurityUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.baiye.util.FileUtil; import com.baiye.util.FileUtil;
import com.baiye.domain.PageParam; import com.baiye.domain.PageParam;
@ -16,6 +17,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/** /**
* @Author YQY * @Author YQY
* @Date 2023/8/1 * @Date 2023/8/1
@ -40,4 +43,9 @@ public class ClueRecordServiceImpl extends ExtendServiceImpl<ClueRecordMapper, C
return SqlHelper.retBool(baseMapper.deleteById(clueRecordId)); return SqlHelper.retBool(baseMapper.deleteById(clueRecordId));
} }
@Override
public List<ClueRecordEntity> selectByWrapper(LambdaQueryWrapper<ClueRecordEntity> wrapper) {
return baseMapper.selectList(wrapper);
}
} }

@ -0,0 +1,303 @@
package com.baiye.modules.distribute.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baiye.exception.BadRequestException;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.modules.distribute.entity.ClueRecordEntity;
import com.baiye.modules.distribute.entity.DistributeReportChannelEntity;
import com.baiye.modules.distribute.entity.DistributeReportEntity;
import com.baiye.modules.distribute.entity.DistributeReportUserEntity;
import com.baiye.modules.distribute.mapper.DistributeReportChannelMapper;
import com.baiye.modules.distribute.mapper.DistributeReportMapper;
import com.baiye.modules.distribute.mapper.DistributeReportUserMapper;
import com.baiye.modules.distribute.service.ClueRecordService;
import com.baiye.modules.distribute.service.DistributeReportService;
import com.baiye.modules.distribute.vo.ReportFlowVO;
import com.baiye.system.model.entity.SysUser;
import com.baiye.system.service.SysUserService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author wjt
* @date 2023/8/11
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class DistributeReportServiceImpl extends ExtendServiceImpl<DistributeReportMapper, DistributeReportEntity> implements DistributeReportService {
private final ClueRecordService clueRecordService;
private final DistributeReportChannelMapper distributeReportChannelMapper;
private final DistributeReportUserMapper distributeReportUserMapper;
private final SysUserService sysUserService;
@Override
public Map<String, Object> reportFlow(Long userId, String channel, Integer type) {
Map<String, Object> map = getHomeReport(type, userId);
List<ReportFlowVO> reportFlowList = new ArrayList<>();
if (userId != null) {
if (StrUtil.isNotBlank(channel)) {
//查询近7天
Date date = DateUtil.offsetDay(DateUtil.yesterday(), -6);
Date beginTime = DateUtil.beginOfDay(date);
Date endTime = DateUtil.endOfDay(DateUtil.yesterday());
LambdaQueryWrapper<DistributeReportEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.between(DistributeReportEntity::getCreateTime, beginTime, endTime);
wrapper.eq(DistributeReportEntity::getUserId, userId);
wrapper.eq(DistributeReportEntity::getChannel, channel);
List<DistributeReportEntity> distributeReportEntityList = baseMapper.selectList(wrapper);
if (CollUtil.isEmpty(distributeReportEntityList)) {
return map;
}
reportFlowList = getReportFlowList(distributeReportEntityList, beginTime, endTime);
map.put("type", 3);
map.put("data", reportFlowList);
return map;
}
map.put("type", 2);
LambdaQueryWrapper<DistributeReportChannelEntity> wrapperChannel = new LambdaQueryWrapper<>();
wrapperChannel.eq(DistributeReportChannelEntity::getUserId, userId);
List<DistributeReportChannelEntity> channelList = distributeReportChannelMapper.selectList(wrapperChannel);
for (DistributeReportChannelEntity channelEntity : channelList) {
ReportFlowVO reportFlowVO = new ReportFlowVO();
reportFlowVO.setName(channelEntity.getChannel());
reportFlowVO.setRatio(channelEntity.getRatio());
reportFlowVO.setRatioDay(channelEntity.getRatioDay());
reportFlowVO.setTotalNum(channelEntity.getTotalNum());
reportFlowList.add(reportFlowVO);
}
map.put("data", reportFlowList);
} else {
List<DistributeReportUserEntity> distributeReportUserList = distributeReportUserMapper.selectList(null);
for (DistributeReportUserEntity distributeReportUserEntity : distributeReportUserList) {
ReportFlowVO reportFlowVO = new ReportFlowVO();
reportFlowVO.setName(distributeReportUserEntity.getUsername());
reportFlowVO.setRatio(distributeReportUserEntity.getRatio());
reportFlowVO.setRatioDay(distributeReportUserEntity.getRatioDay());
reportFlowVO.setTotalNum(distributeReportUserEntity.getTotalNum());
reportFlowList.add(reportFlowVO);
}
map.put("data", reportFlowList);
map.put("type", 1);
return map;
}
return map;
}
/**
*
*/
private Map<String, Object> getHomeReport(Integer type, Long userId) {
Map<String, Object> map = new HashMap<>(8);
LambdaQueryWrapper<DistributeReportUserEntity> wrapperUser = new LambdaQueryWrapper<>();
DateTime dateTime = DateUtil.beginOfDay(DateUtil.yesterday());
DateTime dateTime1 = DateUtil.endOfDay(DateUtil.yesterday());
wrapperUser.between(DistributeReportUserEntity::getCreateTime, dateTime, dateTime1);
int yesterdayImportNum = 0;
int yesterdayDistributeNum = 0;
if (type == 1) {
List<DistributeReportUserEntity> distributeReportUserList = distributeReportUserMapper.selectList(wrapperUser);
if (CollUtil.isNotEmpty(distributeReportUserList)) {
for (DistributeReportUserEntity distributeReportUserEntity : distributeReportUserList) {
yesterdayImportNum += distributeReportUserEntity.getTodayNum();
yesterdayDistributeNum += distributeReportUserEntity.getDistributeNum();
}
}
} else {
if (userId == null) {
throw new BadRequestException("参数异常");
}
wrapperUser.eq(DistributeReportUserEntity::getUserId, userId);
DistributeReportUserEntity distributeReportUserEntity = distributeReportUserMapper.selectOne(wrapperUser);
if (distributeReportUserEntity != null) {
yesterdayImportNum = distributeReportUserEntity.getTodayNum();
yesterdayDistributeNum = distributeReportUserEntity.getDistributeNum();
}
}
map.put("yesterdayImportNum", yesterdayImportNum);
map.put("yesterdayDistributeNum", yesterdayDistributeNum);
return map;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void distributeReport() {
LambdaQueryWrapper<ClueRecordEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.between(ClueRecordEntity::getCreateTime, DateUtil.beginOfDay(DateUtil.date()), DateUtil.endOfDay(DateUtil.date()));
wrapper.eq(ClueRecordEntity::getStatus, 2);
List<ClueRecordEntity> allRecordInTodayList = clueRecordService.selectByWrapper(wrapper);
if (CollUtil.isEmpty(allRecordInTodayList)) {
return;
}
//提取所有用户
Set<Long> collect = allRecordInTodayList.stream().map(ClueRecordEntity::getCreateBy).collect(Collectors.toSet());
Map<Long, String> userNameList = getUserName(collect);
//1.按公司分组
Map<Long, List<ClueRecordEntity>> recordByUserMap = allRecordInTodayList.stream().collect(
Collectors.groupingBy(ClueRecordEntity::getCreateBy));
if (ObjectUtil.isEmpty(recordByUserMap)) {
return;
}
List<DistributeReportUserEntity> distributeReportUserList = new ArrayList<>();
//之前的总量
Long historyTotal = distributeReportUserMapper.selectCount(new LambdaQueryWrapper<DistributeReportUserEntity>().select(DistributeReportUserEntity::getTotalNum));
int sum = allRecordInTodayList.stream().mapToInt(ClueRecordEntity::getSuccessNum).sum();
int totalAll = historyTotal.intValue() + sum;
//记录之前得统计id
List<Long> ids = new ArrayList<>();
for (Map.Entry<Long, List<ClueRecordEntity>> entry : recordByUserMap.entrySet()) {
Long userId = entry.getKey();
List<ClueRecordEntity> clueRecordByUserList = entry.getValue();
//今日新增数
int sumByUser = clueRecordByUserList.stream().mapToInt(ClueRecordEntity::getSuccessNum).sum();
//上次对象
DistributeReportUserEntity distributeReportUserByYesterday = distributeReportUserMapper.selectOne(new LambdaQueryWrapper<DistributeReportUserEntity>()
.eq(DistributeReportUserEntity::getUserId, userId)
);
int yesterdayNum = 0;
int yesterdayTotalNum = 0;
if (distributeReportUserByYesterday != null) {
//上次新增数
if (DateUtil.betweenDay(distributeReportUserByYesterday.getCreateTime(), DateUtil.yesterday(), true) == 0) {
yesterdayNum = distributeReportUserByYesterday.getTodayNum();
}
yesterdayTotalNum = distributeReportUserByYesterday.getTotalNum();
ids.add(distributeReportUserByYesterday.getId());
} else {
distributeReportUserByYesterday = new DistributeReportUserEntity();
}
//总数
int totalNum = yesterdayTotalNum + sumByUser;
//分发数
int distributeNum = clueRecordByUserList.stream().filter(c -> c.getAllocationStatus() == 1).mapToInt(ClueRecordEntity::getSuccessNum).sum();
double ratio;
ratio = NumberUtil.div(totalNum, totalAll);
double ratioDay = 0.0;
if (yesterdayNum > 0) {
ratioDay = NumberUtil.div(NumberUtil.min(sumByUser, yesterdayNum), yesterdayNum);
}
String userName = userNameList.get(userId) == null ? "" : userNameList.get(userId);
distributeReportUserByYesterday.createDistributeReportUser(userId, userName, sumByUser, totalNum, distributeNum, ratio, ratioDay);
distributeReportUserList.add(distributeReportUserByYesterday);
//按渠道统计
dealByChannel(clueRecordByUserList, userId, totalNum, userName);
}
if (CollUtil.isNotEmpty(ids)) {
distributeReportUserMapper.deleteBatchIds(ids);
}
distributeReportUserMapper.insertBatchSomeColumn(distributeReportUserList);
}
private void dealByChannel(List<ClueRecordEntity> clueRecordByUserList, Long userId, Integer totalNumByUser, String userName) {
List<DistributeReportChannelEntity> list = new ArrayList<>();
List<DistributeReportEntity> distributeReportEntityList = new ArrayList<>();
//.按渠道分组
Map<String, List<ClueRecordEntity>> recordByChannelMap = clueRecordByUserList.stream().filter(c -> StrUtil.isNotBlank(c.getChannelIdentifying())).collect(
Collectors.groupingBy(ClueRecordEntity::getChannelIdentifying));
if (ObjectUtil.isEmpty(recordByChannelMap)) {
return;
}
List<Long> ids = new ArrayList<>();
for (Map.Entry<String, List<ClueRecordEntity>> entryByChannel : recordByChannelMap.entrySet()) {
String channel = entryByChannel.getKey();
List<ClueRecordEntity> clueRecordByChannel = entryByChannel.getValue();
int sumByUser = clueRecordByChannel.stream().mapToInt(ClueRecordEntity::getSuccessNum).sum();
//查询昨日信息
DistributeReportChannelEntity distributeReportUserByYesterday = distributeReportChannelMapper.selectOne(new LambdaQueryWrapper<DistributeReportChannelEntity>()
.eq(DistributeReportChannelEntity::getUserId, userId)
.eq(DistributeReportChannelEntity::getChannel, channel)
);
int yesterdayNum = 0;
int yesterdayTotalNum = 0;
if (distributeReportUserByYesterday != null) {
if (DateUtil.betweenDay(distributeReportUserByYesterday.getCreateTime(), DateUtil.yesterday(), true) == 0) {
yesterdayNum = distributeReportUserByYesterday.getTodayNum();
}
yesterdayTotalNum = distributeReportUserByYesterday.getTotalNum();
ids.add(distributeReportUserByYesterday.getId());
} else {
distributeReportUserByYesterday = new DistributeReportChannelEntity();
}
int totalNum = yesterdayTotalNum + sumByUser;
int distributeNum = clueRecordByChannel.stream().filter(c -> c.getAllocationStatus() == 1).mapToInt(ClueRecordEntity::getSuccessNum).sum();
double ratio = NumberUtil.div(totalNum, totalNumByUser.intValue());
double ratioDay = 0.0;
if (yesterdayNum > 0) {
ratioDay = NumberUtil.div(NumberUtil.min(sumByUser, yesterdayNum), yesterdayNum);
}
distributeReportUserByYesterday.createDistributeReportChannel(userId, userName, channel, sumByUser, totalNum, distributeNum, ratio, ratioDay);
list.add(distributeReportUserByYesterday);
DistributeReportEntity distributeReport = new DistributeReportEntity().createDistributeReport(userId, userName, channel, sumByUser, NumberUtil.div(sumByUser, totalNum), ratioDay);
distributeReportEntityList.add(distributeReport);
}
if (CollUtil.isNotEmpty(ids)) {
distributeReportChannelMapper.deleteBatchIds(ids);
}
distributeReportChannelMapper.insertBatchSomeColumn(list);
baseMapper.insertBatchSomeColumn(distributeReportEntityList);
}
private List<ReportFlowVO> getReportFlowList(List<DistributeReportEntity> distributeReportEntityList, Date beginTime, Date endTime) {
Map<String, DistributeReportEntity> callMap = new HashMap<>(8);
for (DistributeReportEntity reportDeduct : distributeReportEntityList) {
callMap.put(reportDeduct.getCreateTime().toString(), reportDeduct);
}
List<ReportFlowVO> list = new ArrayList<>();
long betweenDay = DateUtil.between(beginTime, endTime, DateUnit.DAY);
for (int i = 0; i <= betweenDay; i++) {
String time = DateUtil.format(DateUtil.offsetDay(beginTime, i), "yyyy-MM-dd");
ReportFlowVO reportFlowVO = new ReportFlowVO();
if (callMap.containsKey(time)) {
DistributeReportEntity reportDeduct = callMap.get(time);
reportFlowVO.setRatioDay(reportDeduct.getRatioDay());
reportFlowVO.setRatio(reportDeduct.getRatio());
reportFlowVO.setTotalNum(reportDeduct.getTodayNum());
} else {
reportFlowVO.setRatioDay(0.0);
reportFlowVO.setRatio(0.0);
reportFlowVO.setTotalNum(0);
}
reportFlowVO.setName(time);
list.add(reportFlowVO);
}
return list;
}
public Map<Long, String> getUserName(Set<Long> ids) {
List<SysUser> sysUsers = sysUserService.listByUserIds(ids);
Map<Long, String> map = new HashMap<>(8);
for (SysUser sysUser : sysUsers) {
map.put(sysUser.getUserId(), sysUser.getUsername());
}
return map;
}
}

@ -0,0 +1,25 @@
package com.baiye.modules.distribute.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* @author wjt
* @date 2023/8/2
*/
@Data
@Schema(title = "标签组VO")
public class ReportFlowVO {
@Schema(title = "公司名/渠道/日期")
private String name;
@Schema(title = "总量")
private Integer totalNum;
@Schema(title = "占比")
private Double ratio;
@Schema(title = "日环比")
private Double ratioDay;
}

@ -123,10 +123,7 @@ file:
maxSize: 300 maxSize: 300
avatarMaxSize: 5 avatarMaxSize: 5
elasticjob:
zookeeper:
namespace: springboot-elasticjob
server-list: localhost:2181
Loading…
Cancel
Save