diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/entity/SiteLog.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/entity/SiteLog.java new file mode 100644 index 0000000..8a901c8 --- /dev/null +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/entity/SiteLog.java @@ -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(); + } +} diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/enums/SiteOpenTypeEnum.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/enums/SiteOpenTypeEnum.java new file mode 100644 index 0000000..7b834bd --- /dev/null +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/enums/SiteOpenTypeEnum.java @@ -0,0 +1,34 @@ +package com.flossom.common.core.enums; + +/** + * 站点管理: + * site_info:open_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; + } +} diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/enums/SitePushTypeEnum.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/enums/SitePushTypeEnum.java new file mode 100644 index 0000000..47ce913 --- /dev/null +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/enums/SitePushTypeEnum.java @@ -0,0 +1,25 @@ +package com.flossom.common.core.enums; + +/** + * 站点管理: + * site_info:push_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; + } +} diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/enums/SiteTypeEnum.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/enums/SiteTypeEnum.java new file mode 100644 index 0000000..22155cb --- /dev/null +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/enums/SiteTypeEnum.java @@ -0,0 +1,25 @@ +package com.flossom.common.core.enums; + +/** + * 站点管理: + * site_info:site_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; + } +} diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/mapper/SiteLogMapper.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/mapper/SiteLogMapper.java new file mode 100644 index 0000000..e3da0c2 --- /dev/null +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/mapper/SiteLogMapper.java @@ -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 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); +} diff --git a/flossom-common/flossom-common-core/src/main/resources/mapper/SiteLogMapper.xml b/flossom-common/flossom-common-core/src/main/resources/mapper/SiteLogMapper.xml new file mode 100644 index 0000000..546c08a --- /dev/null +++ b/flossom-common/flossom-common-core/src/main/resources/mapper/SiteLogMapper.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + select id, user_id, site_id, create_by, create_time from site_log + + + + + + + + insert into site_log + + user_id, + site_id, + create_by, + create_time, + + + #{userId}, + #{siteId}, + #{createBy}, + #{createTime}, + + + + + update site_log + + user_id = #{userId}, + site_id = #{siteId}, + create_by = #{createBy}, + create_time = #{createTime}, + + where id = #{id} + + + + delete from site_log where id = #{id} + + + + delete from site_log where id in + + #{id} + + + \ No newline at end of file diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/SiteInfoController.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/SiteInfoController.java new file mode 100644 index 0000000..5f76e8a --- /dev/null +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/SiteInfoController.java @@ -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()); + } + +} diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/ISiteInfoService.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/ISiteInfoService.java new file mode 100644 index 0000000..a0f1556 --- /dev/null +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/ISiteInfoService.java @@ -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 popupList(Integer openType); + + List carousel(); +} diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/SiteInfoServiceImpl.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/SiteInfoServiceImpl.java new file mode 100644 index 0000000..d80aa90 --- /dev/null +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/SiteInfoServiceImpl.java @@ -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 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 siteInfos = siteInfoMapper.selectSiteInfoList(siteInfo); + if (siteInfos != null && siteInfos.size() > 0) { + return filterSite(siteInfos); + } + return null; + } + + @Override + public List carousel() { + SiteInfo siteInfo = new SiteInfo(); + // 站点类型 + siteInfo.setSiteType(SiteTypeEnum.CAROUSEL_LIST.getCode()); + // 开启的数据 + siteInfo.setOperate(1); + List siteInfos = siteInfoMapper.selectSiteInfoList(siteInfo); + if (siteInfos != null && siteInfos.size() > 0) { + return filterSite(siteInfos); + } + return null; + } + + /** + * 根据 条件做过滤 + * + * @param siteInfos + * @return + */ + private List filterSite(List siteInfos) { + List 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 userMiniTageIdList = new ArrayList<>(); + List userWecomTageIdList = new ArrayList<>(); + WxUserMember wxUserMember = SecurityUtils.getLoginUser().getWxUserMember(); + WxUserTag wxUserTag = new WxUserTag(); + wxUserTag.setUserId(wxUserMember.getId()); + wxUserTag.setType(TagTypeStatus.MINI_PROGRAM.getCode()); + // 用户拥有的小程序标签 + List 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 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 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 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 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 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 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 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 siteLogs = siteLogMapper.selectSiteLogList(siteLog); + if (siteLogs == null || siteLogs.size() >= info.getPushNumber()) { + continue; + } + } + } + } + + /** + * TODO: 打卡多少次可见 + */ + + /** + * TODO: 关联仪器 + */ + + // 最终符合条件 + resultList.add(info); + } + return resultList; + } + +}