# Conflicts:
#	ruoyi-admin/src/main/java/com/ruoyi/member/service/IMemberCardService.java
#	ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberCardServiceImpl.java
This commit is contained in:
PQZ 2025-03-27 17:02:52 +08:00
commit 594a07f933
43 changed files with 807 additions and 139 deletions

View File

@ -8,6 +8,8 @@ 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.annotation.Anonymous;
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;
@ -131,19 +133,14 @@ public class BaseCategoryController extends BaseController
* @return com.ruoyi.common.core.domain.AjaxResult
**/
@GetMapping("/listByCode")
@Anonymous
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

@ -1,6 +1,7 @@
package com.ruoyi.base.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.base.domain.BaseCardRights;
@ -16,19 +17,29 @@ import org.apache.ibatis.annotations.Mapper;
* @date 2025-03-17
*/
@Mapper
public interface BaseCardRightsMapper extends BaseMapper<BaseCardRights>
{
public interface BaseCardRightsMapper extends BaseMapper<BaseCardRights> {
IPage<BaseCardRights> queryListPage(@Param("entity") BaseCardRights entity, Page<BaseCardRights> page);
/**
* 查询会员卡权益
*
* @param cardId 会员卡id
* @param userType 用户类型
* @return java.util.List<com.ruoyi.base.domain.BaseCardRights>
* @author vinjor-M
* @date 15:24 2025/3/18
* @param cardId 会员卡id
* @param userType 用户类型
* @return java.util.List<com.ruoyi.base.domain.BaseCardRights>
**/
**/
List<CardRightsVO> getByIdAndType(@Param("cardId") String cardId, @Param("userType") String userType);
int removeByCardId(@Param("cardId") String cardId);
/**
* 通过会员卡id查询会员卡权益
*
* @param cardId 会员卡id
* @return java.util.List<com.ruoyi.base.vo.CardRightsVO>
* @author PQZ
* @date 10:36 2025/3/27
**/
List<CardRightsVO> queryByCardId(@Param("cardId") String cardId);
}

View File

@ -42,5 +42,5 @@ public interface IBaseCardRightsService extends IService<BaseCardRights>
* @param cardId 会员卡id
* @return java.util.List<com.ruoyi.base.domain.BaseCardRights>
**/
List<BaseCardRights> queryByCardId(String cardId);
List<CardRightsVO> queryByCardId(String cardId);
}

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

@ -89,9 +89,7 @@ public class BaseCardRightsServiceImpl extends ServiceImpl<BaseCardRightsMapper,
* @date 16:31 2025/3/26
**/
@Override
public List<BaseCardRights> queryByCardId(String cardId) {
LambdaQueryWrapper<BaseCardRights> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(BaseCardRights::getCardId,cardId).eq(DlBaseEntity::getDelFlag,0);
return list(lambdaQueryWrapper);
public List<CardRightsVO> queryByCardId(String cardId) {
return baseCardRightsMapper.queryByCardId(cardId);
}
}

View File

@ -10,6 +10,7 @@ import com.ruoyi.base.mapper.BaseCardMapper;
import com.ruoyi.base.service.IBaseCardRightsService;
import com.ruoyi.base.service.IBaseCardService;
import com.ruoyi.base.vo.BaseCardVO;
import com.ruoyi.base.vo.CardRightsVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -49,7 +50,7 @@ public class BaseCardServiceImpl extends ServiceImpl<BaseCardMapper,BaseCard> i
BaseCardVO cardVO = new BaseCardVO();
BaseCard card = getById(cardId);
BeanUtils.copyProperties(card,cardVO);
List<BaseCardRights> rights = cardRightsService.queryByCardId(cardId);
List<CardRightsVO> rights = cardRightsService.queryByCardId(cardId);
cardVO.setRights(rights);
return cardVO;
}

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

@ -9,5 +9,5 @@ import java.util.List;
@Data
public class BaseCardVO extends BaseCard {
/**会员卡关联权益*/
List<BaseCardRights> rights;
List<CardRightsVO> rights;
}

View File

@ -1,8 +1,6 @@
package com.ruoyi.base.vo;
import com.ruoyi.base.domain.BaseCardRights;
import com.ruoyi.base.domain.BaseRights;
import com.ruoyi.common.annotation.Excel;
import lombok.Data;
import lombok.EqualsAndHashCode;

View File

@ -6,7 +6,10 @@ 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 com.ruoyi.common.annotation.Anonymous;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@ -49,7 +52,7 @@ public class BusiNoticeController extends BaseController
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize)
{
Page<BusiNotice> page = new Page<>(pageNum, pageSize);
IPage<BusiNotice> list = busiNoticeService.queryListPage(query,page);
IPage<BusiNoticeVo> list = busiNoticeService.queryListPage(query,page);
return success(list);
}
@ -136,4 +139,24 @@ 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")
@Anonymous
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;
@ -19,7 +20,7 @@ import org.apache.ibatis.annotations.Mapper;
*/
@Mapper
public interface BusiNoticeMapper extends BaseMapper<BusiNotice> {
IPage<BusiNotice> queryListPage(@Param("entity") BusiNoticeQuery query, Page<BusiNotice> page);
IPage<BusiNoticeVo> queryListPage(@Param("entity") BusiNoticeQuery query, Page<BusiNotice> page);
/**
* 查询博主报名的通告
@ -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;
@ -41,7 +42,7 @@ public interface IBusiNoticeService extends IService<BusiNotice>
* @param query 查询参数
* @param page 分页参数
*/
IPage<BusiNotice> queryListPage(BusiNoticeQuery query, Page<BusiNotice> page);
IPage<BusiNoticeVo> queryListPage(BusiNoticeQuery query, Page<BusiNotice> page);
/**
* 保存
* @param data 保存参数
@ -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,11 +37,17 @@ 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) {
public IPage<BusiNoticeVo> queryListPage(BusiNoticeQuery query, Page<BusiNotice> page) {
return busiNoticeMapper.queryListPage(query, 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

@ -5,12 +5,16 @@ import io.jsonwebtoken.Claims;
import java.util.Locale;
/**
* 通用常量信息
* 通用字典常量信息
*
* @author ruoyi
*/
public class DictConstants
{
/**
* 博主类型字典key
*/
public static final String BLOGGER_TYPES_KEY ="dl_blogger_type";
/**
* 权益类型字典--是否支持
*/
@ -20,6 +24,21 @@ public class DictConstants
*/
public static final String RIGHTS_TYPE_NUMBER = "02";
/**
* 用户类型字典--通告主
*/
public static final String USER_TYPE_TGZ = "01";
/**
* 用户类型字典--博主
*/
public static final String USER_TYPE_BZ = "02";
/**
* 是否字典--
*/
public static final String YES_NO_YES = "1";
/**
* 是否字典--
*/
public static final String YES_NO_NO = "0";
}

View File

@ -0,0 +1,13 @@
package com.ruoyi.constant;
/**
* 通用常量信息
*
* @author ruoyi
*/
public class StrConstants
{
}

View File

@ -30,7 +30,7 @@ public class MemberRights extends DlBaseEntity
/** 用户id */
@Excel(name = "用户id")
private String userId;
private Long userId;
/** 用户类型数据字典dl_user_type */
@Excel(name = "用户类型", readConverterExp = "数=据字典dl_user_type")
@ -54,10 +54,10 @@ public class MemberRights extends DlBaseEntity
/** 权益值(权益类型为是否时0代表不支持1代表支持权益类型为数量限制时0代表不限制其他数字代表具体限制数量) */
@Excel(name = "权益值(权益类型为是否时0代表不支持1代表支持权益类型为数量限制时0代表不限制其他数字代表具体限制数量)")
private Long rightsValue;
private Integer rightsValue;
/** 剩余值 */
@Excel(name = "剩余值")
private Long remaining;
private Integer remaining;
}

View File

@ -4,6 +4,8 @@ import com.ruoyi.common.annotation.Excel;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.constant.DictConstants;
import lombok.*;
import com.ruoyi.common.core.domain.DlBaseEntity;
@ -71,4 +73,19 @@ public class MemberUser extends DlBaseEntity
@Excel(name = "博主-剩余积分")
private Long bPoints;
public MemberUser (String userType, SysUser user,Integer addNotice){
this.userType = userType;
this.userId = user.getUserId();
this.tel = user.getPhonenumber();
if(DictConstants.USER_TYPE_BZ.equals(userType)){
//博主
this.bPoints=0L;
}else{
//通告主
this.tRemaining = addNotice;
this.tTotalNum = 0L;
this.tFansNum = 0;
this.tOpenDisturb = DictConstants.YES_NO_NO;
}
}
}

View File

@ -4,6 +4,7 @@ import java.util.List;
import com.ruoyi.member.domain.MemberCard;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 会员开卡记录Mapper接口
@ -14,5 +15,13 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MemberCardMapper extends BaseMapper<MemberCard>
{
/**
* 查询某会员当前生效的所有会员卡id
* @author vinjor-M
* @date 11:32 2025/3/26
* @param userId TODO
* @param userType TODO
* @return java.util.List<java.lang.String>
**/
List<MemberCard> selectCardIdByUserId(@Param("userId")Long userId,@Param("userType")String userType,@Param("nowDate")String nowDate);
}

View File

@ -4,6 +4,7 @@ import java.util.List;
import com.ruoyi.member.domain.MemberRights;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 会员权益(定时任务重置剩余值)用户id会员卡id权益对应1Mapper接口
@ -15,4 +16,13 @@ import org.apache.ibatis.annotations.Mapper;
public interface MemberRightsMapper extends BaseMapper<MemberRights>
{
/**
* 查某用户某些会员卡的权益明细
* @author vinjor-M
* @date 13:52 2025/3/26
* @param cardIdList 会员卡id集和
* @param userId 用户id
* @return java.util.List<com.ruoyi.member.domain.MemberRights>
**/
List<MemberRights> selectUserRightsByCardIds(@Param("list")List<String> cardIdList,@Param("userId")Long userId);
}

View File

@ -3,8 +3,12 @@ package com.ruoyi.member.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.member.domain.MemberCard;
import com.ruoyi.member.domain.MemberOrder;
import com.ruoyi.member.domain.MemberRights;
import com.ruoyi.member.vo.MemberRightsVO;
import com.ruoyi.member.vo.ViewRightsVO;
import java.util.List;
import java.util.Map;
/**
* 会员开卡记录Service接口
@ -33,4 +37,13 @@ public interface IMemberCardService extends IService<MemberCard> {
**/
void dealMemberCard(MemberOrder order);
/**
* 查当前会员权益列表
* @author vinjor-M
* @date 11:26 2025/3/26
* @param userType 用户类型
* @param userId 用户id
**/
Map<String,Map<String, ViewRightsVO>> selectMemberRights(Long userId, String userType);
}

View File

@ -13,5 +13,5 @@ import java.util.List;
*/
public interface IMemberPointsService extends IService<MemberPoints> {
void dealMemberPoints(Long userId, List<BaseP> );
// void dealMemberPoints(Long userId);
}

View File

@ -1,16 +1,27 @@
package com.ruoyi.member.service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.base.vo.CardRightsVO;
import com.ruoyi.member.domain.MemberCard;
import com.ruoyi.member.domain.MemberRights;
import java.util.List;
/**
* 会员权益(定时任务重置剩余值)用户id会员卡id权益对应1Service接口
*
* @author pqz
* @date 2025-03-17
*/
public interface IMemberRightsService extends IService<MemberRights>
{
public interface IMemberRightsService extends IService<MemberRights> {
/**
* 处理会员权益
*
* @param userId 用户表id
* @param rights 权益
* @author PQZ
* @date 15:45 2025/3/27
**/
void dealRights(Long userId, String userType,List<CardRightsVO> rights);
}

View File

@ -47,4 +47,13 @@ public interface IMemberUserService extends IService<MemberUser> {
**/
MemberUserVO bloggerDetail(Long userId);
/**
* 微信授权登陆
* @author vinjor-M
* @date 15:55 2025/3/26
* @param openid TODO
* @param decryptResult TODO
* @return java.lang.String
**/
String wxLogin(String openid,String decryptResult);
}

View File

@ -1,15 +1,25 @@
package com.ruoyi.member.service.impl;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.base.domain.BaseCard;
import com.ruoyi.base.service.IBaseCardService;
import com.ruoyi.base.vo.BaseCardVO;
import com.ruoyi.common.core.domain.DlBaseEntity;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.constant.DictConstants;
import com.ruoyi.member.domain.MemberCard;
import com.ruoyi.member.domain.MemberOrder;
import com.ruoyi.member.domain.MemberRights;
import com.ruoyi.member.mapper.MemberCardMapper;
import com.ruoyi.member.mapper.MemberRightsMapper;
import com.ruoyi.member.service.IMemberCardService;
import com.ruoyi.member.service.IMemberRightsService;
import com.ruoyi.member.vo.MemberRightsVO;
import com.ruoyi.member.vo.ViewRightsVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -17,6 +27,8 @@ import javax.annotation.Resource;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
* 会员开卡记录Service业务层处理
@ -30,6 +42,10 @@ public class MemberCardServiceImpl extends ServiceImpl<MemberCardMapper, MemberC
private MemberCardMapper memberCardMapper;
@Resource
private IBaseCardService baseCardService;
@Autowired
private IMemberRightsService rightsService;
@Autowired
private MemberRightsMapper memberRightsMapper;
/**
@ -64,9 +80,24 @@ public class MemberCardServiceImpl extends ServiceImpl<MemberCardMapper, MemberC
/*1、数据初始化*/
//查询会员卡
BaseCardVO card = baseCardService.queryByCardId(order.getGoodsId());
//计算到期时间
Date startTime = new Date();
Date endTime = getEndTime(startTime,order.getGoodsCycle());
//查询当前时间是否存在有效会员卡
List<MemberCard> cardList = checkMemberCard(order.getGoodsId(), order.getUserId());
/*2、计算到期时间*/
Date startTime;
Date endTime;
if (cardList.isEmpty()){
//计算到期时间
startTime = new Date();
endTime = getEndTime(startTime, order.getGoodsCycle());
//新增时需要处理会员权益
rightsService.dealRights(order.getUserId(),order.getUserType(),card.getRights());
} else {
startTime = cardList.get(0).getEndDate();
endTime = getEndTime(startTime,order.getGoodsCycle());
}
/*3、保存会员开卡记录*/
//初始化会员开通记录
MemberCard memberCard = new MemberCard();
memberCard.setUserId(order.getUserId());
@ -76,10 +107,28 @@ public class MemberCardServiceImpl extends ServiceImpl<MemberCardMapper, MemberC
memberCard.setCardName(card.getCardName());
memberCard.setStartDate(startTime);
memberCard.setEndDate(endTime);
/*2、处理会员权益*/
/*3、保存记录*/
save(memberCard);
}
/**
* 查询会员卡开卡记录
*
* @param cardId 卡id
* @param userId 用户id
* @return java.util.List<com.ruoyi.member.domain.MemberCard>
* @author PQZ
* @date 16:09 2025/3/27
**/
private List<MemberCard> checkMemberCard(String cardId, Long userId) {
Date time = new Date();
LambdaQueryWrapper<MemberCard> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper
.eq(MemberCard::getCardId, cardId)
.eq(MemberCard::getUserId, userId)
.eq(DlBaseEntity::getDelFlag, 0)
.ge(MemberCard::getStartDate, time)
.lt(MemberCard::getEndDate, time);
return list(lambdaQueryWrapper);
}
/**
@ -109,4 +158,70 @@ public class MemberCardServiceImpl extends ServiceImpl<MemberCardMapper, MemberC
}
return calendar.getTime();
}
/**
* 查当前会员权益列表
*
* @param userId 用户id
* @param userType 用户类型
* @author vinjor-M
* @date 11:26 2025/3/26
**/
@Override
public Map<String, Map<String, ViewRightsVO>> selectMemberRights(Long userId, String userType) {
Map<String, Map<String, ViewRightsVO>> rtnMap = new HashMap<>();
//当前时间
String nowDate = DateUtil.formatDate(new Date());
if (null == userId) {
userId = SecurityUtils.getUserId();
}
List<MemberCard> cardList = memberCardMapper.selectCardIdByUserId(userId, userType, nowDate);
if (cardList.isEmpty()) {
//未开通任何会员卡
rtnMap.put("tgz", new HashMap<>());
rtnMap.put("bz", new HashMap<>());
} else {
//开通会员卡了根据会员卡id查询出所有权益
List<MemberRights> memberRightsList = memberRightsMapper.selectUserRightsByCardIds(cardList.stream().map(MemberCard::getCardId).collect(Collectors.toList()), userId);
//通告主权益
Map<String, ViewRightsVO> tgzRightsMap = new HashMap<>();
//博主权益
Map<String, ViewRightsVO> bzRightsMap = new HashMap<>();
memberRightsList.forEach(item -> {
if (DictConstants.USER_TYPE_TGZ.equals(item.getUserType())) {
//通告主
this.checkRights(tgzRightsMap, item);
} else if (DictConstants.USER_TYPE_BZ.equals(item.getUserType())) {
//博主
this.checkRights(bzRightsMap, item);
}
});
rtnMap.put("tgz", tgzRightsMap);
rtnMap.put("bz", bzRightsMap);
}
return rtnMap;
}
/**
* @param memberRightsMap 会员权益map
* @param item 这个权益
* @author vinjor-M
* @date 14:19 2025/3/26
**/
private void checkRights(Map<String, ViewRightsVO> memberRightsMap, MemberRights item) {
ViewRightsVO newRights = new ViewRightsVO();
BeanUtils.copyProperties(item, newRights);
if (memberRightsMap.containsKey(item.getRightsCode())) {
//有这个权益了
ViewRightsVO oldRights = memberRightsMap.get(item.getRightsCode());
if (DictConstants.RIGHTS_TYPE_NUMBER.equals(item.getRightsType()) &&
oldRights.getRemaining() < item.getRemaining()) {
//权益类型是数量限制的且新的权益剩余值比原来的大取新的
memberRightsMap.put(item.getRightsCode(), newRights);
}
} else {
//没有这个权益直接加
memberRightsMap.put(item.getRightsCode(), newRights);
}
}
}

View File

@ -9,6 +9,7 @@ import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.member.domain.MemberOrder;
import com.ruoyi.member.mapper.MemberOrderMapper;
import com.ruoyi.member.service.IMemberCardService;
import com.ruoyi.member.service.IMemberCouponService;
import com.ruoyi.member.service.IMemberOrderService;
import com.ruoyi.member.vo.MemberOrderVO;
import lombok.SneakyThrows;
@ -31,6 +32,8 @@ public class MemberOrderServiceImpl extends ServiceImpl<MemberOrderMapper,Member
private MemberOrderMapper memberOrderMapper;
@Resource
private IMemberCardService cardService;
@Resource
private IMemberCouponService couponService;
/**

View File

@ -1,13 +1,16 @@
package com.ruoyi.member.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.base.vo.CardRightsVO;
import com.ruoyi.member.domain.MemberCard;
import com.ruoyi.member.domain.MemberRights;
import com.ruoyi.member.mapper.MemberRightsMapper;
import com.ruoyi.member.service.IMemberRightsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.member.mapper.MemberRightsMapper;
import com.ruoyi.member.domain.MemberRights;
import com.ruoyi.member.service.IMemberRightsService;
import java.util.ArrayList;
import java.util.List;
/**
* 会员权益(定时任务重置剩余值)用户id会员卡id权益对应1Service业务层处理
@ -16,10 +19,34 @@ import com.ruoyi.member.service.IMemberRightsService;
* @date 2025-03-17
*/
@Service
public class MemberRightsServiceImpl extends ServiceImpl<MemberRightsMapper,MemberRights> implements IMemberRightsService
{
public class MemberRightsServiceImpl extends ServiceImpl<MemberRightsMapper, MemberRights> implements IMemberRightsService {
@Autowired
private MemberRightsMapper memberRightsMapper;
/**
* 处理会员权益
*
* @param userId 用户表id
* @param rights 权益
* @author PQZ
* @date 15:45 2025/3/27
**/
@Override
public void dealRights(Long userId, String userType, List<CardRightsVO> rights) {
List<MemberRights> saveList = new ArrayList<>();
rights.forEach(item -> {
MemberRights memberRights = new MemberRights();
memberRights.setUserId(userId);
memberRights.setUserType(userType);
memberRights.setCardId(item.getCardId());
memberRights.setRightsCode(item.getCode());
memberRights.setRightsType(item.getRightsType());
memberRights.setRightsCycle(item.getRightsCycle());
memberRights.setRightsValue(item.getRightsValue());
memberRights.setRemaining(item.getRightsValue());
saveList.add(memberRights);
});
saveBatch(saveList);
}
}

View File

@ -1,18 +1,29 @@
package com.ruoyi.member.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.busi.service.IBusiEvaluateService;
import com.ruoyi.busi.service.IBusiNoticeService;
import com.ruoyi.common.config.DlRightsConfig;
import com.ruoyi.common.config.WxAppConfig;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.constant.DictConstants;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.member.domain.MemberUser;
import com.ruoyi.member.mapper.MemberUserMapper;
import com.ruoyi.member.service.IMemberBusiCardService;
import com.ruoyi.member.service.IMemberCardService;
import com.ruoyi.member.service.IMemberUserService;
import com.ruoyi.member.vo.MemberUserVO;
import com.ruoyi.system.mapper.SysUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
@ -34,6 +45,12 @@ public class MemberUserServiceImpl extends ServiceImpl<MemberUserMapper, MemberU
private IBusiNoticeService noticeService;
@Resource
private IMemberBusiCardService busiCardService;
@Autowired
private TokenService tokenService;
@Autowired
private SysUserMapper userMapper;
@Autowired
private DlRightsConfig dlRightsConfig;
/**
@ -89,4 +106,66 @@ public class MemberUserServiceImpl extends ServiceImpl<MemberUserMapper, MemberU
result.setNoticeVos(noticeService.queryListByUserId(userId));
return result;
}
/**
* 微信授权登陆
*
* @param openid TODO
* @param decryptResult TODO
* @return java.lang.String
* @author vinjor-M
* @date 15:53 2025/3/26
**/
@Override
@Transactional(rollbackFor = Exception.class)
public String wxLogin(String openid, String decryptResult) {
//字符串转json
JSONObject jsonObject = JSONObject.parseObject(decryptResult);
//手机号
String phone = jsonObject.getString("phoneNumber");
//根据openid判断数据库中是否有该用户
//根据openid查询用户信息
SysUser wxUser = userMapper.selectWxUserByOpenIdOrPhone(openid,null);
if(null==wxUser){
//根据openId没查到再根据手机号查
wxUser = userMapper.selectWxUserByOpenIdOrPhone(null,phone);
}
//如果查不到则新增查到了则更新
SysUser user = new SysUser();
if (wxUser == null) {
// 新增
// 设置姓名 默认使用昵称+随机数防止重复姓名的发生 数据库中把username的长度修改的长一点
user.setUserName(phone);
user.setNickName("微信用户");
user.setOpenId(openid);
user.setPhonenumber(phone);
user.setSex("2");
user.setCreateTime(DateUtils.getNowDate());
//新增 用户
userMapper.insertUser(user);
//插入用户扩展信息表数据
this.save(new MemberUser(DictConstants.USER_TYPE_TGZ,user,dlRightsConfig.getAddNotice()));
this.save(new MemberUser(DictConstants.USER_TYPE_BZ,user,null));
}else {
//,查到了
if(!"0".equals(wxUser.getStatus())){
//非正常状态无法登录
throw new ServiceException("账号状态异常");
}
// 更新
user = wxUser;
if(!openid.equals(user.getOpenId())){
user.setOpenId(openid);
user.setUpdateTime(DateUtils.getNowDate());
userMapper.updateUser(user);
}
}
//组装token信息
LoginUser loginUser = new LoginUser();
loginUser.setOpenId(openid);
loginUser.setUser(user);
loginUser.setUserId(user.getUserId());
// 生成token
return tokenService.createToken(loginUser);
}
}

View File

@ -0,0 +1,16 @@
package com.ruoyi.member.vo;
import com.ruoyi.member.domain.MemberRights;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 会员拥有的权益明细
* @author vinjor-M
* @date 11:25 2025/3/26
**/
@EqualsAndHashCode(callSuper = true)
@Data
public class MemberRightsVO extends MemberRights {
}

View File

@ -0,0 +1,17 @@
package com.ruoyi.member.vo;
import com.ruoyi.common.annotation.Excel;
import lombok.Data;
/**
* 会员权限浏览使用
* @author vinjor-M
* @date 15:09 2025/3/26
**/
@Data
public class ViewRightsVO {
/** 权益编码 */
private String rightsCode;
/** 剩余值 (权益类型为是否时0代表不支持1代表支持权益类型为数量限制时0代表不限制其他数字代表具体限制数量) */
private Long remaining;
}

View File

@ -13,6 +13,8 @@ import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.config.WxAppConfig;
import com.ruoyi.common.core.domain.model.WxLoginBody;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.member.service.IMemberCardService;
import com.ruoyi.member.service.IMemberUserService;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@ -60,6 +62,10 @@ public class SysLoginController
@Autowired
private SysPermissionService permissionService;
@Autowired
private IMemberUserService memberUserService;
@Autowired
private IMemberCardService memberCardService;
@Autowired
private TokenService tokenService;
@ -94,7 +100,7 @@ public class SysLoginController
if (StringUtils.hasText(decryptResult)){
//如果解析成功,获取token
String token = loginService.wxLogin(openid,decryptResult);
String token = memberUserService.wxLogin(openid,decryptResult);
AjaxResult ajax = AjaxResult.success();
ajax.put(Constants.TOKEN, token);
return ajax;
@ -143,6 +149,7 @@ public class SysLoginController
ajax.put("user", user);
ajax.put("roles", roles);
ajax.put("permissions", permissions);
ajax.put("rights", memberCardService.selectMemberRights(loginUser.getUserId(),null));
return ajax;
}

View File

@ -146,7 +146,11 @@ xss:
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
# 微信小程序配置
# 微信小程序配置----dl
wx-app:
appId: wxd8ef44a8268672e4
appSecret: 30c18855ceb0ab0f9801407c998199c2
# 普通用户权益值
dl-rights:
# 每月发布通告额度
addNotice: 3

View File

@ -48,5 +48,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND dbr.id IS NOT NULL
ORDER BY dbr.sort,dbr.create_time
</select>
<select id="queryByCardId" resultType="com.ruoyi.base.vo.CardRightsVO">
SELECT
dbr.*,
dbcr.card_id,
dbcr.rights_value
FROM
dl_base_rights dbr
LEFT JOIN dl_base_card_rights dbcr ON dbr.id = dbcr.rights_id
AND dbcr.del_flag = 0
WHERE
dbr.del_flag = 0
AND dbcr.card_id = #{cardId}
ORDER BY dbr.sort,dbr.create_time
</select>
</mapper>

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 IS NOT 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 IS NOT NULL OR dbn.fee_up IS NOT NULL )
</if>
<if test="entity.rewardType=='gift'">
AND ( dbn.gift_detail IS NOT 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>

View File

@ -22,6 +22,26 @@
<sql id="selectMemberCardVo">
select id, user_id, user_type, card_id, start_date, end_date, order_id, creator, create_time, updater, update_time, del_flag from dl_member_card
</sql>
<select id="selectCardIdByUserId" resultType="com.ruoyi.member.domain.MemberCard">
SELECT
dmc.id,
dmc.user_id,
dmc.user_type,
dmc.card_id
FROM
dl_member_card dmc
WHERE
dmc.del_flag = 0
<if test="userId!=null">
AND dmc.user_id = #{userId}
</if>
<if test="userType!=null and userType!=''">
AND dmc.user_type = #{userType}
</if>
<if test="nowDate!=null and nowDate!=''">
AND dmc.start_date &lt;= #{nowDate} AND dmc.end_date &gt;= #{nowDate}
</if>
</select>
</mapper>

View File

@ -21,6 +21,18 @@
<sql id="selectMemberRightsVo">
select id, user_id, user_type, card_id, rights_code, rights_type, rights_cycle, rights_value, remaining, create_time, update_time from dl_member_rights
</sql>
<select id="selectUserRightsByCardIds" resultType="com.ruoyi.member.domain.MemberRights">
SELECT
dmr.*
FROM
dl_member_rights dmr
WHERE
dmr.user_id = #{userId}
AND dmr.card_id IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>

View File

@ -0,0 +1,14 @@
package com.ruoyi.common.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "dl-rights")
@Data
public class DlRightsConfig {
/** 每月发布通告额度 */
private Integer addNotice;
}

View File

@ -34,14 +34,18 @@ public class DefaultDBFieldHandler implements MetaObjectHandler {
baseDO.setUpdateTime(current);
}
// 获取当前的用户
Long userId = SecurityUtils.getUserId();
// 当前登录用户不为空创建人为空则当前登录用户为创建人
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) {
baseDO.setCreator(userId.toString());
}
// 当前登录用户不为空更新人为空则当前登录用户为更新人
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) {
baseDO.setUpdater(userId.toString());
try {
Long userId = SecurityUtils.getUserId();
// 当前登录用户不为空创建人为空则当前登录用户为创建人
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) {
baseDO.setCreator(userId.toString());
}
// 当前登录用户不为空更新人为空则当前登录用户为更新人
if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) {
baseDO.setUpdater(userId.toString());
}
}catch (Exception e){
//拦截异常不抛出
}
}
}
@ -62,9 +66,13 @@ public class DefaultDBFieldHandler implements MetaObjectHandler {
// }
//更新数据时强制更新数据的更新时间和更新人
setFieldValByName("updateTime", new Date(), metaObject);
Long userId = SecurityUtils.getUserId();
if (Objects.nonNull(userId)) {
setFieldValByName("updater", userId.toString(), metaObject);
try {
Long userId = SecurityUtils.getUserId();
if (Objects.nonNull(userId)) {
setFieldValByName("updater", userId.toString(), metaObject);
}
}catch (Exception e){
//拦截异常不抛出
}
}
}

View File

@ -106,62 +106,6 @@ public class SysLoginService
return tokenService.createToken(loginUser);
}
/**
* 微信登录
*
* @param decryptResult 登录凭证 只能用一次
* @return
*/
public String wxLogin(String openid,String decryptResult){
//字符串转json
JSONObject jsonObject = JSONObject.parseObject(decryptResult);
//手机号
String phone = jsonObject.getString("phoneNumber");
//根据openid判断数据库中是否有该用户
//根据openid查询用户信息
SysUser wxUser = userMapper.selectWxUserByOpenIdOrPhone(openid,null);
if(null==wxUser){
//根据openId没查到再根据手机号查
wxUser = userMapper.selectWxUserByOpenIdOrPhone(null,phone);
}
//如果查不到则新增查到了则更新
SysUser user = new SysUser();
if (wxUser == null) {
// 新增
// 设置姓名 默认使用昵称+随机数防止重复姓名的发生 数据库中把username的长度修改的长一点
user.setUserName(phone);
user.setNickName("微信用户");
user.setOpenId(openid);
user.setPhonenumber(phone);
user.setSex("2");
user.setCreateTime(DateUtils.getNowDate());
//新增 用户
userMapper.insertUser(user);
}else {
//,查到了
if(!"0".equals(wxUser.getStatus())){
//非正常状态无法登录
throw new ServiceException("账号状态异常");
}
// 更新
user = wxUser;
if(!openid.equals(user.getOpenId())){
user.setOpenId(openid);
user.setUpdateTime(DateUtils.getNowDate());
userMapper.updateUser(user);
}
}
//组装token信息
LoginUser loginUser = new LoginUser();
loginUser.setOpenId(openid);
loginUser.setUser(user);
loginUser.setUserId(user.getUserId());
// 生成token
return tokenService.createToken(loginUser);
}
/**
* 校验验证码
*