c9b15262366bd1f9f5a995c265c5b7aa1165e7bf..88b5320e03180879f9133a3340a86914149f2790
2026-03-13 Administrator
refactor(interceptor): 更改登录拦截器中的会员实体类型
88b532 diff | tree
2026-03-13 Administrator
feat(mall): 替换会员系统为新的AI会员架构
8381bd diff | tree
6 files added
2 files modified
511 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java 3 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 231 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiCompany.java 20 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YhAiMember.java 193 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/entity/YhBaseEntity.java 29 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiCompanyMapper.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/mapper/YhAiMemberMapper.java 14 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/yinhe/service/YhAiMemberService.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java
@@ -5,6 +5,7 @@
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.common.utils.SpringContextUtil;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.yinhe.entity.YhAiMember;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
@@ -51,7 +52,7 @@
            responseUnAuth(response);
            return false;
        }
        MallMember member = JSON.parseObject(userJsonStr, MallMember.class);
        YhAiMember member = JSON.parseObject(userJsonStr, YhAiMember.class);
        request.getSession().setAttribute("member", member);
//        log.info("登录用户token:"+token+",PHONE:"+member.getPhone());
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -33,6 +33,10 @@
import cc.mrbird.febs.vip.VipSettingUnAliveSettingBo;
import cc.mrbird.febs.vip.entity.MallVipConfig;
import cc.mrbird.febs.vip.mapper.MallVipConfigMapper;
import cc.mrbird.febs.yinhe.entity.YHAiCompany;
import cc.mrbird.febs.yinhe.entity.YhAiMember;
import cc.mrbird.febs.yinhe.mapper.YHAiCompanyMapper;
import cc.mrbird.febs.yinhe.mapper.YhAiMemberMapper;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
@@ -696,6 +700,8 @@
    private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class);
    private final YhAiMemberMapper yhAiMemberMapper;
    private final YHAiCompanyMapper yhAiCompanyMapper;
    @Override
    public FebsResponse xcxLogin(ApiXcxLoginDto apiXcxLoginDto) throws IOException {
@@ -718,118 +724,53 @@
            String sessionKey = json.getString("session_key");
            log.info("openId={},sessionKey={}", openId, sessionKey);
            // 查询用户是否存在
            MallMember mallMember = null;
            YhAiMember entity = null;
            synchronized (this) {
                mallMember = this.baseMapper.selectMemberByOpenId(openId);
                if (ObjectUtil.isEmpty(mallMember)) {
                Date systemTime = new Date();
                entity = yhAiMemberMapper.selectOne(
                        Wrappers.lambdaQuery(YhAiMember.class)
                        .eq(YhAiMember::getOpenId, openId)
                );
                if (ObjectUtil.isEmpty(entity)) {
                    // 新增用户
                    mallMember = new MallMember();
                    mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE);
                    mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL);
                    mallMember.setOpenId(openId);
                    mallMember.setSessionKey(sessionKey);
                    mallMember.setTradePassword(SecureUtil.md5("123456"));
                    entity = new YhAiMember();
                    entity.setOpenId(openId);
                    entity.setSessionKey(sessionKey);
                    if (StrUtil.isNotBlank(apiXcxLoginDto.getInviteId())) {
                        MallMember member = this.baseMapper.selectInfoByInviteId(apiXcxLoginDto.getInviteId());
                        if (member != null) {
                            mallMember.setReferrerId(member.getInviteId());
                            //推荐人和推荐人链
                            boolean flag = false;
                            String parentId = mallMember.getReferrerId();
                            if (StrUtil.isBlank(parentId)) {
                                flag = true;
                            }
                            String ids = "";
                            while (!flag) {
                                if (StrUtil.isBlank(ids)) {
                                    ids += parentId;
                                } else {
                                    ids += ("," + parentId);
                                }
                                MallMember parentMember = this.baseMapper.selectInfoByInviteId(parentId);
                                if (parentMember == null) {
                                    break;
                                }
                                parentId = parentMember.getReferrerId();
                                if (StrUtil.isBlank(parentMember.getReferrerId())) {
                                    flag = true;
                                }
                            }
                            if (StrUtil.isNotBlank(ids)) {
                                mallMember.setReferrerIds(ids);
                            }
                        }
                    }
                    this.baseMapper.insert(mallMember);
                    AiMember aiMember = new AiMember();
                    aiMember.setId(UUID.getSimpleUUIDString());
                    entity.setMemberUuid(UUID.getSimpleUUIDString());
                    if (StrUtil.isNotEmpty(apiXcxLoginDto.getCompanyId())){
                        AiCompany aiCompany = aiCompanyMapper.selectOne(
                                Wrappers.lambdaQuery(AiCompany.class)
                                        .eq(AiCompany::getCode, apiXcxLoginDto.getCompanyId())
                                        .last("limit 1")
                        YHAiCompany aiCompany = yhAiCompanyMapper.selectOne(
                                Wrappers.lambdaQuery(YHAiCompany.class)
                                        .eq(YHAiCompany::getCode, apiXcxLoginDto.getCompanyId())
                        );
                        if (ObjectUtil.isNotEmpty(aiCompany)){
                            aiMember.setCompanyId(aiCompany.getId());
                            entity.setCompanyId(aiCompany.getId());
                        }
                    }
                    aiMember.setCreatedTime(new Date());
                    aiMemberMapper.insert(aiMember);
                    entity.setCreateTime(systemTime);
                    entity.setUpdateTime(systemTime);
                    entity.setLastLoginTime(systemTime);
                    yhAiMemberMapper.insert(entity);
                    mallMember = this.baseMapper.selectMemberByOpenId(openId);
                    String inviteId = ShareCodeUtil.toSerialCode(mallMember.getId());
                    mallMember.setMemberUuid(aiMember.getId());
                    if (StrUtil.isNotEmpty(aiMember.getCompanyId())){
                        mallMember.setCompanyId(aiMember.getCompanyId());
                    }
                    mallMember.setInviteId(inviteId);
                    mallMember.setName("新用户"+inviteId);
                    this.baseMapper.updateById(mallMember);
                    MallMemberWallet wallet = new MallMemberWallet();
                    wallet.setBalance(BigDecimal.ZERO);
                    wallet.setMemberId(mallMember.getId());
                    mallMemberWalletMapper.insert(wallet);
                    //分销员的邀请码赠送优惠卷
                    if (StrUtil.isNotBlank(apiXcxLoginDto.getInviteId())) {
                        String couponUUID = IdUtil.simpleUUID();
                        //通过邀请人信息,获取能领取的优惠卷信息
                        MallMember refMember = this.baseMapper.selectInfoByInviteId(apiXcxLoginDto.getInviteId());
                        if(ObjectUtil.isNotEmpty(refMember)){
                            SalemanCoupon salemanCoupon = salemanCouponMapper.selectByMemberId(refMember.getId());
                            if(ObjectUtil.isNotEmpty(salemanCoupon)){
                                Long couponId = salemanCoupon.getCouponId();
                                List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdCouponIdWithOutInviteId(mallMember.getId(), couponId);
                                if(CollUtil.isEmpty(mallMemberCoupons)){
                                    //商品优惠卷如果绑定了,那么当前登陆者获取一张卷
                                    MallGoodsCoupon mallGoodsCoupon = mallGoodsCouponMapper.selectById(couponId);
                                    MallMemberCoupon mallMemberCoupon = new MallMemberCoupon();
                                    mallMemberCoupon.setCouponId(couponId);
                                    mallMemberCoupon.setCouponName(mallGoodsCoupon.getName());
                                    mallMemberCoupon.setMemberId(mallMember.getId());
                                    mallMemberCoupon.setCouponUuid(couponUUID);
                                    mallMemberCoupon.setInviteId(refMember.getInviteId());
                                    mallMemberCoupon.setState(1);
                                    mallMemberCoupon.setExpireTime(DateUtil.offsetDay(DateUtil.date(),mallGoodsCoupon.getExpireDay()));
                                    mallMemberCouponMapper.insert(mallMemberCoupon);
                                }
                            }
                        }
                    }
                    entity = yhAiMemberMapper.selectOne(
                            Wrappers.lambdaQuery(YhAiMember.class)
                                    .eq(YhAiMember::getOpenId, openId)
                    );
                    String inviteId = ShareCodeUtil.toSerialCode(entity.getId());
                    entity.setInviteId(inviteId);
                    entity.setName("XCX"+inviteId);
                    yhAiMemberMapper.updateById(entity);
                } else {
                    if (MallMember.ACCOUNT_STATUS_DISABLED.equals(mallMember.getAccountStatus())) {
                    if ("1".equals(entity.getAccountStatus())) {
                        throw new FebsException("账号已停用");
                    }
                    mallMember.setSessionKey(sessionKey);
                    this.baseMapper.updateById(mallMember);
                    entity.setSessionKey(sessionKey);
                    entity.setLastLoginTime(systemTime);
                    yhAiMemberMapper.updateById(entity);
                }
            }
            // 存放redis
            String redisKey = AppContants.XCX_LOGIN_PREFIX + mallMember.getId();
            String redisKey = AppContants.XCX_LOGIN_PREFIX + entity.getMemberUuid();
            String existToken = redisUtils.getString(redisKey);
            if (StrUtil.isNotBlank(existToken)) {
                Object o = redisUtils.get(existToken);
@@ -838,12 +779,12 @@
                }
            }
            String token = IdUtil.simpleUUID();
            redisUtils.set(token, JSONObject.toJSONString(mallMember), -1);
            redisUtils.set(token, JSONObject.toJSONString(entity), -1);
            redisUtils.set(redisKey, token, -1);
            Map<String, Object> authInfo = new HashMap<>();
            authInfo.put("token", token);
            authInfo.put("appid", xcxProperties.getXcxAppid());
            authInfo.put("member", mallMember);
            authInfo.put("member", entity);
            authInfo.put("rasToken", generateAsaToken(token));
            febsResponse.success().data(authInfo);
        } else {
@@ -857,45 +798,41 @@
    public FebsResponse xcxSaveInfo(ApiXcxSaveInfoDto apiXcxSaveInfoDto) {
        log.info("name={},phone={},avatar={},sex={}",
                apiXcxSaveInfoDto.getNickName(),apiXcxSaveInfoDto.getPhone(),apiXcxSaveInfoDto.getAvatarUrl(),apiXcxSaveInfoDto.getGender());
        Long memberId = LoginUserUtil.getLoginUser().getId();
        MallMember mallMember = this.baseMapper.selectById(memberId);
        String memberId = LoginUserUtil.getLoginUser().getMemberUuid();
        YhAiMember entity = yhAiMemberMapper.selectOne(
                Wrappers.lambdaQuery(YhAiMember.class)
                        .eq(YhAiMember::getMemberUuid, memberId)
        );
        String nickName = apiXcxSaveInfoDto.getNickName();
        if(StrUtil.isNotEmpty(nickName)){
            mallMember.setName(nickName);
            entity.setName(nickName);
        }
        String phone = apiXcxSaveInfoDto.getPhone();
        if(StrUtil.isNotEmpty(phone)){
            mallMember.setPhone(phone);
            entity.setPhone(phone);
        }
        String avatarUrl = apiXcxSaveInfoDto.getAvatarUrl();
        if(StrUtil.isNotEmpty(avatarUrl)){
            mallMember.setAvatar(avatarUrl);
            entity.setAvatar(avatarUrl);
        }
        if (StrUtil.isNotBlank(apiXcxSaveInfoDto.getRealName())) {
            mallMember.setRealName(apiXcxSaveInfoDto.getRealName());
            entity.setRealName(apiXcxSaveInfoDto.getRealName());
        }
        if (apiXcxSaveInfoDto.getBirthday() != null) {
            mallMember.setBirthday(apiXcxSaveInfoDto.getBirthday());
        }
        List<MallVipConfig> configs = mallVipConfigMapper.selectVipConfigList();
        if (StrUtil.isBlank(mallMember.getLevel()) && CollUtil.isNotEmpty(configs)) {
            MallVipConfig mallVipConfig = configs.get(0);
            mallMember.setLevel(mallVipConfig.getCode());
            entity.setBirthday(apiXcxSaveInfoDto.getBirthday());
        }
        if(ObjectUtil.isNotEmpty(apiXcxSaveInfoDto.getGender())){
            mallMember.setSex(1 == apiXcxSaveInfoDto.getGender() ? "女" : "男");
            entity.setSex(1 == apiXcxSaveInfoDto.getGender() ? "女" : "男");
        }
        String companyId = apiXcxSaveInfoDto.getCompanyId();
        if(ObjectUtil.isNotEmpty(apiXcxSaveInfoDto.getCompanyId())){
            AiCompany aiCompany = aiCompanyMapper.selectOne(
                    Wrappers.lambdaQuery(AiCompany.class)
                            .eq(AiCompany::getCode, apiXcxSaveInfoDto.getCompanyId())
                            .last("limit 1")
        if(ObjectUtil.isNotEmpty(companyId)){
            YHAiCompany aiCompany = yhAiCompanyMapper.selectOne(
                    Wrappers.lambdaQuery(YHAiCompany.class)
                            .eq(YHAiCompany::getCode, companyId)
            );
            if (ObjectUtil.isEmpty(aiCompany)){
                throw new FebsException("公司编码不存在");
@@ -904,63 +841,9 @@
                companyId = aiCompany.getId();
            }
        }
        mallMember.setCompanyId(companyId);
        this.baseMapper.updateById(mallMember);
        entity.setCompanyId(companyId);
        yhAiMemberMapper.updateById(entity);
        String memberUuid = mallMember.getMemberUuid();
        AiMember aiMember = aiMemberService.getById(memberUuid);
        if (ObjectUtil.isNotEmpty(aiMember) && StrUtil.isNotEmpty(mallMember.getCompanyId())){
            aiMemberService.update(null,
                    Wrappers.lambdaUpdate(AiMember.class)
                    .set(AiMember::getCompanyId, mallMember.getCompanyId())
                    .eq(AiMember::getId, aiMember.getId())
                    );
        }
//        //完善信息赠送新人礼
//        if (StrUtil.isNotBlank(mallMember.getPhone()) && mallMember.getNewGift() == 0) {
//            DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
//                    CommonDictionaryEnum.NEW_GIFT_SETTING.getType(),
//                    CommonDictionaryEnum.NEW_GIFT_SETTING.getCode()
//            );
//            mallMember.setNewGift(1);
//            this.baseMapper.updateById(mallMember);
//
//            ApiNewGiftSettingDto apiNewGiftSettingDto = JSONObject.parseObject(dic.getValue(), ApiNewGiftSettingDto.class);
//            if (apiNewGiftSettingDto.getState() == 1) {
//                String prizeScore = apiNewGiftSettingDto.getPrizeScore();
//                BigDecimal bigDecimal = new BigDecimal(prizeScore).setScale(0, RoundingMode.HALF_DOWN);
//                if (bigDecimal.compareTo(BigDecimal.ZERO) > 0) {
//                    walletService.add(bigDecimal, mallMember.getId(), "prizeScore");
//                    mallMoneyFlowService.addMoneyFlow(
//                            mallMember.getId(),
//                            bigDecimal,
//                            ScoreFlowTypeEnum.MEMBER_INFO_GIFT.getValue(),
//                            MallUtils.getOrderNum(),
//                            FlowTypeEnum.PRIZE_SCORE.getValue(),
//                            StrUtil.format(ScoreFlowTypeEnum.MEMBER_INFO_GIFT.getDesc(),bigDecimal),
//                            2
//                    );
//                }
//                if (apiNewGiftSettingDto.getCouponId() != null) {
//                    MallGoodsCoupon mallGoodsCoupon = mallGoodsCouponMapper.selectById(apiNewGiftSettingDto.getCouponId());
//                    if(ObjectUtil.isNotEmpty(mallGoodsCoupon)){
//                        MallMemberCoupon memberCoupon = new MallMemberCoupon();
//                        memberCoupon.setCouponId(mallGoodsCoupon.getId());
//                        memberCoupon.setCouponName(mallGoodsCoupon.getName());
//                        memberCoupon.setInviteId(mallMember.getInviteId());
//                        memberCoupon.setCouponUuid(IdUtil.simpleUUID());
//                        memberCoupon.setState(1);
//                        memberCoupon.setFromType(3);
//                        memberCoupon.setExpireTime(DateUtil.offsetDay(DateUtil.date(), mallGoodsCoupon.getExpireDay()));
//                        memberCoupon.setMemberId(mallMember.getId());
//                        mallMemberCouponMapper.insert(memberCoupon);
//                    }
//                }
//
//            }
//        }
        return new FebsResponse().success();
    }
src/main/java/cc/mrbird/febs/yinhe/entity/YHAiCompany.java
New file
@@ -0,0 +1,20 @@
package cc.mrbird.febs.yinhe.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("ai_company")
public class YHAiCompany extends YhBaseEntity {
    /** 主键 */
    private String id;
    /**
     * 公司名称
     */
    private String name;
    private String code;
    private String knowledgeId;
    private String categoryId;
}
src/main/java/cc/mrbird/febs/yinhe/entity/YhAiMember.java
New file
@@ -0,0 +1,193 @@
package cc.mrbird.febs.yinhe.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
/**
 * 用户实体类
 * 对应数据库表:ai_member
 */
@Data
@TableName("ai_member")
public class YhAiMember extends YhBaseEntity {
    /**
     * 主键ID (bigint自增)
     */
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;
    /**
     * 会员UUID
     */
    private String memberUuid;
    /**
     * 用户名称
     */
    private String name;
    /**
     * 手机号
     */
    private String phone;
    /**
     * 邮箱
     */
    private String email;
    /**
     * 密码
     */
    private String password;
    /**
     * 支付密码
     */
    private String tradePassword;
    /**
     * 性别
     */
    private String sex;
    /**
     * 邀请码
     */
    private String inviteId;
    /**
     * 推荐人邀请码
     */
    private String referrerId;
    /**
     * 推荐人线路
     */
    private String referrerIds;
    /**
     * 代理层级
     */
    private String level;
    /**
     * 账户状态 0-正常 1-禁用
     */
    private Integer accountStatus;
    /**
     * 账户类型 1-正常用户
     */
    private Integer accountType;
    /**
     * 头像
     */
    private String avatar;
    /**
     * 绑定手机号(仅全民商城用得到)
     */
    private String bindPhone;
    /**
     * 会员等级
     */
    private Integer director;
    /**
     * 分销等级
     */
    private Integer storeMaster;
    /**
     * 微信用户标识
     */
    private String openId;
    /**
     * 会话密钥
     */
    private String sessionKey;
    /**
     * 推销员id
     */
    private Long salesmansId;
    /**
     * 邀请图片
     */
    private String inviteImg;
    /**
     * 是否是销售员 1:是 2:否
     */
    private Integer isSale;
    /**
     * 生日
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date birthday;
    /**
     * 真实姓名
     */
    private String realName;
    /**
     * 上一次登录时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date lastLoginTime;
    /**
     * 会员时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date vipLevelTime;
    /**
     * 是否是医生 0-否 1-是
     */
    private Integer doctorState;
    /**
     * 是否是核销员 0-否 1-是
     */
    private Integer checkOrder;
    /**
     * 是否领取新人礼 0-否 1-是
     */
    private Integer newGift;
    /**
     * 是否是自提订单核销员 0-否 1-是
     */
    private Integer checkLeader;
    /**
     * 会员角色ID
     */
    private String memberRoleId;
    /**
     * 公司ID
     */
    private String companyId;
    /**
     * 角色ID
     */
    private Long roleId;
}
src/main/java/cc/mrbird/febs/yinhe/entity/YhBaseEntity.java
New file
@@ -0,0 +1,29 @@
package cc.mrbird.febs.yinhe.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class YhBaseEntity implements Serializable
{
    private static final long serialVersionUID = 1L;
    /** 创建者 */
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /** 更新者 */
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /** 备注 */
    private String remark;
}
src/main/java/cc/mrbird/febs/yinhe/mapper/YHAiCompanyMapper.java
New file
@@ -0,0 +1,9 @@
package cc.mrbird.febs.yinhe.mapper;
import cc.mrbird.febs.yinhe.entity.YHAiCompany;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface YHAiCompanyMapper extends BaseMapper<YHAiCompany> {
}
src/main/java/cc/mrbird/febs/yinhe/mapper/YhAiMemberMapper.java
New file
@@ -0,0 +1,14 @@
package cc.mrbird.febs.yinhe.mapper;
import cc.mrbird.febs.yinhe.entity.YhAiMember;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * 用户表 Mapper 接口
 * 对应数据库表:ai_member
 */
@Mapper
public interface YhAiMemberMapper extends BaseMapper<YhAiMember> {
}
src/main/java/cc/mrbird/febs/yinhe/service/YhAiMemberService.java
New file
@@ -0,0 +1,12 @@
package cc.mrbird.febs.yinhe.service;
import cc.mrbird.febs.yinhe.entity.YhAiMember;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * 用户表 Service 接口
 * 对应数据库表:ai_member
 */
public interface YhAiMemberService extends IService<YhAiMember> {
}