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.utils.*; import cc.mrbird.febs.mall.conversion.*; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.ICommonService; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.mall.vo.*; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; 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 com.alibaba.fastjson.JSONObject; 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.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.*; import java.util.regex.Pattern; 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 MallMemberAmountMapper mallMemberAmountMapper; 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 MallMemberBankMapper mallMemberBankMapper; private final IMallMoneyFlowService mallMoneyFlowService; private final MallProductBuyRecordMapper mallProductBuyRecordMapper; private final MallProductBuyMapper mallProductBuyMapper; private final MallMemberSpeakMapper mallMemberSpeakMapper; private final MallMemberChargeMapper mallMemberChargeMapper; @Value("${spring.profiles.active}") private String active; private static final String ACCOUNT_PATTERN = "^[a-zA-Z0-9]{8,16}$"; private static final Pattern pattern = Pattern.compile(ACCOUNT_PATTERN); public static boolean validateAccount(String account) { return pattern.matcher(account).matches(); } public static void main(String[] args) { String account = "example"; // 示例账号,可以根据需要替换 boolean isValid = validateAccount(account); System.out.println("账号是否有效: " + isValid); } @Transactional(rollbackFor = Exception.class) @Override public FebsResponse register(RegisterDto registerDto) { /** * 验证账户密钥是否重复 * 验证邀请码是否存在 * 生成用户信息 * 返回账号和密钥给前端 */ String passwordAgain = registerDto.getPasswordAgain(); String password = registerDto.getPassword(); if(!passwordAgain.equals(password)){ throw new FebsException("两次密码不一致。"); } String accountLogin = registerDto.getAccountLogin(); boolean isValid = validateAccount(accountLogin); if(!isValid){ throw new FebsException("账号不规范。"); } MallMember mallMember = this.baseMapper.selectByAccountLogin(accountLogin); if (mallMember != null) { throw new FebsException("账号已使用,请重新注册。"); } Integer selectCount = this.baseMapper.selectCount(null); String userKey = ShareCodeUtil.toSerialNumberCode(selectCount); MallMember mallMemberKey = this.baseMapper.selectByUserKey(userKey); if (mallMemberKey != null) { throw new FebsException("账号已使用,请重新注册。"); } mallMember = new MallMember(); mallMember.setAccountLogin(accountLogin); mallMember.setPassword(SecureUtil.md5(registerDto.getPassword())); mallMember.setUserKey(userKey); Integer count = this.baseMapper.selectCount(null); if (count != null && count != 0) { MallMember inviteMember = this.baseMapper.selectInfoByInviteId(registerDto.getInviteId()); if (inviteMember == null) { throw new FebsException("邀请码不存在"); } mallMember.setReferrerId(registerDto.getInviteId()); } mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE); mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL); mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.getCode()); mallMember.setIsFrozen(ProductEnum.MEMBER_UNFROZEN.getValue()); mallMember.setPartner(2); this.baseMapper.insert(mallMember); String inviteId = ShareCodeUtil.toSerialNumberCodeTwo(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); } this.baseMapper.updateById(mallMember); MallMemberWallet wallet = new MallMemberWallet(); wallet.setMemberId(mallMember.getId()); mallMemberWalletMapper.insert(wallet); ApiRegisterVo apiRegisterVo = new ApiRegisterVo(); apiRegisterVo.setAccount(mallMember.getAccountLogin()); apiRegisterVo.setUserKey(registerDto.getPassword()); return new FebsResponse().success().data(apiRegisterVo); } @Override public FebsResponse toLogin(LoginDto loginDto) { String md5Pwd = SecureUtil.md5(loginDto.getPassword()); MallMember mallMember = this.baseMapper.selectInfoByAccountLoginAndPwd(loginDto.getAccount(), md5Pwd); if (mallMember == null) { throw new FebsException("账号或密码错误"); } if (ProductEnum.MEMBER_FROZEN.getValue() == mallMember.getIsFrozen()) { 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); } @Override public FebsResponse forgetPwd(ForgetPwdDto forgetPwdDto) { /** * 验证用户名和密钥是否存在、是否匹配 * 更新用户密码 */ String accountLogin = forgetPwdDto.getAccountLogin(); String userKey = forgetPwdDto.getUserKey(); MallMember mallMember = this.baseMapper.selectAccountLoginAndUserKey(accountLogin,userKey); if (mallMember == null) { throw new FebsException("请输入正确的账号或密钥"); } String pwd = SecureUtil.md5(forgetPwdDto.getPassword()); mallMember.setPassword(pwd); this.baseMapper.updateById(mallMember); redisUtils.del(AppContants.APP_LOGIN_PREFIX + mallMember.getId()); 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); } } 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); MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMember.getId()); mallMemberVo.setBalance(mallMemberWallet.getBalance()); DataDictionaryCustom chargeAddressDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.CHARGE_ADDRESS.getType(), DataDictionaryEnum.CHARGE_ADDRESS.getCode() ); mallMemberVo.setSysAddress(chargeAddressDic.getValue()); return new FebsResponse().success().data(mallMemberVo); } @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); 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) { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectById(memberId); if (mallMember == null) { throw new FebsException("账号不存在"); } MallMember mallMemberKey = this.baseMapper.selectByUserKey(forgetPwdDto.getUserKey()); if (!(mallMemberKey.getId() == memberId)) { 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()); mallMember.setName(modifyMemberInfoDto.getName()); mallMember.setPhone(modifyMemberInfoDto.getPhone()); if (StrUtil.isNotBlank(modifyMemberInfoDto.getPhoto())) { mallMember.setAvatar(modifyMemberInfoDto.getPhoto()); } this.baseMapper.updateById(mallMember); return new FebsResponse().success().message("操作成功"); } @Override public FebsResponse teamList() { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectById(memberId); MyTeamVo myTeamVo = new MyTeamVo(); /** * 团队人数,只有直属两级 */ ArrayList memberIdList = new ArrayList<>(); memberIdList.add(memberId); QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("referrer_id",mallMember.getInviteId()); List mallMembers = this.baseMapper.selectList(objectQueryWrapper); if(CollUtil.isNotEmpty(mallMembers)){ for(MallMember directMember : mallMembers){ //第一代 memberIdList.add(directMember.getId()); QueryWrapper directWrapper = new QueryWrapper<>(); directWrapper.eq("referrer_id",directMember.getInviteId()); List refMembers = this.baseMapper.selectList(directWrapper); if(CollUtil.isNotEmpty(refMembers)){ for(MallMember refMember : refMembers){ //第二代 memberIdList.add(refMember.getId()); } } } } BigDecimal chargeAmount = mallMoneyFlowMapper.selectSumAmountByMemberIdAndType(memberIdList,GameFlowTypeEnum.PLAYER_CHARGE.getValue()); myTeamVo.setMyTeamCnt(memberIdList.size()); myTeamVo.setMyAchieve(chargeAmount); return new FebsResponse().success().data(myTeamVo); } @Override public FebsResponse teamFcmList() { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectById(memberId); ArrayList myFcmTeamVos = new ArrayList<>(); /** * 团队人数,只有直属两级 */ ArrayList memberIdList = new ArrayList<>(); memberIdList.add(memberId); QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("referrer_id",mallMember.getInviteId()); List mallMembers = this.baseMapper.selectList(objectQueryWrapper); if(CollUtil.isNotEmpty(mallMembers)){ for(MallMember directMember : mallMembers){ //第一代 memberIdList.add(directMember.getId()); QueryWrapper directWrapper = new QueryWrapper<>(); directWrapper.eq("referrer_id",directMember.getInviteId()); List refMembers = this.baseMapper.selectList(directWrapper); if(CollUtil.isNotEmpty(refMembers)){ for(MallMember refMember : refMembers){ //第二代 memberIdList.add(refMember.getId()); } } } } for(Long id : memberIdList){ MyFcmTeamVo myFcmTeamVo = new MyFcmTeamVo(); MallMember member = this.baseMapper.selectById(id); myFcmTeamVo.setAccountLogin(member.getAccountLogin()); BigDecimal chargeAmount = mallMoneyFlowMapper.selectSumByMemberIdAndType(id,GameFlowTypeEnum.PLAYER_CHARGE.getValue()); myFcmTeamVo.setChargeAmount(chargeAmount); MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(id); myFcmTeamVo.setBalance(mallMemberWallet.getBalance()); BigDecimal amountBuy = mallMoneyFlowMapper.selectSumByMemberIdAndType(id,GameFlowTypeEnum.PLAYER_PICK_NUM.getValue()); myFcmTeamVo.setAmountBuy(amountBuy); BigDecimal playerPerk = mallMoneyFlowMapper.selectSumByMemberIdAndType(id,GameFlowTypeEnum.PLAYER_PERK.getValue()); BigDecimal ownerPerk = mallMoneyFlowMapper.selectSumByMemberIdAndType(id,GameFlowTypeEnum.OWNER_PERK.getValue()); myFcmTeamVo.setAmountPerk(amountBuy.add(playerPerk).add(ownerPerk)); myFcmTeamVos.add(myFcmTeamVo); } return new FebsResponse().success().data(myFcmTeamVos); } @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.selectApiFcmMoneyFlowInPage(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); } @Override @Transactional(rollbackFor = Exception.class) public void transfer(TransferDto transferDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember loginMember = this.baseMapper.selectById(memberId); BigDecimal amount = transferDto.getAmount(); int type = transferDto.getType(); if(1 != type && 2 != type && 3 != type){ throw new FebsException("请选择互转类型"); } Integer insideWith = loginMember.getInsideWith() == null ? 2 :loginMember.getInsideWith(); if (1 != insideWith) { throw new FebsException("功能升级中"); } MallMember mallMember = this.baseMapper.selectByAccountLogin(transferDto.getAccount()); if (mallMember == null) { throw new FebsException("转出账户不存在"); } if (loginMember.getAccountLogin().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("交易密码错误"); } MallMemberAmount mallMemberAmountLogin = mallMemberAmountMapper.selectByMemberId(loginMember.getId()); MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(mallMember.getId()); if(1 == type){ if (amount.compareTo(mallMemberAmountLogin.getFcmCntAva()) > 0) { throw new FebsException("代币不足"); } mallMemberAmountLogin.setFcmCntAva(mallMemberAmountLogin.getFcmCntAva().subtract(amount)); mallMemberAmountMapper.updateFcmCntAvaById(mallMemberAmountLogin); String orderNo = MallUtils.getOrderNum("DB"); mallMoneyFlowService.addMoneyFlow( loginMember.getId(), amount.negate(), MoneyFlowTypeNewEnum.FCM_INSIDE_OUT.getValue(), orderNo, mallMember.getId(), FlowTypeNewEnum.FCM_COIN.getValue(), MoneyFlowTypeNewEnum.FCM_INSIDE_OUT.getDescrition()); mallMemberAmount.setFcmCntAva(mallMemberAmount.getFcmCntAva().add(amount)); mallMemberAmountMapper.updateFcmCntAvaById(mallMemberAmount); mallMoneyFlowService.addMoneyFlow( mallMember.getId(), amount, MoneyFlowTypeNewEnum.FCM_INSIDE_IN.getValue(), orderNo, loginMember.getId(), FlowTypeNewEnum.FCM_COIN.getValue(), MoneyFlowTypeNewEnum.FCM_INSIDE_IN.getDescrition()); } if(2 == type){ if (amount.compareTo(mallMemberAmountLogin.getTokenAva()) > 0) { throw new FebsException("宝石不足"); } mallMemberAmountLogin.setTokenAva(mallMemberAmountLogin.getTokenAva().subtract(amount)); mallMemberAmountMapper.updateTokenAvaById(mallMemberAmountLogin); String orderNo = MallUtils.getOrderNum("LP"); mallMoneyFlowService.addMoneyFlow( loginMember.getId(), amount.negate(), MoneyFlowTypeNewEnum.TOKEN_INSIDE_OUT.getValue(), orderNo, mallMember.getId(), FlowTypeNewEnum.TOKEN.getValue(), MoneyFlowTypeNewEnum.TOKEN_INSIDE_OUT.getDescrition()); mallMemberAmount.setTokenAva(mallMemberAmount.getTokenAva().add(amount)); mallMemberAmountMapper.updateTokenAvaById(mallMemberAmount); mallMoneyFlowService.addMoneyFlow( mallMember.getId(), amount, MoneyFlowTypeNewEnum.TOKEN_INSIDE_IN.getValue(), orderNo, loginMember.getId(), FlowTypeNewEnum.TOKEN.getValue(), MoneyFlowTypeNewEnum.TOKEN_INSIDE_IN.getDescrition()); } if(3 == type){ DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.FCM_INSIDE_NFT_PERCENT.getType(), DataDictionaryEnum.FCM_INSIDE_NFT_PERCENT.getCode() ); BigDecimal feePercent = new BigDecimal("0.01").multiply(new BigDecimal(dataDictionaryCustom.getValue())); if (amount.compareTo(mallMemberAmountLogin.getTrendsNft()) > 0) { throw new FebsException("卡牌不足"); } BigDecimal fee = amount.multiply(feePercent).setScale(2,BigDecimal.ROUND_DOWN); BigDecimal amountReal = amount.subtract(fee); mallMemberAmountLogin.setTrendsNft(mallMemberAmountLogin.getTrendsNft().subtract(amount)); mallMemberAmountMapper.updateTrendsNftById(mallMemberAmountLogin); String orderNo = MallUtils.getOrderNum("NFT"); mallMoneyFlowService.addMoneyFlow( loginMember.getId(), amountReal.negate(), MoneyFlowTypeNewEnum.NFT_TRANS_OUT.getValue(), orderNo, mallMember.getId(), FlowTypeNewEnum.NFT.getValue(), MoneyFlowTypeNewEnum.NFT_TRANS_OUT.getDescrition()); mallMoneyFlowService.addMoneyFlow( loginMember.getId(), fee.negate(), MoneyFlowTypeNewEnum.NFT_TRANS_OUT_FEE.getValue(), orderNo, mallMember.getId(), FlowTypeNewEnum.NFT.getValue(), MoneyFlowTypeNewEnum.NFT_TRANS_OUT_FEE.getDescrition()); mallMemberAmount.setTrendsNft(mallMemberAmount.getTrendsNft().add(amountReal)); mallMemberAmountMapper.updateTrendsNftById(mallMemberAmount); mallMoneyFlowService.addMoneyFlow( mallMember.getId(), amountReal, MoneyFlowTypeNewEnum.NFT_TRANS_IN.getValue(), orderNo, loginMember.getId(), FlowTypeNewEnum.NFT.getValue(), MoneyFlowTypeNewEnum.NFT_TRANS_IN.getDescrition()); } } @Override public void setPayment(MallMemberPayment mallMemberPayment) { MallMember member = LoginUserUtil.getLoginUser(); MallMemberPayment exist = mallMemberPaymentMapper.selectByMemberId(member.getId()); if (exist == null) { mallMemberPayment.setMemberId(member.getId()); mallMemberPaymentMapper.insert(mallMemberPayment); } else { mallMemberPayment.setId(exist.getId()); mallMemberPaymentMapper.updateById(mallMemberPayment); } } @Override public MallMemberPayment findMemberPayment() { MallMember member = LoginUserUtil.getLoginUser(); return mallMemberPaymentMapper.selectByMemberId(member.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.setBindPhone(accountAndCodeDto.getAccount()); this.baseMapper.updateById(member); } @Override public BigDecimal canMoney() { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); BigDecimal profit = mallMoneyFlowMapper.selectProfitByDateAndMemberId(memberId); BigDecimal canMoney = wallet.getCommission(); if (profit != null) { if(canMoney.compareTo(BigDecimal.ZERO) > 0) { canMoney = canMoney.subtract(profit); } } return canMoney; } @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.getBalance()); 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); } DataDictionaryCustom voucherOnOffDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( GreenScoreEnum.VOUCHER_ON_OFF.getType(), GreenScoreEnum.VOUCHER_ON_OFF.getCode()); if(ObjectUtil.isNotEmpty(voucherOnOffDic)){ cashOutSettingVo.setVoucherOnOff(voucherOnOffDic.getValue()); DataDictionaryCustom voucherPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( GreenScoreEnum.VOUCHER_PERCENT.getType(), GreenScoreEnum.VOUCHER_PERCENT.getCode()); if(ObjectUtil.isNotEmpty(voucherPercentDic)){ cashOutSettingVo.setVoucherPercent(new BigDecimal(voucherPercentDic.getValue())); } } 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); } @Override @Transactional public FebsResponse addMemberBank(AddMemberBankDto addMemberBankDto) { MallMember member = LoginUserUtil.getLoginUser(); MallMemberBank mallMemberBank = MallMemberBankConversion.INSTANCE.dtoToentity(addMemberBankDto); mallMemberBank.setMemberId(member.getId()); mallMemberBankMapper.insert(mallMemberBank); return new FebsResponse().success(); } @Override public FebsResponse findMemberBankList(MemberBankListDto memberBankListDto) { MallMember member = LoginUserUtil.getLoginUser(); Page page = new Page<>(memberBankListDto.getPageNum(), memberBankListDto.getPageSize()); memberBankListDto.setMemberId(member.getId()); IPage pageResult = mallMemberBankMapper.findMemberBankListInPage(memberBankListDto, page); return new FebsResponse().success().data(pageResult); } @Override public FebsResponse findBankDetailsById(Long id) { MallMemberBank mallMemberBank = mallMemberBankMapper.selectById(id); MemberBankListVo memberBankListVo = MallMemberBankConversion.INSTANCE.entityToVo(mallMemberBank); return new FebsResponse().success().data(memberBankListVo); } @Override @Transactional public FebsResponse updateMemberBank(UpdateMemberBankDto updateMemberBankDto) { Long id = updateMemberBankDto.getId(); MallMemberBank mallMemberBank = mallMemberBankMapper.selectById(id); mallMemberBank.setName(updateMemberBankDto.getName()); mallMemberBank.setIdType(updateMemberBankDto.getIdType()); mallMemberBank.setIdCardNum(updateMemberBankDto.getIdCardNum()); mallMemberBank.setBankNo(updateMemberBankDto.getBankNo()); mallMemberBank.setPhone(updateMemberBankDto.getPhone()); mallMemberBank.setDigitalNo(updateMemberBankDto.getDigitalNo()); mallMemberBank.setBankName(updateMemberBankDto.getBankName()); mallMemberBank.setSubbranchName(updateMemberBankDto.getSubbranchName()); mallMemberBank.setProvince(updateMemberBankDto.getProvince()); mallMemberBank.setCity(updateMemberBankDto.getCity()); mallMemberBank.setSkhh(updateMemberBankDto.getSkhh()); mallMemberBankMapper.updateById(mallMemberBank); return new FebsResponse().success(); } @Override @Transactional public FebsResponse delMemberBank(Long id) { mallMemberBankMapper.deleteById(id); return new FebsResponse().success(); } @Override public FebsResponse findBankName() { List bankNameList = new ArrayList<>(); List typeBank = dataDictionaryCustomMapper.selectDicByType("TYPE_BANK"); if(CollUtil.isNotEmpty(typeBank)){ bankNameList = typeBank.stream().map(DataDictionaryCustom::getValue).collect(Collectors.toList()); } return new FebsResponse().success().data(bankNameList); } @Override public FebsResponse pwdForget(ForgetPwdDto forgetPwdDto) { String accountLogin = forgetPwdDto.getAccountLogin(); String userKey = forgetPwdDto.getUserKey(); MallMember mallMember = this.baseMapper.selectAccountLoginAndUserKey(accountLogin,userKey); if(ObjectUtil.isEmpty(mallMember)){ throw new FebsException("账号不存在"); } String pwd = SecureUtil.md5(forgetPwdDto.getPassword()); mallMember.setPassword(pwd); this.baseMapper.updateById(mallMember); return new FebsResponse().success().message("操作成功"); } @Override public FebsResponse createAccount() { Integer selectCount = this.baseMapper.selectCount(null); String account = new StringBuilder().append("bbsz").append(ShareCodeUtil.toSerialNumberCode(selectCount)).toString(); return new FebsResponse().success().data(account); } @Override public FebsResponse createKey() { Integer selectCount = this.baseMapper.selectCount(null); String key = ShareCodeUtil.toSerialCode(selectCount); return new FebsResponse().success().data(key); } @Override public FebsResponse getPayment() { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectByMemberId(memberId); MallMemberPaymentVo mallMemberPaymentVo = MallMemberPaymentConversion.INSTANCE.entityToVo(mallMemberPayment); return new FebsResponse().success().data(mallMemberPaymentVo); } @Override public FebsResponse getKey(GetKeyDto getKeyDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectById(memberId); String md5Pwd = SecureUtil.md5(getKeyDto.getPassword()); String md5TraPwd = SecureUtil.md5(getKeyDto.getTradePassword()); if(!mallMember.getPassword().equals(md5Pwd)){ throw new FebsException("登录密码错误"); } if(!mallMember.getTradePassword().equals(md5TraPwd)){ throw new FebsException("交易密码错误"); } return new FebsResponse().success().data(mallMember.getUserKey()); } @Override public FebsResponse updatePayment(UpdatePaymentDto updatePaymentDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("member_id",memberId); List mallProductBuys = mallProductBuyMapper.selectList(objectQueryWrapper); if(ObjectUtil.isNotEmpty(mallProductBuys)){ throw new FebsException("信息无法修改"); } MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectByMemberId(memberId); mallMemberPayment.setWxQrcode(updatePaymentDto.getWxQrcode()); mallMemberPayment.setAliQrcode(updatePaymentDto.getAliQrcode()); mallMemberPayment.setBankName(updatePaymentDto.getBankName()); // mallMemberPayment.setBankNo(updatePaymentDto.getBankNo()); // mallMemberPayment.setBank(updatePaymentDto.getBank()); mallMemberPayment.setPhone(updatePaymentDto.getPhone()); mallMemberPayment.setUsdtTongdao(updatePaymentDto.getUsdtTongdao()); mallMemberPayment.setUsdtAddress(updatePaymentDto.getUsdtAddress()); mallMemberPaymentMapper.updateById(mallMemberPayment); return new FebsResponse().success().message("操作成功"); } @Override public FebsResponse unfreeze(UnfreezeDto unfreezeDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember loginMember = this.baseMapper.selectById(memberId); /** * 判断账号是否冻结 * 判断账号FCM代币是否足够 * 1、自行解冻:扣除对应的FCM代币 * 2、上级解冻:查询是否是解冻用户的直接上级,扣除对应的FCM代币 * 更新账号状态 * 生成流水记录 */ Long unfreezeMemberId = unfreezeDto.getMemberId(); MallMember mallMember = this.baseMapper.selectById(unfreezeMemberId); Integer isFrozen = mallMember.getIsFrozen(); if(ProductEnum.MEMBER_UNFROZEN.getValue() == isFrozen){ throw new FebsException("账户未被冻结"); } DataDictionaryCustom memberFrozenFcmCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.MEMBER_FROZEN_FCM_CNT.getType(), DataDictionaryEnum.MEMBER_FROZEN_FCM_CNT.getCode() ); BigDecimal memberFrozenFcmCnt = new BigDecimal(memberFrozenFcmCntDic.getValue()); MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId); BigDecimal fcmCntAva = mallMemberAmount.getTokenAva(); if(memberFrozenFcmCnt.compareTo(fcmCntAva) > 0){ throw new FebsException("激活需要宝石的数量为:" + fcmCntAva); } if(2 == unfreezeDto.getType()){ List mallMembers = this.baseMapper.selectByRefererId(loginMember.getInviteId()); List collectMemberIds = mallMembers.stream().map(MallMember::getId).collect(Collectors.toList()); if(!collectMemberIds.contains(unfreezeMemberId)){ throw new FebsException("直接推荐人才能解除账户的冻结状态"); } } BigDecimal fcmCntAvaSub = fcmCntAva.subtract(memberFrozenFcmCnt); mallMemberAmount.setTokenAva(fcmCntAvaSub); mallMemberAmountMapper.updateById(mallMemberAmount); mallMember.setIsFrozen(ProductEnum.MEMBER_UNFROZEN.getValue()); this.baseMapper.updateById(mallMember); mallMoneyFlowService.addMoneyFlow( memberId, memberFrozenFcmCnt.negate(), MoneyFlowTypeNewEnum.UNFREEZE_USER.getValue(), MallUtils.getOrderNum(), memberId, FlowTypeNewEnum.TOKEN.getValue(), MoneyFlowTypeNewEnum.UNFREEZE_USER.getDescrition()); return new FebsResponse().success().message("操作成功"); } @Override public FebsResponse memberSpeak(ApiMemberSpeakDto memberSpeakDto) { MallMemberSpeak mallMemberSpeak = new MallMemberSpeak(); if(ObjectUtil.isNotEmpty(memberSpeakDto.getMemberId())){ mallMemberSpeak.setMemberId(memberSpeakDto.getMemberId()); } mallMemberSpeak.setState(ProductEnum.SPEAK_NO_DEAL.getValue()); mallMemberSpeak.setDescription(memberSpeakDto.getDescription()); mallMemberSpeakMapper.insert(mallMemberSpeak); return new FebsResponse().success().message("操作成功"); } @Override public FebsResponse moneyFlowInside(MoneyFlowDto moneyFlowDto) { IPage page = new Page<>(moneyFlowDto.getPageNum(), moneyFlowDto.getPageSize()); Long id = LoginUserUtil.getLoginUser().getId(); moneyFlowDto.setMemberId(id); IPage pages = mallMoneyFlowMapper.selectApiFcmMoneyFlowInsideInPage(page, moneyFlowDto); return new FebsResponse().success().data(pages); } @Override public FebsResponse chargeBalance(ApiChargeBalanceDto apiChargeBalanceDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectById(memberId); if(ObjectUtil.isEmpty(mallMember.getBindPhone())){ throw new FebsException("请绑定充值提取地址"); } String address = mallMember.getBindPhone(); BigDecimal amount = apiChargeBalanceDto.getAmount(); DataDictionaryCustom chargeAmountDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.CHARGE_AMOUNT.getType(), DataDictionaryEnum.CHARGE_AMOUNT.getCode() ); BigDecimal chargeAmount = new BigDecimal(chargeAmountDic.getValue()).setScale(2,BigDecimal.ROUND_DOWN); if(chargeAmount.compareTo(amount) > 0){ throw new FebsException("充值金额需要大于"+chargeAmount); } MallMemberCharge mallMemberCharge = new MallMemberCharge(); mallMemberCharge.setMemberId(memberId); mallMemberCharge.setAmount(amount); mallMemberCharge.setAddress(address); mallMemberCharge.setState(1); mallMemberChargeMapper.insert(mallMemberCharge); return new FebsResponse().success().message("操作成功"); } @Override public FebsResponse bindAddress(ApiBindAddressDto apiBindAddressDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = this.baseMapper.selectById(memberId); if(ObjectUtil.isNotEmpty(mallMember.getBindPhone())){ throw new FebsException("账号已绑定,请勿重复提交"); } String address = apiBindAddressDto.getAddress().toLowerCase(); QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("bind_phone",address); List mallMembers = this.baseMapper.selectList(objectQueryWrapper); if(CollUtil.isNotEmpty(mallMembers)){ throw new FebsException("请使用未绑定的地址"); } mallMember.setBindPhone(address); this.baseMapper.updateById(mallMember); return new FebsResponse().success().message("操作成功"); } // public static void main(String[] args) { // Set objectsAccount = new HashSet<>(); // Set objects = new HashSet<>(); // int j = 100; // for(int i =0;i < 100 ; i++){ // String s = ShareCodeUtil.toSerialNumberCodeTwo(j); // objects.add(s); // } // // System.out.println(objects); // System.out.println(objects.size()); // } }