From 6127f9c2f53b4e11d2ddfc5575631e5403da0410 Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Thu, 05 Jun 2025 17:34:45 +0800 Subject: [PATCH] feat(mall): 添加年排行功能并优化积分查询性能 --- src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java | 1269 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 1,238 insertions(+), 31 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java index 48309b2..5afa1cb 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java @@ -1,24 +1,33 @@ package cc.mrbird.febs.mall.service.impl; +import cc.mrbird.febs.common.configure.FebsConfigure; import cc.mrbird.febs.common.entity.FebsResponse; -import cc.mrbird.febs.common.enumerates.AgentLevelEnum; -import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; -import cc.mrbird.febs.common.enumerates.FlowTypeEnum; -import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; +import cc.mrbird.febs.common.enumerates.*; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.properties.XcxProperties; import cc.mrbird.febs.common.utils.*; import cc.mrbird.febs.mall.conversion.MallMemberConversion; import cc.mrbird.febs.mall.conversion.MallShopApplyConversion; +import cc.mrbird.febs.mall.conversion.MallStoreConversion; import cc.mrbird.febs.mall.dto.*; +import cc.mrbird.febs.mall.dto.memberLevel.*; +import cc.mrbird.febs.mall.dto.signActivity.ApiNewGiftSettingDto; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.*; import cc.mrbird.febs.mall.vo.*; +import cc.mrbird.febs.mall.vo.memberLevel.*; +import cc.mrbird.febs.mall.vo.sale.ApiSaleRecordInfoVo; import cc.mrbird.febs.pay.model.BrandWCPayRequestData; import cc.mrbird.febs.pay.service.IXcxPayService; +import cc.mrbird.febs.pay.util.MD5; +import cc.mrbird.febs.vip.VipSettingUnAliveSettingBo; +import cc.mrbird.febs.vip.entity.MallVipConfig; +import cc.mrbird.febs.vip.mapper.MallVipConfigMapper; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; @@ -26,23 +35,28 @@ import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.json.JSONArray; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.security.SecurityProperties; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; /** * @author wzy @@ -74,6 +88,18 @@ private final CouponGoodsMapper couponGoodsMapper; private final MallGoodsCouponMapper mallGoodsCouponMapper; private final MallMemberCouponMapper mallMemberCouponMapper; + private final MallGoodsMapper mallGoodsMapper; + + private final MallVipConfigMapper mallVipConfigMapper; + private final MallStoreMapper mallStoreMapper; + private final MallStoreItemMapper mallStoreItemMapper; + private final MallStoreMemberMapper mallStoreMemberMapper; + private final MallDoctorMapper mallDoctorMapper; + private final HappyMemberLevelMapper happyMemberLevelMapper; + private final IApiMallMemberWalletService mallMemberWalletService; + private final HappyMemberLabelRecordMapper happyMemberLabelRecordMapper; + private final HappyMemberLabelMapper happyMemberLabelMapper; + private final FebsConfigure febsConfigure; @Value("${spring.profiles.active}") @@ -127,7 +153,6 @@ mallMember.setName(registerDto.getName()); mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE); mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL); - mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.name()); mallMember.setSex("男"); mallMember.setBindPhone(registerDto.getAccount()); @@ -231,6 +256,15 @@ @Override public FebsResponse logout() { Long id = LoginUserUtil.getLoginUser().getId(); + + String redisKey = AppContants.XCX_LOGIN_PREFIX + id; + String existToken = redisUtils.getString(redisKey); + if (StrUtil.isNotBlank(existToken)) { + Object o = redisUtils.get(existToken); + if (ObjectUtil.isNotEmpty(o)) { + redisUtils.del(existToken); + } + } redisUtils.del(AppContants.XCX_LOGIN_PREFIX + id); redisUtils.del(AppContants.XCX_LOGIN_PHONE_PREFIX + id); return new FebsResponse().success().message("退出登录"); @@ -241,12 +275,29 @@ Long id = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectById(id); + + MallMemberVo mallMemberVo = MallMemberConversion.INSTANCE.entityToVo(mallMember); + + HappyMemberLevel happyMemberLevel = happyMemberLevelMapper.selectOne( + new LambdaQueryWrapper<HappyMemberLevel>() + .select(HappyMemberLevel::getName, HappyMemberLevel::getIconPng) + .eq(HappyMemberLevel::getCode, mallMember.getDirector()) + ); + if(happyMemberLevel != null){ + mallMemberVo.setLevelName(happyMemberLevel.getName()); + mallMemberVo.setLevelNamePng(happyMemberLevel.getIconPng()); + } if(StrUtil.isNotEmpty(mallMember.getReferrerId())){ MallMember referMember = this.baseMapper.selectInfoByInviteId(mallMember.getReferrerId()); if (referMember != null) { mallMemberVo.setReferrerName(referMember.getName()); } + } + if(mallMember.getStoreMaster() == 0){ + mallMemberVo.setIsTeamLeader(2); + }else{ + mallMemberVo.setIsTeamLeader(1); } if (StrUtil.isNotBlank(mallMember.getTradePassword())) { @@ -274,10 +325,39 @@ mallMemberVo.setChildCnt(CollUtil.isNotEmpty(mallMembers) ? mallMembers.size() : 0); MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(mallMemberVo.getId()); + + MallVipConfig mallVipConfig = mallVipConfigMapper.selectVipConfigByCode(mallMember.getLevel()); + + mallMemberVo.setVipInfo(mallVipConfig); mallMemberVo.setBalance(wallet.getBalance()); -// mallMemberVo.setScore(wallet.getScore()); -// mallMemberVo.setPrizeScore(wallet.getPrizeScore()); + mallMemberVo.setScore(wallet.getScore()); + mallMemberVo.setPrizeScore(wallet.getPrizeScore()); // mallMemberVo.setTotalCost(mallOrderInfoMapper.selectTotalAmount(id)); + + List<HappyMemberLabelRecord> happyMemberLabelRecords = happyMemberLabelRecordMapper.selectList( + new LambdaQueryWrapper<HappyMemberLabelRecord>() + .eq(HappyMemberLabelRecord::getMemberId, id) + .orderByDesc(HappyMemberLabelRecord::getId) + .last("limit 5") + ); + if(CollUtil.isNotEmpty(happyMemberLabelRecords)){ + Set<Long> collect = happyMemberLabelRecords.stream().map(HappyMemberLabelRecord::getLabelId).collect(Collectors.toSet()); + List<HappyMemberLabel> happyMemberLabels = happyMemberLabelMapper.selectList( + new LambdaQueryWrapper<HappyMemberLabel>() + .select(HappyMemberLabel::getIconPng, HappyMemberLabel::getName) + .in(HappyMemberLabel::getId, collect) + ); + if(CollUtil.isNotEmpty(happyMemberLabels)){ + ArrayList<ApiLabelInfoVo> apiMemberLabelVos = new ArrayList<>(); + for (HappyMemberLabel happyMemberLabel : happyMemberLabels) { + ApiLabelInfoVo apiLabelInfoVo = new ApiLabelInfoVo(); + apiLabelInfoVo.setIconPng(happyMemberLabel.getIconPng()); + apiLabelInfoVo.setName(happyMemberLabel.getName()); + apiMemberLabelVos.add(apiLabelInfoVo); + } + mallMemberVo.setLabelList(apiMemberLabelVos); + } + } return new FebsResponse().success().data(mallMemberVo); } @@ -293,7 +373,7 @@ } } - List<MallShoppingCart> carts = mallShoppingCartMapper.selectCartGoodsList(id); + List<MallShoppingCart> carts = mallShoppingCartMapper.selectCartGoodsList(id, 1); Map<String, Object> result = new HashMap<>(); result.put("order", orderCnt); result.put("carts", carts.size()); @@ -316,6 +396,11 @@ mallMember.setTradePassword(SecureUtil.md5(forgetPwdDto.getPassword())); this.baseMapper.updateById(mallMember); return new FebsResponse().success().message("设置成功"); + } + + public static void main(String[] args) { + String pwd = SecureUtil.md5("123456"); + System.out.println(pwd); } @Override @@ -366,6 +451,12 @@ Long id = LoginUserUtil.getLoginUser().getId(); moneyFlowDto.setMemberId(id); IPage<MoneyFlowVo> pages = mallMoneyFlowMapper.selectApiMoneyFlowInPage(page, moneyFlowDto); + + if (moneyFlowDto.getFlowType() == 3) { + pages.getRecords().forEach(item -> { + item.setDescription(ScoreFlowTypeEnum.getDescByValue(item.getType())); + }); + } return new FebsResponse().success().data(pages); } @@ -598,9 +689,9 @@ mallMember = new MallMember(); mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE); mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL); - mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.name()); mallMember.setOpenId(openId); mallMember.setSessionKey(sessionKey); + mallMember.setTradePassword(SecureUtil.md5("123456")); if (StrUtil.isNotBlank(apiXcxLoginDto.getInviteId())) { MallMember member = this.baseMapper.selectInfoByInviteId(apiXcxLoginDto.getInviteId()); @@ -645,7 +736,37 @@ 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); + } + } + } + } } else { + if (MallMember.ACCOUNT_STATUS_DISABLED.equals(mallMember.getAccountStatus())) { + throw new FebsException("账号已停用"); + } mallMember.setSessionKey(sessionKey); this.baseMapper.updateById(mallMember); } @@ -692,8 +813,67 @@ if(StrUtil.isNotEmpty(avatarUrl)){ mallMember.setAvatar(avatarUrl); } -// mallMember.setSex(1 == apiXcxSaveInfoDto.getGender() ? "女" : "男"); + + if (StrUtil.isNotBlank(apiXcxSaveInfoDto.getRealName())) { + mallMember.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()); + } + + mallMember.setSex(1 == apiXcxSaveInfoDto.getGender() ? "女" : "男"); this.baseMapper.updateById(mallMember); + +// //完善信息赠送新人礼 +// 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(); } @@ -712,7 +892,6 @@ mallMember.setPhone(phone); mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE); mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL); - mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.name()); this.baseMapper.insert(mallMember); String inviteId = ShareCodeUtil.toSerialCode(mallMember.getId()); @@ -812,10 +991,12 @@ mallMoneyFlowService.addMoneyFlow( memberId, amount, - MoneyFlowTypeEnum.RECHARGE.getValue(), + ScoreFlowTypeEnum.RECHARGE_ING.getValue(), rechargeNo, FlowTypeEnum.BALANCE.getValue(), - "余额充值",1); + StrUtil.format(ScoreFlowTypeEnum.RECHARGE_ING.getDesc(),amount), + 1 + ); String wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData); String payResultStr = brandWCPayRequestData.getPrepay_id(); @@ -877,28 +1058,78 @@ @Override public FebsResponse getCoupon(GetCouponDto getCouponDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); + + String couponUUID = IdUtil.simpleUUID(); +// String couponUUID = getCouponDto.getCouponUUID(); +// QueryWrapper<MallMemberCoupon> objectQueryWrapper = new QueryWrapper<>(); +// objectQueryWrapper.eq("coupon_uuid",couponUUID); +// List<MallMemberCoupon> mallMemberCouponDone = mallMemberCouponMapper.selectList(objectQueryWrapper); +// if(CollUtil.isNotEmpty(mallMemberCouponDone)){ +// return new FebsResponse().success(); +// } //通过邀请人信息,获取能领取的优惠卷信息 MallMember mallMember = this.baseMapper.selectInfoByInviteId(getCouponDto.getInviteId()); - SalemanCoupon salemanCoupon = salemanCouponMapper.selectByMemberId(mallMember.getId()); - if(ObjectUtil.isNotEmpty(salemanCoupon)){ - Long couponId = salemanCoupon.getCouponId(); - Long goodsId = getCouponDto.getGoodsId(); - //商品优惠卷如果绑定了,那么当前登陆者获取一张卷 - List<CouponGoods> couponGoodsList = couponGoodsMapper.selectByGoodIdAndCouponId(goodsId,couponId); - MallGoodsCoupon mallGoodsCoupon = mallGoodsCouponMapper.selectById(couponId); - if(CollUtil.isNotEmpty(couponGoodsList)){ - MallMemberCoupon mallMemberCoupon = new MallMemberCoupon(); - mallMemberCoupon.setCouponId(couponId); - mallMemberCoupon.setCouponName(mallGoodsCoupon.getName()); - mallMemberCoupon.setMemberId(memberId); - mallMemberCoupon.setGoodsId(goodsId); - mallMemberCoupon.setInviteId(mallMember.getInviteId()); - mallMemberCoupon.setState(1); - mallMemberCoupon.setExpireTime(DateUtil.offsetDay(DateUtil.date(),mallGoodsCoupon.getExpireDay())); - mallMemberCouponMapper.insert(mallMemberCoupon); + if(ObjectUtil.isNotEmpty(mallMember)){ + SalemanCoupon salemanCoupon = salemanCouponMapper.selectByMemberId(mallMember.getId()); + if(ObjectUtil.isNotEmpty(salemanCoupon)){ + Long couponId = salemanCoupon.getCouponId(); + Long goodsId = getCouponDto.getGoodsId(); + MallGoods mallGoods = mallGoodsMapper.selectById(goodsId); + //验证商品存不存在,且上没上架 + if(ObjectUtil.isNotEmpty(mallGoods) + && MallGoods.ISSALE_STATUS_ENABLE == mallGoods.getIsSale()){ +// List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdAndGoodsIdAndCouponId(memberId, goodsId, couponId,mallMember.getInviteId()); +// List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdAndGoodsIdAndCouponIdWithOutInviteId(memberId, goodsId, couponId); + List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdAndGoodsIdAndCouponIdWithOutInviteId(memberId, goodsId); + if(CollUtil.isEmpty(mallMemberCoupons)){ + //商品优惠卷如果绑定了,那么当前登陆者获取一张卷 + List<CouponGoods> couponGoodsList = couponGoodsMapper.selectByGoodIdAndCouponId(goodsId,couponId); + MallGoodsCoupon mallGoodsCoupon = mallGoodsCouponMapper.selectById(couponId); + if(CollUtil.isNotEmpty(couponGoodsList)){ + MallMemberCoupon mallMemberCoupon = new MallMemberCoupon(); + mallMemberCoupon.setCouponId(couponId); + mallMemberCoupon.setCouponName(mallGoodsCoupon.getName()); + mallMemberCoupon.setMemberId(memberId); + mallMemberCoupon.setGoodsId(goodsId); + mallMemberCoupon.setCouponUuid(couponUUID); + mallMemberCoupon.setInviteId(mallMember.getInviteId()); + mallMemberCoupon.setState(1); + mallMemberCoupon.setExpireTime(DateUtil.offsetDay(DateUtil.date(),mallGoodsCoupon.getExpireDay())); + mallMemberCouponMapper.insert(mallMemberCoupon); + } + } + } } } + return new FebsResponse().success(); + } + @Override + public FebsResponse scanCoupon(GetCouponDto getCouponDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + String couponUUID = IdUtil.simpleUUID(); + //通过邀请人信息,获取能领取的优惠卷信息 + MallMember mallMember = this.baseMapper.selectInfoByInviteId(getCouponDto.getInviteId()); + if(ObjectUtil.isNotEmpty(mallMember)){ + SalemanCoupon salemanCoupon = salemanCouponMapper.selectByMemberId(mallMember.getId()); + if(ObjectUtil.isNotEmpty(salemanCoupon)){ + Long couponId = salemanCoupon.getCouponId(); + List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdCouponIdWithOutInviteId(memberId, couponId); + if(CollUtil.isEmpty(mallMemberCoupons)){ + //商品优惠卷如果绑定了,那么当前登陆者获取一张卷 + MallGoodsCoupon mallGoodsCoupon = mallGoodsCouponMapper.selectById(couponId); + MallMemberCoupon mallMemberCoupon = new MallMemberCoupon(); + mallMemberCoupon.setCouponId(couponId); + mallMemberCoupon.setCouponName(mallGoodsCoupon.getName()); + mallMemberCoupon.setMemberId(memberId); + mallMemberCoupon.setCouponUuid(couponUUID); + mallMemberCoupon.setInviteId(mallMember.getInviteId()); + mallMemberCoupon.setState(1); + mallMemberCoupon.setExpireTime(DateUtil.offsetDay(DateUtil.date(),mallGoodsCoupon.getExpireDay())); + mallMemberCouponMapper.insert(mallMemberCoupon); + } + } + } return new FebsResponse().success(); } @@ -913,6 +1144,22 @@ } @Override + public FebsResponse memberPayCoupon(MallMemberCouponDto mallMemberCouponDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + mallMemberCouponDto.setMemberId(memberId); + mallMemberCouponDto.setExpireTime(DateUtil.date()); +// List<Long> couponIds = couponGoodsMapper.selectByGoodId(mallMemberCouponDto.getGoodsId()); + List<Long> goodsIdList = mallMemberCouponDto.getGoodsIdList(); + List<Long> couponIds = couponGoodsMapper.selectByGoodIdList(goodsIdList); + + List<MallMemberCouponVo> mallMemberCouponVos = new ArrayList<>(); + if(CollUtil.isNotEmpty(couponIds)){ + mallMemberCouponVos = mallMemberCouponMapper.selectListCreateInPage(mallMemberCouponDto,couponIds); + } + return new FebsResponse().success().data(mallMemberCouponVos); + } + + @Override public FebsResponse couponDetails(Long id) { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMemberCoupon mallMemberCoupon = mallMemberCouponMapper.selectById(id); @@ -921,11 +1168,971 @@ MallGoodsCoupon mallGoodsCoupon = mallGoodsCouponMapper.selectById(mallMemberCoupon.getCouponId()); mallMemberCouponVo.setCostAmount(mallGoodsCoupon.getCostAmount()); mallMemberCouponVo.setRealAmount(mallGoodsCoupon.getRealAmount()); + mallMemberCouponVo.setType(mallGoodsCoupon.getType()); return new FebsResponse().success().data(mallMemberCouponVo); + } + + @Override + public FebsResponse setInvite(ApiSetInviteDto apiSetInviteDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + MallMember mallMember = this.baseMapper.selectById(memberId); + if(ObjectUtil.isNotEmpty(mallMember.getReferrerId())){ + throw new FebsException("已绑定"); + } + String inviteId = apiSetInviteDto.getInviteId(); + if(inviteId.equals(mallMember.getInviteId())){ + return new FebsResponse().success(); + } + MallMember member = this.baseMapper.selectInfoByInviteId(inviteId); + if (member != null) { + if (StrUtil.isNotBlank(member.getReferrerIds()) && member.getReferrerIds().contains(mallMember.getInviteId())) { + log.info("下级不能邀请上级"); + return new FebsResponse().success(); + } + 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.updateById(mallMember); + } + return new FebsResponse().success(); } private String getXcxLoginUrl(String code) { String wechatLoginUrl =xcxProperties.getWecharLoginUrl(); return String.format(wechatLoginUrl, xcxProperties.getXcxAppid(), xcxProperties.getXcxSecret(), code); } + + @Override + public Map<String, Object> loginEvent() { + MallMember loginUser = LoginUserUtil.getLoginUser(); + + MallMember member = this.baseMapper.selectById(loginUser.getId()); + +// MallMember mallMember = new MallMember(); +// mallMember.setId(member.getId()); +// mallMember.setLastLoginTime(new Date()); +// this.baseMapper.updateById(mallMember); + + this.baseMapper.updateLastLoginTime(member.getId(),new Date()); + + DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.UNALIVE_COUPON.getType(), DataDictionaryEnum.UNALIVE_COUPON.getCode()); + if (dic == null || StrUtil.isBlank(dic.getValue())) { + return new HashMap<>(); + } + + Date today = new Date(); + Date lastLoginTime = member.getLastLoginTime(); + if (lastLoginTime == null) { + lastLoginTime = new Date(); + } + + long days = DateUtil.between(DateUtil.endOfDay(lastLoginTime), DateUtil.endOfDay(today), DateUnit.DAY); + + List<VipSettingUnAliveSettingBo> list = JSONObject.parseArray(dic.getValue(), VipSettingUnAliveSettingBo.class); + List<Long> couponIds = list.stream().filter(item -> { + return item.getDay() <= days && item.getCouponId() != null; + }).map(VipSettingUnAliveSettingBo::getCouponId).collect(Collectors.toList()); + if (CollUtil.isEmpty(couponIds)) { + return new HashMap<>(); + } + + LambdaQueryWrapper<MallGoodsCoupon> query = new LambdaQueryWrapper<>(); + query.in(MallGoodsCoupon::getId, couponIds) + .eq(MallGoodsCoupon::getState, 2); + List<MallGoodsCoupon> coupons = mallGoodsCouponMapper.selectList(query); + + LambdaQueryWrapper<MallMemberCoupon> memberCouponQuery = new LambdaQueryWrapper<>(); + memberCouponQuery.in(MallMemberCoupon::getCouponId, couponIds) + .eq(MallMemberCoupon::getMemberId, member.getId()) + .eq(MallMemberCoupon::getFromType, 3) + .ge(MallMemberCoupon::getCreatedTime, DateUtil.beginOfDay(new Date())) + .le(MallMemberCoupon::getCreatedTime, DateUtil.endOfDay(new Date())); + List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectList(memberCouponQuery); + if (CollUtil.isNotEmpty(mallMemberCoupons)) { + Map<Long, MallMemberCoupon> map = mallMemberCoupons.stream().collect(Collectors.toMap(MallMemberCoupon::getCouponId, MallMemberCoupon -> MallMemberCoupon)); + coupons = coupons.stream().filter(item -> { + return map.get(item.getId()) == null; + }).collect(Collectors.toList()); + } + + if (CollUtil.isEmpty(coupons)) { + return new HashMap<>(); + } + + coupons.forEach(item -> { + MallMemberCoupon memberCoupon = new MallMemberCoupon(); + memberCoupon.setCouponId(item.getId()); + memberCoupon.setCouponName(item.getName()); + memberCoupon.setInviteId(member.getInviteId()); + memberCoupon.setCouponUuid(IdUtil.simpleUUID()); + memberCoupon.setState(1); + memberCoupon.setFromType(3); + memberCoupon.setExpireTime(DateUtil.offsetDay(DateUtil.date(), item.getExpireDay())); + memberCoupon.setMemberId(member.getId()); + mallMemberCouponMapper.insert(memberCoupon); + }); + + Map<String, Object> result = new HashMap<>(); + result.put("coupon", coupons); + return result; + } + + @Override + public FebsResponse storeList(MallStoreDto mallStoreDto) { + QueryWrapper<MallStore> mallStoreQueryWrapper = new QueryWrapper<>(); + if(StrUtil.isNotEmpty(mallStoreDto.getName())){ + mallStoreQueryWrapper.like("name",mallStoreDto.getName()); + } + List<MallStore> mallStores = mallStoreMapper.selectList(mallStoreQueryWrapper); + List<MallStoreVo> mallStoreVos = MallStoreConversion.INSTANCE.entitysToVos(mallStores); + return new FebsResponse().success().data(mallStoreVos); + } + + @Override + public FebsResponse storeItemList(MallStoreItemDto mallStoreItemDto) { +// QueryWrapper<MallStoreItem> mallStoreQueryWrapper = new QueryWrapper<>(); +// mallStoreQueryWrapper.like("store_id",mallStoreItemDto.getStoreId()); +// List<MallStoreItem> mallStores = mallStoreItemMapper.selectList(mallStoreQueryWrapper); + + List<MallStoreItem> mallStores = mallStoreItemMapper.selectList( + new LambdaQueryWrapper<MallStoreItem>() + .eq(MallStoreItem::getStoreId, mallStoreItemDto.getStoreId()) + ); + return new FebsResponse().success().data(mallStores); + } + + @Override + public FebsResponse bindStoreMember(BindStoreMemberDto bindStoreMemberDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + Long storeItemId = bindStoreMemberDto.getStoreItemId(); + +// QueryWrapper<MallStoreMember> objectQueryWrapper = new QueryWrapper<>(); +// objectQueryWrapper.eq("member_id",memberId); +// List<MallStoreMember> mallStoreMembers = mallStoreMemberMapper.selectList(objectQueryWrapper); + + List<MallStoreMember> mallStoreMembers = mallStoreMemberMapper.selectList( + new LambdaQueryWrapper<MallStoreMember>() + .eq(MallStoreMember::getMemberId, memberId) + .eq(MallStoreMember::getStoreItemId, bindStoreMemberDto.getStoreItemId()) + ); + if(CollUtil.isNotEmpty(mallStoreMembers)){ + return new FebsResponse().fail().message("您已经绑定过了"); + } + + MallMember mallMember = this.baseMapper.selectById(memberId); + Integer sex = "女".equals(mallMember.getSex()) ? 3 : 2; + + MallStoreItem mallStoreItem = mallStoreItemMapper.selectById(storeItemId); + HashMap<String, String> objectObjectHashMap = new HashMap<>(); + String shopAccount = mallStoreItem.getAccount(); + String shopPwd = mallStoreItem.getPassword(); + String name = bindStoreMemberDto.getName(); + String address = bindStoreMemberDto.getAddress(); + Integer age = bindStoreMemberDto.getAge(); + String phoneNumber = bindStoreMemberDto.getPhone(); + + objectObjectHashMap.put("shopAccount",shopAccount); + objectObjectHashMap.put("shopPwd",shopPwd); + objectObjectHashMap.put("name",name); + objectObjectHashMap.put("address",address); + objectObjectHashMap.put("age",age.toString()); + objectObjectHashMap.put("phoneNumber",phoneNumber); + objectObjectHashMap.put("sex",sex.toString()); + + //sign= MD5(address+age+name+phoneNumber+shopAccount+shopPwd) + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append(address); + stringBuffer.append(age); + stringBuffer.append(name); + stringBuffer.append(phoneNumber); + stringBuffer.append(sex); + stringBuffer.append(shopAccount); + stringBuffer.append(shopPwd); + String sign = MD5.MD5Encode(stringBuffer.toString()); + objectObjectHashMap.put("sign",sign); + String url = "https://data.muchun.co/api/bindCustomer"; + + log.info("请求参数"+objectObjectHashMap); + String result = HttpCurlUtil.sendPost(url, objectObjectHashMap); + log.info("绑定用户"+result); + Integer retCode = JSONUtil.parseObj(result).getInt("retCode"); + String message = JSONUtil.parseObj(result).getStr("message"); + if(0 != retCode || !"绑定成功".equals(message)){ + return new FebsResponse().fail().message(message); + } + + Long bindId = JSONUtil.parseObj(result).getJSONObject("data").getLong("userId"); + List<MallStoreMember> mallStoreMembers1 = mallStoreMemberMapper.selectList( + new LambdaQueryWrapper<MallStoreMember>() + .eq(MallStoreMember::getMemberId, memberId) + .eq(MallStoreMember::getStoreItemId, mallStoreItem.getId()) + .eq(MallStoreMember::getBindId, bindId) + ); + if(CollUtil.isEmpty(mallStoreMembers1)){ + MallStoreMember mallStoreMember = new MallStoreMember(); + mallStoreMember.setMemberId(memberId); + mallStoreMember.setBindId(bindId); + mallStoreMember.setStoreId(mallStoreItem.getStoreId()); + mallStoreMember.setStoreItemId(mallStoreItem.getId()); + + mallStoreMember.setAccount(shopAccount); + mallStoreMember.setPassword(shopPwd); + + mallStoreMember.setName(name); + mallStoreMember.setAddress(address); + mallStoreMember.setAge(age); + mallStoreMember.setPhone(phoneNumber); + mallStoreMemberMapper.insert(mallStoreMember); + } + return new FebsResponse().success().message("绑定成功"); + } + + @Override + public FebsResponse bindList() { + Long memberId = LoginUserUtil.getLoginUser().getId(); + QueryWrapper<MallStoreMember> objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("member_id",memberId); + List<MallStoreMember> mallStoreMembers = mallStoreMemberMapper.selectList(objectQueryWrapper); + + ArrayList<MallStoreMemberVo> mallStoreMemberVos = new ArrayList<>(); + for(MallStoreMember mallStoreMember : mallStoreMembers){ + MallStoreMemberVo mallStoreMemberVo = new MallStoreMemberVo(); + Long storeId = mallStoreMember.getStoreId(); + Long storeItemId = mallStoreMember.getStoreItemId(); + MallStore mallStore = mallStoreMapper.selectById(storeId); + MallStoreItem mallStoreItem = mallStoreItemMapper.selectById(storeItemId); + mallStoreMemberVo.setId(mallStoreMember.getId()); + mallStoreMemberVo.setBindInfo(mallStore.getName()+"-"+mallStoreItem.getCode()); + mallStoreMemberVos.add(mallStoreMemberVo); + } + return new FebsResponse().success().data(mallStoreMemberVos); + } + + @Override + public FebsResponse bindResult(BindResultDto bindResultDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + MallStoreMember mallStoreMember = mallStoreMemberMapper.selectById(bindResultDto.getBindId()); + Long userld = mallStoreMember.getBindId(); + String shopAccount = mallStoreMember.getAccount(); + String shopPwd = mallStoreMember.getPassword(); + + HashMap<String, String> objectObjectHashMap = new HashMap<>(); + + objectObjectHashMap.put("shopAccount",shopAccount); + objectObjectHashMap.put("shopPwd",shopPwd); + objectObjectHashMap.put("userId",userld.toString()); + + //sign= MD5(shopAccount+shopPwd+userId) + StringBuffer stringBuffer = new StringBuffer(); + stringBuffer.append(shopAccount); + stringBuffer.append(shopPwd); + stringBuffer.append(userld); + String sign = MD5.MD5Encode(stringBuffer.toString()); + objectObjectHashMap.put("sign",sign); + + String url = "https://data.muchun.co/api/getCustomerCheckRecords"; + String result = HttpCurlUtil.sendPost(url, objectObjectHashMap); + Integer retCode = JSONUtil.parseObj(result).getInt("retCode"); + String message = JSONUtil.parseObj(result).getStr("message"); + if(0 != retCode){ + return new FebsResponse().fail().message(message); + } + JSONArray data = JSONUtil.parseObj(result).getJSONArray("data"); + return new FebsResponse().success().data(data); + } + + /** + * 绑定医生接口的实现方法 + * + * @param dto 包含绑定医生所需信息的数据传输对象 + * @return 返回操作结果的响应对象 + * @throws FebsException 如果绑定操作失败,抛出此异常 + */ + @Override + public FebsResponse bindDoctor(ApiDoctorBindDto dto) { + + // 获取当前登录用户的ID + Long memberId = LoginUserUtil.getLoginUser().getId(); + log.info("开始绑定医生{}",memberId); + // 从DTO中提取邀请ID和门店会员ID + String inviteId = dto.getInviteId(); + Long storeMemberId = dto.getStoreMemberId(); + + // 根据门店会员ID查询门店会员信息 + MallStoreMember mallStoreMember = mallStoreMemberMapper.selectOne( + new LambdaQueryWrapper<MallStoreMember>() + .eq(MallStoreMember::getId,storeMemberId) + .eq(MallStoreMember::getMemberId,memberId) + ); + // 如果门店会员信息为空,抛出异常 + if(null == mallStoreMember){ + throw new FebsException("当前检测记录无法绑定!"); + } + + // 根据邀请ID查询会员信息 + MallMember mallMember = this.baseMapper.selectInfoByInviteId(inviteId); + // 如果会员的医生状态不是1,抛出异常 + if(1 != mallMember.getDoctorState()){ + throw new FebsException("无法绑定!"); + } + + // 查询与当前门店会员ID关联的医生列表 + List<MallDoctor> mallDoctors = mallDoctorMapper.selectList( + new LambdaQueryWrapper<MallDoctor>() + .eq(MallDoctor::getStoreMemberId, mallStoreMember.getId()) + .eq(MallDoctor::getMemberId, mallMember.getId()) + ); + // 如果医生列表为空,创建新的医生对象并设置相关信息,然后插入数据库 + if(CollUtil.isEmpty(mallDoctors)){ + MallDoctor mallDoctor = new MallDoctor(); + mallDoctor.setMemberId(mallMember.getId()); + mallDoctor.setStoreMemberId(mallStoreMember.getId()); + mallDoctor.setBindMemberId(mallStoreMember.getMemberId()); + mallDoctor.setBindPhone(mallStoreMember.getPhone()); + mallDoctor.setBindName(mallStoreMember.getName()); + mallDoctor.setBindAge(mallStoreMember.getAge()); + + Long storeId = mallStoreMember.getStoreId(); + Long storeItemId = mallStoreMember.getStoreItemId(); + MallStore mallStore = mallStoreMapper.selectById(storeId); + MallStoreItem mallStoreItem = mallStoreItemMapper.selectById(storeItemId); + mallDoctor.setBindInfo(mallStore.getName()+"-"+mallStoreItem.getCode()); + mallDoctorMapper.insert(mallDoctor); + } + + // 返回操作成功的响应 + return new FebsResponse().success().message("操作成功"); + } + + /** + * 获取医生列表接口的实现 + * 根据登录用户信息和查询条件,返回相应的医生列表 + * + * @param dto 包含查询条件的数据传输对象 + * @return 返回包含医生列表的响应对象 + */ + @Override + public FebsResponse doctorList(ApiDoctorListDto dto) { + // 获取当前登录用户的ID + Long memberId = LoginUserUtil.getLoginUser().getId(); + // 初始化用于存储医生信息的集合 + ArrayList<ApiDoctorListVo> apiDoctorListVos = new ArrayList<>(); + + // 创建查询条件包装器 + LambdaQueryWrapper<MallDoctor> objectQueryWrapper = new LambdaQueryWrapper<>(); + // 根据传入的手机号进行模糊查询 + if(StrUtil.isNotEmpty(dto.getPhone())){ + objectQueryWrapper.like(MallDoctor::getBindPhone,dto.getPhone()); + } + // 根据会员ID进行精确查询 + objectQueryWrapper.eq(MallDoctor::getMemberId,memberId); + // 按创建时间降序排序 + objectQueryWrapper.orderByDesc(MallDoctor::getCreatedTime); + + // 执行查询,获取医生列表 + List<MallDoctor> mallDoctors = mallDoctorMapper.selectList(objectQueryWrapper); + // 如果查询结果不为空,则遍历查询结果,封装医生信息 + if(CollUtil.isNotEmpty(mallDoctors)){ + for(MallDoctor mallDoctor : mallDoctors){ + ApiDoctorListVo apiDoctorListVo = new ApiDoctorListVo(); + apiDoctorListVo.setId(mallDoctor.getId()); + apiDoctorListVo.setStoreMemberId(mallDoctor.getStoreMemberId()); + apiDoctorListVo.setName(mallDoctor.getBindName()); + apiDoctorListVo.setPhone(mallDoctor.getBindPhone()); + apiDoctorListVo.setBindAge(mallDoctor.getBindAge()); + apiDoctorListVo.setBindInfo(mallDoctor.getBindInfo()); + apiDoctorListVo.setCreatedTime(mallDoctor.getCreatedTime()); + // 将封装好的医生信息添加到集合中 + apiDoctorListVos.add(apiDoctorListVo); + } + } + // 返回包含医生列表的响应对象 + return new FebsResponse().success().data(apiDoctorListVos); + } + + @Override + public FebsResponse authList() { + // 获取当前登录用户的ID + Long memberId = LoginUserUtil.getLoginUser().getId(); + // 初始化用于存储医生信息的集合 + ArrayList<ApiDoctorListVo> apiDoctorListVos = new ArrayList<>(); + // 创建查询条件包装器 + LambdaQueryWrapper<MallDoctor> objectQueryWrapper = new LambdaQueryWrapper<>(); + // 根据会员ID进行精确查询 + objectQueryWrapper.eq(MallDoctor::getBindMemberId,memberId); + // 按创建时间降序排序 + objectQueryWrapper.orderByDesc(MallDoctor::getCreatedTime); + // 执行查询,获取医生列表 + List<MallDoctor> mallDoctors = mallDoctorMapper.selectList(objectQueryWrapper); + // 如果查询结果不为空,则遍历查询结果,封装医生信息 + if(CollUtil.isNotEmpty(mallDoctors)){ + for(MallDoctor mallDoctor : mallDoctors){ + ApiDoctorListVo apiDoctorListVo = new ApiDoctorListVo(); + apiDoctorListVo.setId(mallDoctor.getId()); + apiDoctorListVo.setStoreMemberId(mallDoctor.getStoreMemberId()); + MallMember mallMember = this.baseMapper.selectById(mallDoctor.getMemberId()); + apiDoctorListVo.setName(mallMember.getName()); + apiDoctorListVo.setPhone(mallDoctor.getBindPhone()); + apiDoctorListVo.setBindAge(mallDoctor.getBindAge()); + apiDoctorListVo.setBindInfo(mallDoctor.getBindInfo()); + apiDoctorListVo.setCreatedTime(mallDoctor.getCreatedTime()); + // 将封装好的医生信息添加到集合中 + apiDoctorListVos.add(apiDoctorListVo); + } + } + // 返回包含医生列表的响应对象 + return new FebsResponse().success().data(apiDoctorListVos); + } + + @Override + public FebsResponse authDel(ApiDoctorAuthDeleteDto dto) { + // 获取当前登录用户的ID + Long memberId = LoginUserUtil.getLoginUser().getId(); + + MallDoctor mallDoctor = mallDoctorMapper.selectById(dto.getId()); + if(!memberId.equals(mallDoctor.getBindMemberId())){ + throw new FebsException("当前授权无法删除!"); + } + mallDoctorMapper.deleteById(dto.getId()); + return new FebsResponse().success().message("操作成功"); + } + + @Override + public FebsResponse flowList(ApiMoneyFlowDto dto) { + Long id = LoginUserUtil.getLoginUser().getId(); + IPage<ApiMoneyFlowVo> page = new Page<>(dto.getPageNum(), dto.getPageSize()); + dto.setMemberId(id); + IPage<ApiMoneyFlowVo> pages = mallMoneyFlowMapper.selectFlowInPage(page, dto); + return new FebsResponse().success().data(pages); + } + + @Override + public FebsResponse flowHeader() { + // 获取当前登录用户的ID + Long memberId = LoginUserUtil.getLoginUser().getId(); + ApiMoneyFlowHeaderVo apiMoneyFlowHeaderVo = new ApiMoneyFlowHeaderVo(); + MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); + apiMoneyFlowHeaderVo.setBalance(mallMemberWallet.getBalance()); + apiMoneyFlowHeaderVo.setPrizeScore(mallMemberWallet.getPrizeScore()); + return new FebsResponse().success().data(apiMoneyFlowHeaderVo); + } + + @Override + public FebsResponse newGiftEvent() { + // 获取当前登录用户的ID + Long memberId = LoginUserUtil.getLoginUser().getId(); + + ApiMemberNewGiftSettingVo apiMemberNewGiftSettingVo = new ApiMemberNewGiftSettingVo(); + + MallMember mallMember = this.baseMapper.selectById(memberId); + + Integer newGift = mallMember.getNewGift(); + if(newGift == 0){ + apiMemberNewGiftSettingVo.setOpenState(1); + }else{ + apiMemberNewGiftSettingVo.setOpenState(0); + } + + DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + CommonDictionaryEnum.NEW_GIFT_SETTING.getType(), + CommonDictionaryEnum.NEW_GIFT_SETTING.getCode() + ); + ApiNewGiftSettingDto apiNewGiftSettingDto = JSONObject.parseObject(dic.getValue(), ApiNewGiftSettingDto.class); + apiMemberNewGiftSettingVo.setState(apiNewGiftSettingDto.getState()); + if(apiMemberNewGiftSettingVo.getState() == 1 && apiMemberNewGiftSettingVo.getOpenState() == 1){ + + mallMember.setNewGift(1); + + BigDecimal prizeScore = new BigDecimal(StrUtil.isBlank(apiNewGiftSettingDto.getPrizeScore()) ? "0" : apiNewGiftSettingDto.getPrizeScore()) + .setScale(0, RoundingMode.HALF_DOWN); + + if(prizeScore.compareTo(BigDecimal.ZERO) > 0){ + mallMoneyFlowService.addMoneyFlow( + memberId, + prizeScore, + ScoreFlowTypeEnum.NEW_GIFT_PRIZE_SCORE.getValue(), + MallUtils.getOrderNum(), + FlowTypeEnum.PRIZE_SCORE.getValue(), + StrUtil.format( ScoreFlowTypeEnum.NEW_GIFT_PRIZE_SCORE.getDesc(),prizeScore), + 2); + mallMemberWalletService.add(prizeScore,memberId , "prizeScore"); + + apiMemberNewGiftSettingVo.setPrizeScore(prizeScore); + } + + String couponUUID = IdUtil.simpleUUID(); + if(ObjectUtil.isNotEmpty(apiNewGiftSettingDto.getCouponId())){ + Long couponId = apiNewGiftSettingDto.getCouponId(); + MallGoodsCoupon mallGoodsCoupon = mallGoodsCouponMapper.selectById(couponId); + if(ObjectUtil.isNotEmpty(mallGoodsCoupon) && mallGoodsCoupon.getState() == 2){ + List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdCouponIdWithOutInviteId(memberId, couponId); + if(CollUtil.isEmpty(mallMemberCoupons)){ + //商品优惠卷如果绑定了,那么当前登陆者获取一张卷 + MallMemberCoupon mallMemberCoupon = new MallMemberCoupon(); + mallMemberCoupon.setCouponId(couponId); + mallMemberCoupon.setCouponName(mallGoodsCoupon.getName()); + mallMemberCoupon.setMemberId(memberId); + mallMemberCoupon.setCouponUuid(couponUUID); + mallMemberCoupon.setInviteId(mallMember.getInviteId()); + mallMemberCoupon.setState(1); + mallMemberCoupon.setExpireTime(DateUtil.offsetDay(DateUtil.date(),mallGoodsCoupon.getExpireDay())); + mallMemberCouponMapper.insert(mallMemberCoupon); + + mallMoneyFlowService.addMoneyFlow( + memberId, + BigDecimal.ONE, + ScoreFlowTypeEnum.NEW_GIFT_COUPON.getValue(), + MallUtils.getOrderNum(), + FlowTypeEnum.BALANCE.getValue(), + StrUtil.format( ScoreFlowTypeEnum.NEW_GIFT_COUPON.getDesc(),mallGoodsCoupon.getName()), + 2); + + apiMemberNewGiftSettingVo.setCouponName(mallGoodsCoupon.getName()); + } + } + } + } + + mallMember.setLastLoginTime(new Date()); + this.baseMapper.updateById(mallMember); + +// this.baseMapper.updateLastLoginTime(memberId,new Date()); + + return new FebsResponse().success().data(apiMemberNewGiftSettingVo); + } + + @Override + public FebsResponse getLabelList() { + + // 获取当前登录用户的ID + Long memberId = LoginUserUtil.getLoginUser().getId(); + + ArrayList<ApiMemberLabelVo> apiMemberLabelVos = new ArrayList<>(); + + List<HappyMemberLabelRecord> happyMemberLabelRecords = happyMemberLabelRecordMapper.selectList( + new LambdaQueryWrapper<HappyMemberLabelRecord>() + .eq(HappyMemberLabelRecord::getMemberId,memberId) + ); + if(CollUtil.isNotEmpty(happyMemberLabelRecords)){ + Set<Long> collect = happyMemberLabelRecords.stream().map(HappyMemberLabelRecord::getLabelId).collect(Collectors.toSet()); + List<HappyMemberLabel> happyMemberLabels = happyMemberLabelMapper.selectList( + new LambdaQueryWrapper<HappyMemberLabel>() + .select( HappyMemberLabel::getId, HappyMemberLabel::getCode,HappyMemberLabel::getIconPng, HappyMemberLabel::getName, HappyMemberLabel::getContent, HappyMemberLabel::getHeaderPng) + .in(HappyMemberLabel::getId, collect) + .orderByDesc(HappyMemberLabel::getCode) + ); + if(CollUtil.isNotEmpty(happyMemberLabels)){ + for (HappyMemberLabel happyMemberLabel : happyMemberLabels) { + ApiMemberLabelVo apiMemberLabelVo = new ApiMemberLabelVo(); + apiMemberLabelVo.setId(happyMemberLabel.getId()); + apiMemberLabelVo.setCode(happyMemberLabel.getCode()); + apiMemberLabelVo.setName(happyMemberLabel.getName()); + apiMemberLabelVo.setContent(happyMemberLabel.getContent()); + apiMemberLabelVo.setHeaderPng(happyMemberLabel.getHeaderPng()); + apiMemberLabelVo.setIconPng(happyMemberLabel.getIconPng()); + apiMemberLabelVos.add(apiMemberLabelVo); + } + } + } + + return new FebsResponse().success().data(apiMemberLabelVos); + } + + @Override + public FebsResponse getLabelListById(ApiMemberLabelInfoDto dto) { + // 获取当前登录用户的ID + Long memberId = LoginUserUtil.getLoginUser().getId(); + + List<ApiMemberLabelInfoVo> apiMemberLabelInfoVos = new ArrayList<>(); + + HappyMemberLabelRecord happyMemberLabelRecord = happyMemberLabelRecordMapper.selectOne( + Wrappers.lambdaQuery(HappyMemberLabelRecord.class) + .eq(HappyMemberLabelRecord::getMemberId, memberId) + .eq(HappyMemberLabelRecord::getLabelId, dto.getId()) + ); + if(ObjectUtil.isEmpty(happyMemberLabelRecord)){ + throw new FebsException("您没有该会员标签"); + } + HappyMemberLabel happyMemberLabel = happyMemberLabelMapper.selectById(dto.getId()); + if(ObjectUtil.isEmpty(happyMemberLabel)){ + throw new FebsException("您没有该会员标签"); + } + if(!ObjectUtil.equal(happyMemberLabel.getCode(),1)){ + throw new FebsException("没有查看权限"); + } + + List<HappyMemberLabel> happyMemberLabels = happyMemberLabelMapper.selectList( + Wrappers.lambdaQuery(HappyMemberLabel.class) + .eq(HappyMemberLabel::getParentId, dto.getId()) + ); + if(CollUtil.isNotEmpty(happyMemberLabels)){ + for (HappyMemberLabel happyMemberLabelItem : happyMemberLabels) { + ApiMemberLabelInfoVo apiMemberLabelInfoVo = new ApiMemberLabelInfoVo(); + + apiMemberLabelInfoVo.setId(happyMemberLabelItem.getId()); + apiMemberLabelInfoVo.setName(happyMemberLabelItem.getName()); + apiMemberLabelInfoVos.add(apiMemberLabelInfoVo); + } + } + + return new FebsResponse().success().data(apiMemberLabelInfoVos); + } + + @Override + public FebsResponse scoreRecord(ApiScoreRecordInfoDto dto) { + // 初始化结果列表 + List<ApiScoreRecordInfoVo> apiSaleRecordInfoVos = new ArrayList<>(); + + List<HappyMemberLabel> happyMemberLabels = happyMemberLabelMapper.selectList( + Wrappers.lambdaQuery(HappyMemberLabel.class) + .eq(HappyMemberLabel::getCode, 1) + .eq(HappyMemberLabel::getParentId, 0) + ); + if(CollUtil.isEmpty(happyMemberLabels)){ + return new FebsResponse().success().data(apiSaleRecordInfoVos); + } + + // 获取类型参数 + Integer type = dto.getType(); + // 校验类型参数,确保其为1(月)或2(周) + if (type == null || (type != 1 && type != 2 && type != 3)) { + return new FebsResponse().fail().message("非法的类型参数"); + } + DateTime startTime = DateUtil.beginOfMonth(new Date()); + if(1 == type){ + startTime = DateUtil.beginOfMonth(new Date()); + } + if(2 == type){ + startTime = DateUtil.beginOfWeek(new Date()); + } + if(3 == type){ + startTime = DateUtil.beginOfYear(new Date()); + } + + // 合并查询所有子标签 + Set<Long> parentIds = happyMemberLabels.stream() + .map(HappyMemberLabel::getId) + .collect(Collectors.toSet()); + + List<HappyMemberLabel> allChildLabels = happyMemberLabelMapper.selectList( + Wrappers.lambdaQuery(HappyMemberLabel.class) + .in(HappyMemberLabel::getParentId, parentIds) + ); + + Map<Long, List<HappyMemberLabel>> childLabelMap = new HashMap<>(); + if (CollUtil.isNotEmpty(allChildLabels)) { + childLabelMap = allChildLabels.stream() + .collect(Collectors.groupingBy(HappyMemberLabel::getParentId)); + } + + // 提取所有子标签 ID + Set<Long> labelIds = allChildLabels.stream() + .map(HappyMemberLabel::getId) + .collect(Collectors.toSet()); + + // 获取所有绑定关系 + List<HappyMemberLabelRecord> labelRecords = CollUtil.isEmpty(labelIds) ? Collections.emptyList() : + happyMemberLabelRecordMapper.selectList( + Wrappers.lambdaQuery(HappyMemberLabelRecord.class) + .in(HappyMemberLabelRecord::getLabelId, labelIds) + ); + + Map<Long, Set<Long>> labelToMembersMap = new HashMap<>(); + if (CollUtil.isNotEmpty(labelRecords)) { + labelToMembersMap = labelRecords.stream() + .collect(Collectors.groupingBy( + HappyMemberLabelRecord::getLabelId, + Collectors.mapping(HappyMemberLabelRecord::getMemberId, Collectors.toSet()) + )); + } + + Set<Long> memberIds = labelToMembersMap.values().stream() + .flatMap(Set::stream) + .collect(Collectors.toSet()); + + // 获取资金流 + List<MallMoneyFlow> moneyFlows = CollUtil.isEmpty(memberIds) ? Collections.emptyList() : + mallMoneyFlowMapper.selectList( + Wrappers.lambdaQuery(MallMoneyFlow.class) + .select(MallMoneyFlow::getAmount, MallMoneyFlow::getMemberId) + .in(MallMoneyFlow::getMemberId, memberIds) + .eq(MallMoneyFlow::getFlowType, FlowTypeEnum.PRIZE_SCORE.getValue()) + .gt(MallMoneyFlow::getAmount, BigDecimal.ZERO) + .ge(MallMoneyFlow::getCreatedTime, startTime) + ); + + Map<Long, BigDecimal> memberScoreMap = new HashMap<>(); + if (CollUtil.isNotEmpty(moneyFlows)) { + memberScoreMap = moneyFlows.stream() + .collect(Collectors.groupingBy( + MallMoneyFlow::getMemberId, + Collectors.mapping(MallMoneyFlow::getAmount, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)) + )); + } + + List<CompletableFuture<ApiScoreRecordInfoVo>> futures = new ArrayList<>(); + + Map<Long, List<HappyMemberLabel>> finalChildLabelMap = childLabelMap; + Map<Long, Set<Long>> finalLabelToMembersMap = labelToMembersMap; + Map<Long, BigDecimal> finalMemberScoreMap = memberScoreMap; + happyMemberLabels.forEach(item -> { + CompletableFuture<ApiScoreRecordInfoVo> uCompletableFuture = CompletableFuture.supplyAsync(() -> { + ApiScoreRecordInfoVo vo = new ApiScoreRecordInfoVo(); + vo.setName(item.getName()); + vo.setAvatar(item.getIconPng()); + vo.setScore(BigDecimal.ZERO); + + List<HappyMemberLabel> children = finalChildLabelMap.getOrDefault(item.getId(), Collections.emptyList()); + if (CollUtil.isEmpty(children)) { + return vo; + } + + Set<Long> childIds = children.stream().map(HappyMemberLabel::getId).collect(Collectors.toSet()); + Set<Long> members = new HashSet<>(); + for (Long childId : childIds) { + Set<Long> ids = finalLabelToMembersMap.getOrDefault(childId, Collections.emptySet()); + members.addAll(ids); + } + + if (CollUtil.isEmpty(members)) { + return vo; + } + + BigDecimal total = BigDecimal.ZERO; + for (Long memberId : members) { + total = total.add(finalMemberScoreMap.getOrDefault(memberId, BigDecimal.ZERO)); + } + vo.setScore(total.setScale(0, RoundingMode.DOWN)); + return vo; + }, febsConfigure.asyncThreadPoolTaskExecutor()).exceptionally(ex -> { + // 异常兜底返回默认值 + ApiScoreRecordInfoVo vo = new ApiScoreRecordInfoVo(); + vo.setName(item.getName()); + vo.setAvatar(item.getIconPng()); + vo.setScore(BigDecimal.ZERO); + return vo; + }); + + futures.add(uCompletableFuture); + }); + // 等待所有任务完成 + CompletableFuture<Void> allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + allOf.join(); // 阻塞直到所有任务完成 + + //等任务结束,获取返回结果 + apiSaleRecordInfoVos = futures.stream() + .map(CompletableFuture::join) + .sorted(Comparator.comparing(ApiScoreRecordInfoVo::getScore).reversed()) + .collect(Collectors.toList()); + + + // 返回成功响应,包含销售记录信息 + return new FebsResponse().success().data(apiSaleRecordInfoVos); + } + + @Override + public FebsResponse getMemberLabelListById(ApiMemberLabelItemDto dto) { + + // 获取当前登录用户的ID + Long memberId = LoginUserUtil.getLoginUser().getId(); + + List<ApiMemberLabelItemVo> apiMemberLabelItemVos = new ArrayList<>(); + + Integer labelId = dto.getLabelId(); + List<HappyMemberLabelRecord> happyMemberLabelRecords = happyMemberLabelRecordMapper.selectList( + Wrappers.lambdaQuery(HappyMemberLabelRecord.class) + .eq(HappyMemberLabelRecord::getLabelId, labelId) + ); + if(CollUtil.isNotEmpty(happyMemberLabelRecords)){ + + //stream流操作happyMemberLabelRecords,返回memberId的set集合 + Set<Long> memberIdSet = happyMemberLabelRecords.stream().map(HappyMemberLabelRecord::getMemberId).collect(Collectors.toSet()); + List<MallMember> mallMembers = this.baseMapper.selectList( + Wrappers.lambdaQuery(MallMember.class) + .select(MallMember::getId, MallMember::getName, MallMember::getPhone, MallMember::getAvatar) + .in(MallMember::getId, memberIdSet) + .eq(MallMember::getAccountStatus, MallMember.ACCOUNT_STATUS_ENABLE) + ); + + List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList( + Wrappers.lambdaQuery(MallMoneyFlow.class) + .select(MallMoneyFlow::getAmount, MallMoneyFlow::getMemberId) + .in(MallMoneyFlow::getMemberId, memberIdSet) + .eq(MallMoneyFlow::getFlowType, FlowTypeEnum.PRIZE_SCORE.getValue()) + .gt(MallMoneyFlow::getAmount, BigDecimal.ZERO) + ); + //stream流操作mallMoneyFlows,返回一个map<Long,BigDecimal>,其中key为memberId,value为mallMoneyFlow的memberId等于key的amount的总和 + Map<Long, BigDecimal> prizeScoreMap = mallMoneyFlows.stream() + .filter(Objects::nonNull) // 防止 MallMoneyFlow 为 null + .collect(Collectors.groupingBy( + MallMoneyFlow::getMemberId, + Collectors.mapping( + MallMoneyFlow::getAmount, + Collectors.reducing(BigDecimal.ZERO, BigDecimal::add) + ) + )); + for (MallMember mallMember : mallMembers){ + ApiMemberLabelItemVo apiMemberLabelItemVo = new ApiMemberLabelItemVo(); + apiMemberLabelItemVo.setName(mallMember.getName()); + apiMemberLabelItemVo.setAvatar(mallMember.getAvatar()); + apiMemberLabelItemVo.setPhone(mallMember.getPhone()); + apiMemberLabelItemVo.setScore(prizeScoreMap.get(mallMember.getId()).setScale(0,RoundingMode.DOWN)); + apiMemberLabelItemVos.add(apiMemberLabelItemVo); + } + } + + return new FebsResponse().success().data(apiMemberLabelItemVos); + } + + @Override + public FebsResponse addLabelMember(ApiMemberLabelAddDto dto) { + + // 获取当前登录用户的ID + Long memberId = LoginUserUtil.getLoginUser().getId(); + + ApiMemberLabelAddVo apiMemberLabelAddVo = new ApiMemberLabelAddVo(); + + Integer labelId = dto.getLabelId(); + String phone = dto.getPhone(); + + List<MallMember> mallMembers = this.baseMapper.selectList( + Wrappers.lambdaQuery(MallMember.class) + .eq(MallMember::getPhone, phone) + ); + if(CollUtil.isEmpty(mallMembers)){ + throw new FebsException("未查询到用户"); + } + + MallMember mallMember = mallMembers.get(0); + apiMemberLabelAddVo.setMemberId(mallMember.getId()); + apiMemberLabelAddVo.setName(mallMember.getName()); + apiMemberLabelAddVo.setPhone(mallMember.getPhone()); + + HappyMemberLabel happyMemberLabel = happyMemberLabelMapper.selectById(labelId); + apiMemberLabelAddVo.setLabelId(happyMemberLabel.getId()); + apiMemberLabelAddVo.setLabelName(happyMemberLabel.getName()); + + //获取会员标签 + Integer integer = happyMemberLabelRecordMapper.selectCount( + Wrappers.lambdaQuery(HappyMemberLabelRecord.class) + .eq(HappyMemberLabelRecord::getMemberId, mallMember.getId()) + .eq(HappyMemberLabelRecord::getLabelId, labelId) + ); + if(integer > 0){ + apiMemberLabelAddVo.setState(0); + }else{ + apiMemberLabelAddVo.setState(1); + } + return new FebsResponse().success().data(apiMemberLabelAddVo); + } + + @Override + public FebsResponse insureLabelMember(ApiMemberLabelInsureDto dto) { + + // 获取当前登录用户的ID + Long memberId = LoginUserUtil.getLoginUser().getId(); + Long labelId = dto.getLabelId(); + Long insureMemberId = dto.getMemberId(); + + HappyMemberLabel happyMemberLabel = happyMemberLabelMapper.selectById(labelId); + if(ObjectUtil.isEmpty(happyMemberLabel)){ + throw new FebsException("会员标签不存在"); + } + if(happyMemberLabel.getParentId() == 0){ + throw new FebsException("会员标签不存在"); + } + + Long parentId = happyMemberLabel.getParentId(); + HappyMemberLabel happyMemberLabelParent = happyMemberLabelMapper.selectById(parentId); + if(ObjectUtil.isEmpty(happyMemberLabelParent)){ + throw new FebsException("会员标签不存在"); + } + if(happyMemberLabelParent.getCode() != 1){ + throw new FebsException("权限不足"); + } + + List<HappyMemberLabelRecord> happyMemberLabelRecordsParent = happyMemberLabelRecordMapper.selectList( + Wrappers.lambdaQuery(HappyMemberLabelRecord.class) + .eq(HappyMemberLabelRecord::getMemberId, memberId) + .eq(HappyMemberLabelRecord::getLabelId, parentId) + ); + if(ObjectUtil.isEmpty(happyMemberLabelRecordsParent)){ + throw new FebsException("权限不足"); + } + + + List<HappyMemberLabelRecord> happyMemberLabelRecords = happyMemberLabelRecordMapper.selectList( + Wrappers.lambdaQuery(HappyMemberLabelRecord.class) + .eq(HappyMemberLabelRecord::getMemberId, insureMemberId) + .eq(HappyMemberLabelRecord::getLabelId, labelId) + ); + if(CollUtil.isEmpty(happyMemberLabelRecords)){ + HappyMemberLabelRecord happyMemberLabelRecord = new HappyMemberLabelRecord(); + happyMemberLabelRecord.setMemberId(insureMemberId); + happyMemberLabelRecord.setLabelId(labelId); + happyMemberLabelRecordMapper.insert(happyMemberLabelRecord); + } + + return new FebsResponse().success().message("操作成功"); + } + +// public static void main(String[] args) { +// Long userld = 16425L; +// String shopAccount = "爱和美医疗"; +// String shopPwd = "blnka2005"; +// +// HashMap<String, String> objectObjectHashMap = new HashMap<>(); +// +// objectObjectHashMap.put("shopAccount",shopAccount); +// objectObjectHashMap.put("shopPwd",shopPwd); +// objectObjectHashMap.put("userId",userld.toString()); +// +// //sign= MD5(shopAccount+shopPwd+userId) +// StringBuffer stringBuffer = new StringBuffer(); +// stringBuffer.append(shopAccount); +// stringBuffer.append(shopPwd); +// stringBuffer.append(userld); +// String sign = MD5.MD5Encode(stringBuffer.toString()); +// objectObjectHashMap.put("sign",sign); +// +// System.out.println(sign); +// +// System.out.println(objectObjectHashMap); +// String url = "https://data.muchun.co/api/getCustomerCheckRecords"; +// String result = HttpCurlUtil.sendPost(url, objectObjectHashMap); +// Integer retCode = JSONUtil.parseObj(result).getInt("retCode"); +// String message = JSONUtil.parseObj(result).getStr("message"); +// if(0 != retCode){ +// System.out.println(message); +// } +// +// JSONArray data = JSONUtil.parseObj(result).getJSONArray("data"); +// System.out.println(data); +// } + + } -- Gitblit v1.9.1