管理员系统功能添加

This commit is contained in:
2024-08-05 15:19:02 +08:00
parent 1093ac68b6
commit ea4ba74989
8 changed files with 434 additions and 50 deletions

View File

@@ -4,14 +4,16 @@ package com.ai.da.controller;
import com.ai.da.common.context.UserContext; import com.ai.da.common.context.UserContext;
import com.ai.da.common.response.Response; import com.ai.da.common.response.Response;
import com.ai.da.mapper.primary.DesignMapper; import com.ai.da.mapper.primary.DesignMapper;
import com.ai.da.mapper.primary.TrialOrderMapper;
import com.ai.da.mapper.primary.entity.Account; import com.ai.da.mapper.primary.entity.Account;
import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.mapper.primary.entity.TrialOrder;
import com.ai.da.model.dto.AccountAddDTO;
import com.ai.da.model.dto.UserDesignStatisticDTO; import com.ai.da.model.dto.UserDesignStatisticDTO;
import com.ai.da.model.vo.QuestionnaireFeedbackVO; import com.ai.da.model.vo.QuestionnaireFeedbackVO;
import com.ai.da.model.vo.QuestionnaireVO; import com.ai.da.model.vo.QuestionnaireVO;
import com.ai.da.model.vo.QueryUserConditionsVO;
import com.ai.da.service.ConvenientInquiryService; import com.ai.da.service.ConvenientInquiryService;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.netty.util.internal.StringUtil; import io.netty.util.internal.StringUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@@ -21,6 +23,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
@@ -29,43 +32,37 @@ import java.util.*;
@RestController @RestController
@RequestMapping("/api/inquiry") @RequestMapping("/api/inquiry")
public class ConvenientInquiryController { public class ConvenientInquiryController {
@Resource
private TrialOrderMapper trialOrderMapper;
@Resource @Resource
private DesignMapper designMapper; private DesignMapper designMapper;
@Resource @Resource
private ConvenientInquiryService convenientInquiryService; private ConvenientInquiryService convenientInquiryService;
@ApiOperation("获取当前所有试用用户") @ApiOperation("获取当前所有试用用户")
@GetMapping("/getTrial") @PostMapping("/getTrial")
public Response<List<TrialOrder>> getTrial(){ public Response<IPage<TrialOrder>> getTrial(@Valid @RequestBody QueryUserConditionsVO queryUserConditionsVO) {
Long accountId = UserContext.getUserHolder().getId(); Long accountId = UserContext.getUserHolder().getId();
if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)){ if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)) {
List<TrialOrder> trialOrders = trialOrderMapper.selectList(null); return Response.success(convenientInquiryService.getTrial(queryUserConditionsVO));
return Response.success(trialOrders); } else {
}else {
return Response.fail("Sorry, you don't have permission"); return Response.fail("Sorry, you don't have permission");
} }
} }
@ApiOperation("获取指定时间区间内所有用户design的使用情况") @ApiOperation("获取指定时间区间内所有用户design的使用情况")
@GetMapping("/getDesignStatistic") @GetMapping("/getDesignStatistic")
public Response<List<UserDesignStatisticDTO>> getDesignStatistic(@RequestParam String startTime,@RequestParam String endTime){ public Response<List<UserDesignStatisticDTO>> getDesignStatistic(@RequestParam String startTime, @RequestParam String endTime) {
Long accountId = UserContext.getUserHolder().getId(); Long accountId = UserContext.getUserHolder().getId();
if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)){ if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)) {
if (StringUtil.isNullOrEmpty(startTime)) startTime = "2024-02-01 00:00:00"; if (StringUtil.isNullOrEmpty(startTime)) startTime = "2024-02-01 00:00:00";
if (StringUtil.isNullOrEmpty(endTime)){ if (StringUtil.isNullOrEmpty(endTime)) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date(); Date date = new Date();
endTime = simpleDateFormat.format(date); endTime = simpleDateFormat.format(date);
} }
List<UserDesignStatisticDTO> designStatistic = designMapper.getDesignStatistic(startTime, endTime); List<UserDesignStatisticDTO> designStatistic = designMapper.getDesignStatistic(startTime, endTime);
return Response.success(designStatistic); return Response.success(designStatistic);
}else { } else {
return Response.fail("Sorry, you don't have permission"); return Response.fail("Sorry, you don't have permission");
} }
} }
@@ -74,57 +71,101 @@ public class ConvenientInquiryController {
//调查问卷 //调查问卷
@ApiOperation("获取调查问卷统计详情") @ApiOperation("获取调查问卷统计详情")
@GetMapping("/getQuestionnaireStatistic") @GetMapping("/getQuestionnaireStatistic")
public Response<QuestionnaireFeedbackVO> getQuestionnaire(){ public Response<QuestionnaireFeedbackVO> getQuestionnaire() {
return Response.success(convenientInquiryService.getQuestionnaireInfo()); return Response.success(convenientInquiryService.getQuestionnaireInfo());
} }
@ApiOperation("获取所有调查问卷") @ApiOperation("获取所有调查问卷")
@GetMapping("/getAllQuestionnaire") @GetMapping("/getAllQuestionnaire")
public Response<List<QuestionnaireVO>> getAllQuestionnaire(){ public Response<List<QuestionnaireVO>> getAllQuestionnaire() {
return Response.success(convenientInquiryService.getAllQuestionnaire()); return Response.success(convenientInquiryService.getAllQuestionnaire());
} }
@ApiOperation("获取近期新用户") @ApiOperation("获取近期新用户")
@PostMapping("/recentNewUser") @GetMapping("/recentNewUser")
public Response<IPage<Account>> recentNewUser(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime, public Response<IPage<Account>> recentNewUser(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime,
@ApiParam(value = "endTime") @RequestParam @Nullable String endTime, @ApiParam(value = "endTime") @RequestParam @Nullable String endTime,
@ApiParam("userType") @RequestParam String userType, @ApiParam("userType visitor/trial/official") @RequestParam String userType,
@ApiParam("pageNum") @RequestParam int pageNum, @ApiParam("page") @RequestParam int page,
@ApiParam("size") @RequestParam int size){ @ApiParam("size") @RequestParam int size) {
return Response.success(convenientInquiryService.recentNewUser(startTime, endTime, userType, pageNum, size)); return Response.success(convenientInquiryService.recentNewUser(startTime, endTime, userType, page, size));
} }
@ApiOperation("获取近期新用户图表数据") @ApiOperation("获取近期新用户图表数据")
@PostMapping("/recentNewUserChart") @GetMapping("/recentNewUserChart")
public Response<Map<String, Object>> recentNewUserChart(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime, public Response<Map<String, Object>> recentNewUserChart(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime,
@ApiParam(value = "endTime") @RequestParam @Nullable String endTime, @ApiParam(value = "endTime") @RequestParam @Nullable String endTime,
@ApiParam("userType") @RequestParam String userType){ @ApiParam("userType") @RequestParam String userType) {
return Response.success(convenientInquiryService.recentNewUserChart(startTime, endTime, userType)); return Response.success(convenientInquiryService.recentNewUserChart(startTime, endTime, userType));
} }
@ApiOperation("获取近期活跃用户") @ApiOperation("获取近期活跃用户")
@PostMapping("/recentActiveUser") @GetMapping("/recentActiveUser")
public Response<IPage<Account>> recentActiveUser(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime, public Response<IPage<Account>> recentActiveUser(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime,
@ApiParam(value = "endTime") @RequestParam @Nullable String endTime, @ApiParam(value = "endTime") @RequestParam @Nullable String endTime,
@ApiParam("pageNum") @RequestParam int pageNum, @ApiParam("pageNum") @RequestParam int page,
@ApiParam("size") @RequestParam int size){ @ApiParam("size") @RequestParam int size) {
return Response.success(convenientInquiryService.recentActiveUser(startTime, endTime, pageNum, size)); return Response.success(convenientInquiryService.recentActiveUser(startTime, endTime, page, size));
} }
@ApiOperation("获取近期活跃用户图表数据") @ApiOperation("获取近期活跃用户图表数据")
@PostMapping("/recentActiveUserChart") @GetMapping("/recentActiveUserChart")
public Response<Integer> recentActiveUserChart(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime, public Response<Integer> recentActiveUserChart(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime,
@ApiParam(value = "endTime") @RequestParam @Nullable String endTime){ @ApiParam(value = "endTime") @RequestParam @Nullable String endTime) {
return Response.success(convenientInquiryService.recentActiveUserChart(startTime, endTime)); return Response.success(convenientInquiryService.recentActiveUserChart(startTime, endTime));
} }
@ApiOperation("获取用户的各模块功能使用详情") @ApiOperation("获取用户的各模块功能使用详情")
@PostMapping("/getActiveUserFunc") @GetMapping("/getActiveUserFunc")
public Response<Map<String, List<Object>>> getActiveUserFunc(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime, public Response<Map<String, List<Object>>> getActiveUserFunc(@ApiParam(value = "startTime") @RequestParam @Nullable String startTime,
@ApiParam(value = "endTime") @RequestParam @Nullable String endTime, @ApiParam(value = "endTime") @RequestParam @Nullable String endTime,
@ApiParam("userIdList") @RequestParam List<Long> userIdList){ @ApiParam("userIdList") @RequestParam @Nullable List<Long> userIdList) {
return Response.success(convenientInquiryService.getActiveUserFunc(startTime, endTime, userIdList)); return Response.success(convenientInquiryService.getActiveUserFunc(startTime, endTime, userIdList));
} }
@ApiOperation("试用用户到正式用户的转化率")
@GetMapping("/conversionRate")
public Response<Map<String, Float>> conversionRate() {
return Response.success(convenientInquiryService.conversionRate());
}
@ApiOperation("试用用户国家/城市分布")
@GetMapping("/trialUserCountry")
public Response<Map<String, List<Object>>> trialUserCountry() {
return Response.success(convenientInquiryService.trialUserCountry());
}
@ApiOperation("添加用户")
@PostMapping("/addUser")
public Response<Boolean> addUser(@Valid @RequestBody AccountAddDTO accountAddDTO) {
return Response.success(convenientInquiryService.addUser(accountAddDTO));
}
@ApiOperation("修改用户信息")
@PostMapping("/modifyUser")
public Response<Boolean> modifyUser(@ApiParam(value = "用户id") @RequestParam @Nullable Long accountId,
@ApiParam(value = "有效期截止时间的毫秒级unix格式") @RequestParam @Nullable Long validEndTime,
@ApiParam(value = "用户类型 1/2/3/0 -> yearly/monthly/trial/visitor") @RequestParam @Nullable Integer systemUser,
@ApiParam("积分") @RequestParam @Nullable Long credits) {
return Response.success(convenientInquiryService.modifyUser(accountId, validEndTime, systemUser, credits));
}
@ApiOperation("获取用户信息")
@PostMapping("/getUserInfo")
public Response<IPage<Account>> getUserInfo(@Valid @RequestBody QueryUserConditionsVO queryUserConditionsVO) {
Long accountId = UserContext.getUserHolder().getId();
if (accountId.equals(31L) || accountId.equals(87L) || accountId.equals(83L) || accountId.equals(6L) || accountId.equals(4L) || accountId.equals(73L)) {
return Response.success(convenientInquiryService.getUserInfo(queryUserConditionsVO));
} else {
return Response.fail("Sorry, you don't have permission");
}
}
@ApiOperation("获取所有用户id")
@GetMapping("/getAllUserId")
public Response<List<Map<String, Object>>> getAllUsrIdList() {
return Response.success(convenientInquiryService.getAllUserIdList());
}
} }

View File

@@ -3,6 +3,8 @@ package com.ai.da.mapper.primary;
import com.ai.da.common.config.mybatis.plus.CommonMapper; import com.ai.da.common.config.mybatis.plus.CommonMapper;
import com.ai.da.mapper.primary.entity.TrialOrder; import com.ai.da.mapper.primary.entity.TrialOrder;
import java.util.Map;
/** /**
* Mapper 接口 * Mapper 接口
* *
@@ -11,6 +13,8 @@ import com.ai.da.mapper.primary.entity.TrialOrder;
*/ */
public interface TrialOrderMapper extends CommonMapper<TrialOrder> { public interface TrialOrderMapper extends CommonMapper<TrialOrder> {
Map<String, Long> countOfficialUser();
} }

View File

@@ -3,6 +3,7 @@ package com.ai.da.mapper.primary.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@@ -69,11 +70,13 @@ public class Account implements Serializable {
/** /**
* 创建时间 * 创建时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date createDate; private Date createDate;
/** /**
* 更新时间 * 更新时间
*/ */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date updateDate; private Date updateDate;
private Integer isTrial; private Integer isTrial;

View File

@@ -0,0 +1,38 @@
package com.ai.da.model.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("按条件筛选试用用户")
public class QueryUserConditionsVO extends PageQueryBaseVo {
private List<Long> ids;
private String userName;
private String email;
private String country;
private String occupation;
private String startTime;
private String endTime;
@ApiModelProperty("Ascending升序 || Descending降序")
private String order;
// by id | time | credits
private String orderBy;
private Integer systemUser;
}

View File

@@ -2,9 +2,13 @@ package com.ai.da.service;
import com.ai.da.mapper.primary.entity.Account; import com.ai.da.mapper.primary.entity.Account;
import com.ai.da.mapper.primary.entity.Questionnaire; import com.ai.da.mapper.primary.entity.Questionnaire;
import com.ai.da.mapper.primary.entity.TrialOrder;
import com.ai.da.model.dto.AccountAddDTO;
import com.ai.da.model.vo.QuestionnaireFeedbackVO; import com.ai.da.model.vo.QuestionnaireFeedbackVO;
import com.ai.da.model.vo.QuestionnaireVO; import com.ai.da.model.vo.QuestionnaireVO;
import com.ai.da.model.vo.QueryUserConditionsVO;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
@@ -12,6 +16,8 @@ import java.util.Map;
public interface ConvenientInquiryService extends IService<Questionnaire> { public interface ConvenientInquiryService extends IService<Questionnaire> {
IPage<TrialOrder> getTrial(QueryUserConditionsVO queryUserConditionsVO);
QuestionnaireFeedbackVO getQuestionnaireInfo(); QuestionnaireFeedbackVO getQuestionnaireInfo();
List<QuestionnaireVO> getAllQuestionnaire(); List<QuestionnaireVO> getAllQuestionnaire();
@@ -26,4 +32,16 @@ public interface ConvenientInquiryService extends IService<Questionnaire> {
int recentActiveUserChart(String startTime, String endTime); int recentActiveUserChart(String startTime, String endTime);
Map<String, List<Object>> getActiveUserFunc(String startTime, String endTime, List<Long> ids); Map<String, List<Object>> getActiveUserFunc(String startTime, String endTime, List<Long> ids);
Map<String, Float> conversionRate();
Map<String, List<Object>> trialUserCountry();
Boolean addUser(AccountAddDTO accountAddDTO);
Boolean modifyUser(Long accountId, Long validEndTime, Integer systemUser, Long credits);
IPage<Account> getUserInfo(QueryUserConditionsVO queryUserConditionsVO);
List<Map<String, Object>> getAllUserIdList();
} }

View File

@@ -1,28 +1,43 @@
package com.ai.da.service.impl; package com.ai.da.service.impl;
import com.ai.da.common.config.exception.BusinessException;
import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.constant.CommonConstant;
import com.ai.da.common.context.UserContext; import com.ai.da.common.context.UserContext;
import com.ai.da.common.enums.CreditsEventsEnum;
import com.ai.da.common.utils.CopyUtil;
import com.ai.da.mapper.primary.AccountMapper;
import com.ai.da.mapper.primary.QuestionnaireMapper; import com.ai.da.mapper.primary.QuestionnaireMapper;
import com.ai.da.mapper.primary.ToProductImageResultMapper; import com.ai.da.mapper.primary.ToProductImageResultMapper;
import com.ai.da.mapper.primary.TrialOrderMapper;
import com.ai.da.mapper.primary.entity.Account; import com.ai.da.mapper.primary.entity.Account;
import com.ai.da.mapper.primary.entity.Questionnaire; import com.ai.da.mapper.primary.entity.Questionnaire;
import com.ai.da.mapper.primary.entity.TrialOrder;
import com.ai.da.model.dto.AccountAddDTO;
import com.ai.da.model.enums.Language;
import com.ai.da.model.vo.QuestionnaireFeedbackVO; import com.ai.da.model.vo.QuestionnaireFeedbackVO;
import com.ai.da.model.vo.QuestionnaireVO; import com.ai.da.model.vo.QuestionnaireVO;
import com.ai.da.model.vo.QueryUserConditionsVO;
import com.ai.da.service.*; import com.ai.da.service.*;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mysql.cj.util.StringUtils;
import io.netty.util.internal.StringUtil; import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
@Slf4j
public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMapper, Questionnaire> implements ConvenientInquiryService { public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMapper, Questionnaire> implements ConvenientInquiryService {
@Resource @Resource
@@ -31,6 +46,56 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
@Resource @Resource
private AccountLoginLogService accountLoginLogService; private AccountLoginLogService accountLoginLogService;
public IPage<TrialOrder> getTrial(QueryUserConditionsVO queryUserConditionsVO) {
log.info("getTrial parameter : {},page:{}, size:{}",queryUserConditionsVO,queryUserConditionsVO.getPage(),queryUserConditionsVO.getSize());
/* 添加按条件查询试用用户 */
// 按用户邮箱/用户名/用户id查指定用户
QueryWrapper<TrialOrder> queryWrapper = new QueryWrapper<>();
if (!Objects.isNull(queryUserConditionsVO.getIds()) && !queryUserConditionsVO.getIds().isEmpty()) {
queryWrapper.in("id", queryUserConditionsVO.getIds());
}
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getUserName())) {
queryWrapper.eq("user_name", queryUserConditionsVO.getUserName());
}
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getEmail())) {
queryWrapper.eq("email", queryUserConditionsVO.getEmail());
}
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getCountry())) {
queryWrapper.eq("country", queryUserConditionsVO.getCountry());
}
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getOccupation())) {
queryWrapper.eq("occupation", queryUserConditionsVO.getOccupation());
}
// 按时间区间查
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getStartTime())) {
queryWrapper.gt("create_time", queryUserConditionsVO.getStartTime());
}
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getEndTime())) {
queryWrapper.lt("create_time", queryUserConditionsVO.getEndTime());
}
// 排序
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getOrder()) && !StringUtils.isNullOrEmpty(queryUserConditionsVO.getOrderBy())) {
String orderBy = "id";
if (queryUserConditionsVO.getOrderBy().equals("time")) {
orderBy = "create_time";
}
switch (queryUserConditionsVO.getOrder()) {
case "Ascending":
queryWrapper.orderByAsc(orderBy);
break;
case "Descending":
queryWrapper.orderByDesc(orderBy);
break;
}
}
// 分页查询
return trialOrderMapper.selectPage(new Page<>(queryUserConditionsVO.getPage(), queryUserConditionsVO.getSize()), queryWrapper);
// List<TrialOrder> trialOrders = trialOrderMapper.selectList(null);
}
public QuestionnaireFeedbackVO getQuestionnaireInfo() { public QuestionnaireFeedbackVO getQuestionnaireInfo() {
String title = "AiDA_3.0 Feedback Survey--06/2024"; String title = "AiDA_3.0 Feedback Survey--06/2024";
@@ -195,6 +260,10 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
if (StringUtil.isNullOrEmpty(startTime) && StringUtil.isNullOrEmpty(endTime)) { if (StringUtil.isNullOrEmpty(startTime) && StringUtil.isNullOrEmpty(endTime)) {
return null; return null;
} }
if (!StringUtil.isNullOrEmpty(startTime) && StringUtil.isNullOrEmpty(endTime)) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
endTime = LocalDateTime.now().format(formatter);
}
Integer type = null; Integer type = null;
if (!StringUtil.isNullOrEmpty(userType)) { if (!StringUtil.isNullOrEmpty(userType)) {
type = userType.equals("visitor") ? 0 : userType.equals("trial") ? 1 : 2; type = userType.equals("visitor") ? 0 : userType.equals("trial") ? 1 : 2;
@@ -208,6 +277,10 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
if (StringUtil.isNullOrEmpty(startTime) && StringUtil.isNullOrEmpty(endTime)) { if (StringUtil.isNullOrEmpty(startTime) && StringUtil.isNullOrEmpty(endTime)) {
return null; return null;
} }
if (!StringUtil.isNullOrEmpty(startTime) && StringUtil.isNullOrEmpty(endTime)) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
endTime = LocalDateTime.now().format(formatter);
}
Integer type = null; Integer type = null;
if (!StringUtil.isNullOrEmpty(userType)) { if (!StringUtil.isNullOrEmpty(userType)) {
type = userType.equals("visitor") ? 0 : userType.equals("trial") ? 1 : 2; type = userType.equals("visitor") ? 0 : userType.equals("trial") ? 1 : 2;
@@ -232,17 +305,24 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
// 近期活跃用户 // 近期活跃用户
public IPage<Account> recentActiveUser(String startTime, String endTime, int pageNum, int size) { public IPage<Account> recentActiveUser(String startTime, String endTime, int pageNum, int size) {
if (!StringUtil.isNullOrEmpty(startTime) && StringUtil.isNullOrEmpty(endTime)) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
endTime = LocalDateTime.now().format(formatter);
}
List<Long> accountIds = accountLoginLogService.getByDate(startTime, endTime); List<Long> accountIds = accountLoginLogService.getByDate(startTime, endTime);
return accountService.getPageByIds(accountIds, pageNum, size); return accountService.getPageByIds(accountIds, pageNum, size);
} }
// 图表数据 // 图表数据
public int recentActiveUserChart(String startTime, String endTime) { public int recentActiveUserChart(String startTime, String endTime) {
if (!StringUtil.isNullOrEmpty(startTime) && StringUtil.isNullOrEmpty(endTime)) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
endTime = LocalDateTime.now().format(formatter);
}
List<Long> accountIds = accountLoginLogService.getByDate(startTime, endTime); List<Long> accountIds = accountLoginLogService.getByDate(startTime, endTime);
return accountIds.size(); return accountIds.size();
} }
@Resource @Resource
private GenerateService generateService; private GenerateService generateService;
@Resource @Resource
@@ -255,6 +335,8 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
private ChatRobotService chatRobotService; private ChatRobotService chatRobotService;
public Map<String, List<Object>> getActiveUserFunc(String startTime, String endTime, List<Long> ids) { public Map<String, List<Object>> getActiveUserFunc(String startTime, String endTime, List<Long> ids) {
log.info("getActiveUserFunc ==> startTime:{}, endTime:{}, accountList:{}", startTime, endTime, ids);
// 必须指定时间区间 // 必须指定时间区间
if (StringUtil.isNullOrEmpty(startTime) && StringUtil.isNullOrEmpty(endTime)) { if (StringUtil.isNullOrEmpty(startTime) && StringUtil.isNullOrEmpty(endTime)) {
return null; return null;
@@ -306,7 +388,199 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl<QuestionnaireMappe
return resp; return resp;
} }
// @Resource
private TrialOrderMapper trialOrderMapper;
// 试用用户到正式用户的转化率
public Map<String, Float> conversionRate() {
QueryWrapper<TrialOrder> queryWrapper = new QueryWrapper<>();
// 获取试用用户总数
queryWrapper.select("count(distinct email) as count");
List<Map<String, Object>> trialMaps = trialOrderMapper.selectMaps(queryWrapper);
Long totalTrials = (Long) trialMaps.get(0).get("count");
// 获取从试用用户转为正式用户的用户数量
Map<String, Long> officialMaps = trialOrderMapper.countOfficialUser();
Long trialToOfficial = officialMaps.get("count");
// 计算转化率
HashMap<String, Float> resp = new HashMap<>();
resp.put("trialUserCount", totalTrials.floatValue());
resp.put("trialToOfficialCount", trialToOfficial.floatValue());
resp.put("conversionRate", new BigDecimal(trialToOfficial).divide(new BigDecimal(totalTrials), 2, RoundingMode.HALF_UP).floatValue());
return resp;
}
// 试用用户地区统计
public Map<String, List<Object>> trialUserCountry() {
QueryWrapper<TrialOrder> queryWrapper = new QueryWrapper<>();
queryWrapper.select("country, count(id) as count")
.groupBy("country");
List<Map<String, Object>> countryCount = trialOrderMapper.selectMaps(queryWrapper);
Map<Object, Object> countryCountMap = countryCount.stream().collect(Collectors.toMap(
map -> map.get("country"),
map -> map.get("count")
));
HashMap<String, List<Object>> resp = new HashMap<>();
resp.put("names", new ArrayList<>(countryCountMap.keySet()));
resp.put("values", new ArrayList<>(countryCountMap.values()));
return resp;
}
// 新增用户
public Boolean addUser(AccountAddDTO accountAddDTO) {
// 需要给的数据 用户邮箱、用户名、账号有效期截止时间、账号类型
Account account = CopyUtil.copyObject(accountAddDTO, Account.class);
// 添加正式用户
if (Objects.isNull(accountAddDTO.getSystemUser())) {
throw new BusinessException("you have to choose user type");
} else {
switch (accountAddDTO.getSystemUser()) {
case 0:
account.setCredits(new BigDecimal(0));
account.setIsTrial(0);
break;
case 1:
account.setCredits(new BigDecimal(CreditsEventsEnum.INIT_YEARLY.getValue()));
account.setIsTrial(0);
break;
case 2:
account.setCredits(new BigDecimal(CreditsEventsEnum.INIT_MONTHLY.getValue()));
account.setIsTrial(0);
break;
case 3:
account.setCredits(new BigDecimal(CreditsEventsEnum.INIT_TRIAL.getValue()));
account.setIsTrial(1);
break;
}
}
account.setValidStartTime(Long.parseLong(accountAddDTO.getValidStartTime()));
account.setValidEndTime(Long.parseLong(accountAddDTO.getValidEndTime()));
account.setUserPassword("Third-000000");
account.setLanguage(Language.ENGLISH.name());
account.setCreateDate(new Date());
account.setIsBeginner(1);
log.info("添加用户:{}", accountAddDTO.getUserEmail());
return accountService.save(account);
}
// 修改用户信息
public Boolean modifyUser(Long accountId, Long validEndTime, Integer systemUser, Long credits) {
log.info("modifyUser ==> accountId:{}, validEndTime:{}, systemUser:{}, systemUser:{}", accountId, validEndTime, systemUser, credits);
if (Objects.isNull(accountId) && Objects.isNull(validEndTime) && Objects.isNull(systemUser) && Objects.isNull(credits)) {
return null;
} else if (Objects.isNull(accountId)) {
throw new BusinessException("you have to choose a user");
}
Account account = new Account();
// 修改用户有效期截止日期、用户类型、积分
if (!Objects.isNull(validEndTime)) {
account.setValidEndTime(validEndTime);
}
if (!Objects.isNull(systemUser)) {
account.setSystemUser(systemUser);
}
/*if (!StringUtils.isNullOrEmpty(systemUser)) {
int systemUser = 0;
switch (systemUser) {
case "yearly":
systemUser = 1;
break;
case "monthly":
systemUser = 2;
break;
case "trial":
systemUser = 3;
break;
case "visitor":
systemUser = 0;
break;
}
account.setSystemUser(systemUser);
}*/
if (!Objects.isNull(credits)) {
account.setCredits(new BigDecimal(credits));
}
account.setId(accountId);
account.setUpdateDate(new Date());
log.info("修改用户信息:{}", accountId);
return accountMapper.updateById(account) == 1;
// accountService.update(account,null);
}
@Resource
private AccountMapper accountMapper;
// 按条件查询用户信息
public IPage<Account> getUserInfo(QueryUserConditionsVO queryUserConditionsVO) {
log.info("getUserInfo parameter : {},page:{}, size:{}",queryUserConditionsVO,queryUserConditionsVO.getPage(),queryUserConditionsVO.getSize());
// 按用户邮箱/用户名/用户id查指定用户
QueryWrapper<Account> queryWrapper = new QueryWrapper<>();
if (!Objects.isNull(queryUserConditionsVO.getIds()) && !queryUserConditionsVO.getIds().isEmpty()) {
queryWrapper.in("id", queryUserConditionsVO.getIds());
}
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getUserName())) {
queryWrapper.eq("user_name", queryUserConditionsVO.getUserName());
}
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getEmail())) {
queryWrapper.eq("user_email", queryUserConditionsVO.getEmail());
}
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getCountry())) {
queryWrapper.eq("country", queryUserConditionsVO.getCountry());
}
if (!Objects.isNull(queryUserConditionsVO.getSystemUser())) {
queryWrapper.eq("system_user", queryUserConditionsVO.getSystemUser());
}
// 按时间区间查
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getStartTime())) {
queryWrapper.gt("create_date", queryUserConditionsVO.getStartTime());
}
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getEndTime())) {
queryWrapper.lt("create_date", queryUserConditionsVO.getEndTime());
}
// 排序
if (!StringUtils.isNullOrEmpty(queryUserConditionsVO.getOrder()) && !StringUtils.isNullOrEmpty(queryUserConditionsVO.getOrderBy())) {
String orderBy = "id";
switch (queryUserConditionsVO.getOrderBy()) {
case "time":
orderBy = "create_date";
break;
case "credits":
orderBy = "credits";
break;
}
switch (queryUserConditionsVO.getOrder()) {
case "Ascending":
queryWrapper.orderByAsc(orderBy);
break;
case "Descending":
queryWrapper.orderByDesc(orderBy);
break;
}
}
// 分页查询
return accountMapper.selectPage(new Page<>(queryUserConditionsVO.getPage(), queryUserConditionsVO.getSize()), queryWrapper);
}
public List<Map<String, Object>> getAllUserIdList() {
QueryWrapper<Account> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id as value, user_name as label");
return accountMapper.selectMaps(queryWrapper);
// return maps.stream().map(map -> (Long)map.get("id")).collect(Collectors.toList());
}
} }

View File

@@ -1292,7 +1292,7 @@ public class DesignServiceImpl extends ServiceImpl<DesignMapper, Design> impleme
.lt("create_date", endTime) .lt("create_date", endTime)
.select("count(id) as count"); .select("count(id) as count");
if (!accountIds.isEmpty()){ if (!Objects.isNull(accountIds) && !accountIds.isEmpty() ){
queryWrapper.in("account_id", accountIds); queryWrapper.in("account_id", accountIds);
} }

View File

@@ -4,18 +4,24 @@
<!-- 通用查询映射结果 --> <!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.ai.da.mapper.primary.entity.TrialOrder"> <resultMap id="BaseResultMap" type="com.ai.da.mapper.primary.entity.TrialOrder">
<id column="id" property="id" /> <id column="id" property="id"/>
<result column="surname" property="surname" /> <result column="surname" property="surname"/>
<result column="given_name" property="givenName" /> <result column="given_name" property="givenName"/>
<result column="user_name" property="userName" /> <result column="user_name" property="userName"/>
<result column="email" property="email" /> <result column="email" property="email"/>
<result column="country" property="country" /> <result column="country" property="country"/>
<result column="occupation" property="occupation" /> <result column="occupation" property="occupation"/>
<result column="create_time" property="createTime" /> <result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime" /> <result column="update_time" property="updateTime"/>
<result column="status" property="status" /> <result column="status" property="status"/>
<result column="is_deleted" property="isDeleted" /> <result column="is_deleted" property="isDeleted"/>
</resultMap> </resultMap>
<select id="countOfficialUser" resultType="java.util.Map">
select count(distinct a.user_email) as count
from t_account a
inner join trial_order b
ON a.user_email = b.email
</select>
</mapper> </mapper>