Merge remote-tracking branch 'origin/feature-20240104' into feature-20240104

master
elliott 2 years ago
commit 62c93b6be4

@ -0,0 +1,68 @@
package com.flossom.common.core.domain.entity;
import com.flossom.common.core.annotation.Excel;
import com.flossom.common.core.web.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* site_log
*
* @author flossom
* @date 2024-01-12
*/
public class SiteLog extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* $column.columnComment
*/
private Long id;
/**
* id
*/
@Excel(name = "会员id")
private Long userId;
/**
* id
*/
@Excel(name = "站点id")
private Long siteId;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Long getUserId() {
return userId;
}
public void setSiteId(Long siteId) {
this.siteId = siteId;
}
public Long getSiteId() {
return siteId;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("userId", getUserId())
.append("siteId", getSiteId())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.toString();
}
}

@ -0,0 +1,34 @@
package com.flossom.common.core.enums;
/**
*
* site_infoopen_type
*/
public enum SiteOpenTypeEnum {
FIRST_PAGE_MODULE(1, "首页"), DISCOVER_MODULE(2, "发现模块"), ACTIVITY_MODULE(3, "活动模块");
private final Integer code;
private final String info;
SiteOpenTypeEnum(Integer code, String info) {
this.code = code;
this.info = info;
}
public Integer getCode() {
return code;
}
public String getInfo() {
return info;
}
public static SiteOpenTypeEnum getOpenType(Integer openType) {
for (SiteOpenTypeEnum openTypeEnum : SiteOpenTypeEnum.values()) {
if (openTypeEnum.getCode() == openType) {
return openTypeEnum;
}
}
return null;
}
}

@ -0,0 +1,25 @@
package com.flossom.common.core.enums;
/**
*
* site_infopush_type
*/
public enum SitePushTypeEnum {
ONE(1, "永久一次"), EVERY(2, "每次进入"), CUSTOM(3, "自定义");
private final Integer code;
private final String info;
SitePushTypeEnum(Integer code, String info) {
this.code = code;
this.info = info;
}
public Integer getCode() {
return code;
}
public String getInfo() {
return info;
}
}

@ -0,0 +1,25 @@
package com.flossom.common.core.enums;
/**
*
* site_infosite_type
*/
public enum SiteTypeEnum {
POPUP_LIST(1, "弹窗列表"), CAROUSEL_LIST(2, "轮播列表");
private final Integer code;
private final String info;
SiteTypeEnum(Integer code, String info) {
this.code = code;
this.info = info;
}
public Integer getCode() {
return code;
}
public String getInfo() {
return info;
}
}

@ -0,0 +1,61 @@
package com.flossom.common.core.mapper;
import com.flossom.common.core.domain.entity.SiteLog;
import java.util.List;
/**
* Mapper
*
* @author flossom
* @date 2024-01-12
*/
public interface SiteLogMapper {
/**
*
*
* @param id
* @return
*/
public SiteLog selectSiteLogById(Long id);
/**
*
*
* @param siteLog
* @return
*/
public List<SiteLog> selectSiteLogList(SiteLog siteLog);
/**
*
*
* @param siteLog
* @return
*/
public int insertSiteLog(SiteLog siteLog);
/**
*
*
* @param siteLog
* @return
*/
public int updateSiteLog(SiteLog siteLog);
/**
*
*
* @param id
* @return
*/
public int deleteSiteLogById(Long id);
/**
*
*
* @param ids
* @return
*/
public int deleteSiteLogByIds(Long[] ids);
}

@ -0,0 +1,71 @@
<?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.flossom.common.core.mapper.SiteLogMapper">
<resultMap type="SiteLog" id="SiteLogResult">
<result property="id" column="id" />
<result property="userId" column="user_id" />
<result property="siteId" column="site_id" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
</resultMap>
<sql id="selectSiteLogVo">
select id, user_id, site_id, create_by, create_time from site_log
</sql>
<select id="selectSiteLogList" parameterType="SiteLog" resultMap="SiteLogResult">
<include refid="selectSiteLogVo"/>
<where>
<if test="userId != null "> and user_id = #{userId}</if>
<if test="siteId != null "> and site_id = #{siteId}</if>
<if test="params != null and params.beginTime != null"> and create_time &gt;= #{params.beginTime},</if>
<if test="params != null and params.endTime != null"> and create_time &lt;= #{params.endTime},</if>
</where>
</select>
<select id="selectSiteLogById" parameterType="Long" resultMap="SiteLogResult">
<include refid="selectSiteLogVo"/>
where id = #{id}
</select>
<insert id="insertSiteLog" parameterType="SiteLog" useGeneratedKeys="true" keyProperty="id">
insert into site_log
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="userId != null">user_id,</if>
<if test="siteId != null">site_id,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="userId != null">#{userId},</if>
<if test="siteId != null">#{siteId},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
</trim>
</insert>
<update id="updateSiteLog" parameterType="SiteLog">
update site_log
<trim prefix="SET" suffixOverrides=",">
<if test="userId != null">user_id = #{userId},</if>
<if test="siteId != null">site_id = #{siteId},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteSiteLogById" parameterType="Long">
delete from site_log where id = #{id}
</delete>
<delete id="deleteSiteLogByIds" parameterType="String">
delete from site_log where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

@ -0,0 +1,36 @@
package com.flossom.miniProgram.controller;
import com.flossom.common.core.domain.R;
import com.flossom.common.core.web.controller.BaseController;
import com.flossom.miniProgram.service.ISiteInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/siteInfo")
public class SiteInfoController extends BaseController {
@Autowired
private ISiteInfoService siteInfoService;
/**
*
*
* @param openType
* @return
*/
@GetMapping("/popup/{openType}")
public R popupList(@PathVariable Integer openType) {
return R.ok(siteInfoService.popupList(openType));
}
/**
*
*/
@GetMapping("/carousel")
public R carousel() {
return R.ok(siteInfoService.carousel());
}
}

@ -0,0 +1,11 @@
package com.flossom.miniProgram.service;
import com.flossom.common.core.domain.entity.SiteInfo;
import java.util.List;
public interface ISiteInfoService {
List<SiteInfo> popupList(Integer openType);
List<SiteInfo> carousel();
}

@ -0,0 +1,259 @@
package com.flossom.miniProgram.service.impl;
import com.flossom.common.core.domain.entity.SiteInfo;
import com.flossom.common.core.domain.entity.SiteLog;
import com.flossom.common.core.domain.entity.WxUserMember;
import com.flossom.common.core.domain.entity.WxUserTag;
import com.flossom.common.core.enums.SiteOpenTypeEnum;
import com.flossom.common.core.enums.SitePushTypeEnum;
import com.flossom.common.core.enums.SiteTypeEnum;
import com.flossom.common.core.enums.TagTypeStatus;
import com.flossom.common.core.exception.ServiceException;
import com.flossom.common.core.mapper.SiteInfoMapper;
import com.flossom.common.core.mapper.SiteLogMapper;
import com.flossom.common.core.mapper.WxUserTagMapper;
import com.flossom.common.core.utils.StringUtils;
import com.flossom.common.security.utils.SecurityUtils;
import com.flossom.miniProgram.service.ISiteInfoService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class SiteInfoServiceImpl implements ISiteInfoService {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private SiteInfoMapper siteInfoMapper;
@Autowired
private SiteLogMapper siteLogMapper;
@Autowired
private WxUserTagMapper wxUserTagMapper;
@Override
public List<SiteInfo> popupList(Integer openType) {
SiteOpenTypeEnum openTypeEnum = SiteOpenTypeEnum.getOpenType(openType);
if (openTypeEnum == null) {
logger.error("获取弹窗失败openType值为 {}", openType);
throw new ServiceException("获取弹窗失败");
}
SiteInfo siteInfo = new SiteInfo();
// 站点类型
siteInfo.setSiteType(SiteTypeEnum.POPUP_LIST.getCode());
// 弹窗类型
siteInfo.setOpenType(openTypeEnum.getCode());
// 开启的数据
siteInfo.setOperate(1);
List<SiteInfo> siteInfos = siteInfoMapper.selectSiteInfoList(siteInfo);
if (siteInfos != null && siteInfos.size() > 0) {
return filterSite(siteInfos);
}
return null;
}
@Override
public List<SiteInfo> carousel() {
SiteInfo siteInfo = new SiteInfo();
// 站点类型
siteInfo.setSiteType(SiteTypeEnum.CAROUSEL_LIST.getCode());
// 开启的数据
siteInfo.setOperate(1);
List<SiteInfo> siteInfos = siteInfoMapper.selectSiteInfoList(siteInfo);
if (siteInfos != null && siteInfos.size() > 0) {
return filterSite(siteInfos);
}
return null;
}
/**
*
*
* @param siteInfos
* @return
*/
private List<SiteInfo> filterSite(List<SiteInfo> siteInfos) {
List<SiteInfo> resultList = new ArrayList<>();
for (SiteInfo info : siteInfos) {
/* 1、开启结束时间判定 */
Date siteStartTime = info.getSiteStartTime();
Date siteEndTime = info.getSiteEndTime();
if (siteStartTime != null && siteEndTime != null) {
LocalDateTime startTime = LocalDateTime.ofInstant(siteStartTime.toInstant(), ZoneId.systemDefault());
LocalDateTime endTime = LocalDateTime.ofInstant(siteEndTime.toInstant(), ZoneId.systemDefault());
LocalDateTime now = LocalDateTime.now();
// 不在时间范围内
if (!(now.isAfter(startTime) && now.isBefore(endTime))) {
continue;
}
}
/* 2、投放用户注册时间 */
Date registerStartTime = info.getUserRegisterStartTime();
Date registerEndTime = info.getUserRegisterEndTime();
if (registerStartTime != null && registerEndTime != null) {
LocalDateTime startTime = LocalDateTime.ofInstant(registerStartTime.toInstant(), ZoneId.systemDefault());
LocalDateTime endTime = LocalDateTime.ofInstant(registerEndTime.toInstant(), ZoneId.systemDefault());
LocalDateTime now = LocalDateTime.now();
// 不在时间范围内
if (!(now.isAfter(startTime) && now.isBefore(endTime))) {
continue;
}
}
/* 3、可见用户类型 */
Integer userType = info.getUserType();
// 可见用户类型 0-全部 1-游客 2-会员
if (userType != 0) {
Integer loginUserType = SecurityUtils.getLoginUser().getWxUserMember().getUserType();
// 当用户类型为游客
if (loginUserType == 0) {
if (userType != 1) {
continue;
}
}
// 当用户类型为会员
if (loginUserType == 1) {
if (userType != 2) {
continue;
}
}
}
/* 4、弹窗标签判断 */
// 4.1、获取用户拥有的小程序标签和企微标签
List<Long> userMiniTageIdList = new ArrayList<>();
List<Long> userWecomTageIdList = new ArrayList<>();
WxUserMember wxUserMember = SecurityUtils.getLoginUser().getWxUserMember();
WxUserTag wxUserTag = new WxUserTag();
wxUserTag.setUserId(wxUserMember.getId());
wxUserTag.setType(TagTypeStatus.MINI_PROGRAM.getCode());
// 用户拥有的小程序标签
List<WxUserTag> userMiniProgramTags = wxUserTagMapper.selectWxUserTagList(wxUserTag);
if (userMiniProgramTags != null && userMiniProgramTags.size() > 0) {
userMiniTageIdList = userMiniProgramTags.stream().map(WxUserTag::getTagId).collect(Collectors.toList());
}
wxUserTag.setType(TagTypeStatus.ENTERPRISE_WECHAT.getCode());
// 用户拥有的企微标签
List<WxUserTag> userWecomTags = wxUserTagMapper.selectWxUserTagList(wxUserTag);
if (userWecomTags != null && userWecomTags.size() > 0) {
userWecomTageIdList = userWecomTags.stream().map(WxUserTag::getTagId).collect(Collectors.toList());
}
// 4.2、禁止小程序标签
String forbidWechatTagId = info.getForbidWechatTagId();
if (StringUtils.isNotBlank(forbidWechatTagId)) {
List<String> forbidWechatTagIdList = Arrays.asList(forbidWechatTagId.split(","));
if (forbidWechatTagIdList != null && forbidWechatTagIdList.size() > 0) {
if (userMiniTageIdList.size() > 0) {
for (Long tagid : userMiniTageIdList) {
if (forbidWechatTagIdList.contains(tagid)) {
continue;
}
}
}
}
}
// 4.3、禁止企微标签
String forbidCompanyTagId = info.getForbidCompanyTagId();
if (StringUtils.isNotBlank(forbidCompanyTagId)) {
List<String> forbidCompanyTagIdList = Arrays.asList(forbidCompanyTagId.split(","));
if (forbidCompanyTagIdList != null && forbidCompanyTagIdList.size() > 0) {
if (userWecomTageIdList.size() > 0) {
for (Long tagid : userWecomTageIdList) {
if (forbidCompanyTagIdList.contains(tagid)) {
continue;
}
}
}
}
}
// 4.4、可见小程序标签
String showWechatTagId = info.getShowWechatTagId();
if (StringUtils.isNotBlank(showWechatTagId)) {
List<String> showWechatTagIdList = Arrays.asList(showWechatTagId.split(","));
if (showWechatTagIdList != null && userMiniTageIdList.size() > 0) {
if (!userMiniTageIdList.containsAll(showWechatTagIdList)) {
continue;
}
}
}
// 4.5、可见企微标签
String showCompanyTagId = info.getShowCompanyTagId();
if (StringUtils.isNotBlank(showCompanyTagId)) {
List<String> showCompanyTagIdList = Arrays.asList(showCompanyTagId.split(","));
if (userWecomTageIdList != null && userWecomTageIdList.size() > 0) {
if (!userWecomTageIdList.containsAll(showCompanyTagIdList)) {
continue;
}
}
}
/* 5、推送频次 */
Integer pushType = info.getPushType();
if (info.getPushType() != null) {
// 5.1、每次进入,不用做判断
// 5.2、一次
if (SitePushTypeEnum.ONE.getCode() == pushType) {
SiteLog siteLog = new SiteLog();
siteLog.setUserId(SecurityUtils.getLoginUser().getWxUserMember().getId());
siteLog.setSiteId(info.getId());
List<SiteLog> siteLogs = siteLogMapper.selectSiteLogList(siteLog);
if (siteLogs != null && siteLogs.size() > 0) {
continue;
}
}
// 自定义
if (SitePushTypeEnum.CUSTOM.getCode() == pushType) {
// 判断当前日期的星期是否在规定范围内
String pushTimer = info.getPushTimer();
if (StringUtils.isNotBlank(pushTimer)) {
List<String> weekList = Arrays.asList(pushTimer.split(","));
Calendar calendar = Calendar.getInstance();
// 获取当前星期几1表示周日2表示周一依此类推
int week = calendar.get(Calendar.DAY_OF_WEEK);
if (!weekList.contains(week)) {
// 不包含
continue;
}
// 在规定的星期内,判断观看次数是否达标了
SiteLog siteLog = new SiteLog();
siteLog.setUserId(SecurityUtils.getLoginUser().getWxUserMember().getId());
siteLog.setSiteId(info.getId());
LocalDateTime now = LocalDateTime.now();
siteLog.getParams().put("beginTime", LocalDateTime.of(now.toLocalDate(), LocalTime.MIN));
siteLog.getParams().put("endTime", LocalDateTime.of(now.toLocalDate(), LocalTime.MAX));
List<SiteLog> siteLogs = siteLogMapper.selectSiteLogList(siteLog);
if (siteLogs == null || siteLogs.size() >= info.getPushNumber()) {
continue;
}
}
}
}
/**
* TODO:
*/
/**
* TODO:
*/
// 最终符合条件
resultList.add(info);
}
return resultList;
}
}
Loading…
Cancel
Save