This commit is contained in:
Vinjor 2025-03-26 10:08:42 +08:00
parent 85bfa6d832
commit f8cb4fc32a
14 changed files with 302 additions and 23 deletions

View File

@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.exception.ServiceException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
@ -134,16 +135,10 @@ public class BaseCategoryController extends BaseController
public AjaxResult listByCode(@RequestParam(value = "code") String code,
@RequestParam(value = "isSystem",required = false) Integer isSystem)
{
List<BaseCategory> list = baseCategoryService.selectByCode(code);
if(list.isEmpty()){
try {
return success(baseCategoryService.listByParentCode(code, isSystem));
}catch (ServiceException e){
return error("未查询到该字典项!");
}
LambdaQueryWrapper<BaseCategory> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(BaseCategory::getPid,list.get(0).getId());
if(null!=isSystem){
queryWrapper.eq(BaseCategory::getIsSystem,isSystem);
}
queryWrapper.orderByAsc(BaseCategory::getSort);
return success(baseCategoryService.list(queryWrapper));
}
}

View File

@ -24,4 +24,14 @@ public interface IBaseCategoryService extends IService<BaseCategory>
* @return java.util.List<com.ruoyi.base.domain.BaseCategory>
**/
List<BaseCategory> selectByCode(String code);
/**
* 根据code查下级分类字典--列表
* @author vinjor-M
* @date 17:01 2025/3/25
* @param code 编码
* @param isSystem 是否系统级
* @return java.util.List<com.ruoyi.base.domain.BaseCategory>
**/
List<BaseCategory> listByParentCode(String code, Integer isSystem);
}

View File

@ -3,6 +3,7 @@ package com.ruoyi.base.service.impl;
import java.util.List;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -42,4 +43,28 @@ public class BaseCategoryServiceImpl extends ServiceImpl<BaseCategoryMapper,Base
public List<BaseCategory> selectByCode(String code) {
return this.list(new LambdaQueryWrapper<BaseCategory>().eq(BaseCategory::getCode,code));
}
/**
* 根据code查分类字典--列表
*
* @param code 编码
* @param isSystem 是否系统级
* @return java.util.List<com.ruoyi.base.domain.BaseCategory>
* @author vinjor-M
* @date 17:01 2025/3/25
**/
@Override
public List<BaseCategory> listByParentCode(String code, Integer isSystem) {
List<BaseCategory> list = this.selectByCode(code);
if(list.isEmpty()){
throw new ServiceException("未查询到该字典项!");
}
LambdaQueryWrapper<BaseCategory> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(BaseCategory::getPid,list.get(0).getId());
if(null!=isSystem){
queryWrapper.eq(BaseCategory::getIsSystem,isSystem);
}
queryWrapper.orderByAsc(BaseCategory::getSort);
return list(queryWrapper);
}
}

View File

@ -6,7 +6,9 @@ import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.busi.query.AppNoticeQuery;
import com.ruoyi.busi.query.BusiNoticeQuery;
import com.ruoyi.busi.vo.BusiNoticeVo;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@ -136,4 +138,23 @@ public class BusiNoticeController extends BaseController
return success();
}
/**
* 小程序端查询通告列表
* @author vinjor-M
* @date 15:39 2025/3/25
* @param query 查询条件
* @param pageNum TODO
* @param pageSize TODO
* @return com.ruoyi.common.core.domain.AjaxResult
**/
@GetMapping("/appList")
public AjaxResult appList(AppNoticeQuery query,
@RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize)
{
Page<BusiNotice> page = new Page<>(pageNum, pageSize);
IPage<BusiNoticeVo> list = busiNoticeService.queryAppListPage(query,page);
return success(list);
}
}

View File

@ -5,6 +5,7 @@ import java.util.List;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.busi.domain.BusiNotice;
import com.ruoyi.busi.query.AppNoticeQuery;
import com.ruoyi.busi.query.BusiNoticeQuery;
import com.ruoyi.busi.vo.BusiNoticeVo;
import org.apache.ibatis.annotations.Param;
@ -30,4 +31,14 @@ public interface BusiNoticeMapper extends BaseMapper<BusiNotice> {
* @date 11:04 2025/3/22
**/
List<BusiNoticeVo> queryListByUserId(@Param("userId") Long userId);
/**
* 小程序端查询通告列表
* @author vinjor-M
* @date 15:41 2025/3/25
* @param query TODO
* @param page
* @return com.baomidou.mybatisplus.core.metadata.IPage<com.ruoyi.busi.domain.BusiNotice>
**/
IPage<BusiNoticeVo> queryAppListPage(@Param("entity") AppNoticeQuery query, Page<BusiNotice> page);
}

View File

@ -1,6 +1,8 @@
package com.ruoyi.busi.mapper;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.busi.domain.BusiNoticeSign;
@ -18,4 +20,13 @@ import org.apache.ibatis.annotations.Mapper;
public interface BusiNoticeSignMapper extends BaseMapper<BusiNoticeSign>
{
IPage<BusiNoticeSign> queryListPage(@Param("entity") BusiNoticeSign entity, Page<BusiNoticeSign> page);
/**
* 查某些公告的报名数量
* @author vinjor-M
* @date 16:50 2025/3/25
* @param idList 公告id
* @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
**/
List<Map<String,Object>> selectReportNumByIdList(@Param("list")List<String> idList);
}

View File

@ -0,0 +1,33 @@
package com.ruoyi.busi.query;
import lombok.Data;
/**
* 小程序端查询通告条件
* @author vinjor-M
* @date 15:40 2025/3/25
**/
@Data
public class AppNoticeQuery {
/** 排序方式new-最新money-高奖励; */
private String sortBy;
/** 品牌置换--只要有值代表查品牌置换 */
private String gift;
/** 平台code */
private String platformCode;
/** 领域code */
private String bloggerType;
/** 搜索的文字 */
private String searchValue;
/** 奖励类型选中值:""-不限 | money-稿费 | gift-赠品 */
private String rewardType;
/** 粉丝量要求-上限 */
private Double fansUp;
/** 粉丝量要求-下限 */
private Double fansDown;
/** 稿费要求-上限 */
private Double feeUp;
/** 稿费要求-下限 */
private Double feeDown;
}

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.busi.domain.BusiNotice;
import com.ruoyi.busi.query.AppNoticeQuery;
import com.ruoyi.busi.query.BusiNoticeQuery;
import com.ruoyi.busi.vo.BusiNoticeVo;
@ -59,4 +60,14 @@ public interface IBusiNoticeService extends IService<BusiNotice>
* @param query 审核参数
*/
void auditInfo(BusiNoticeQuery query);
/**
* 小程序端查询通告列表
* @author vinjor-M
* @date 15:41 2025/3/25
* @param query TODO
* @param page TODO
* @return com.baomidou.mybatisplus.core.metadata.IPage<com.ruoyi.busi.domain.BusiNotice>
**/
IPage<BusiNoticeVo> queryAppListPage(AppNoticeQuery query, Page<BusiNotice> page);
}

View File

@ -1,22 +1,26 @@
package com.ruoyi.busi.service.impl;
import java.util.Date;
import java.util.List;
import java.util.*;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.ruoyi.base.domain.BaseCategory;
import com.ruoyi.base.service.IBaseCategoryService;
import com.ruoyi.busi.mapper.BusiNoticeSignMapper;
import com.ruoyi.busi.query.AppNoticeQuery;
import com.ruoyi.busi.vo.BusiNoticeVo;
import com.ruoyi.common.core.domain.DlBaseEntity;
import java.util.Optional;
import java.util.stream.Collectors;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.busi.utils.JaccardSimilarity;
import com.ruoyi.busi.utils.NoticeUtils;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.busi.query.BusiNoticeQuery;
import com.ruoyi.constant.DictConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -33,8 +37,14 @@ import com.ruoyi.busi.service.IBusiNoticeService;
@Service
public class BusiNoticeServiceImpl extends ServiceImpl<BusiNoticeMapper,BusiNotice> implements IBusiNoticeService
{
@Autowired
private IBaseCategoryService baseCategoryService;
@Autowired
private BusiNoticeMapper busiNoticeMapper;
@Autowired
private BusiNoticeSignMapper busiNoticeSignMapper;
@Autowired
private NoticeUtils noticeUtils;
@Override
public IPage<BusiNotice> queryListPage(BusiNoticeQuery query, Page<BusiNotice> page) {
@ -62,8 +72,8 @@ public class BusiNoticeServiceImpl extends ServiceImpl<BusiNoticeMapper,BusiNoti
data.setApprovalStatus("1");
//遍历 list的每条数据与data对比如果两条数据相似度大于70% 提出预警
for (BusiNotice busiNotice : list) {
double v1 = JaccardSimilarity.computeJaccardSimilarity(data.getTitle(), busiNotice.getTitle());
double v2 = JaccardSimilarity.computeJaccardSimilarity(data.getDetail(), busiNotice.getDetail());
double v1 = NoticeUtils.computeJaccardSimilarity(data.getTitle(), busiNotice.getTitle());
double v2 = NoticeUtils.computeJaccardSimilarity(data.getDetail(), busiNotice.getDetail());
if (v1>=0.7&&v2>=0.7){
//title detail 相似度大于70% 待审核
data.setApprovalStatus("0");
@ -127,8 +137,8 @@ public class BusiNoticeServiceImpl extends ServiceImpl<BusiNoticeMapper,BusiNoti
data.setApprovalStatus("1");
//遍历 list的每条数据与data对比如果两条数据相似度大于70% 提出预警
for (BusiNotice busiNotice : list) {
double v1 = JaccardSimilarity.computeJaccardSimilarity(data.getTitle(), busiNotice.getTitle());
double v2 = JaccardSimilarity.computeJaccardSimilarity(data.getDetail(), busiNotice.getDetail());
double v1 = NoticeUtils.computeJaccardSimilarity(data.getTitle(), busiNotice.getTitle());
double v2 = NoticeUtils.computeJaccardSimilarity(data.getDetail(), busiNotice.getDetail());
if (v1>=0.7&&v2>=0.7){
//title detail 相似度大于70% 待审核
data.setApprovalStatus("0");
@ -152,5 +162,49 @@ public class BusiNoticeServiceImpl extends ServiceImpl<BusiNoticeMapper,BusiNoti
}
/**
* 小程序端查询通告列表
*
* @param query TODO
* @param page TODO
* @return com.baomidou.mybatisplus.core.metadata.IPage<com.ruoyi.busi.domain.BusiNotice>
* @author vinjor-M
* @date 15:41 2025/3/25
**/
@Override
public IPage<BusiNoticeVo> queryAppListPage(AppNoticeQuery query, Page<BusiNotice> page) {
IPage<BusiNoticeVo> pageList = busiNoticeMapper.queryAppListPage(query,page);
List<String> idList = pageList.getRecords().stream().map(BusiNotice::getId).collect(Collectors.toList());
if(!idList.isEmpty()){
//查报名数量
List<Map<String,Object>> mapList = busiNoticeSignMapper.selectReportNumByIdList(idList);
//转map
Map<String,Object> objectMap = mapList.stream().collect(Collectors.toMap(each-> Objects.toString(each.get("id"),""),each->each.get("reportNum")));
//查博主类型字典
List<BaseCategory> categoryList = baseCategoryService.listByParentCode(DictConstants.BLOGGER_TYPES_KEY,null);
//转map
Map<String,String> categoryMap = categoryList.stream().collect(Collectors.toMap(BaseCategory::getCode,BaseCategory::getTitle));
pageList.getRecords().forEach(item->{
//报名数量浏览量相关字典转换
if(null==item.getViewNum()){
item.setViewNum(0);
}
if(!objectMap.containsKey(item.getId()) || null==objectMap.get(item.getId())){
item.setReportNum(0);
}else{
item.setReportNum((Integer) objectMap.get(item.getId()));
}
item.setBloggerTypesText(noticeUtils.translateBloggerTypes(item.getBloggerTypes(),categoryMap));
if(StringUtils.isNotEmpty(item.getImages())){
item.setMainImage(item.getImages().split(StrUtil.COMMA)[0]);
}
});
}
//TODO 后续需要拼接开通会员的通告主发布的通告增加曝光度这部分逻辑需要商讨
return pageList;
}
}

View File

@ -1,14 +1,17 @@
package com.ruoyi.busi.utils;
import java.util.HashSet;
import java.util.Set;
import java.util.Arrays;
import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.stream.Collectors;
/**
* 文本相似度对比
* @author 朱春云
* @version 1.0
*/
public class JaccardSimilarity {
@Component
public class NoticeUtils {
public static double computeJaccardSimilarity(String str1, String str2) {
Set<String> set1 = Arrays.stream(str1.split("\\s+")) // 分词这里按空格分割可以根据需要调整正则表达式
.collect(Collectors.toSet());
@ -22,4 +25,18 @@ public class JaccardSimilarity {
union.removeAll(intersection); // 从并集中移除交集部分因为我们只计算交集的元素
return (double) intersection.size() / union.size(); // 返回相似度比例
}
/**
* 翻译通告的博主类型字典
* @author vinjor-M
* @date 17:10 2025/3/25
* @return java.lang.String
**/
public String translateBloggerTypes(String bloggerTypes, Map<String,String> categoryMap){
List<String> rtnList = new ArrayList<>();
List<String> bloggerTypeList = Arrays.asList(bloggerTypes.split(StrUtil.COMMA));
bloggerTypeList.forEach(item->{
rtnList.add(categoryMap.get(item));
});
return String.join(" ",rtnList);
}
}

View File

@ -8,10 +8,21 @@ import lombok.Data;
public class BusiNoticeVo extends BusiNotice {
/**发布者名称**/
private String userNickName;
/**发布者头像*/
private String avatar;
/** 平台名称 */
private String platformName;
/** 是否超级报名*/
private String isSuper;
/**通告合作状态*/
private String signStatus;
/**产品主图*/
private String mainImage;
/**浏览量*/
private Integer viewNum;
/**报名量*/
private Integer reportNum;
/**博主类型-text*/
private String bloggerTypesText;
}

View File

@ -11,6 +11,10 @@ import java.util.Locale;
*/
public class DictConstants
{
/**
* 博主类型字典key
*/
public static final String BLOGGER_TYPES_KEY ="dl_blogger_type";
/**
* 权益类型字典--是否支持
*/

View File

@ -56,5 +56,66 @@
WHERE
dbns.user_id = #{userId}
</select>
<select id="queryAppListPage" resultType="com.ruoyi.busi.vo.BusiNoticeVo">
SELECT
dbn.*,
dbnv.view_num AS viewNum,
su.avatar,
su.nick_name AS userNickName
FROM
dl_busi_notice dbn
LEFT JOIN dl_busi_notice_view dbnv ON dbn.id = dbnv.id
LEFT JOIN sys_user su ON dbn.user_id = su.user_id
WHERE
dbn.del_flag = 0
AND (dbn.approval_status = '1')
<if test="entity.gift!=null and entity.gift!=''">
AND ( dbn.gift_detail != NULL AND dbn.gift_detail != '' )
</if>
<if test="entity.platformCode!=null and entity.platformCode!=''">
AND ( dbn.platform_code =#{entity.platformCode} )
</if>
<if test="entity.bloggerType!=null and entity.bloggerType!=''">
AND ( dbn.blogger_types LIKE CONCAT('%',#{entity.bloggerType},'%') )
</if>
<if test="entity.searchValue!=null and entity.searchValue!=''">
AND ( dbn.title LIKE CONCAT('%',#{entity.searchValue},'%') OR
dbn.detail LIKE CONCAT('%',#{entity.searchValue},'%') )
</if>
<if test="entity.rewardType=='money'">
AND ( dbn.fee_down!=null OR dbn.fee_up!= null )
</if>
<if test="entity.rewardType=='gift'">
AND ( dbn.gift_detail!=null AND dbn.gift_detail!='' )
</if>
<if test="entity.fansUp!=null">
AND ( dbn.fans_up &lt;=#{entity.fansUp} )
</if>
<if test="entity.fansDown!=null">
AND ( dbn.fans_up &gt;=#{entity.fansDown} )
</if>
<if test="entity.feeUp!=null">
AND ( dbn.fee_up &lt;=#{entity.feeUp} )
</if>
<if test="entity.feeDown!=null">
AND ( dbn.fee_down &gt;=#{entity.feeDown} )
</if>
ORDER BY
<choose>
<when test="entity.sortBy=='new'">
-- 查最新的 --
dbn.create_time DESC
</when>
<when test="entity.sortBy=='money'">
-- 查高奖励 --
dbn.fee_up DESC
</when>
<otherwise>
-- 默认正序排列 --
dbn.create_time ASC
</otherwise>
</choose>
</select>
</mapper>

View File

@ -39,4 +39,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="entity.status != null and entity.status != ''"> and status = #{entity.status}</if>
</where>
</select>
<select id="selectReportNumByIdList" resultType="java.util.Map">
SELECT
dbns.id,
COUNT( dbns.id ) AS reportNum
FROM
dl_busi_notice_sign dbns
WHERE
dbns.del_flag = 0
AND dbns.notice_id IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
GROUP BY
dbns.id
</select>
</mapper>