提交 9e4b5191 作者: gh

用户付费激活与近月平均充值

上级 b1a6e9bb
package com.yaoyaozw.customer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.event.ApplicationEventMulticaster;
import org.springframework.context.event.SimpleApplicationEventMulticaster;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.stereotype.Component;
@Component
public class AsynchronousSpringEventsConfig {
@Bean(name = "applicationEventMulticaster")
public ApplicationEventMulticaster simpleApplicationEventMulticaster() {
SimpleApplicationEventMulticaster eventMulticaster =
new SimpleApplicationEventMulticaster();
eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());
return eventMulticaster;
}
}
package com.yaoyaozw.customer.dto.integration;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 获取数据DTO
*/
@Data
public class IntegrationRequestDTO implements Serializable {
private static final long serialVersionUID = -9128287125234317100L;
/**
* 获取数据的事件
* 例如: 2021-04-01 00:00:00
*/
private Date requestDate;
/**
* 数据频次
* 例如: 实时
*/
private Integer dataFrequency;
/**
* 获取的数据类型
* 渠道账号, 用户数据, 订单, 消耗
* 例如: 渠道账号
*/
private String dataType;
}
package com.yaoyaozw.customer.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
/**
* 订单表
*/
@Data
@TableName(value = "account_order")
public class AccountOrder implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 投放信息外键
*/
@TableField(value = "setup_id")
private Long setupId;
/**
* 分成后收入
*/
@TableField(value = "profit")
private Double profit;
/**
* 下单完成时间
*/
@TableField(value = "finish_time")
private Date finishTime;
/**
* 类型
*/
@TableField(value = "`type`")
private Integer type;
/**
* 用户OPENID
*/
@TableField(value = "open_id")
private String openId;
/**
* 用户关注时间
*/
@TableField(value = "user_subscribe_time")
private Date userSubscribeTime;
private static final long serialVersionUID = 1L;
public static final String COL_ID = "id";
public static final String COL_SETUP_ID = "setup_id";
public static final String COL_PROFIT = "profit";
public static final String COL_FINISH_TIME = "finish_time";
public static final String COL_TYPE = "type";
public static final String COL_OPEN_ID = "open_id";
public static final String COL_USER_SUBSCRIBE_TIME = "user_subscribe_time";
}
\ No newline at end of file
package com.yaoyaozw.customer.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
/**
* 注册用户信息
*/
@Data
@TableName(value = "register_user_entity")
public class RegisterUserEntity implements Serializable {
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* app_id
*/
@TableField(value = "app_id")
private String appId;
/**
* openid
*/
@TableField(value = "open_id")
private String openId;
/**
* 投放信息id
*/
@TableField(value = "setup_id")
private Long setupId;
/**
* 未付费0/付费1/VIP 2
*/
@TableField(value = "pay_type")
private Integer payType;
/**
* 支付次数
*/
@TableField(value = "pay_num")
private Integer payNum;
/**
* 累充金额
*/
@TableField(value = "pay_amount")
private Double payAmount;
/**
* 近一月平均金额
*/
@TableField(value = "avg_month")
private Double avgMonth;
/**
* 最近活跃时间
*/
@TableField(value = "last_active")
private Date lastActive;
/**
* 创建时间
*/
@TableField(value = "gmt_create")
private Date gmtCreate;
/**
* 延时客服序列
*/
@TableField(value = "customer_sort")
private Integer customerSort;
/**
* 延时客服发送时间
*/
@TableField(value = "customer_publish")
private Date customerPublish;
private static final long serialVersionUID = 1L;
public static final String COL_ID = "id";
public static final String COL_APP_ID = "app_id";
public static final String COL_OPEN_ID = "open_id";
public static final String COL_SETUP_ID = "setup_id";
public static final String COL_PAY_TYPE = "pay_type";
public static final String COL_PAY_NUM = "pay_num";
public static final String COL_PAY_AMOUNT = "pay_amount";
public static final String COL_AVG_MONTH = "avg_month";
public static final String COL_LAST_ACTIVE = "last_active";
public static final String COL_GMT_CREATE = "gmt_create";
public static final String COL_CUSTOMER_SORT = "customer_sort";
public static final String COL_CUSTOMER_PUBLISH = "customer_publish";
}
\ No newline at end of file
package com.yaoyaozw.customer.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yaoyaozw.customer.entity.AccountOrder;
import com.yaoyaozw.customer.vo.UserAvgAmountVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
@Mapper
public interface AccountOrderMapper extends BaseMapper<AccountOrder> {
List<AccountOrder> findNewestRuntimeAccountOrder();
List<UserAvgAmountVO> findMonthDailyAccountOrder();
}
\ No newline at end of file
package com.yaoyaozw.customer.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yaoyaozw.customer.entity.RegisterUserEntity;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface RegisterUserEntityMapper extends BaseMapper<RegisterUserEntity> {
}
\ No newline at end of file
package com.yaoyaozw.customer.scheduling;
import com.yaoyaozw.customer.dto.integration.IntegrationRequestDTO;
import com.yaoyaozw.customer.service.AccountOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Calendar;
@Component
public class SchedulingTask {
@Autowired
private AccountOrderService accountOrderService;
/**
* 拉取付费订单(每15min一次)
*/
public void retrieveOrderData(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
IntegrationRequestDTO integrationRequestDTO = new IntegrationRequestDTO();
accountOrderService.activeUserByOrder(integrationRequestDTO);
}
/**
* 更新付费用户近一月平均充值(每天一次)
*/
public void retrieveMonthOrder(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
IntegrationRequestDTO integrationRequestDTO = new IntegrationRequestDTO();
accountOrderService.calculateAvgMonth(integrationRequestDTO);
}
}
package com.yaoyaozw.customer.service;
import com.yaoyaozw.customer.dto.integration.IntegrationRequestDTO;
import com.yaoyaozw.customer.entity.AccountOrder;
import com.baomidou.mybatisplus.extension.service.IService;
public interface AccountOrderService extends IService<AccountOrder> {
/**
* 付费激活
* @param integrationRequestDTO
*/
void activeUserByOrder(IntegrationRequestDTO integrationRequestDTO);
/**
* 计算近一月平均付费
* @param integrationRequestDTO
*/
void calculateAvgMonth(IntegrationRequestDTO integrationRequestDTO);
}
package com.yaoyaozw.customer.service;
import com.yaoyaozw.customer.entity.RegisterUserEntity;
import com.baomidou.mybatisplus.extension.service.IService;
public interface RegisterUserEntityService extends IService<RegisterUserEntity>{
}
package com.yaoyaozw.customer.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yaoyaozw.customer.dto.integration.IntegrationRequestDTO;
import com.yaoyaozw.customer.entity.RegisterUserEntity;
import com.yaoyaozw.customer.service.RegisterUserEntityService;
import com.yaoyaozw.customer.vo.UserAvgAmountVO;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yaoyaozw.customer.mapper.AccountOrderMapper;
import com.yaoyaozw.customer.entity.AccountOrder;
import com.yaoyaozw.customer.service.AccountOrderService;
@Service
public class AccountOrderServiceImpl extends ServiceImpl<AccountOrderMapper, AccountOrder> implements AccountOrderService {
@Autowired
private RegisterUserEntityService registerUserEntityService;
@Override
public void activeUserByOrder(IntegrationRequestDTO integrationRequestDTO) {
//获取runtime订单最新一版数据
List<AccountOrder> runtimeOrders= baseMapper.findNewestRuntimeAccountOrder();
Set<String> openIdSet = runtimeOrders.stream().map(AccountOrder::getOpenId).collect(Collectors.toSet());
Map<String, List<AccountOrder>> userOrderMap = runtimeOrders.stream().collect(Collectors.groupingBy(AccountOrder::getOpenId));
//获取注册用户信息
List<RegisterUserEntity> userList = registerUserEntityService.list(new QueryWrapper<RegisterUserEntity>().in(RegisterUserEntity.COL_OPEN_ID, openIdSet));
for (RegisterUserEntity registerUser : userList) {
//获取用户订单
List<AccountOrder> accountOrders = userOrderMap.get(registerUser.getOpenId());
Date lastFinishTime=registerUser.getLastActive();
int type=registerUser.getPayType()!=null?registerUser.getPayType():0;
Double sum=registerUser.getPayAmount();
for (AccountOrder accountOrder : accountOrders) {
//最近时间
lastFinishTime = (lastFinishTime != null && lastFinishTime.compareTo(accountOrder.getFinishTime()) > 0) ? lastFinishTime : accountOrder.getFinishTime();
//最大类型
type = Math.max(accountOrder.getType() + 1, type);
sum += accountOrder.getProfit();
}
//计算用户信息
if (registerUser.getLastActive()==null){
//排期重置....
}
//活跃时间重置
registerUser.setLastActive(lastFinishTime);
//如果类型大于当前类型
registerUser.setPayType(type);
//累计次数
registerUser.setPayNum(registerUser.getPayNum()+accountOrders.size());
//累计金额
registerUser.setPayAmount(sum);
}
registerUserEntityService.updateBatchById(userList);
}
@Override
public void calculateAvgMonth(IntegrationRequestDTO integrationRequestDTO) {
//获取近一月每个用户的平均充值
List<UserAvgAmountVO> userAvgAmountVos= baseMapper.findMonthDailyAccountOrder();
Map<String, Double> userAvgAmountMap = userAvgAmountVos.stream().collect(Collectors.toMap(UserAvgAmountVO::getOpenId, UserAvgAmountVO::getAvgAmount, (v1, v2) -> v1));
//获取注册用户信息
List<RegisterUserEntity> userList = registerUserEntityService.list(new QueryWrapper<RegisterUserEntity>().gt(RegisterUserEntity.COL_PAY_TYPE, 0));
if (userList!=null&&!userList.isEmpty()){
for (RegisterUserEntity registerUserEntity : userList) {
registerUserEntity.setAvgMonth(userAvgAmountMap.get(registerUserEntity.getOpenId()));
}
}
registerUserEntityService.updateBatchById(userList);
}
}
package com.yaoyaozw.customer.service.impl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yaoyaozw.customer.mapper.RegisterUserEntityMapper;
import com.yaoyaozw.customer.entity.RegisterUserEntity;
import com.yaoyaozw.customer.service.RegisterUserEntityService;
@Service
public class RegisterUserEntityServiceImpl extends ServiceImpl<RegisterUserEntityMapper, RegisterUserEntity> implements RegisterUserEntityService{
}
package com.yaoyaozw.customer.service.wechat.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class WechatResponseEntity implements Serializable {
private static final long serialVersionUID = -7200832532059064880L;
private Integer errcode;
private String errmsg;
}
package com.yaoyaozw.customer.service.wechat.service;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.Map;
@Service
public class WeChatRestService {
/**
* POST请求
* @param fullPath 请求路径
* @param queryMap query
* @param requestMap Body
* @param urlParams 路径变量
* @param responseEntity 返回实体
* @param <T> 泛型
* @return 响应结果
* @throws RestClientException 异常
*/
public <T> ResponseEntity<T> postRequest(String fullPath, MultiValueMap<String, String> queryMap, Map<String, Object> requestMap, Map<String,Object> urlParams, Class<T> responseEntity)
throws RestClientException {
RestTemplate restTemplate = new RestTemplate();
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(fullPath).queryParams(queryMap);
UriComponents uriComponents=uriComponentsBuilder.build();
if (urlParams!=null){
uriComponents = uriComponentsBuilder.buildAndExpand(urlParams);
}
ResponseEntity<T> result = restTemplate.postForEntity(uriComponents.toUri(), requestMap, responseEntity);
return result;
}
}
package com.yaoyaozw.customer.service.wechat.service;
public interface WeChatService {
/**
* 发送客服消息
*/
void sendCustomerServiceMessage();
}
package com.yaoyaozw.customer.service.wechat.service;
import org.springframework.stereotype.Service;
@Service
public class WeChatServiceImpl implements WeChatService{
@Override
public void sendCustomerServiceMessage() {
//根据人群包发送客服
}
}
package com.yaoyaozw.customer.vo;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class UserAvgAmountVO implements Serializable {
private static final long serialVersionUID = 5172574895622870993L;
private String openId;
private Double avgAmount;
}
......@@ -20,5 +20,3 @@ mybatis-plus:
logging:
level:
com.example.material.mapper: debug
wx:
requestUrl: https://api.weixin.qq.com
\ No newline at end of file
......@@ -21,5 +21,3 @@ mybatis-plus:
logging:
level:
com.example.material.mapper: debug
wx:
requestUrl: https://api.weixin.qq.com
\ No newline at end of file
......@@ -20,5 +20,3 @@ mybatis-plus:
logging:
level:
com.example.material.mapper: debug
wx:
requestUrl: https://api.weixin.qq.com
\ No newline at end of file
<?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.yaoyaozw.customer.mapper.AccountOrderMapper">
<resultMap id="BaseResultMap" type="com.yaoyaozw.customer.entity.AccountOrder">
<!--@mbg.generated-->
<!--@Table account_order-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="setup_id" jdbcType="BIGINT" property="setupId" />
<result column="profit" jdbcType="DOUBLE" property="profit" />
<result column="finish_time" jdbcType="TIMESTAMP" property="finishTime" />
<result column="type" jdbcType="BIGINT" property="type" />
<result column="open_id" jdbcType="VARCHAR" property="openId" />
<result column="user_subscribe_time" jdbcType="TIMESTAMP" property="userSubscribeTime" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, setup_id, profit, finish_time, `type`, open_id, user_subscribe_time
</sql>
<select id="findNewestRuntimeAccountOrder" resultMap="BaseResultMap">
SELECT
ao.id, ao.setup_id, ao.profit, ao.finish_time, ao.`type`, ao.open_id, ao.user_subscribe_time
FROM
account_order ao
INNER JOIN ( SELECT max( gmt_create) AS maxDate FROM account_order where data_frequency=0 and gmt_create>CURRENT_DATE ) st ON
ao.gmt_create = st.maxDate
where ao.data_frequency=0 and ao.open_id LIKE 'o%'
</select>
<select id="findMonthDailyAccountOrder" resultType="com.yaoyaozw.customer.vo.UserAvgAmountVO">
SELECT
open_id,convert(SUM(profit)/(if(datediff(CURDATE(),user_subscribe_time)&lt;30,datediff(CURDATE(),user_subscribe_time),30)),decimal(8,2))
FROM
account_order
where data_frequency=1 and open_id LIKE 'o%' and datediff(CURDATE(),finish_time)&lt;30 GROUP BY open_id
</select>
</mapper>
\ No newline at end of file
<?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.yaoyaozw.customer.mapper.RegisterUserEntityMapper">
<resultMap id="BaseResultMap" type="com.yaoyaozw.customer.entity.RegisterUserEntity">
<!--@mbg.generated-->
<!--@Table register_user_entity-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="app_id" jdbcType="VARCHAR" property="appId" />
<result column="open_id" jdbcType="VARCHAR" property="openId" />
<result column="setup_id" jdbcType="BIGINT" property="setupId" />
<result column="pay_type" jdbcType="INTEGER" property="payType" />
<result column="pay_num" jdbcType="INTEGER" property="payNum" />
<result column="pay_amount" jdbcType="DOUBLE" property="payAmount" />
<result column="avg_month" jdbcType="DOUBLE" property="avgMonth" />
<result column="last_active" jdbcType="TIMESTAMP" property="lastActive" />
<result column="gmt_create" jdbcType="TIMESTAMP" property="gmtCreate" />
<result column="customer_sort" jdbcType="INTEGER" property="customerSort" />
<result column="customer_publish" jdbcType="TIMESTAMP" property="customerPublish" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, app_id, open_id, setup_id, pay_type, pay_num, pay_amount, avg_month, last_active,
gmt_create, customer_sort, customer_publish
</sql>
</mapper>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论