package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.entity.FebsResponse; 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.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.*; import cc.mrbird.febs.mall.vo.*; 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.rabbit.producter.AgentProducer; 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; import cn.hutool.core.util.StrUtil; 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.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.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.stream.Collectors; /** * @author wzy * @date 2021-09-16 **/ @Slf4j @Service @RequiredArgsConstructor public class ApiMallMemberServiceImpl extends ServiceImpl implements IApiMallMemberService { private final MallMemberWalletMapper mallMemberWalletMapper; private final ICommonService commonService; private final RedisUtils redisUtils; private final MallOrderInfoMapper mallOrderInfoMapper; private final MallShoppingCartMapper mallShoppingCartMapper; private final MallMoneyFlowMapper mallMoneyFlowMapper; private final IApiMallMemberWalletService walletService; private final MallMemberPaymentMapper mallMemberPaymentMapper; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final MallShopApplyMapper mallShopApplyMapper; private final MallRegisterAppealMapper mallRegisterAppealMapper; private final MallTeamLeaderMapper mallTeamLeaderMapper; private final MallAgentRecordMapper mallAgentRecordMapper; private final IMallMoneyFlowService mallMoneyFlowService; private final IMallMemberCollectionService mallMemberCollectionService; private final IMallMemberFootprintService mallMemberFootprintService; private final SalemanCouponMapper salemanCouponMapper; private final CouponGoodsMapper couponGoodsMapper; private final MallGoodsCouponMapper mallGoodsCouponMapper; private final MallMemberCouponMapper mallMemberCouponMapper; private final MallGoodsMapper mallGoodsMapper; private final MallChargeMapper mallChargeMapper; private final MallVipConfigMapper mallVipConfigMapper; private final RunVipMapper runVipMapper; private final MallStoreMapper mallStoreMapper; private final MallStoreItemMapper mallStoreItemMapper; private final MallStoreMemberMapper mallStoreMemberMapper; private final MallMemberWithdrawMapper mallMemberWithdrawMapper; private final AgentProducer agentProducer; @Value("${spring.profiles.active}") private String active; @Transactional(rollbackFor = Exception.class) @Override public FebsResponse register(RegisterDto registerDto) { String account = registerDto.getAccount(); MallMember mallMember = this.baseMapper.selectInfoByAccount(account); if (mallMember != null) { throw new FebsException("手机号已注册"); } /** * 验证两次密码是否一致 */ String password = registerDto.getPassword(); String passwordAgain = registerDto.getPasswordAgain(); if(!password.equals(passwordAgain)){ throw new FebsException("密码不一致"); } //邀请码为admin的时候(后台添加用户),不需要验证验证码 if (!"admin".equals(registerDto.getRegistType())) { String code = registerDto.getCode(); boolean flags = commonService.verifyCode(account, code); if (!flags) { throw new FebsException("验证码错误"); } } mallMember = new MallMember(); mallMember.setPassword(SecureUtil.md5(registerDto.getPassword())); // 判断账号类型 if (AppContants.ACCOUNT_TYPE_MOBILE.equals(registerDto.getType())) { mallMember.setPhone(registerDto.getAccount()); } else { mallMember.setEmail(registerDto.getAccount()); } //对于邀请码的验证和上级联系人的验证 Integer count = this.baseMapper.selectCount(null); if (count != null && count != 0) { if(StrUtil.isEmpty(registerDto.getInviteId())){ throw new FebsException("请输入邀请码"); } String inviteId = registerDto.getInviteId(); MallMember inviteMember = this.baseMapper.selectInfoByInviteId(inviteId); if (inviteMember == null) { throw new FebsException("邀请码不存在"); } mallMember.setReferrerId(registerDto.getInviteId()); // if(!StrUtil.isEmpty(registerDto.getInviteId())){ // String inviteId = registerDto.getInviteId(); // MallMember inviteMember = this.baseMapper.selectInfoByInviteId(inviteId); // if (inviteMember == null) { // throw new FebsException("邀请码不存在"); // } // mallMember.setReferrerId(registerDto.getInviteId()); // } } mallMember.setName(account); mallMember.setAvatar("https://res.runstep.cc/rslogo.png"); mallMember.setAccountStatus(YesOrNoEnum.YES.getValue()); mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL); mallMember.setSex("男"); mallMember.setDirector(YesOrNoEnum.NO.getValue()); mallMember.setDirectorTime(DateUtil.date()); mallMember.setBindPhone(account); this.baseMapper.insert(mallMember); String inviteId = ShareCodeUtil.toSerialCode(mallMember.getId()); mallMember.setInviteId(inviteId); //推荐人和推荐人链 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); } //会员VIP等级 List runVips = runVipMapper.selectList(new LambdaQueryWrapper().orderByAsc(RunVip::getOrderNumber)); if (StrUtil.isBlank(mallMember.getLevel()) && CollUtil.isNotEmpty(runVips)) { RunVip runVip = runVips.get(0); mallMember.setLevel(runVip.getVipCode()); } this.baseMapper.updateById(mallMember); MallMemberWallet wallet = new MallMemberWallet(); wallet.setBalance(BigDecimal.ZERO); wallet.setMemberId(mallMember.getId()); mallMemberWalletMapper.insert(wallet); agentProducer.sendNodeUpMsg(mallMember.getId()); return new FebsResponse().success().message("注册成功"); } @Override public FebsResponse toLogin(LoginDto loginDto) { String md5Pwd = SecureUtil.md5(loginDto.getPassword()); MallMember mallMember = this.baseMapper.selectInfoByAccountAndPwd(loginDto.getAccount(), md5Pwd); if (mallMember == null) { throw new FebsException("用户不存在或账号密码错误"); } if (YesOrNoEnum.NO.getValue() == mallMember.getAccountStatus()) { throw new FebsException("账号限制登录"); } String redisKey = AppContants.APP_LOGIN_PREFIX + mallMember.getId(); String existToken = redisUtils.getString(redisKey); if (StrUtil.isNotBlank(existToken)) { Object o = redisUtils.get(existToken); if (ObjectUtil.isNotEmpty(o)) { redisUtils.del(existToken); } } String token = IdUtil.simpleUUID(); redisUtils.set(token, JSONObject.toJSONString(mallMember), 360000); redisUtils.set(redisKey, token, 360000); Map authInfo = new HashMap<>(); authInfo.put("token", token); authInfo.put("rasToken", generateAsaToken(token)); return new FebsResponse().success().data(authInfo); } public String generateAsaToken(String token) { RSA rsa = new RSA(null, AppContants.PUBLIC_KEY); // return rsa.encryptBase64(token + "_" + System.currentTimeMillis(), KeyType.PublicKey); //去掉时间戳 return rsa.encryptBase64(token, KeyType.PublicKey); } @Override public FebsResponse forgetPwd(ForgetPwdDto forgetPwdDto) { MallMember mallMember = this.baseMapper.selectInfoByAccount(forgetPwdDto.getAccount()); if (mallMember == null) { throw new FebsException("账号不存在"); } boolean b = commonService.verifyCode(forgetPwdDto.getAccount(), forgetPwdDto.getCode()); if (!b) { throw new FebsException("验证码错误"); } String pwd = SecureUtil.md5(forgetPwdDto.getPassword()); mallMember.setPassword(pwd); this.baseMapper.updateById(mallMember); return new FebsResponse().success().message("重置成功"); } @Override public FebsResponse logout() { Long id = LoginUserUtil.getLoginUser().getId(); String redisKey = AppContants.APP_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.APP_LOGIN_PREFIX + id); redisUtils.del(AppContants.XCX_LOGIN_PHONE_PREFIX + id); return new FebsResponse().success().message("退出登录"); } @Override public FebsResponse findMemberInfo() { Long id = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectById(id); MallMemberVo mallMemberVo = MallMemberConversion.INSTANCE.entityToVo(mallMember); mallMemberVo.setTradeWord(StrUtil.isEmpty(mallMember.getTradePassword()) ? YesOrNoEnum.NO.getValue() : YesOrNoEnum.YES.getValue()); RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper().eq(RunVip::getVipCode, mallMemberVo.getLevel())); mallMemberVo.setLevelName(runVip.getVipName()); mallMemberVo.setLevelPng(runVip.getVipPng()); mallMemberVo.setChangeState(runVip.getChangeState()); mallMemberVo.setWithdrawState(runVip.getWithdrawState()); mallMemberVo.setInsideState(runVip.getInsideState()); mallMemberVo.setCommissionState(runVip.getCommissionState()); mallMemberVo.setGrowState(runVip.getGrowState()); MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(mallMemberVo.getId()); mallMemberVo.setBalance(wallet.getBalance()); mallMemberVo.setScore(wallet.getScore()); mallMemberVo.setCommission(wallet.getCommission()); return new FebsResponse().success().data(mallMemberVo); } private BigDecimal getDirectAchieve(String inviteId,Date startTime,Date endTime) { try { // 获取直推成员和团队成员的ID集合 Set memberIds = getTeamMemberIds(inviteId); if (CollUtil.isEmpty(memberIds)) { return BigDecimal.ZERO; } // 获取团队业绩(不包含本人业绩) List mallCharges = mallChargeMapper.selectList( new LambdaQueryWrapper() .in(MallCharge::getMemberId, memberIds) .eq(MallCharge::getState, YesOrNoEnum.YES.getValue()) .ge(MallCharge::getCreatedTime, startTime) .lt(MallCharge::getCreatedTime, endTime) ); if (CollUtil.isEmpty(mallCharges)) { return BigDecimal.ZERO; } return mallCharges.stream() .map(MallCharge::getAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); } catch (Exception e) { // 异常处理 log.error("Error occurred while calculating direct achieve for member: {}", inviteId, e); return BigDecimal.ZERO; } } private Set getTeamMemberIds(String inviteId) { Set memberIds = new HashSet<>(); // 获取直推成员 List directMembers = this.baseMapper.selectList( new LambdaQueryWrapper() .eq(MallMember::getReferrerId, inviteId) ); if(CollUtil.isEmpty(directMembers)){ return memberIds; } memberIds.addAll(directMembers.stream().map(MallMember::getId).collect(Collectors.toSet())); // 获取团队成员 List teamMembers = this.baseMapper.selectList( new LambdaQueryWrapper() .in(MallMember::getReferrerId, directMembers.stream().map(MallMember::getInviteId).collect(Collectors.toSet())) ); if(CollUtil.isEmpty(teamMembers)){ return memberIds; } memberIds.addAll(teamMembers.stream().map(MallMember::getId).collect(Collectors.toSet())); return memberIds; } @Override public FebsResponse findMemberMarkCnt() { Long id = LoginUserUtil.getLoginUser().getId(); List> maps = mallOrderInfoMapper.selectMemberOrderStatusCnt(id); Map orderCnt = new HashMap<>(); if (CollUtil.isNotEmpty(maps)) { for (Map map : maps) { orderCnt.put(map.get("status"), map.get("cnt")); } } List carts = mallShoppingCartMapper.selectCartGoodsList(id, 1); Map result = new HashMap<>(); result.put("order", orderCnt); result.put("carts", carts.size()); return new FebsResponse().success().data(result); } @Override public FebsResponse setTradePwd(ForgetPwdDto forgetPwdDto) { MallMember memberId = LoginUserUtil.getLoginUser(); MallMember mallMember = this.baseMapper.selectById(memberId); if (mallMember == null) { throw new FebsException("账号不存在"); } boolean b = commonService.verifyCode(forgetPwdDto.getAccount(), forgetPwdDto.getCode()); if (!b) { throw new FebsException("验证码错误"); } mallMember.setTradePassword(SecureUtil.md5(forgetPwdDto.getPassword())); this.baseMapper.updateById(mallMember); return new FebsResponse().success().message("设置成功"); } @Override public FebsResponse modifyMemberInfo(ModifyMemberInfoDto modifyMemberInfoDto) { MallMember member = LoginUserUtil.getLoginUser(); MallMember mallMember = this.baseMapper.selectById(member.getId()); if (StrUtil.isNotBlank(modifyMemberInfoDto.getName())) { mallMember.setName(modifyMemberInfoDto.getName()); } if (StrUtil.isNotBlank(modifyMemberInfoDto.getPhoto())) { mallMember.setAvatar(modifyMemberInfoDto.getPhoto()); } this.baseMapper.updateNameAndAvatar(member.getId(),modifyMemberInfoDto.getName(),modifyMemberInfoDto.getPhoto()); return new FebsResponse().success().message("修改成功"); } @Override public FebsResponse teamList(TeamListDto teamListDto) { Long memberId = null; if (teamListDto.getId() == null) { memberId = LoginUserUtil.getLoginUser().getId(); } else { memberId = teamListDto.getId(); } MallMember mallMember = this.baseMapper.selectById(memberId); /** * 直属三级 */ MyTeamVo myTeamVo = new MyTeamVo(); //节点和团队业绩 myTeamVo.setDirector(mallMember.getDirector()); if(mallMember.getDirector() == YesOrNoEnum.YES.getValue() && mallMember.getDirectorTime() != null){ myTeamVo.setDirectorTime(mallMember.getDirectorTime()); BigDecimal directAchieve = getDirectAchieve(mallMember.getInviteId(), mallMember.getDirectorTime(), DateUtil.date()); myTeamVo.setDirectorAchieve(directAchieve); }else{ myTeamVo.setDirectorTime(mallMember.getCreatedTime()); BigDecimal directAchieve = getDirectAchieve(mallMember.getInviteId(), mallMember.getCreatedTime(), DateUtil.date()); myTeamVo.setDirectorAchieve(directAchieve); } //获取个人的碳币 MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); myTeamVo.setMyBalance(mallMemberWallet.getBalance()); myTeamVo.setMyCommission(mallMemberWallet.getCommission()); //全部直推 List mallMembers = this.baseMapper.selectByRefererId(mallMember.getInviteId()); /** * 如果没有下级,那么直接返回当前用户的信息 */ if(CollUtil.isEmpty(mallMembers)){ myTeamVo.setMyTeamCnt(0); myTeamVo.setMyTeamBalance(BigDecimal.ZERO); myTeamVo.setMyTeamCommission(BigDecimal.ZERO); myTeamVo.setTeam(null); return new FebsResponse().success().data(myTeamVo); } /** * 如果有下级,获取所有的团队 */ myTeamVo.setMyTeamCnt(mallMembers.size()); myTeamVo.setMyTeamBalance(getTeamBalance(mallMembers).getMyTeamBalance()); myTeamVo.setMyTeamCommission(getTeamBalance(mallMembers).getMyTeamCommission()); List teamListVos = MallMemberConversion.INSTANCE.entityToTeamListVos(mallMembers); teamListVos.forEach(item -> { item.setMyBalance(mallMemberWalletMapper.selectWalletByMemberId(item.getId()).getBalance()); item.setLevelName(runVipMapper.selectOne(new LambdaQueryWrapper().eq(RunVip::getVipCode,item.getLevel())).getVipName()); List mallMemberRefs = this.baseMapper.selectByRefererId(item.getInviteId()); if(CollUtil.isEmpty(mallMemberRefs)){ item.setMyTeamCnt(0); item.setMyTeamBalance(BigDecimal.ZERO); item.setMyTeamCommission(BigDecimal.ZERO); }else{ item.setMyTeamCnt(mallMemberRefs.size()); //获取mallMembers的所有id item.setMyTeamBalance(getTeamBalance(mallMemberRefs).getMyTeamBalance()); item.setMyTeamCommission(getTeamBalance(mallMemberRefs).getMyTeamCommission()); } }); myTeamVo.setTeam(teamListVos); return new FebsResponse().success().data(myTeamVo); } /** * 获取团队余额 * 该方法计算一组商城成员的总余额 * 它首先提取成员ID,然后查询这些成员的钱包信息,并计算钱包余额的总和 * * @param mallMembers 商城成员列表,用于计算总余额 * @return 团队的总余额,表示为BigDecimal类型 */ private TeamListVo getTeamBalance(List mallMembers) { TeamListVo teamListVo = new TeamListVo(); // 提取所有商城成员的ID,以便进行后续的钱包信息查询 List ids = mallMembers.stream().map(MallMember::getId).collect(Collectors.toList()); // 根据成员ID列表查询所有相关成员的钱包信息 List mallMemberWallets = mallMemberWalletMapper.selectList(new LambdaQueryWrapper().in(MallMemberWallet::getMemberId, ids)); // 计算所有成员钱包余额的总和,并返回该总和 teamListVo.setMyTeamBalance(mallMemberWallets.stream().map(MallMemberWallet::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add)); teamListVo.setMyTeamCommission(mallMemberWallets.stream().map(MallMemberWallet::getCommission).reduce(BigDecimal.ZERO, BigDecimal::add)); return teamListVo; } @Override public MyTeamVo teamListForMine(TeamListDto teamListDto) { return null; } @Override public FebsResponse moneyFlows(MoneyFlowDto moneyFlowDto) { IPage page = new Page<>(moneyFlowDto.getPageNum(), moneyFlowDto.getPageSize()); Long id = LoginUserUtil.getLoginUser().getId(); moneyFlowDto.setMemberId(id); IPage pages = mallMoneyFlowMapper.selectApiMoneyFlowInPage(page, moneyFlowDto); return new FebsResponse().success().data(pages); } @Override public void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, String description, String remark, Long rtMemberId, Integer status, Integer flowType) { MallMoneyFlow flow = new MallMoneyFlow(); flow.setMemberId(memberId); flow.setAmount(amount); flow.setType(type); flow.setOrderNo(orderNo); flow.setDescription(description); flow.setRemark(remark); flow.setRtMemberId(rtMemberId); flow.setStatus(status); flow.setFlowType(flowType); mallMoneyFlowMapper.insert(flow); } /** * 处理VIP资金流水添加操作 * 此方法用于在会员进行充值或扣费活动时,记录相应的资金流水信息 * * @param memberId 会员ID,标识进行资金操作的会员 * @param rtMemberId 实体会员ID,用于关联现实中的会员身份 * @param orderNo 订单编号,用于跟踪资金流水的来源订单 * @param flowType 流水类型,指示资金流入或流出 * @param type 交易类型,区分不同的交易场景 * @param amount 金额,本次操作涉及的资金量 * @param description 描述,简述本次资金操作的原因或场景 * @param status 状态,表示资金操作的当前状态 */ @Override public void runVipMoneyFlowAdd(Long memberId, Long rtMemberId, String orderNo,Integer flowType, Integer type, BigDecimal amount, String description, Integer status) { // 创建一个新的商城资金流水对象 MallMoneyFlow flow = new MallMoneyFlow(); // 设置资金流水的各项属性 flow.setMemberId(memberId); flow.setRtMemberId(rtMemberId); flow.setOrderNo(orderNo); flow.setFlowType(flowType); flow.setType(type); flow.setAmount(amount); flow.setDescription(description); flow.setStatus(status); // 插入资金流水记录到数据库 mallMoneyFlowMapper.insert(flow); } @Override @Transactional(rollbackFor = Exception.class) public void transfer(TransferDto transferDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectInfoByAccount(transferDto.getAccount()); if (mallMember == null) { throw new FebsException("用户不存在"); } MallMember loginMember = this.baseMapper.selectById(memberId); /** * 用户的等级level是否允许兑换碳币 */ RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper().eq(RunVip::getVipCode, loginMember.getLevel())); if(ObjectUtil.isEmpty(runVip) || runVip.getInsideState() != YesOrNoEnum.YES.getValue()){ throw new FebsException("请先升级会员"); } if (loginMember.getPhone().equals(transferDto.getAccount()) || loginMember.getInviteId().equals(transferDto.getAccount())) { throw new FebsException("不能给自己转账"); } if (StrUtil.isBlank(loginMember.getTradePassword())) { throw new FebsException("未设置资金密码"); } if (!loginMember.getTradePassword().equals(SecureUtil.md5(transferDto.getTradePwd()))) { throw new FebsException("资金密码错误"); } walletService.reduceCommission(transferDto.getAmount(), loginMember.getId()); String orderNo = MallUtils.getOrderNum("HZ"); this.runVipMoneyFlowAdd( loginMember.getId(), mallMember.getId(), orderNo, FlowTypeEnum.COMMISSION.getValue(), RunVipMoneyFlowTypeEnum.COMMISSION_OUT_GIVE_FRIEND.getValue(), transferDto.getAmount().negate(), StrUtil.format(RunVipMoneyFlowTypeEnum.COMMISSION_OUT_GIVE_FRIEND.getDescription(),mallMember.getInviteId(),transferDto.getAmount()), YesOrNoEnum.YES.getValue() ); walletService.addCommission(transferDto.getAmount(), mallMember.getId()); this.runVipMoneyFlowAdd( mallMember.getId(), loginMember.getId(), orderNo, FlowTypeEnum.COMMISSION.getValue(), RunVipMoneyFlowTypeEnum.COMMISSION_IN_GIVE_FRIEND.getValue(), transferDto.getAmount(), StrUtil.format(RunVipMoneyFlowTypeEnum.COMMISSION_IN_GIVE_FRIEND.getDescription(),loginMember.getInviteId(),transferDto.getAmount()), YesOrNoEnum.YES.getValue() ); } @Override @Transactional(rollbackFor = Exception.class) public void withdrawal(CommissionChangeDto withdrawalDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember loginMember = this.baseMapper.selectById(memberId); /** * 用户的等级level是否允许兑换碳币 */ RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper().eq(RunVip::getVipCode, loginMember.getLevel())); if(ObjectUtil.isEmpty(runVip) || runVip.getWithdrawState() != YesOrNoEnum.YES.getValue()){ throw new FebsException("请先升级会员"); } if (StrUtil.isBlank(loginMember.getTradePassword())) { throw new FebsException("未设置资金密码"); } if (!loginMember.getTradePassword().equals(SecureUtil.md5(withdrawalDto.getTradePwd()))) { throw new FebsException("资金密码错误"); } BigDecimal minCnt = new BigDecimal( dataDictionaryCustomMapper.selectDicDataByTypeAndCode( RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_MIN.getType(), RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_MIN.getCode()).getValue() ).setScale(4, RoundingMode.DOWN); if(minCnt.compareTo(withdrawalDto.getAmount()) > 0){ throw new FebsException(minCnt+"碳币起提"); } BigDecimal balanceToCoin = new BigDecimal( dataDictionaryCustomMapper.selectDicDataByTypeAndCode( RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getType(), RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getCode()).getValue() ).setScale(2, RoundingMode.DOWN); BigDecimal withdrawalAmount = withdrawalDto.getAmount().multiply(balanceToCoin).setScale(2, RoundingMode.DOWN); if(BigDecimal.ZERO.compareTo(withdrawalAmount) >= 0){ throw new FebsException("转换异常"); } /** * 减少碳币 */ walletService.reduceBalance(withdrawalDto.getAmount(), loginMember.getId()); String orderNo = MallUtils.getOrderNum("BU"); this.runVipMoneyFlowAdd( loginMember.getId(), loginMember.getId(), orderNo, FlowTypeEnum.BALANCE.getValue(), RunVipMoneyFlowTypeEnum.BALANCE_OUT_COMMISSION.getValue(), withdrawalDto.getAmount().negate(), StrUtil.format(RunVipMoneyFlowTypeEnum.BALANCE_OUT_COMMISSION.getDescription(),withdrawalDto.getAmount(),withdrawalAmount), YesOrNoEnum.YES.getValue() ); walletService.addCommission(withdrawalAmount, loginMember.getId()); this.runVipMoneyFlowAdd( loginMember.getId(), loginMember.getId(), orderNo, FlowTypeEnum.COMMISSION.getValue(), RunVipMoneyFlowTypeEnum.BALANCE_OUT_COMMISSION_IN.getValue(), withdrawalAmount, StrUtil.format(RunVipMoneyFlowTypeEnum.BALANCE_OUT_COMMISSION_IN.getDescription(),withdrawalDto.getAmount(),withdrawalAmount), YesOrNoEnum.YES.getValue() ); } @Override @Transactional(rollbackFor = Exception.class) public void withdrawalU(WithdrawalDto withdrawalDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember loginMember = this.baseMapper.selectById(memberId); /** * 用户的等级level是否允许USDT提现 */ RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper().eq(RunVip::getVipCode, loginMember.getLevel())); if(ObjectUtil.isEmpty(runVip) || runVip.getCommissionState() != YesOrNoEnum.YES.getValue()){ throw new FebsException("请先升级会员"); } if (StrUtil.isBlank(loginMember.getTradePassword())) { throw new FebsException("未设置资金密码"); } if (!loginMember.getTradePassword().equals(SecureUtil.md5(withdrawalDto.getTradePwd()))) { throw new FebsException("资金密码错误"); } MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectById(withdrawalDto.getAddressId()); if (mallMemberPayment == null) { throw new FebsException("无效的提现地址"); } BigDecimal balanceToCoinPercent = new BigDecimal( dataDictionaryCustomMapper.selectDicDataByTypeAndCode( RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_PERCENT.getType(), RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_PERCENT.getCode()).getValue() ).setScale(2, RoundingMode.DOWN); if(balanceToCoinPercent.compareTo(withdrawalDto.getAmount()) > 0){ throw new FebsException("手续费不足"); } BigDecimal fee = balanceToCoinPercent; BigDecimal withdrawalAmountReal = withdrawalDto.getAmount().subtract(fee).setScale(2, RoundingMode.DOWN); if(BigDecimal.ZERO.compareTo(withdrawalAmountReal) >= 0){ throw new FebsException("手续费不足"); } /** * 减少碳币,增加进行中提现记录 */ walletService.reduceCommission(withdrawalDto.getAmount(), loginMember.getId()); String orderNo = MallUtils.getOrderNum("TX"); MallMemberWithdraw withdraw = new MallMemberWithdraw(); withdraw.setWithdrawNo(orderNo); withdraw.setMemberId(loginMember.getId()); withdraw.setAmount(withdrawalAmountReal); withdraw.setStatus(YesOrNoEnum.ING.getValue()); withdraw.setAmountFee(fee); withdraw.setName(mallMemberPayment.getBank()); withdraw.setType(mallMemberPayment.getBankNo()); withdraw.setWithdrawTimes(withdrawalDto.getAmount()); mallMemberWithdrawMapper.insert(withdraw); this.runVipMoneyFlowAdd( loginMember.getId(), loginMember.getId(), orderNo, FlowTypeEnum.COMMISSION.getValue(), RunVipMoneyFlowTypeEnum.COMMISSION_OUT.getValue(), withdrawalDto.getAmount().negate(), StrUtil.format(RunVipMoneyFlowTypeEnum.COMMISSION_OUT.getDescription(),withdrawalDto.getAmount(),fee), YesOrNoEnum.ING.getValue() ); } @Override @Transactional(rollbackFor = Exception.class) public void commissionChange(CommissionChangeDto commissionChange) { Long memberId = LoginUserUtil.getLoginUser().getId(); BigDecimal minScore = new BigDecimal( dataDictionaryCustomMapper.selectDicDataByTypeAndCode( RunVipDataDictionaryEnum.RUN_VIP_SCORE_MIN.getType(), RunVipDataDictionaryEnum.RUN_VIP_SCORE_MIN.getCode()).getValue() ).setScale(0, BigDecimal.ROUND_DOWN); if(minScore.compareTo(commissionChange.getAmount()) > 0){ throw new FebsException("碳积分不足"+minScore); } MallMember loginMember = this.baseMapper.selectById(memberId); if (StrUtil.isBlank(loginMember.getTradePassword())) { throw new FebsException("未设置资金密码"); } if (!loginMember.getTradePassword().equals(SecureUtil.md5(commissionChange.getTradePwd()))) { throw new FebsException("资金密码错误"); } /** * 用户的等级level是否允许兑换碳币 */ RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper().eq(RunVip::getVipCode, loginMember.getLevel())); if(ObjectUtil.isEmpty(runVip) || runVip.getChangeState() != YesOrNoEnum.YES.getValue()){ throw new FebsException("请先升级会员"); } MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); if(minScore.compareTo(mallMemberWallet.getScore()) > 0){ throw new FebsException("碳积分不足"); } BigDecimal scoreBalancePercent = new BigDecimal( dataDictionaryCustomMapper.selectDicDataByTypeAndCode( RunVipDataDictionaryEnum.RUN_VIP_SCORE_TO_BALANCE.getType(), RunVipDataDictionaryEnum.RUN_VIP_SCORE_TO_BALANCE.getCode()).getValue() ).setScale(2, BigDecimal.ROUND_DOWN); BigDecimal score = commissionChange.getAmount(); BigDecimal balance = commissionChange.getAmount().multiply(scoreBalancePercent).setScale(2, BigDecimal.ROUND_DOWN); walletService.reduceScore(score, loginMember.getId()); String orderNo = MallUtils.getOrderNum("DH"); this.runVipMoneyFlowAdd( loginMember.getId(), loginMember.getId(), orderNo, FlowTypeEnum.SCORE.getValue(), RunVipMoneyFlowTypeEnum.SCORE_OUT_BALANCE.getValue(), score.negate(), StrUtil.format(RunVipMoneyFlowTypeEnum.SCORE_OUT_BALANCE.getDescription(),score,balance), YesOrNoEnum.YES.getValue() ); walletService.addBalance(balance, loginMember.getId()); this.runVipMoneyFlowAdd( loginMember.getId(), loginMember.getId(), orderNo, FlowTypeEnum.BALANCE.getValue(), RunVipMoneyFlowTypeEnum.SCORE_OUT_BALANCE_IN.getValue(), balance, StrUtil.format(RunVipMoneyFlowTypeEnum.SCORE_OUT_BALANCE_IN.getDescription(),score,balance), YesOrNoEnum.YES.getValue() ); } @Override public void setPayment(ApiMallMemberPaymentDto apiMallMemberPaymentDto) { MallMember member = LoginUserUtil.getLoginUser(); if(null == apiMallMemberPaymentDto.getId()){//新增 List mallMemberPayments = mallMemberPaymentMapper.selectList( new LambdaQueryWrapper().eq(MallMemberPayment::getBank, apiMallMemberPaymentDto.getBank())); if(CollUtil.isNotEmpty(mallMemberPayments)){ throw new FebsException("地址已使用"); } MallMemberPayment mallMemberPayment = new MallMemberPayment(); mallMemberPayment.setMemberId(member.getId()); mallMemberPayment.setBankNo(apiMallMemberPaymentDto.getBankNo()); mallMemberPayment.setBank(apiMallMemberPaymentDto.getBank()); mallMemberPaymentMapper.insert(mallMemberPayment); }else{ List mallMemberPayments = mallMemberPaymentMapper.selectList( new LambdaQueryWrapper().eq(MallMemberPayment::getBank, apiMallMemberPaymentDto.getBank())); if(CollUtil.isNotEmpty(mallMemberPayments) && mallMemberPayments.size() > 1){ throw new FebsException("地址已使用"); } MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectById(apiMallMemberPaymentDto.getId()); mallMemberPayment.setMemberId(member.getId()); mallMemberPayment.setBankNo(apiMallMemberPaymentDto.getBankNo()); mallMemberPayment.setBank(apiMallMemberPaymentDto.getBank()); mallMemberPaymentMapper.updateById(mallMemberPayment); } } @Override public List findMemberPayment() { MallMember member = LoginUserUtil.getLoginUser(); List mallMemberPayments = mallMemberPaymentMapper.selectList(new LambdaQueryWrapper().eq(MallMemberPayment::getMemberId, member.getId())); return mallMemberPayments; } @Override public void delPayment(ApiMallMemberPaymentDto mallMemberPayment) { MallMember member = LoginUserUtil.getLoginUser(); mallMemberPaymentMapper.deleteById(mallMemberPayment.getId()); } @Override public void bindPhone(AccountAndCodeDto accountAndCodeDto) { boolean b = commonService.verifyCode(accountAndCodeDto.getAccount(), accountAndCodeDto.getCode()); if (!b) { throw new FebsException("验证码错误"); } Long id = LoginUserUtil.getLoginUser().getId(); MallMember member = this.baseMapper.selectById(id); member.setPhone(accountAndCodeDto.getAccount()); this.baseMapper.updateById(member); } @Override public BigDecimal canMoney() { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); return wallet.getBalance().setScale(2,BigDecimal.ROUND_DOWN); } @Override public List findRankList(RankListDto rankListDto) { IPage page = new Page<>(rankListDto.getPageNum(), rankListDto.getPageSize()); MallMember member = new MallMember(); member.setQuery("2"); member.setCreatedTime(new Date()); IPage list = this.baseMapper.selectRankListInPage(page, member); return list.getRecords(); } @Override public MallMember findMemberInfoByAccount(String phone) { return this.baseMapper.selectInfoByAccount(phone); } @Override public MyCommissionVo myCommission() { Long id = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectById(id); MyCommissionVo commissionVo = MallMemberConversion.INSTANCE.entityToCommissionVo(mallMember); MallMember referMember = this.baseMapper.selectInfoByInviteId(mallMember.getReferrerId()); if (referMember != null) { commissionVo.setReferrerName(referMember.getName()); commissionVo.setAvatar(referMember.getAvatar()); } DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.AGENT_LEVEL, mallMember.getLevel()); if (dic != null) { commissionVo.setLevelName(dic.getDescription()); } MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(id); commissionVo.setCommission(wallet.getCommission()); commissionVo.setToday(mallMoneyFlowMapper.selectCommissionIncome(1, new Date(), id)); commissionVo.setMonth(mallMoneyFlowMapper.selectCommissionIncome(2, new Date(), id)); commissionVo.setTotal(mallMoneyFlowMapper.selectCommissionIncome(null, null, id)); commissionVo.setWaitCommission(BigDecimal.ZERO); return commissionVo; } @Override public void shopApply(ShopApplyDto shopApplyDto) { MallMember member = LoginUserUtil.getLoginUser(); MallShopApply hasApply = mallShopApplyMapper.selectNewestApplyByMemberId(member.getId()); if (hasApply != null) { if (!hasApply.getStatus().equals(MallShopApply.APPLY_DISAGREE)) { throw new FebsException("请勿重复提交申请"); } } MallShopApply mallShopApply = new MallShopApply(); BeanUtil.copyProperties(shopApplyDto, mallShopApply); mallShopApply.setStatus(MallShopApply.APPLY_ING); mallShopApply.setMemberId(member.getId()); mallShopApplyMapper.insert(mallShopApply); } @Override public MallShopApply findNewestApply() { MallMember member = LoginUserUtil.getLoginUser(); return mallShopApplyMapper.selectNewestApplyByMemberId(member.getId()); } @Override public void addRegisterAppeal(RegisterAppealDto registerAppeal) { MallRegisterAppeal isExist = mallRegisterAppealMapper.selectByPhoneAndName(registerAppeal.getName(), registerAppeal.getPhone()); if (isExist != null) { throw new FebsException("申诉已存在"); } isExist = new MallRegisterAppeal(); isExist.setName(registerAppeal.getName()); isExist.setPhone(registerAppeal.getPhone()); isExist.setStatus(2); mallRegisterAppealMapper.insert(isExist); } @Override public CashOutSettingVo cashOutSetting() { CashOutSettingVo cashOutSettingVo = new CashOutSettingVo(); DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.CASHOUT_SETTING.getType(), DataDictionaryEnum.CASHOUT_SETTING.getCode()); if (dic != null) { cashOutSettingVo = JSONObject.parseObject(dic.getValue(), CashOutSettingVo.class); } return cashOutSettingVo; } @Override public List findShopListVo(ShopListDto shopListDto) { Page page = new Page<>(shopListDto.getPageNow(), shopListDto.getPageSize()); MallShopApply shopApply = new MallShopApply(); shopApply.setStatus(MallShopApply.APPLY_AGREE); IPage pageResult = mallShopApplyMapper.selectShopApplyInPage(shopApply, page); List list = pageResult.getRecords(); if (CollUtil.isEmpty(list)) { list = new ArrayList<>(); } return MallShopApplyConversion.INSTANCE.entitiesToVOs(list); } private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class); @Override public FebsResponse xcxLogin(ApiXcxLoginDto apiXcxLoginDto) throws IOException { log.info("登录请求参数:{}", JSONObject.toJSONString(apiXcxLoginDto)); FebsResponse febsResponse = new FebsResponse(); String code = apiXcxLoginDto.getCode(); log.info("code:" + code); if (StrUtil.isNotBlank(code)) { String requrl = getXcxLoginUrl(code); String reslutData = HttpCurlUtil.sendGetHttp(requrl, null); net.sf.json.JSONObject json = net.sf.json.JSONObject.fromObject(reslutData); log.info("微信登录获取到登录信息={}", json); if (json.containsKey("errcode")) { log.info("微信登录获取到异常信息errcode"); return febsResponse.fail().message("自动登录失败"); } String openId = json.getString("openid"); String sessionKey = json.getString("session_key"); log.info("openId={},sessionKey={}", openId, sessionKey); // 查询用户是否存在 MallMember mallMember = null; synchronized (this) { mallMember = this.baseMapper.selectMemberByOpenId(openId); if (ObjectUtil.isEmpty(mallMember)) { // 新增用户 mallMember = new MallMember(); mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE); mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL); mallMember.setOpenId(openId); mallMember.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); mallMember = this.baseMapper.selectMemberByOpenId(openId); String inviteId = ShareCodeUtil.toSerialCode(mallMember.getId()); mallMember.setInviteId(inviteId); this.baseMapper.updateById(mallMember); MallMemberWallet wallet = new MallMemberWallet(); wallet.setBalance(BigDecimal.ZERO); wallet.setMemberId(mallMember.getId()); mallMemberWalletMapper.insert(wallet); } else { mallMember.setSessionKey(sessionKey); this.baseMapper.updateById(mallMember); } } // 存放redis String redisKey = AppContants.XCX_LOGIN_PREFIX + mallMember.getId(); String existToken = redisUtils.getString(redisKey); if (StrUtil.isNotBlank(existToken)) { Object o = redisUtils.get(existToken); if (ObjectUtil.isNotEmpty(o)) { redisUtils.del(existToken); } } String token = IdUtil.simpleUUID(); redisUtils.set(token, JSONObject.toJSONString(mallMember), -1); redisUtils.set(redisKey, token, -1); Map authInfo = new HashMap<>(); authInfo.put("token", token); authInfo.put("appid", xcxProperties.getXcxAppid()); authInfo.put("member", mallMember); authInfo.put("rasToken", generateAsaToken(token)); febsResponse.success().data(authInfo); } else { return febsResponse.fail().message("自动登录失败"); } return febsResponse; } @Override 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 nickName = apiXcxSaveInfoDto.getNickName(); if(StrUtil.isNotEmpty(nickName)){ mallMember.setName(nickName); } String phone = apiXcxSaveInfoDto.getPhone(); if(StrUtil.isNotEmpty(phone)){ mallMember.setPhone(phone); } String avatarUrl = apiXcxSaveInfoDto.getAvatarUrl(); if(StrUtil.isNotEmpty(avatarUrl)){ mallMember.setAvatar(avatarUrl); } if (StrUtil.isNotBlank(apiXcxSaveInfoDto.getRealName())) { mallMember.setRealName(apiXcxSaveInfoDto.getRealName()); } if (apiXcxSaveInfoDto.getBirthday() != null) { mallMember.setBirthday(apiXcxSaveInfoDto.getBirthday()); } List 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); return new FebsResponse().success(); } @Override public FebsResponse xcxPhoneLogin(ApiXcxPhoneLoginDto apiXcxPhoneLoginDto) { String phone = apiXcxPhoneLoginDto.getPhone(); boolean flag = commonService.verifyCode(phone, apiXcxPhoneLoginDto.getCode()); if (flag) { // 查询用户是否存在 MallMember mallMember = null; synchronized (this) { mallMember = this.baseMapper.selectInfoByAccount(apiXcxPhoneLoginDto.getPhone()); if (ObjectUtil.isEmpty(mallMember)) { // 新增用户 mallMember = new MallMember(); mallMember.setPhone(phone); mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE); mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL); this.baseMapper.insert(mallMember); String inviteId = ShareCodeUtil.toSerialCode(mallMember.getId()); mallMember.setInviteId(inviteId); this.baseMapper.updateById(mallMember); MallMemberWallet wallet = new MallMemberWallet(); wallet.setBalance(BigDecimal.ZERO); wallet.setMemberId(mallMember.getId()); mallMemberWalletMapper.insert(wallet); } } // 存放redis String redisKey = AppContants.XCX_LOGIN_PHONE_PREFIX + mallMember.getId(); String existToken = redisUtils.getString(redisKey); if (StrUtil.isNotBlank(existToken)) { Object o = redisUtils.get(existToken); if (ObjectUtil.isNotEmpty(o)) { redisUtils.del(existToken); } } String token = IdUtil.simpleUUID(); redisUtils.set(token, JSONObject.toJSONString(mallMember), 360000); redisUtils.set(redisKey, token, 360000); Map authInfo = new HashMap<>(); authInfo.put("token", token); authInfo.put("member", mallMember); authInfo.put("rasToken", generateAsaToken(token)); return new FebsResponse().success().data(authInfo); } return new FebsResponse().fail().message("验证码错误"); } @Override public FebsResponse xcxOpen(ApiXcxOpenDto apiXcxOpenDto) { DataDictionaryCustom rangeSwitch = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.RANGE_SWITCH.getType(), DataDictionaryEnum.RANGE_SWITCH.getCode()); if(StrUtil.isNotBlank(rangeSwitch.getValue()) && "1".equals(rangeSwitch.getValue())){ if(ObjectUtil.isNull(apiXcxOpenDto.getLongitude()) || ObjectUtil.isNull(apiXcxOpenDto.getLatitude())){ return new FebsResponse().fail().message("请授权位置信息"); } Double longitude = apiXcxOpenDto.getLongitude(); Double latitude = apiXcxOpenDto.getLatitude(); DataDictionaryCustom rangeSize = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.RANGE_SIZE.getType(), DataDictionaryEnum.RANGE_SIZE.getCode()); if(ObjectUtil.isEmpty(rangeSize)){ return new FebsResponse().success().data(2); } if(StrUtil.isBlank(rangeSize.getValue())){ return new FebsResponse().success().data(2); } //方位大小,换成单位:米 Integer value = Integer.parseInt(rangeSize.getValue()) * 1000; //根据经纬度获取周围团长的距离 MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByLonAndLat(longitude, latitude); if(ObjectUtil.isEmpty(mallTeamLeader)){ return new FebsResponse().success().data(2); } Double distance = mallTeamLeader.getDistance(); if(value <= distance){ return new FebsResponse().success().data(2); } } return new FebsResponse().success().data(1); } private final IXcxPayService iXcxPayService; @Override @Transactional(rollbackFor = Exception.class) public FebsResponse rechargeWallet(ApiRechargeWalletDto apiRechargeWalletDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); BigDecimal amount = apiRechargeWalletDto.getAmount(); if(BigDecimal.ZERO.compareTo(amount)>0){ return new FebsResponse().fail().message("请输入正确的充值金额"); } Integer type = apiRechargeWalletDto.getType(); if(2 == type){ //成为合伙人的充值金额 MallAgentRecord mallAgentRecord = mallAgentRecordMapper.selectById(apiRechargeWalletDto.getAgentApplyId()); BigDecimal agentPrice = mallAgentRecord.getAmount(); // DataDictionaryCustom agentPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.PRICE_AMOUNT.getType(), // DataDictionaryEnum.PRICE_AMOUNT.getCode()); // String agentPrice = agentPriceDic.getValue(); // BigDecimal price = new BigDecimal(agentPrice); if(agentPrice.compareTo(amount) != 0){ return new FebsResponse().fail().message("成为合伙人的金额为"+agentPrice); } } String rechargeNo = "CZ_"+MallUtils.getOrderNum(); apiRechargeWalletDto.setRechargeNo(rechargeNo); apiRechargeWalletDto.setMemberId(memberId); BrandWCPayRequestData brandWCPayRequestData = null; try { brandWCPayRequestData = iXcxPayService.startRechargeWallet(apiRechargeWalletDto); } catch (Exception e) { throw new FebsException("支付失败"); } mallMoneyFlowService.addMoneyFlow( memberId, amount, MoneyFlowTypeEnum.RECHARGE.getValue(), rechargeNo, FlowTypeEnum.BALANCE.getValue(), "余额充值",1); String wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData); String payResultStr = brandWCPayRequestData.getPrepay_id(); Map map = new HashMap<>(); map.put("orderInfo", payResultStr); map.put("wxResultStr", wxResultStr); return new FebsResponse().success().data(map).message("充值即将到账"); } @Override public void updateMemberAgent(Long memberId,String levelCode) { mallAgentRecordMapper.updateStateByMemberId(memberId); MallAgentRecord mallAgentRecord = mallAgentRecordMapper.selectById(memberId); //更新用户表中的LEVEL MallMember mallMember = this.baseMapper.selectById(mallAgentRecord.getMemberId()); mallMember.setLevel(levelCode); this.baseMapper.updateById(mallMember); } @Override public FebsResponse agentDetail() { DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.AGENT_DETAILS.getType(), DataDictionaryEnum.AGENT_DETAILS.getCode()); Map map = new HashMap<>(); if(ObjectUtil.isNotEmpty(dataDictionaryCustom)){ map.put("agentDetail", dataDictionaryCustom.getValue()); } return new FebsResponse().success().data(map); } @Override public FebsResponse activityInfo() { DataDictionaryCustom activityBulletinDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.ACTIVITY_BULLETIN.getType(), DataDictionaryEnum.ACTIVITY_BULLETIN.getCode()); DataDictionaryCustom giveAmountDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.GIVE_AMOUNT.getType(), DataDictionaryEnum.GIVE_AMOUNT.getCode()); DataDictionaryCustom giveStateDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.GIVE_STATE.getType(), DataDictionaryEnum.GIVE_STATE.getCode()); Map map = new HashMap<>(); if(ObjectUtil.isNotEmpty(activityBulletinDic)){ map.put("activityBulletin", ObjectUtil.isEmpty(activityBulletinDic.getValue()) ? "暂无活动" : activityBulletinDic.getValue()); } if(ObjectUtil.isNotEmpty(giveAmountDic)){ map.put("giveAmount", ObjectUtil.isEmpty(giveAmountDic.getValue()) ? 0 : giveAmountDic.getValue()); } map.put("giveState",giveStateDic.getValue()); return new FebsResponse().success().data(map); } @Override public FebsResponse agentApplyInfo() { Long memberId = LoginUserUtil.getLoginUser().getId(); ApiMallAgentRecordVo apiMallAgentRecordVo = mallAgentRecordMapper.selectApiMallAgentRecordVoByMemberIdAndState(memberId,MallAgentRecord.APPLY_ING); return new FebsResponse().success().data(apiMallAgentRecordVo); } @Override public FebsResponse getCoupon(GetCouponDto getCouponDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); String couponUUID = IdUtil.simpleUUID(); // String couponUUID = getCouponDto.getCouponUUID(); // QueryWrapper objectQueryWrapper = new QueryWrapper<>(); // objectQueryWrapper.eq("coupon_uuid",couponUUID); // List mallMemberCouponDone = mallMemberCouponMapper.selectList(objectQueryWrapper); // if(CollUtil.isNotEmpty(mallMemberCouponDone)){ // return new FebsResponse().success(); // } //通过邀请人信息,获取能领取的优惠卷信息 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(); Long goodsId = getCouponDto.getGoodsId(); MallGoods mallGoods = mallGoodsMapper.selectById(goodsId); //验证商品存不存在,且上没上架 if(ObjectUtil.isNotEmpty(mallGoods) && MallGoods.ISSALE_STATUS_ENABLE == mallGoods.getIsSale()){ // List mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdAndGoodsIdAndCouponId(memberId, goodsId, couponId,mallMember.getInviteId()); // List mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdAndGoodsIdAndCouponIdWithOutInviteId(memberId, goodsId, couponId); List mallMemberCoupons = mallMemberCouponMapper.selectListByMemberIdAndGoodsIdAndCouponIdWithOutInviteId(memberId, goodsId); if(CollUtil.isEmpty(mallMemberCoupons)){ //商品优惠卷如果绑定了,那么当前登陆者获取一张卷 List 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 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(); } @Override public FebsResponse memberCoupon(MallMemberCouponDto mallMemberCouponDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); IPage page = new Page<>(mallMemberCouponDto.getPageNum(), mallMemberCouponDto.getPageSize()); mallMemberCouponDto.setMemberId(memberId); mallMemberCouponDto.setExpireTime(DateUtil.date()); IPage pages = mallMemberCouponMapper.selectListInPage(page, mallMemberCouponDto); return new FebsResponse().success().data(pages); } @Override public FebsResponse memberPayCoupon(MallMemberCouponDto mallMemberCouponDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); mallMemberCouponDto.setMemberId(memberId); mallMemberCouponDto.setExpireTime(DateUtil.date()); // List couponIds = couponGoodsMapper.selectByGoodId(mallMemberCouponDto.getGoodsId()); List goodsIdList = mallMemberCouponDto.getGoodsIdList(); List couponIds = couponGoodsMapper.selectByGoodIdList(goodsIdList); List 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); MallMemberCouponVo mallMemberCouponVo = new MallMemberCouponVo(); mallMemberCouponVo.setCouponName(mallMemberCoupon.getCouponName()); 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 loginEvent() { MallMember loginUser = LoginUserUtil.getLoginUser(); MallMember member = this.baseMapper.selectById(loginUser.getId()); this.baseMapper.updateLastLogin(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 list = JSONObject.parseArray(dic.getValue(), VipSettingUnAliveSettingBo.class); List 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 query = new LambdaQueryWrapper<>(); query.in(MallGoodsCoupon::getId, couponIds) .eq(MallGoodsCoupon::getState, 2); List coupons = mallGoodsCouponMapper.selectList(query); LambdaQueryWrapper 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 mallMemberCoupons = mallMemberCouponMapper.selectList(memberCouponQuery); if (CollUtil.isNotEmpty(mallMemberCoupons)) { Map 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 result = new HashMap<>(); result.put("coupon", coupons); return result; } @Override public FebsResponse storeList(MallStoreDto mallStoreDto) { QueryWrapper mallStoreQueryWrapper = new QueryWrapper<>(); if(StrUtil.isNotEmpty(mallStoreDto.getName())){ mallStoreQueryWrapper.like("name",mallStoreDto.getName()); } List mallStores = mallStoreMapper.selectList(mallStoreQueryWrapper); List mallStoreVos = MallStoreConversion.INSTANCE.entitysToVos(mallStores); return new FebsResponse().success().data(mallStoreVos); } @Override public FebsResponse storeItemList(MallStoreItemDto mallStoreItemDto) { QueryWrapper mallStoreQueryWrapper = new QueryWrapper<>(); mallStoreQueryWrapper.like("store_id",mallStoreItemDto.getStoreId()); List mallStores = mallStoreItemMapper.selectList(mallStoreQueryWrapper); return new FebsResponse().success().data(mallStores); } @Override public FebsResponse bindStoreMember(BindStoreMemberDto bindStoreMemberDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); Long storeItemId = bindStoreMemberDto.getStoreItemId(); QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("member_id",memberId); List mallStoreMembers = mallStoreMemberMapper.selectList(objectQueryWrapper); if(CollUtil.isNotEmpty(mallStoreMembers)){ mallStoreMemberMapper.delete(objectQueryWrapper); } MallMember mallMember = this.baseMapper.selectById(memberId); Integer sex = "女".equals(mallMember.getSex()) ? 3 : 2; MallStoreItem mallStoreItem = mallStoreItemMapper.selectById(storeItemId); HashMap 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"; String result = HttpCurlUtil.sendPost(url, objectObjectHashMap); 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"); 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 objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("member_id",memberId); List mallStoreMembers = mallStoreMemberMapper.selectList(objectQueryWrapper); ArrayList 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 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); } public static String hidePhoneNumber(String phoneNumber) { //判断字符串的长度小于4就直接返回 if (phoneNumber.length() < 4) { return phoneNumber; } // 获取前3位和后4位 String prefix = phoneNumber.substring(0, 3); // 生成隐藏的电话号码 return prefix + "****"; } @Override public List dayRecord(ApiRecordDto apiRecordDto) { /** * 1:日榜 2:月榜 * 获取当前日期 */ LambdaQueryWrapper mallMoneyFlowLambdaQueryWrapper = new LambdaQueryWrapper<>(); if(apiRecordDto.getType() == 1){ DateTime dateTime = DateUtil.beginOfDay(DateUtil.date()); mallMoneyFlowLambdaQueryWrapper.ge(MallMoneyFlow :: getCreatedTime , dateTime); }else{ DateTime dateTime = DateUtil.beginOfMonth(DateUtil.date()); mallMoneyFlowLambdaQueryWrapper.ge(MallMoneyFlow :: getCreatedTime , dateTime); } mallMoneyFlowLambdaQueryWrapper.eq(MallMoneyFlow :: getFlowType, FlowTypeEnum.SCORE.getValue()); mallMoneyFlowLambdaQueryWrapper.in( MallMoneyFlow :: getType, RunVipMoneyFlowTypeEnum.GET_SCORE.getValue(), RunVipMoneyFlowTypeEnum.SYS_SCORE.getValue() ); List mallMoneyFlows = mallMoneyFlowMapper.selectList(mallMoneyFlowLambdaQueryWrapper); List apiChartVos = new ArrayList<>(); if(CollUtil.isEmpty(mallMoneyFlows)){ return apiChartVos; } // 使用 Stream API 按照 memberId 分组,并计算每个 memberId 的 amount 绝对值之和 Map sumByMemberId = mallMoneyFlows.stream() .collect(Collectors.groupingBy( MallMoneyFlow::getMemberId, Collectors.reducing(BigDecimal.ZERO, MallMoneyFlow::getAmount, BigDecimal::add) )).entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, entry -> entry.getValue().abs() // 计算绝对值 )); // 对 Map 按照 amount 的绝对值之和从大到小排序,并取前十个结果 List> sortedList = sumByMemberId.entrySet().stream() .sorted((entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue())) .limit(20) .collect(Collectors.toList()); for (Map.Entry entry : sortedList){ if(apiChartVos.size() >= 10){ break; } ApiChartVo apiChartVo = new ApiChartVo(); MallMember mallMember = this.baseMapper.selectById(entry.getKey()); if(null == mallMember){ continue; } apiChartVo.setName(hidePhoneNumber(mallMember.getName())); apiChartVo.setAvatar(mallMember.getAvatar()); apiChartVo.setScore(entry.getValue()); apiChartVos.add(apiChartVo); } // sortedList.forEach(entry -> { // ApiChartVo apiChartVo = new ApiChartVo(); // MallMember mallMember = this.baseMapper.selectById(entry.getKey()); // if(null == mallMember){ // apiChartVo.setName(hidePhoneNumber("runStep")); // apiChartVo.setAvatar(null); // apiChartVo.setScore(entry.getValue()); // }else{ // apiChartVo.setName(hidePhoneNumber(mallMember.getName())); // apiChartVo.setAvatar(mallMember.getAvatar()); // apiChartVo.setScore(entry.getValue()); // } // apiChartVos.add(apiChartVo); // }); return apiChartVos; } public static void main(String[] args) { Long userld = 173L; String shopAccount = "luohu"; String shopPwd = "123456"; HashMap 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); } }