提交 8755380d 作者: gh

延时客服合并

上级 b79b3207
......@@ -10,9 +10,7 @@ import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.yaoyaozw.customer.common.R;
import com.yaoyaozw.customer.constants.ApiResultConstant;
import com.yaoyaozw.customer.constants.CrowdPackageCommonConstant;
import com.yaoyaozw.customer.constants.CustomerCommonConstant;
import com.yaoyaozw.customer.dto.customer.CustomerMessageSaveDTO;
import com.yaoyaozw.customer.entity.CustomerGraphics;
import com.yaoyaozw.customer.entity.CustomerGraphicsDelay;
import com.yaoyaozw.customer.entity.ReferralEntity;
......@@ -27,7 +25,7 @@ import com.yaoyaozw.customer.service.CrowdPackageConditionMatchService;
import com.yaoyaozw.customer.service.ReferralEntityService;
import com.yaoyaozw.customer.service.RegisterUserEntityService;
import com.yaoyaozw.customer.vo.AuthInfoVO;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.customer.CrowdPackageUserVO;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
......@@ -37,7 +35,6 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
......
......@@ -5,7 +5,6 @@ import com.yaoyaozw.customer.common.GenericsResult;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageQueryDTO;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageConditionDTO;
import com.yaoyaozw.customer.service.CrowdPackageService;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.crowd.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......
......@@ -2,7 +2,7 @@ package com.yaoyaozw.customer.controller;
import com.yaoyaozw.customer.common.GenericsResult;
import com.yaoyaozw.customer.service.CustomerServiceCommonService;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
......
......@@ -7,7 +7,7 @@ import com.yaoyaozw.customer.dto.customer.CustomerDelayQueryDTO;
import com.yaoyaozw.customer.dto.customer.CustomerDelaySaveDTO;
import com.yaoyaozw.customer.service.CustomerGraphicsDelayService;
import com.yaoyaozw.customer.vo.AuthInfoVO;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.customer.CustomerDelayListVO;
import com.yaoyaozw.customer.vo.customer.CustomerDelayGraphicsDetailVO;
import io.swagger.annotations.Api;
......
package com.yaoyaozw.customer.controller;
import com.yaoyaozw.customer.dto.integration.IntegrationRequestDTO;
import com.yaoyaozw.customer.service.AccountOrderService;
import com.yaoyaozw.customer.service.CustomerDelayPublishService;
import com.yaoyaozw.customer.service.CustomerGraphicsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
......@@ -19,6 +21,10 @@ public class TestController {
@Autowired
private CustomerGraphicsService customerGraphicsService;
@Autowired
private AccountOrderService accountOrderService;
@Autowired
private CustomerDelayPublishService customerDelayPublishService;
@GetMapping("/CustomerTest")
public void test(){
......@@ -35,5 +41,32 @@ public class TestController {
customerGraphicsService.sendCustomerMessage(integrationRequestDTO);
}
@GetMapping("/CustomerDelayTest")
public void delayTest(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.AM_PM,0);
calendar.set(Calendar.HOUR,17);
calendar.set(Calendar.MINUTE,0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
IntegrationRequestDTO integrationRequestDTO = new IntegrationRequestDTO();
integrationRequestDTO.setRequestDate(calendar.getTime());
customerDelayPublishService.sendCustomerDelayMessage(integrationRequestDTO);
}
@GetMapping("/payTest")
public void payTest(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.AM_PM,0);
calendar.set(Calendar.HOUR,12);
calendar.set(Calendar.MINUTE,0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
IntegrationRequestDTO integrationRequestDTO = new IntegrationRequestDTO();
integrationRequestDTO.setRequestDate(calendar.getTime());
accountOrderService.activeUserByOrder(integrationRequestDTO);
}
}
......@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author wgh
......@@ -25,19 +26,19 @@ public class CustomerDelayPublish implements Serializable {
/**
* app_id
*/
@TableField(exist = false ,value = "app_id")
@TableField(exist = false )
private String appId;
/**
* openid
*/
@TableField(exist = false ,value = "open_id")
@TableField(exist = false )
private String openId;
/**
* 未付费0/付费1/VIP 2
*/
@TableField(exist = false ,value= "pay_type")
@TableField(exist = false )
private Byte payType;
/**
......@@ -52,10 +53,12 @@ public class CustomerDelayPublish implements Serializable {
@TableField(value = "customer_publish")
private Date customerPublish;
@TableField(value = "first_active")
private Date firstActive;
/**
* 创建时间
*/
@TableField(exist = false ,value = "gmt_create")
@TableField(exist = false )
private Date gmtCreate;
......
......@@ -107,11 +107,11 @@ public class CustomerGraphics implements Serializable {
@TableLogic
private Integer isDeleted;
@TableField(exist = false)
private Integer sendCount;
@TableField(value = "send_Num")
private Integer sendNum;
public void updateCount(){
sendCount++;
this.sendNum++;
}
private static final long serialVersionUID = 1L;
......
......@@ -46,6 +46,11 @@ public class CustomerGraphicsDelay implements Serializable {
@TableField(value = "extend_title")
private String extendTitle;
/**
* 封面图地址
*/
@TableField(value = "cover_url")
private String coverUrl;
/**
* 文本内容
......
......@@ -70,6 +70,12 @@ public class RegisterUserEntity implements Serializable {
private Date lastActive;
/**
* 首次活跃时间
*/
@TableField(value = "first_active")
private Date firstActive;
/**
* 创建时间
*/
@TableField(value = "gmt_create")
......@@ -93,6 +99,8 @@ public class RegisterUserEntity implements Serializable {
@TableField(value = "in_package")
private String inPackage;
@TableField(exist = false)
private Date formatDate;
private static final long serialVersionUID = 1L;
......
package com.yaoyaozw.customer.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yaoyaozw.customer.entity.AccountOrder;
import com.yaoyaozw.customer.vo.UserAvgAmountVO;
import com.yaoyaozw.customer.vo.kanban.UserAvgAmountVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
@DS("kanban")
@Mapper
public interface AccountOrderMapper extends BaseMapper<AccountOrder> {
......
......@@ -3,6 +3,10 @@ package com.yaoyaozw.customer.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yaoyaozw.customer.entity.CustomerDelayPublish;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
/**
* @author wgh
......@@ -10,4 +14,6 @@ import org.apache.ibatis.annotations.Mapper;
*/
@Mapper
public interface CustomerDelayPublishMapper extends BaseMapper<CustomerDelayPublish> {
List<CustomerDelayPublish> findPublishUser(@Param("requestDate") Date requestDate);
}
\ No newline at end of file
......@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yaoyaozw.customer.dto.customer.CustomerDelayQueryDTO;
import com.yaoyaozw.customer.entity.CustomerGraphicsDelay;
import com.yaoyaozw.customer.vo.AuthInfoVO;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.customer.CustomerDelayItemVO;
import com.yaoyaozw.customer.vo.customer.CustomerDelayListVO;
import org.apache.ibatis.annotations.Mapper;
......@@ -18,16 +18,17 @@ import java.util.Set;
@DS("material")
@Mapper
public interface CustomerGraphicsDelayMapper extends BaseMapper<CustomerGraphicsDelay> {
/**
* 根据appid找延时客服
*
* 根据appid找有限序列的延时客服
* @param appidList
* @param maxSort
* @return
*/
List<CustomerDelayItemVO> findAllDelayCustomerMessage(@Param("appidList") Set<String> appidList);
List<CustomerDelayItemVO> findDelayCustomerMessageByRange(@Param("appidList") Set<String> appidList, @Param("maxSort") Integer maxSort);
void updateSendNumByVo(@Param("CustomerDelayItems")Set<CustomerDelayItemVO>voList);
/**
* 页面列表
*
......
......@@ -2,7 +2,8 @@ package com.yaoyaozw.customer.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.yaoyaozw.customer.entity.CrowdPackageCondition;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.kanban.CommonCostSetupVo;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
......@@ -51,4 +52,6 @@ public interface KanbanCommonMapper {
List<CommonOptionResponseVO> getStoreTypeEntity(@Param("storeKeySet") Set<String> storeKeySet);
List<CommonCostSetupVo> getWechatCostSetup(@Param("appid")String appid);
}
package com.yaoyaozw.customer.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.yaoyaozw.customer.common.GenericsResult;
import com.yaoyaozw.customer.vo.AuthInfoVO;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
......
......@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageQueryDTO;
import com.yaoyaozw.customer.entity.CrowdPackage;
import com.yaoyaozw.customer.entity.CrowdPackageCondition;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.crowd.CrowdPackageListVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
......
package com.yaoyaozw.customer.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yaoyaozw.customer.entity.AuthorizerInfo;
import com.yaoyaozw.customer.entity.RegisterUserEntity;
import com.yaoyaozw.customer.vo.customer.CrowdPackageUserVO;
import org.apache.ibatis.annotations.Mapper;
......@@ -51,4 +52,11 @@ public interface RegisterUserEntityMapper extends BaseMapper<RegisterUserEntity>
*/
List<CrowdPackageUserVO> getCurrentInPackUserListWithoutAccountId(@Param("packageId") Long packageId);
/**
* 获取所有appid
* @return
*/
List<AuthorizerInfo>existAppid();
List<RegisterUserEntity> findAllUserWithoutSetupId(String appid);
}
\ No newline at end of file
......@@ -56,6 +56,8 @@ public class SchedulingTask {
IntegrationRequestDTO integrationRequestDTO = new IntegrationRequestDTO();
integrationRequestDTO.setRequestDate(calendar.getTime());
accountOrderService.activeUserByOrder(integrationRequestDTO);
}
......@@ -72,6 +74,8 @@ public class SchedulingTask {
IntegrationRequestDTO integrationRequestDTO = new IntegrationRequestDTO();
integrationRequestDTO.setRequestDate(calendar.getTime());
accountOrderService.calculateAvgMonth(integrationRequestDTO);
}
......@@ -90,6 +94,8 @@ public class SchedulingTask {
IntegrationRequestDTO integrationRequestDTO = new IntegrationRequestDTO();
integrationRequestDTO.setRequestDate(calendar.getTime());
customerGraphicsService.sendCustomerMessage(integrationRequestDTO);
......@@ -99,6 +105,7 @@ public class SchedulingTask {
/**
* 每1min扫延时客服
*/
@Scheduled(cron = "0 0/1 * * * *")
public void publishDelayCustomerMessage(){
Calendar calendar = Calendar.getInstance();
......@@ -109,6 +116,8 @@ public class SchedulingTask {
IntegrationRequestDTO integrationRequestDTO = new IntegrationRequestDTO();
integrationRequestDTO.setRequestDate(calendar.getTime());
customerDelayPublishService.sendCustomerDelayMessage(integrationRequestDTO);
}
......
......@@ -6,7 +6,6 @@ import com.yaoyaozw.customer.common.GenericsResult;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageQueryDTO;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageConditionDTO;
import com.yaoyaozw.customer.entity.CrowdPackage;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.crowd.*;
import java.util.List;
......
......@@ -8,7 +8,7 @@ import com.yaoyaozw.customer.dto.customer.CustomerDelayQueryDTO;
import com.yaoyaozw.customer.dto.customer.CustomerDelaySaveDTO;
import com.yaoyaozw.customer.entity.CustomerGraphicsDelay;
import com.yaoyaozw.customer.vo.AuthInfoVO;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.customer.CustomerDelayGraphicsDetailVO;
import com.yaoyaozw.customer.vo.customer.CustomerDelayItemVO;
import com.yaoyaozw.customer.vo.customer.CustomerDelayListVO;
......@@ -22,7 +22,19 @@ import java.util.Set;
*/
public interface CustomerGraphicsDelayService extends IService<CustomerGraphicsDelay> {
List<CustomerDelayItemVO> findAllDelayCustomerMessage(Set<String> appidList,Integer maxSortRage);
/**
* 找到延时客服
* @param appidList
* @param maxSortRage
* @return
*/
List<CustomerDelayItemVO> findAllDelayCustomerSort(Set<String> appidList,Integer maxSortRage);
/**
* 更新发送人数
* @param voList
*/
void updateSendNumById (Set<CustomerDelayItemVO>voList);
/**
* 插入客户延迟
......
package com.yaoyaozw.customer.service;
import com.yaoyaozw.customer.common.GenericsResult;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import org.apache.ibatis.annotations.Param;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import java.util.List;
......
......@@ -4,6 +4,7 @@ import com.yaoyaozw.customer.dto.integration.IntegrationRequestDTO;
import com.yaoyaozw.customer.entity.RegisterUserEntity;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yaoyaozw.customer.vo.customer.CrowdPackageUserVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
......
......@@ -2,18 +2,14 @@ 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.CustomerDelayPublish;
import com.yaoyaozw.customer.entity.RegisterUserEntity;
import com.yaoyaozw.customer.service.CustomerDelayPublishService;
import com.yaoyaozw.customer.service.CustomerGraphicsDelayService;
import com.yaoyaozw.customer.service.RegisterUserEntityService;
import com.yaoyaozw.customer.vo.UserAvgAmountVO;
import com.yaoyaozw.customer.vo.kanban.UserAvgAmountVO;
import com.yaoyaozw.customer.vo.customer.CustomerDelayItemVO;
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;
......@@ -40,50 +36,56 @@ public class AccountOrderServiceImpl extends ServiceImpl<AccountOrderMapper, Acc
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));
Set<String> appIdSet = userList.stream().map(RegisterUserEntity::getAppId).collect(Collectors.toSet());
List<CustomerDelayItemVO> allDelayCustomerMessage = customerGraphicsDelayService.findAllDelayCustomerMessage(appIdSet,2);
Map<String, Map<Integer, Long>> delayMessageMap = allDelayCustomerMessage.stream().collect(Collectors.groupingBy(CustomerDelayItemVO::getAppId, Collectors.toMap(CustomerDelayItemVO::getPostSort, CustomerDelayItemVO::getTimeInterval, (v1, v2) -> v2)));
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 (!openIdSet.isEmpty()){
//获取注册用户信息
List<RegisterUserEntity> userList = registerUserEntityService.list(new QueryWrapper<RegisterUserEntity>().in(RegisterUserEntity.COL_OPEN_ID, openIdSet));
if(!userList.isEmpty()){
Set<String> appIdSet = userList.stream().map(RegisterUserEntity::getAppId).collect(Collectors.toSet());
List<CustomerDelayItemVO> allDelayCustomerMessage = customerGraphicsDelayService.findAllDelayCustomerSort(appIdSet,1);
Map<String, Map<Integer, Long>> delayMessageMap = allDelayCustomerMessage.stream().collect(Collectors.groupingBy(CustomerDelayItemVO::getAppId, Collectors.toMap(CustomerDelayItemVO::getPostSort, CustomerDelayItemVO::getTimeInterval, (v1, v2) -> v2)));
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()!=null?registerUser.getPayAmount():0;
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.setFirstActive(lastFinishTime);
//排期重置
delayCustomerManage(registerUser,lastFinishTime,delayMessageMap);
}
//活跃时间重置
registerUser.setLastActive(lastFinishTime);
//如果类型大于当前类型
registerUser.setPayType(type);
//累计次数
registerUser.setPayNum(registerUser.getPayNum()+accountOrders.size());
//累计金额
registerUser.setPayAmount(sum);
}
registerUserEntityService.updateBatchById(userList);
}
//计算用户信息
if (registerUser.getLastActive()==null){
//排期重置....
delayCustomerManage(registerUser,lastFinishTime,delayMessageMap);
}
//活跃时间重置
registerUser.setLastActive(lastFinishTime);
//如果类型大于当前类型
registerUser.setPayType(type);
//累计次数
registerUser.setPayNum(registerUser.getPayNum()+accountOrders.size());
//累计金额
registerUser.setPayAmount(sum);
}
registerUserEntityService.updateBatchById(userList);
}
@Override
public void calculateAvgMonth(IntegrationRequestDTO integrationRequestDTO) {
//获取近一月每个用户的平均充值
......@@ -113,27 +115,16 @@ public class AccountOrderServiceImpl extends ServiceImpl<AccountOrderMapper, Acc
Map<Integer, Long> integerLongMap = delayMessageMap.get(registerUserPublish.getAppId());
if (integerLongMap!=null&&!integerLongMap.isEmpty()){
//找初始排期间隔时间
Long firstDelayMessage = integerLongMap.get(1);
Long secondDelayMessage = integerLongMap.get(2);
if (activeTime.getTime()-registerUserPublish.getGmtCreate().getTime()<firstDelayMessage){
Date publishTime = new Date(activeTime.getTime() + firstDelayMessage);
Date publishTime = new Date(activeTime.getTime() + firstDelayMessage);
registerUserPublish.setCustomerSort(1);
registerUserPublish.setCustomerSort(1);
registerUserPublish.setCustomerPublish(publishTime);
registerUserPublish.setCustomerPublish(publishTime);
//如果活跃时间和注册时间的间隔小于首次排期间隔,则说明首次没发,从1序列开始排;否则从2序列开始排
}else{
Date publishTime = new Date(activeTime.getTime() + secondDelayMessage);
registerUserPublish.setCustomerSort(2);
registerUserPublish.setCustomerPublish(publishTime);
}
}
}
......
package com.yaoyaozw.customer.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
......@@ -10,10 +9,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yaoyaozw.customer.common.BaseResult;
import com.yaoyaozw.customer.common.GenericsResult;
import com.yaoyaozw.customer.components.CustomerServiceCommonAsyncComponent;
import com.yaoyaozw.customer.components.SnowflakeComponent;
import com.yaoyaozw.customer.components.TokenManager;
import com.yaoyaozw.customer.constants.CrowdPackageCommonConstant;
import com.yaoyaozw.customer.constants.CustomerCommonConstant;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageQueryDTO;
import com.yaoyaozw.customer.dto.crowd.CrowdPackageConditionDTO;
import com.yaoyaozw.customer.entity.CrowdPackage;
......@@ -26,8 +23,7 @@ import com.yaoyaozw.customer.mapper.RegisterUserEntityMapper;
import com.yaoyaozw.customer.service.CrowdPackageConditionMatchService;
import com.yaoyaozw.customer.service.CrowdPackageConditionService;
import com.yaoyaozw.customer.service.CrowdPackageService;
import com.yaoyaozw.customer.service.RegisterUserEntityService;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.crowd.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
......@@ -37,9 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
......
......@@ -10,10 +10,7 @@ import com.yaoyaozw.customer.vo.customer.CustomerDelayItemVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
......@@ -44,16 +41,16 @@ public class CustomerDelayPublishServiceImpl extends ServiceImpl<CustomerDelayPu
@Override
public void sendCustomerDelayMessage(IntegrationRequestDTO integrationRequestDTO) {
//读取延时客服排期
List<CustomerDelayPublish> allPostUser = list(new QueryWrapper<CustomerDelayPublish>().eq(CustomerDelayPublish.COL_CUSTOMER_PUBLISH,integrationRequestDTO.getRequestDate()));
//读取延时客服排期
List<CustomerDelayPublish> allPostUser = baseMapper.findPublishUser(integrationRequestDTO.getRequestDate());
//涉及的appid
Set<String> appidSet = allPostUser.stream().map(CustomerDelayPublish::getAppId).collect(Collectors.toSet());
if (!allPostUser.isEmpty()){
//号-用户
Map<String, List<CustomerDelayPublish>> userMap = allPostUser.stream().collect(Collectors.groupingBy(CustomerDelayPublish::getAppId));
Map<String, List<CustomerDelayPublish>> userMap = allPostUser.stream().filter(a->a.getCustomerSort()!=null).collect(Collectors.groupingBy(CustomerDelayPublish::getAppId));
//获取所有延时客服
List<CustomerDelayItemVO> allDelayCustomerMessage = customerGraphicsDelayService.findAllDelayCustomerMessage(appidSet,null);
List<CustomerDelayItemVO> allDelayCustomerMessage = customerGraphicsDelayService.findAllDelayCustomerSort(appidSet,null);
if (allDelayCustomerMessage!=null&&!allDelayCustomerMessage.isEmpty()){
......@@ -63,10 +60,12 @@ public class CustomerDelayPublishServiceImpl extends ServiceImpl<CustomerDelayPu
allDelayCustomerMessage.stream().collect(Collectors.groupingBy(CustomerDelayItemVO::getAppId,
Collectors.toMap(CustomerDelayItemVO::getPostSort, a -> a, (v1, v2) -> v2)));
Set<CustomerDelayItemVO> needUpdateCustomerDelay = new HashSet<>();
for (Map.Entry<String, List<CustomerDelayPublish>> userEntry : userMap.entrySet()) {
String appid = userEntry.getKey();
//获取该号token
AuthorizerToken authorizerToken = authorizerTokenService.findTokenByAppid(appid);
String token = authorizerToken.getAuthorizerAppid();
......@@ -78,10 +77,10 @@ public class CustomerDelayPublishServiceImpl extends ServiceImpl<CustomerDelayPu
List<CustomerDelayPublish> userList = userEntry.getValue();
if (delaySortMap!=null&&!delaySortMap.isEmpty()){
//将所有待用延时客服收集
for (CustomerDelayPublish userPublish : userList) {
//发送客服
futureList.add(weChatService.sendCustomerDelayMessage(token, userPublish, delaySortMap)) ;
//发送延时客服
futureList.add(weChatService.sendCustomerDelayMessage(authorizerToken, userPublish, delaySortMap,needUpdateCustomerDelay)) ;
}
}
}
......@@ -95,7 +94,15 @@ public class CustomerDelayPublishServiceImpl extends ServiceImpl<CustomerDelayPu
e.printStackTrace();
}
}
updateBatchById(registerUserEntities);
if (!registerUserEntities.isEmpty()){
updateBatchById(registerUserEntities);
}
//更新延时客服的发送人数数据
if (!needUpdateCustomerDelay.isEmpty()){
customerGraphicsDelayService.updateSendNumById(needUpdateCustomerDelay);
}
}
}
......
......@@ -3,9 +3,6 @@ package com.yaoyaozw.customer.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
......@@ -27,7 +24,7 @@ import com.yaoyaozw.customer.service.AuthorizerInfoService;
import com.yaoyaozw.customer.service.CustomerGraphicsDelayService;
import com.yaoyaozw.customer.service.ReferralEntityService;
import com.yaoyaozw.customer.vo.AuthInfoVO;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.customer.CustomerDelayGraphicsDetailVO;
import com.yaoyaozw.customer.vo.customer.CustomerDelayItemVO;
import com.yaoyaozw.customer.vo.customer.CustomerDelayListVO;
......@@ -64,17 +61,21 @@ public class CustomerGraphicsDelayServiceImpl extends ServiceImpl<CustomerGraphi
@Override
public List<CustomerDelayItemVO> findAllDelayCustomerMessage(Set<String> appidList,Integer maxSortRange) {
public List<CustomerDelayItemVO> findAllDelayCustomerSort(Set<String> appidList,Integer maxSortRange) {
if (maxSortRange!=null){
return baseMapper.findDelayCustomerMessageByRange(appidList,maxSortRange);
return baseMapper.findDelayCustomerMessageByRange(appidList,maxSortRange);
}else{
}
return baseMapper.findAllDelayCustomerMessage(appidList);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateSendNumById(Set<CustomerDelayItemVO> voList) {
baseMapper.updateSendNumByVo(voList);
}
@Override
@Transactional(rollbackFor = Exception.class)
public BaseResult insertCustomerDelay(CustomerDelaySaveDTO saveDto) {
......
......@@ -2,24 +2,14 @@ package com.yaoyaozw.customer.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sun.xml.internal.bind.v2.TODO;
import com.yaoyaozw.customer.common.BaseResult;
import com.yaoyaozw.customer.common.GenericsResult;
import com.yaoyaozw.customer.common.R;
import com.yaoyaozw.customer.components.CustomerServiceCommonAsyncComponent;
import com.yaoyaozw.customer.components.SnowflakeComponent;
import com.yaoyaozw.customer.components.TokenManager;
import com.yaoyaozw.customer.constants.ApiResultConstant;
import com.yaoyaozw.customer.constants.CrowdPackageCommonConstant;
import com.yaoyaozw.customer.constants.CustomerCommonConstant;
import com.yaoyaozw.customer.dto.customer.CustomerMessageQueryDTO;
......@@ -30,15 +20,10 @@ import com.yaoyaozw.customer.dto.customer.CustomerReferralDTO;
import com.yaoyaozw.customer.entity.CrowdPackageCondition;
import com.yaoyaozw.customer.entity.CrowdPackageConditionMatch;
import com.yaoyaozw.customer.entity.ReferralEntity;
import com.yaoyaozw.customer.enums.CustomerStoreTemplateEnum;
import com.yaoyaozw.customer.feigns.ReferralFeignClient;
import com.yaoyaozw.customer.mapper.KanbanCommonMapper;
import com.yaoyaozw.customer.mapper.MaterialCommonMapper;
import com.yaoyaozw.customer.service.CrowdPackageConditionMatchService;
import com.yaoyaozw.customer.service.CrowdPackageConditionService;
import com.yaoyaozw.customer.service.ReferralEntityService;
import com.yaoyaozw.customer.vo.AuthInfoVO;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.customer.*;
import com.yaoyaozw.customer.service.*;
import com.yaoyaozw.customer.service.wechat.service.WeChatService;
......@@ -54,9 +39,6 @@ import java.util.*;
import java.util.stream.Collectors;
import java.util.List;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yaoyaozw.customer.entity.CustomerGraphics;
......@@ -237,7 +219,6 @@ public class CustomerGraphicsServiceImpl extends ServiceImpl<CustomerGraphicsMap
List<CustomerGraphics> customerGraphicsList = list(new QueryWrapper<CustomerGraphics>().eq(CustomerGraphics.COL_POST_TIME, requestDate));
for (CustomerGraphics customerGraphics : customerGraphicsList) {
customerGraphics.setSendCount(0);
//人群包id
Long packId = customerGraphics.getPackId();
//根据人群包找人,并按appId分组
......@@ -268,6 +249,7 @@ public class CustomerGraphicsServiceImpl extends ServiceImpl<CustomerGraphicsMap
}
}
}
updateBatchById(customerGraphicsList);
}
private BaseResult checkExtendBook(String storeType, CrowdPackageConditionMatch storeConditionMatch) {
......
......@@ -5,7 +5,7 @@ import com.yaoyaozw.customer.common.GenericsResult;
import com.yaoyaozw.customer.mapper.KanbanCommonMapper;
import com.yaoyaozw.customer.mapper.MaterialCommonMapper;
import com.yaoyaozw.customer.service.CustomerServiceCommonService;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......
......@@ -23,6 +23,7 @@ import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.Map;
@Service
......@@ -69,10 +70,10 @@ public class WeChatRestService {
}
public <T>Object httpPostRequest(String fullPath, Object requestEntity,Class<T> responseEntity)throws Exception{
public <T>Object httpPostRequest(UriComponentsBuilder uriComponentsBuilder, Object requestEntity,Class<T> responseEntity)throws Exception{
HttpClient defaultHttpClient = HttpClients.createDefault();
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(fullPath);
HttpPost httpPost = new HttpPost(uriComponentsBuilder.toUriString());
httpPost.setHeader("Content-Type", "application/json;charset=utf-8");
if (requestEntity != null) {
......@@ -84,11 +85,11 @@ public class WeChatRestService {
HttpResponse httpResponse = defaultHttpClient.execute(httpPost);
if (httpResponse.getStatusLine().getStatusCode() != 200) {
String errorLog = "请求失败,errorCode:" + httpResponse.getStatusLine().getStatusCode();
throw new Exception(fullPath + errorLog);
throw new Exception( errorLog);
}
//读取返回信息
String output;
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "utf-8"));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), StandardCharsets.UTF_8));
StringBuilder stringBuilder = new StringBuilder();
while ((output = bufferedReader.readLine()) != null) {
stringBuilder.append(output);
......
......@@ -10,6 +10,7 @@ import com.yaoyaozw.customer.vo.referral.ReferralEntityVo;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Future;
public interface WeChatService {
......@@ -17,8 +18,14 @@ public interface WeChatService {
/**
* 发送延时客服消息
*/
Future<CustomerDelayPublish> sendCustomerDelayMessage(String token, CustomerDelayPublish user, Map<Integer,CustomerDelayItemVO>delaySortMap);
Future<CustomerDelayPublish> sendCustomerDelayMessage( AuthorizerToken authorizerToken, CustomerDelayPublish user,
Map<Integer,CustomerDelayItemVO>delaySortMap,
Set<CustomerDelayItemVO>needUpdateVoList);
/**
* 定时发送客服消息
*/
void sendCustomerMessage(String appid, AuthorizerToken authorizerToken, CustomerGraphics customerGraphics, List<CrowdPackageUserVO>openidList, List<ReferralEntityVo> referralEntityVo);
}
......@@ -5,6 +5,7 @@ import com.yaoyaozw.customer.constants.CustomerCommonConstant;
import com.yaoyaozw.customer.entity.AuthorizerToken;
import com.yaoyaozw.customer.entity.CustomerDelayPublish;
import com.yaoyaozw.customer.entity.CustomerGraphics;
import com.yaoyaozw.customer.service.AuthorizerTokenService;
import com.yaoyaozw.customer.service.ReferralEntityService;
import com.yaoyaozw.customer.service.wechat.entity.WeChatResponseEntity;
import com.yaoyaozw.customer.service.wechat.entity.customerRequest.CustomerNewsArticleItem;
......@@ -18,12 +19,10 @@ import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
......@@ -38,31 +37,72 @@ public class WeChatServiceImpl implements WeChatService{
private static final int THREAD_NUM=1000;
private static final Integer SUCCESS_CODE=0;
private static final Integer EXPIRED_CODE=40001;
private static final ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(20, 100, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(2),new ThreadPoolExecutor.CallerRunsPolicy());
private final static Object LOCK=new Object();
private final static Object CUSTOMER_LOCK=new Object();
@Autowired
private AuthorizerTokenService authorizerTokenService;
@Autowired
private WeChatRestService weChatRestService;
@Async("myExecutor")
@Override
public Future<CustomerDelayPublish> sendCustomerDelayMessage(String token, CustomerDelayPublish user, Map<Integer,CustomerDelayItemVO> delaySortMap) {
public Future<CustomerDelayPublish> sendCustomerDelayMessage( AuthorizerToken authorizerToken, CustomerDelayPublish user,
Map<Integer,CustomerDelayItemVO> delaySortMap,
Set<CustomerDelayItemVO> needUpdateVoList) {
//token
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(customerPath).queryParam("access_token",authorizerToken.getAuthorizerAccessToken());
//找到延时序列
CustomerDelayItemVO sendCustomerDelay = delaySortMap.get(user.getCustomerSort());
if (sendCustomerDelay!=null){
needUpdateVoList.add(sendCustomerDelay);
//构建请求参数
WeChatCustomerRequestEntity customerRequest = buildCustomerRequest(sendCustomerDelay);
if (customerRequest!=null){
customerRequest.setTouser(user.getOpenId());
//System.err.println(user.getOpenId());
try {
WeChatResponseEntity response=(WeChatResponseEntity)weChatRestService.httpPostRequest(uriComponentsBuilder, customerRequest,WeChatResponseEntity.class);
//System.err.println(response);
if(SUCCESS_CODE.equals(response.getErrcode())){
//发送成功计数
sendCustomerDelay.updateSendNum();
}else if(EXPIRED_CODE.equals(response.getErrcode()) ){
//token过期重新取一下
AuthorizerToken updateToken = authorizerTokenService.findTokenByAppid(authorizerToken.getAuthorizerAppid());
return sendCustomerDelayMessage(updateToken,user,delaySortMap,needUpdateVoList);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//用户首次活跃时间
Long subscribeTimestamp = user.getFirstActive().getTime();
//当前时间批次发文素材的用户关注时间一致
Long subscribeTimestamp = user.getGmtCreate().getTime();
Set<Integer> sortSet = delaySortMap.keySet();
//找最小
Integer newSort =sortSet.stream().filter(a->a>user.getCustomerSort()).min(Comparator.naturalOrder()).orElse(-1);
Integer newSort = user.getCustomerSort()+1;
user.setCustomerSort(newSort);
CustomerDelayItemVO customerDelayItemVO = delaySortMap.get(newSort);
if (customerDelayItemVO!=null&&customerDelayItemVO.getTimeInterval()!=null){
user.setCustomerSort(newSort);
user.setCustomerPublish(new Date(subscribeTimestamp+customerDelayItemVO.getTimeInterval()));
}
return new AsyncResult<>(user);
......@@ -71,15 +111,14 @@ public class WeChatServiceImpl implements WeChatService{
@Override
public void sendCustomerMessage(String appid, AuthorizerToken authorizerToken, CustomerGraphics customerGraphics, List<CrowdPackageUserVO> openidList, List<ReferralEntityVo> referralEntityVo) {
//根据公众号发送客服
String fullPath=customerPath+"?access_token="+authorizerToken.getAuthorizerAccessToken();
//token
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(customerPath).queryParam("access_token",authorizerToken.getAuthorizerAccessToken());
//构建请求参数(文本/图文)
WeChatCustomerRequestEntity customerRequest = buildCustomerRequest(customerGraphics,referralEntityVo);
//计数器
CountDownLatch latch = new CountDownLatch(openidList.size());
if (customerRequest!=null){
//计数器
CountDownLatch latch = new CountDownLatch(openidList.size());
for (int i = 0; i < openidList.size(); i+=THREAD_NUM) {
......@@ -94,13 +133,23 @@ public class WeChatServiceImpl implements WeChatService{
try {
System.err.println(customerRequest.getTouser());
WeChatResponseEntity response=(WeChatResponseEntity)weChatRestService.httpPostRequest(fullPath, customerRequest,WeChatResponseEntity.class);
//线程锁
synchronized (LOCK){
customerGraphics.updateCount();
WeChatResponseEntity response=(WeChatResponseEntity)weChatRestService.httpPostRequest(uriComponentsBuilder, customerRequest,WeChatResponseEntity.class);
if(SUCCESS_CODE.equals(response.getErrcode())){
//线程锁
synchronized (CUSTOMER_LOCK){
//发送成功计数
customerGraphics.updateCount();
}
System.err.println(response);
}else if(EXPIRED_CODE.equals(response.getErrcode()) ){
Thread.sleep(500);
//token过期重新取一下
synchronized (uriComponentsBuilder){
AuthorizerToken updateToken = authorizerTokenService.findTokenByAppid(appid);
uriComponentsBuilder.replaceQueryParam("access_token",updateToken.getAuthorizerAccessToken());
}
}
System.err.println(response);
} catch (Exception e) {
e.printStackTrace();
......@@ -110,11 +159,42 @@ public class WeChatServiceImpl implements WeChatService{
}
});
}
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 延时客服参数构建
* @param customerDelay
* @return
*/
private WeChatCustomerRequestEntity buildCustomerRequest(CustomerDelayItemVO customerDelay) {
//类型判断
if (CUSTOMER_TEXT.equals(customerDelay.getType())){
//文本类
return new WeChatCustomerRequestEntity(CUSTOMER_TEXT,customerDelay.getContent());
}else if (CUSTOMER_NEWS.equals(customerDelay.getType())){
//图文类
return new WeChatCustomerRequestEntity(CUSTOMER_NEWS,customerDelay.getExtendTitle(),customerDelay.getContent(),customerDelay.getSourceUrl(),customerDelay.getCoverUrl());
}
return null;
}
/**
* 定时客服参数构建
* @param customerGraphics
* @param urlList
* @return
*/
private WeChatCustomerRequestEntity buildCustomerRequest(CustomerGraphics customerGraphics,List<ReferralEntityVo> urlList){
//类型判断
if (CUSTOMER_TEXT.equals(customerGraphics.getType())){
......@@ -145,4 +225,6 @@ public class WeChatServiceImpl implements WeChatService{
}
return null;
}
}
package com.yaoyaozw.customer.vo.crowd;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
......@@ -2,13 +2,11 @@ package com.yaoyaozw.customer.vo.crowd;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yaoyaozw.customer.vo.CommonOptionResponseVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @author darker
......
......@@ -2,6 +2,7 @@ package com.yaoyaozw.customer.vo.customer;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
......@@ -9,21 +10,20 @@ import java.io.Serializable;
* @author darker
* @date 2022/9/16 10:45
*/
@Data
@EqualsAndHashCode(of = "id")
public class CustomerDelayItemVO implements Serializable {
private static final long serialVersionUID = -4630777409975737444L;
private Long id;
/**
* appid
*/
private String appId;
/**
* 客服消息id
*/
private Long customerInfoId;
/**
* 发送序列
*/
private Integer postSort;
......@@ -33,4 +33,51 @@ public class CustomerDelayItemVO implements Serializable {
*/
private Long timeInterval;
/**
* 类型
*/
private String type;
/**
* 推广标题
*/
private String extendTitle;
/**
* 文本内容
*/
private String content;
/**
* 图文原文链接
*/
private String sourceUrl;
/**
* 图片
*/
private String coverUrl;
/**
* 送达人数
*/
private Integer sendNum;
/**
* 计数锁
*/
private final Object LOCK;
public CustomerDelayItemVO() {
this.LOCK=new Object();
}
public void updateSendNum(){
synchronized (LOCK){
this.sendNum++;
}
}
}
package com.yaoyaozw.customer.vo.kanban;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author wgh
* @date 2022/10/17 18:24
*/
@Data
public class CommonCostSetupVo implements Serializable {
private Long id;
private String appId;
private Date costDate;
}
package com.yaoyaozw.customer.vo;
package com.yaoyaozw.customer.vo.kanban;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......
......@@ -18,7 +18,7 @@ spring:
namespace: 062507b6-b1d7-4aac-8ed8-0da1cd9451e1
file-extension: yml
ext-config:
- data-id: customer-service-test.yml
- data-id: customer-service-dev.yml
group: DEFAULT_GROUP
refresh: true
---
......
......@@ -35,7 +35,7 @@
<select id="findMonthDailyAccountOrder" resultType="com.yaoyaozw.customer.vo.UserAvgAmountVO">
<select id="findMonthDailyAccountOrder" resultType="com.yaoyaozw.customer.vo.kanban.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
......
......@@ -10,9 +10,21 @@
<result column="pay_type" jdbcType="TINYINT" property="payType" />
<result column="customer_sort" jdbcType="INTEGER" property="customerSort" />
<result column="customer_publish" jdbcType="TIMESTAMP" property="customerPublish" />
<result column="first_active" jdbcType="TIMESTAMP" property="firstActive" />
<result column="gmt_create" jdbcType="TIMESTAMP" property="gmtCreate" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, app_id, open_id, pay_type, customer_sort, customer_publish
</sql>
<select id="findPublishUser" resultMap="BaseResultMap">
select id,app_id,open_id,pay_type,first_active ,customer_sort,customer_publish, gmt_create
from register_user_entity
where customer_publish=#{requestDate} and customer_sort>0
</select>
</mapper>
\ No newline at end of file
......@@ -20,18 +20,24 @@
is_deleted
</sql>
<update id="updateSendNumByVo" >
<select id="findAllDelayCustomerMessage" resultType="com.yaoyaozw.customer.vo.customer.CustomerDelayItemVO">
select * from customer_graphics_delay
<foreach collection="CustomerDelayItems" item="itemVo" separator=";">
update customer_graphics_delay set send_num = #{itemVo.sendNum} where id=#{itemVo.id}
</foreach>
</select>
</update>
<select id="findDelayCustomerMessageByRange" resultType="com.yaoyaozw.customer.vo.customer.CustomerDelayItemVO">
select * from customer_graphics_delay where post_sort &lt; #{maxSort}
select * from customer_graphics_delay
where send_status=9 and is_deleted=0 and app_id in
<foreach collection="appidList" item="appid" separator="," open="(" close=")">
#{appid}
</foreach>
<if test="maxSort != null and maxSort != ''">
and post_sort &lt;= #{maxSort}
</if>
</select>
......@@ -78,7 +84,7 @@
</select>
<select id="getTimeIntervalList" resultType="com.yaoyaozw.customer.vo.CommonOptionResponseVO">
<select id="getTimeIntervalList" resultType="com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO">
select
dic_value as name,
dic_key as `key`
......
......@@ -2,7 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yaoyaozw.customer.mapper.KanbanCommonMapper">
<select id="getConditionOptionByConfig" resultType="com.yaoyaozw.customer.vo.CommonOptionResponseVO">
<select id="getConditionOptionByConfig" resultType="com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO">
select
${conditionItem.keyColumn} as `key`,
${conditionItem.nameColumn} as `name`
......@@ -34,7 +34,7 @@
</select>
<select id="getStoreTypeEntity" resultType="com.yaoyaozw.customer.vo.CommonOptionResponseVO">
<select id="getStoreTypeEntity" resultType="com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO">
select
store_type as `key`,
store_name as `name`
......@@ -44,4 +44,10 @@
#{storeKey}
</foreach>
</select>
<select id="getWechatCostSetup" resultType="com.yaoyaozw.customer.vo.kanban.CommonCostSetupVo">
select id,app_id,cost_date from account_cost_setup where app_id =#{appid}
</select>
</mapper>
\ No newline at end of file
......@@ -2,7 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yaoyaozw.customer.mapper.MaterialCommonMapper">
<select id="getStoreList" resultType="com.yaoyaozw.customer.vo.CommonOptionResponseVO">
<select id="getStoreList" resultType="com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO">
select
`value` as `key`,
explanation as `name`
......
......@@ -2,7 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yaoyaozw.customer.mapper.MaterialCrowdPackageMapper">
<select id="getConditionOptionByConfig" resultType="com.yaoyaozw.customer.vo.CommonOptionResponseVO">
<select id="getConditionOptionByConfig" resultType="com.yaoyaozw.customer.vo.kanban.CommonOptionResponseVO">
select
${conditionItem.keyColumn} as `key`,
${conditionItem.nameColumn} as `name`
......
......@@ -99,4 +99,26 @@
</select>
<resultMap id="updateSetupMap" 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="format_date" jdbcType="TIMESTAMP" property="formatDate" />
</resultMap>
<select id="existAppid" resultType="com.yaoyaozw.customer.entity.AuthorizerInfo">
select authinfo.appid,authinfo.nick_name from (select app_id from register_user_entity GROUP BY app_id) existAppid left join authorizer_info authinfo
on existAppid.app_id=authinfo.appid where authinfo.appid is not null
</select>
<select id="findAllUserWithoutSetupId" resultMap="updateSetupMap">
select id,app_id,DATE_FORMAT(gmt_create,'%Y-%m-%d') as format_date from register_user_entity where setup_id is null and app_id=#{appid}
</select>
</mapper>
\ No newline at end of file
import com.yaoyaozw.customer.CustomerServiceApplication;
import com.yaoyaozw.customer.entity.AuthorizerInfo;
import com.yaoyaozw.customer.entity.RegisterUserEntity;
import com.yaoyaozw.customer.mapper.KanbanCommonMapper;
import com.yaoyaozw.customer.mapper.RegisterUserEntityMapper;
import com.yaoyaozw.customer.service.RegisterUserEntityService;
import com.yaoyaozw.customer.vo.kanban.CommonCostSetupVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author wgh
* @date 2022/10/17 19:20
*/
@SpringBootTest(classes = CustomerServiceApplication.class)
@RunWith(SpringRunner.class)
public class test {
@Autowired
private KanbanCommonMapper kanbanCommonMapper;
@Autowired
private RegisterUserEntityMapper registerUserEntityMapper;
@Autowired
private RegisterUserEntityService registerUserEntityService;
@Test
public void updateSetupId(){
List<AuthorizerInfo> appidList = registerUserEntityMapper.existAppid();
if (appidList!=null){
for (AuthorizerInfo authInfo : appidList) {
String appid = authInfo.getAppid();
System.err.println("开始:"+authInfo.getNickName());
List<CommonCostSetupVo> wechatCostSetup = kanbanCommonMapper.getWechatCostSetup(appid);
if (wechatCostSetup!=null){
Map<Date, Long> setupMap = wechatCostSetup.stream().collect(Collectors.toMap(CommonCostSetupVo::getCostDate, CommonCostSetupVo::getId, (v1, v2) -> v1));
List<RegisterUserEntity> allUser = registerUserEntityMapper.findAllUserWithoutSetupId(appid);
System.err.println("总计:"+allUser.size());
for (RegisterUserEntity user :allUser){
user.setSetupId(setupMap.get( user.getFormatDate()) );
}
registerUserEntityService.updateBatchById(allUser);
System.err.println("====>完成:"+authInfo.getNickName());
}
}
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论