From 8444084e6aa11efa23287e7f82474ac22378a5c4 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期二, 01 四月 2025 16:03:19 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java | 2105 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 1,894 insertions(+), 211 deletions(-) diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java index d2a6216..bd779ac 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java @@ -1,49 +1,60 @@ package com.ruoyi.member.service.impl.member; - +import com.google.common.collect.Lists; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; +import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.bean.BeanUtils; import com.ruoyi.common.core.utils.uuid.IdUtils; +import com.ruoyi.common.redis.service.RedisService; +import com.ruoyi.common.security.utils.CodeFactoryUtil; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.member.domain.dto.*; -import com.ruoyi.member.domain.pojo.member.MemberNurse; +import com.ruoyi.member.domain.pojo.member.IntegralRecord; +import com.ruoyi.member.domain.pojo.member.MemberArchive; +import com.ruoyi.member.domain.pojo.member.MemberTotal; +import com.ruoyi.member.domain.vo.MerMemberTotalVo; import com.ruoyi.member.domain.vo.*; import com.ruoyi.member.mapper.member.MemberMapper; -import com.ruoyi.member.service.member.MemberNurseService; +import com.ruoyi.member.service.member.IntegralRecordService; +import com.ruoyi.member.service.member.MemberArchiveService; import com.ruoyi.member.service.member.MemberService; +import com.ruoyi.member.service.member.MemberTotalService; import com.ruoyi.member.util.HttpUtils; -import com.ruoyi.system.api.RemoteConfigService; -import com.ruoyi.system.api.RemoteOrderService; -import com.ruoyi.system.api.RemoteShopService; -import com.ruoyi.system.api.RemoteUserService; +import com.ruoyi.member.util.MsgUtils; import com.ruoyi.system.api.constant.AppErrorConstant; import com.ruoyi.system.api.constant.SecurityConstant; -import com.ruoyi.system.api.domain.dto.AppEditUserDto; -import com.ruoyi.system.api.domain.dto.AppMemberBindingDto; -import com.ruoyi.system.api.domain.dto.AppMemberGoodsTypeDto; +import com.ruoyi.system.api.domain.dto.*; +import com.ruoyi.system.api.domain.poji.config.Activeness; import com.ruoyi.system.api.domain.poji.config.SysTag; import com.ruoyi.system.api.domain.poji.member.Member; import com.ruoyi.system.api.domain.poji.shop.Shop; import com.ruoyi.system.api.domain.poji.sys.SysUser; -import com.ruoyi.system.api.domain.vo.AppOrderTotalVo; +import com.ruoyi.system.api.domain.vo.*; import com.ruoyi.system.api.model.AppMiniLoginDto; import com.ruoyi.system.api.model.AppMiniLoginVo; +import com.ruoyi.system.api.service.RemoteConfigService; +import com.ruoyi.system.api.service.RemoteOrderService; +import com.ruoyi.system.api.service.RemoteShopService; +import com.ruoyi.system.api.service.RemoteUserService; import lombok.extern.log4j.Log4j2; -import com.ruoyi.common.core.utils.StringUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.http.HttpResponse; import org.apache.http.util.EntityUtils; -import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -77,19 +88,38 @@ private MemberMapper memberMapper; @Resource - private StringRedisTemplate stringRedisTemplate; - - @Resource private RemoteShopService shopService; @Resource private RemoteOrderService orderService; - @Resource - private MemberNurseService memberNurseService; @Resource private RemoteConfigService remoteConfigService; + + @Resource + private RedisService redisService; + + @Resource + private MemberTotalService memberTotalService; + + @Resource + private IntegralRecordService integralRecordService; + + @Resource + private MemberArchiveService memberArchiveService; + + @Resource + private RemoteShopService remoteShopService; + + @Resource + private RemoteOrderService remoteOrderService; + + @Resource + private RemoteUserService remoteUserService; + + + /** * @description: TODO @@ -98,18 +128,17 @@ * @version 1.0 */ @Override - public Member getByUserId(Long userId){ + public Member getByUserId(Long userId) { Member member = memberMapper.selectMemberByUserId(userId); return member; } /** - * * @param appMiniLoginDto * @return */ @Override - public AppMiniLoginVo getMemberByCode(AppMiniLoginDto appMiniLoginDto){ + public AppMiniLoginVo getMemberByCode(AppMiniLoginDto appMiniLoginDto) { AppMiniLoginVo appMiniLoginVo = new AppMiniLoginVo(); WxMaJscode2SessionResult session = null; @@ -123,149 +152,159 @@ e.printStackTrace(); return null; } - if(session!=null&& StringUtils.isNotBlank(session.getOpenid())){ + if (session != null && StringUtils.isNotBlank(session.getOpenid())) { unionid = session.getUnionid(); openid = session.getOpenid(); sessionKey = session.getSessionKey(); //获取用户 Member member = memberMapper.getOneByMiniOpenid(openid); - SysUser sysUser; - if(member==null){ - //创建新用户 - String memberId = IdUtils.simpleUUID(); - sysUser = new SysUser(); - sysUser.setUserName(memberId); - sysUser.setUserType("03"); - sysUser.setNickName("鸿瑞堂用户"); - sysUser.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png"); - String password = "hongruitang"; - sysUser.setPassword(SecurityUtils.encryptPassword(password)); - sysUser = sysUserService.registerUser(sysUser).getData(); - log.info("sysUser1-----------------"+sysUser.toString()); - member = new Member(); - member.setUserId(sysUser.getUserId()); - member.setDelFlag(0); - member.setNickName("鸿瑞堂用户"); - member.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png"); - member.setMemberId(memberId); - member.setRelationShopId(1L); - member.setWxUnionid(unionid); - member.setMiniOpenid(openid); - member.setBindingFlag(0); - member.setCreateTime(new Date()); - log.info("member-----------------"+member.toString()); - this.saveOrUpdate(member); - - }else{ - log.info("member2"+member.toString()); - R<SysUser> sysUser1 = sysUserService.getSysUser(member.getUserId()); - log.info("sysUser1"+ sysUser1.getCode() + " : " + sysUser1.getMsg()); - sysUser = sysUser1.getData(); - log.info("sysUser"+sysUser.toString()); + SysUser sysUser = null; + if (member != null) { + sysUser = sysUserService.getSysUser(member.getUserId()).getData(); } appMiniLoginVo.setMiniOpenid(openid); appMiniLoginVo.setWxUnionid(unionid); appMiniLoginVo.setSysUser(sysUser); appMiniLoginVo.setSessionKey(sessionKey); - stringRedisTemplate.opsForValue().set(SecurityConstant.SESSION_KEY+openid,sessionKey); - }else{ - log.info("null"); - return null; + redisService.setCacheObject(SecurityConstant.SESSION_KEY + openid, sessionKey, 1L, TimeUnit.DAYS); } - log.info("appMiniLoginVo"+appMiniLoginVo.toString()); + log.info("appMiniLoginVo" + appMiniLoginVo.toString()); return appMiniLoginVo; } /** - * 获取授权信息 - * @param appUserAuthorizeDto + * 小程序注册 + * + * @param appUserRegisterDto * @return */ @Override - public AppUserAuthorizeVo getAppUserAuthorize(AppUserAuthorizeDto appUserAuthorizeDto){ - Member member = this.getById(appUserAuthorizeDto.getUserId()); - AppUserAuthorizeVo appUserAuthorizeVo = new AppUserAuthorizeVo(); + public AppMiniRegisterVo miniRegister(AppMiniRegisterDto appUserRegisterDto) { + AppMiniRegisterVo appUserRegisterVo = new AppMiniRegisterVo(); String mobile = null; - if(StringUtils.isBlank(member.getMobile())){ - //获取code接口在redis里存放的sessionkey用于解密 - String sessionkey = stringRedisTemplate.opsForValue().get(SecurityConstant.SESSION_KEY+ member.getMiniOpenid()); - if(StringUtils.isBlank(sessionkey)){ - throw new ServiceException(AppErrorConstant.USER_NOT_LOGIN); - } - try { - String accessToken = stringRedisTemplate.opsForValue().get("wx_access_token"); + //获取code接口在redis里存放的sessionkey用于解密 + String sessionkey = redisService.getCacheObject(SecurityConstant.SESSION_KEY + appUserRegisterDto.getMiniOpenid()); + if (StringUtils.isBlank(sessionkey)) { + throw new ServiceException(AppErrorConstant.USER_NOT_LOGIN); + } + try { + //获取微信token用于解密手机 + String accessToken = redisService.getCacheObject(SecurityConstant.WX_TOKEN); + if (StringUtils.isBlank(accessToken)) { + String responseAccessToken = getAccessTokenByWX(); + JSONObject jsonAccessToken = JSONObject.parseObject(responseAccessToken); + accessToken = jsonAccessToken.getString("access_token"); + String errmsg = jsonAccessToken.getString("errmsg"); + Long expiresIn = jsonAccessToken.getLong("expires_in"); if (StringUtils.isBlank(accessToken)) { - String responseAccessToken = getAccessTokenByWX(); - JSONObject jsonAccessToken = JSONObject.parseObject(responseAccessToken); - accessToken = jsonAccessToken.getString("access_token"); - String errmsg = jsonAccessToken.getString("errmsg"); - Long expiresIn = jsonAccessToken.getLong("expires_in"); - if (StringUtils.isBlank(accessToken)) { - throw new ServiceException(errmsg); - } else { - expiresIn = expiresIn - 100; - stringRedisTemplate.opsForValue().set("wx_access_token", accessToken, expiresIn.intValue(), TimeUnit.SECONDS); - } + throw new ServiceException(errmsg); + } else { + expiresIn = expiresIn - 100; + redisService.setCacheObject(SecurityConstant.WX_TOKEN, accessToken, Long.valueOf(expiresIn), TimeUnit.SECONDS); } - String responseUserPhoneNumber = getMobileByWX(accessToken, appUserAuthorizeDto.getMobileCode()); - JSONObject jsonUserPhoneNumber = JSONObject.parseObject(responseUserPhoneNumber); - String errcode = jsonUserPhoneNumber.getString("errcode"); - String errmsg = jsonUserPhoneNumber.getString("errmsg"); - if (!errcode.equals("0")) { + } + //解密手机 + String responseUserPhoneNumber = getMobileByWX(accessToken, appUserRegisterDto.getMobileCode()); + JSONObject jsonUserPhoneNumber = JSONObject.parseObject(responseUserPhoneNumber); + String errcode = jsonUserPhoneNumber.getString("errcode"); + String errmsg = jsonUserPhoneNumber.getString("errmsg"); + if (!"0".equals(errcode)) { + //因为生产测试差异,临时更新token + redisService.deleteObject(SecurityConstant.WX_TOKEN); + String responseAccessToken = getAccessTokenByWX(); + JSONObject jsonAccessToken = JSONObject.parseObject(responseAccessToken); + accessToken = jsonAccessToken.getString("access_token"); + errmsg = jsonAccessToken.getString("errmsg"); + Long expiresIn = jsonAccessToken.getLong("expires_in"); + if (StringUtils.isBlank(accessToken)) { + throw new ServiceException(errmsg); + } else { + expiresIn = expiresIn - 100; + redisService.setCacheObject(SecurityConstant.WX_TOKEN, accessToken, Long.valueOf(expiresIn), TimeUnit.SECONDS); + } + responseUserPhoneNumber = getMobileByWX(accessToken, appUserRegisterDto.getMobileCode()); + jsonUserPhoneNumber = JSONObject.parseObject(responseUserPhoneNumber); + errcode = jsonUserPhoneNumber.getString("errcode"); + errmsg = jsonUserPhoneNumber.getString("errmsg"); + if (!"0".equals(errcode)) { throw new ServiceException(errmsg); } - String phoneInfo = jsonUserPhoneNumber.getString("phone_info"); - JSONObject jsonUserPhoneInfo = JSONObject.parseObject(phoneInfo); - mobile = jsonUserPhoneInfo.getString("purePhoneNumber"); - } catch (Exception e) { - e.printStackTrace(); } - Member oldMember = this.getByMobile(mobile); - if(oldMember!=null){ - member.setNickName(oldMember.getNickName()); - member.setGender(oldMember.getGender()); - member.setReferrer(oldMember.getReferrer()); - member.setBirthday(oldMember.getBirthday()); - member.setBindingFlag(1); - member.setRelationShopId(oldMember.getRelationShopId()); - oldMember.setDelFlag(1); - oldMember.setMiniOpenid(oldMember.getMiniOpenid()+"已删除"); - this.saveOrUpdate(oldMember); - }else{ - //更新用户手机信息 - SysUser sysUser = new SysUser(); - sysUser.setUserId(appUserAuthorizeDto.getUserId()); - sysUser.setPhonenumber(mobile); - sysUserService.updateUserMobile(sysUser); - member.setNickName(sysUser.getNickName()); - } - member.setMobile(mobile); - this.saveOrUpdate(member); - }else{ - mobile = member.getMobile(); + String phoneInfo = jsonUserPhoneNumber.getString("phone_info"); + JSONObject jsonUserPhoneInfo = JSONObject.parseObject(phoneInfo); + mobile = jsonUserPhoneInfo.getString("purePhoneNumber"); + } catch (Exception e) { + e.printStackTrace(); } - appUserAuthorizeVo.setMobile(mobile); - appUserAuthorizeVo.setNickName(member.getNickName()); - appUserAuthorizeVo.setOpenid(member.getMiniOpenid()); - appUserAuthorizeVo.setUnionid(member.getWxUnionid()); - return appUserAuthorizeVo; + if (StringUtils.isBlank(mobile)) { + return null; + } + //判断openid是否被其他手机号占用 + Member checkMember = memberMapper.getOneByMiniOpenid(appUserRegisterDto.getMiniOpenid()); + if (checkMember != null && !checkMember.getMobile().equals(mobile)) { + throw new ServiceException("微信号换绑手机需联系客服"); + } + Member member = memberMapper.selectMemberByMobile(mobile); + SysUser sysUser; + //获取用户为空则新建 + if (member == null) { + //创建新用户 + String memberId = IdUtils.simpleUUID(); + sysUser = new SysUser(); + sysUser.setUserName(memberId); + sysUser.setUserType("03"); + sysUser.setNickName("鸿瑞堂用户"); + sysUser.setPhonenumber(mobile); + sysUser.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png"); + String password = "hongruitang"; + sysUser.setPassword(SecurityUtils.encryptPassword(password)); + sysUser = sysUserService.registerUser(sysUser).getData(); + member = new Member(); + String memberNo = createMemberNo(); + member.setMemberNo(memberNo); + member.setUserId(sysUser.getUserId()); + member.setDelFlag(0); + member.setFrozenFlag(0); + member.setNickName("鸿瑞堂用户"); + member.setRealName("鸿瑞堂用户"); + member.setCustomerSource("小程序"); + member.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png"); + member.setMemberId(memberId); + member.setBindingFlag(0); + member.setCreateTime(new Date()); + member.setMobile(mobile); + initMemberTotal(memberId); + log.info("sysUser01-----------------" + sysUser.toString()); + } else { + sysUser = sysUserService.getSysUser(member.getUserId()).getData(); + log.info("sysUser02-----------------" + sysUser.toString()); + } + member.setWxUnionid(appUserRegisterDto.getWxUnionid()); + member.setMiniOpenid(appUserRegisterDto.getMiniOpenid()); + log.info("member02-----------------" + member.toString()); + this.saveOrUpdate(member); + appUserRegisterVo.setMobile(mobile); + appUserRegisterVo.setNickName(member.getNickName()); + appUserRegisterVo.setOpenid(member.getMiniOpenid()); + appUserRegisterVo.setUnionid(member.getWxUnionid()); + appUserRegisterVo.setSysUser(sysUser); + return appUserRegisterVo; } public static String getAccessTokenByWX() throws Exception { String host = ACCESS_TOKEN_HOST + "?appid=" + WX_APPID + "&secret=" + WX_SECRET + "&grant_type=client_credential"; - Map<String, String> headers = new HashMap<>(8); + Map<String, String> headers = new HashMap<>(8); HttpResponse response = HttpUtils.doGet(host, "", "GET", headers, null); return EntityUtils.toString(response.getEntity()); } - public static String getMobileByWX(String accessToken, String code) throws Exception { - String method = "POST"; + public static String getMobileByWX(String accessToken, String code) throws Exception { Map<String, String> headers = new HashMap<>(16); headers.put("Content-Type", "application/json"); headers.put("Accept", "application/json"); Map<String, String> querys = new HashMap<>(16); Map<String, String> bodys = new HashMap<>(16); - querys.put("access_token", accessToken ); + querys.put("access_token", accessToken); bodys.put("code", code); String body = JSONObject.toJSONString(bodys); String host = "https://api.weixin.qq.com/wxa/business/getuserphonenumber"; @@ -275,77 +314,148 @@ /** * 获取用户信息 + * * @param userId * @return */ @Override - public AppUserInfoVo getAppUserInfo(Long userId){ + public AppUserInfoVo getAppUserInfo(Long userId) { AppUserInfoVo appUserInfoVo = new AppUserInfoVo(); Member member = this.getByUserId(userId); appUserInfoVo.setUserId(userId); - appUserInfoVo.setRelationShopId(member.getRelationShopId()); appUserInfoVo.setMemberNo(member.getMemberNo()); appUserInfoVo.setNickName(member.getNickName()); appUserInfoVo.setRealName(member.getRealName()); appUserInfoVo.setPhonenumber(member.getMobile()); - if(member.getRelationShopId()!=null){ + //绑定会员显示绑定店铺 + if (member.getRelationShopId() != null && member.getBindingFlag() == 1) { + appUserInfoVo.setRelationShopId(member.getRelationShopId()); Shop shop = shopService.getShop(member.getRelationShopId()).getData(); appUserInfoVo.setShopName(shop.getShopName()); + appUserInfoVo.setShopAddress(shop.getShopAreaName() + shop.getShopAddress()); } appUserInfoVo.setBirthday(member.getBirthday()); appUserInfoVo.setGender(member.getGender()); appUserInfoVo.setAvatar(member.getAvatar()); + //待支付待核销统计 AppOrderTotalVo appOrderTotalVo = orderService.getAppOrderTotal(userId).getData(); appUserInfoVo.setNoPayCount(appOrderTotalVo.getNoPayCount()); appUserInfoVo.setNoUseCount(appOrderTotalVo.getNoUseCount()); + //积分 + MemberTotal memberTotal = memberTotalService.getById(member.getMemberId()); + appUserInfoVo.setIntegral(memberTotal.getUseableIntegral()); return appUserInfoVo; } /** * 修改用户信息 + * * @param appEditUserDto */ @Override - public void editAppUserInfo(AppEditUserDto appEditUserDto){ + public void editAppUserInfo(AppEditUserDto appEditUserDto) { //修改类型1.昵称2.头像3.性别4.生日 Integer editType = appEditUserDto.getEditType(); String editValue = appEditUserDto.getEditValue(); Member member = this.getByUserId(appEditUserDto.getUserId()); - switch (editType){ + switch (editType) { case 1: member.setNickName(editValue); - member.setUpdateTime(new Date()); - member.setUpdateUserId(appEditUserDto.getUserId()); - this.saveOrUpdate(member); break; case 2: + member.setAvatar(editValue); break; case 3: member.setGender(Integer.valueOf(editValue)); - member.setUpdateTime(new Date()); - member.setUpdateUserId(appEditUserDto.getUserId()); - this.saveOrUpdate(member); break; case 4: + if(editValue.compareTo(DateUtils.getDate())>0){ + throw new ServiceException(AppErrorConstant.BIRTHDAY_BEYOND); + } member.setBirthday(editValue); - member.setUpdateTime(new Date()); - member.setUpdateUserId(appEditUserDto.getUserId()); - this.saveOrUpdate(member); + break; + case 5: + member.setRealName(editValue); break; default: break; } + member.setUpdateTime(new Date()); + member.setUpdateUserId(appEditUserDto.getUserId()); + this.saveOrUpdate(member); sysUserService.editUserInfo(appEditUserDto); } /** * 分页获取会员信息 + * * @param merMemberPageDto * @return */ @Override - public List<MerMemberPageVo> pageMerMember(Page page, MerMemberPageDto merMemberPageDto){ - List<MerMemberPageVo> merMemberPageVoList = memberMapper.pageMerMember(page,merMemberPageDto); + public List<MerMemberPageVo> pageMerMember(Page page, MerMemberPageDto merMemberPageDto) { + //处理活跃度 + List<Activeness> activenessList = remoteConfigService.listActiveness().getData(); + if (StringUtils.isNotBlank(merMemberPageDto.getMemberActiveness())) { + if(!activenessList.isEmpty()){ + for(Activeness activeness : activenessList){ + if(activeness.getActivenessName().equals(merMemberPageDto.getMemberActiveness())){ + Date nowDay = DateUtils.getNowDate(); + String actStartDate = DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(nowDay, -activeness.getEndDay())); + String actEndDate = DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(nowDay, -activeness.getStartDay())); + merMemberPageDto.setActStartDate(actStartDate); + merMemberPageDto.setActEndDate(actEndDate); + break; + } + } + } + } + //处理剩余次数 + if(merMemberPageDto.getSurpNum()!=null){ + if(merMemberPageDto.getSurpNum()==1){ + merMemberPageDto.setSurpStartNum(0); + merMemberPageDto.setSurpEndNum(5); + }else if(merMemberPageDto.getSurpNum()==2){ + merMemberPageDto.setSurpStartNum(5); + merMemberPageDto.setSurpEndNum(10); + }else if(merMemberPageDto.getSurpNum()==3){ + merMemberPageDto.setSurpStartNum(10); + merMemberPageDto.setSurpEndNum(999999999); + } + } + List<MerMemberPageVo> merMemberPageVoList = memberMapper.pageMerMember(page, merMemberPageDto); + //处理活跃度返回 + if (merMemberPageVoList != null && !merMemberPageVoList.isEmpty()) { + if (activenessList != null && !activenessList.isEmpty()) { + //生成活跃度时间段列表 + List<MgtActivenessJudgeVo> mgtActivenessJudgeVoList = new ArrayList<>(); + MgtActivenessJudgeVo mgtActivenessJudgeVo; + for (Activeness activeness : activenessList) { + mgtActivenessJudgeVo = new MgtActivenessJudgeVo(); + mgtActivenessJudgeVo.setStartDay(DateUtils.addDays(new Date(), -activeness.getEndDay())); + mgtActivenessJudgeVo.setEndDay(DateUtils.addDays(new Date(), -activeness.getStartDay())); + mgtActivenessJudgeVo.setActivenessName(activeness.getActivenessName()); + mgtActivenessJudgeVoList.add(mgtActivenessJudgeVo); + } + //活跃度赋值 + Date lastPayTime; + for (MerMemberPageVo mgtMemberPageVo : merMemberPageVoList) { + //实际是最后服务时间 + lastPayTime = mgtMemberPageVo.getLastPayTime(); + StringJoiner sj = new StringJoiner(","); + if (lastPayTime != null) { + for (MgtActivenessJudgeVo entity : mgtActivenessJudgeVoList) { + if (lastPayTime.compareTo(entity.getStartDay()) >= 0 && lastPayTime.compareTo(entity.getEndDay()) <= 0) { + sj.add(entity.getActivenessName()); + } + } + if (sj.length() > 0) { + mgtMemberPageVo.setMemberActiveness(sj.toString()); + } + } + } + } + } return merMemberPageVoList; } @@ -357,89 +467,132 @@ * @version 1.0 */ @Override - public MerMemberInfoVo getMerMemberInfo(Long userId){ + public MerMemberInfoVo getMerMemberInfo(MerBaseGetDto merBaseGetDto) { + // 将id转换为Long类型 + Long userId = Long.valueOf(merBaseGetDto.getId()); + // 创建MerMemberInfoVo对象 MerMemberInfoVo merMemberInfoVo = new MerMemberInfoVo(); + // 根据userId获取Member对象 Member member = this.getByUserId(userId); + // 设置MerMemberInfoVo对象的属性值 merMemberInfoVo.setUserId(userId); - merMemberInfoVo.setNickName(member.getNickName()); + merMemberInfoVo.setRealName(member.getRealName()); merMemberInfoVo.setPhonenumber(member.getMobile()); merMemberInfoVo.setAvatar(member.getAvatar()); merMemberInfoVo.setBirthday(member.getBirthday()); merMemberInfoVo.setUserTags(member.getUserTags()); - //未完成 - + merMemberInfoVo.setMemberType(member.getGoodsType()); + // 根据memberId获取MemberTotal对象 + MemberTotal memberTotal = memberTotalService.getById(member.getMemberId()); + // 设置MerMemberInfoVo对象的属性值 + merMemberInfoVo.setSurpNumber(memberTotal.getUseableServiceCount()); + // 创建MerBaseDto对象 + MerBaseDto merBaseDto = new MerBaseDto(); + // 设置MerBaseDto对象的属性值 + merBaseDto.setShopId(merBaseGetDto.getShopId()); + merBaseDto.setUserId(userId); + // 获取未支付订单金额 + MerMemberSimpleTotalVo memberSimpleTotalVo = remoteOrderService.getMerMemberSimpleTotalVo(merBaseDto).getData(); + merMemberInfoVo.setUserNumber(memberSimpleTotalVo.getUserNumber()); + merMemberInfoVo.setPayMoney(memberSimpleTotalVo.getPayMoney()); + merMemberInfoVo.setUnpaidMoney(memberSimpleTotalVo.getUnpaidMoney()); + // 获取最近的会员任务 + MemberTaskSimpleVo memberTaskSimpleVo = remoteShopService.getLastMemberTask(userId).getData(); + if (memberTaskSimpleVo != null) { + merMemberInfoVo.setLastTaskContent(memberTaskSimpleVo.getTaskContent()); + merMemberInfoVo.setLastTaskTime(memberTaskSimpleVo.getTaskDate()); + } + // 设置MerMemberInfoVo对象的属性值 + merMemberInfoVo.setNextTaskTime(memberTotal.getNextTaskTime()); + merMemberInfoVo.setLastPayTime(memberTotal.getLastConsumeTime()); + // 返回MerMemberInfoVo对象 return merMemberInfoVo; } /** * 分页获取收银用户列表 + * * @param page * @param merCashMemberPageDto * @return */ @Override - public List<MerCashMemberPageVo> pageMerCashMember(Page page, MerCashMemberPageDto merCashMemberPageDto){ + public List<MerCashMemberPageVo> pageMerCashMember(Page page, MerCashMemberPageDto merCashMemberPageDto) { - List<MerCashMemberPageVo> merCashMemberPageVos = memberMapper.pageMerCashMember(page,merCashMemberPageDto); + List<MerCashMemberPageVo> merCashMemberPageVos = memberMapper.pageMerCashMember(page, merCashMemberPageDto); return merCashMemberPageVos; } /** * 更新会员绑定商户 + * * @param appMemberBindingDto */ @Override - public void updateMemberBinding(AppMemberBindingDto appMemberBindingDto){ + public void updateMemberBinding(AppMemberBindingDto appMemberBindingDto) { Member member = this.getByUserId(appMemberBindingDto.getUserId()); + if (member.getBindingFlag() == 0) { + member.setBindingTime(new Date()); + } member.setBindingFlag(appMemberBindingDto.getBindingFlag()); member.setRelationShopId(appMemberBindingDto.getShopId()); + member.setRelationShopName(appMemberBindingDto.getShopName()); + member.setBindingType(appMemberBindingDto.getBindingType()); this.saveOrUpdate(member); } /** * 获取会员基础档案 + * * @param userId * @return */ @Override - public MerMemberBasicFileVo getMerMemberBasicFile(Long userId){ + public MerMemberBasicFileVo getMerMemberBasicFile(Long userId) { MerMemberBasicFileVo merMemberBasicFileVo = new MerMemberBasicFileVo(); Member member = this.getByUserId(userId); BeanUtils.copyProperties(member, merMemberBasicFileVo); - merMemberBasicFileVo.setNickName(member.getNickName()); + merMemberBasicFileVo.setRealName(member.getRealName()); merMemberBasicFileVo.setPhonenumber(member.getMobile()); merMemberBasicFileVo.setCreateTime(member.getCreateTime()); - List<MemberNurse> memberNurseList = memberNurseService.listByUserId(userId); - List<String> valueList = memberNurseList.stream().map(k->k.getNurse()).collect(Collectors.toList()); - merMemberBasicFileVo.setMemberNurse(valueList); + /*List<MemberNurse> memberNurseList = memberNurseService.listByUserId(userId); + List<String> valueList = memberNurseList.stream().map(k -> k.getNurse()).collect(Collectors.toList());*/ + String memberNurse = member.getMemberNurse(); + if(StringUtils.isNotBlank(memberNurse)){ + List<String> valueList = Arrays.asList(memberNurse.split(",")); + merMemberBasicFileVo.setMemberNurse(valueList); + } + List<MemberArchiveVo> achiveList = memberArchiveService.listMerVoByUserId(userId); + merMemberBasicFileVo.setAchiveList(achiveList); return merMemberBasicFileVo; } /** * 获取会员标签 + * * @param userId * @return */ @Override - public List<MerMemberTagVo> getMerMemberTags(Long userId){ + public List<MerMemberTagVo> getMerMemberTags(Long userId) { Member member = this.getByUserId(userId); String userTags = member.getUserTags(); String[] userTagsArr = null; - if(StringUtils.isNotBlank(userTags)){ + if (StringUtils.isNotBlank(userTags)) { userTagsArr = userTags.split(","); } List<SysTag> sysTagsList = remoteConfigService.listSysTag(1).getData(); List<MerMemberTagVo> merMemberTagVoList = new ArrayList<>(); MerMemberTagVo merMemberTagVo; String tagName; - if(sysTagsList!=null&&!sysTagsList.isEmpty()){ - for(SysTag sysTag : sysTagsList){ + if (sysTagsList != null && !sysTagsList.isEmpty()) { + for (SysTag sysTag : sysTagsList) { merMemberTagVo = new MerMemberTagVo(); tagName = sysTag.getTagName(); merMemberTagVo.setTagName(tagName); - if(userTagsArr!=null && ArrayUtils.contains(userTagsArr, tagName)){ + if (userTagsArr != null && ArrayUtils.contains(userTagsArr, tagName)) { merMemberTagVo.setSelectFlag(1); - }else{ + } else { merMemberTagVo.setSelectFlag(0); } merMemberTagVoList.add(merMemberTagVo); @@ -450,15 +603,16 @@ /** * 编辑会员标签 + * * @param merMemberTagEditDto */ @Override - public void editMerMemberTags(MerMemberTagEditDto merMemberTagEditDto){ + public void editMerMemberTags(MerMemberTagEditDto merMemberTagEditDto) { Member member = this.getByUserId(merMemberTagEditDto.getMemberUserId()); List<String> userTags = merMemberTagEditDto.getUserTags(); StringJoiner sj = new StringJoiner(","); - if(userTags!=null&&!userTags.isEmpty()){ - for(String str : userTags){ + if (userTags != null && !userTags.isEmpty()) { + for (String str : userTags) { sj.add(str); } } @@ -469,64 +623,113 @@ /** * 添加会员 + * * @param merMemberAddDto */ @Override - public void addMerMember(MerMemberAddDto merMemberAddDto){ - String phonenumber = merMemberAddDto.getPhonenumber(); - Member oldMember = this.getByMobile(phonenumber); - if(oldMember!=null){ + public Long addMerMember(MerMemberAddDto merMemberAddDto) { + String phoneNumber = merMemberAddDto.getPhonenumber(); + Member oldMember = this.getByMobile(phoneNumber); + // Check if the member already exists + if (oldMember != null && oldMember.getBindingFlag() == 1) { throw new ServiceException(AppErrorConstant.MOBILE_USER_DOUBLE); } - SysUser sysUser = sysUserService.getSysUserByMobile(phonenumber).getData(); - if(sysUser==null){ + if (oldMember != null && oldMember.getBindingFlag() == 0) { + oldMember.setRelationShopId(merMemberAddDto.getShopId()); + oldMember.setBindingFlag(1); + oldMember.setBindingType(8); + this.updateById(oldMember); + return oldMember.getUserId(); + } + // Get the sysUser by mobile number + SysUser sysUser = sysUserService.getSysUserByMobile(phoneNumber).getData(); + // If sysUser does not exist, create a new one + if (sysUser == null || !sysUser.getUserType().equals("03")) { + String memberId = IdUtils.simpleUUID(); sysUser = new SysUser(); - sysUser.setUserName(phonenumber); + sysUser.setUserName(memberId); sysUser.setUserType("03"); - sysUser.setNickName(merMemberAddDto.getNickName()); + sysUser.setNickName(merMemberAddDto.getRealName()); + sysUser.setPhonenumber(merMemberAddDto.getPhonenumber()); sysUser.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png"); String password = "hongruitang"; sysUser.setPassword(SecurityUtils.encryptPassword(password)); - log.debug("sysUser"+sysUser.toString()); + log.debug("sysUser" + sysUser.toString()); sysUser = sysUserService.registerUser(sysUser).getData(); + // Create a new member + Member member = new Member(); + String memberNo = createMemberNo(); + member.setMemberNo(memberNo); + member.setMemberId(memberId); + member.setUserId(sysUser.getUserId()); + member.setDelFlag(0); + member.setFrozenFlag(0); + member.setNickName(merMemberAddDto.getRealName()); + member.setRealName(merMemberAddDto.getRealName()); + member.setGender(merMemberAddDto.getGender()); + member.setLevel(merMemberAddDto.getLevel()); + member.setMobile(phoneNumber); + member.setReferrer(merMemberAddDto.getReferrer()); + member.setBirthday(merMemberAddDto.getBirthday()); + member.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png"); + member.setRelationShopId(merMemberAddDto.getShopId()); + member.setWxUnionid(null); + member.setMiniOpenid(null); + member.setBindingFlag(1); + member.setBindingTime(new Date()); + member.setBindingType(6); + // Get shop information and set it to the member + Shop shop = remoteShopService.getShop(merMemberAddDto.getShopId()).getData(); + member.setRelationShopName(shop.getShopName()); + member.setCustomerSource(merMemberAddDto.getCustomerSource()); + member.setCreateTime(new Date()); + //调理问题 + List<String> memberNurse = merMemberAddDto.getMemberNurse(); + if(memberNurse!=null&&!memberNurse.isEmpty()){ + String memberNurseString = String.join(",", memberNurse); + member.setMemberNurse(memberNurseString); + } + // Save the member and initialize member total + this.saveOrUpdate(member); + initMemberTotal(memberId); + List<MemberArchiveVo> achiveList = merMemberAddDto.getAchiveList(); + if(achiveList!=null&&!achiveList.isEmpty()){ + SysUser finalSysUser = sysUser; + List<MemberArchive> memberArchiveList = achiveList.stream().map(memberArchiveVo -> { + MemberArchive memberArchive = new MemberArchive(); + memberArchive.setDelFlag(0); + memberArchive.setUserId(finalSysUser.getUserId()); + memberArchive.setFieldId(memberArchiveVo.getFieldId()); + memberArchive.setFieldValue(memberArchiveVo.getFieldValue()); + return memberArchive; + } + ).collect(Collectors.toList()); + memberArchiveService.saveBatch(memberArchiveList); + } + }else{ + throw new ServiceException(AppErrorConstant.MOBILE_USER_DOUBLE); } - log.info("sysUser1-----------------"+sysUser.toString()); - String memberId = IdUtils.simpleUUID(); - Member member = new Member(); - member.setUserId(sysUser.getUserId()); - member.setDelFlag(0); - member.setNickName(merMemberAddDto.getNickName()); - member.setGender(merMemberAddDto.getGender()); - member.setMobile(phonenumber); - member.setReferrer(merMemberAddDto.getReferrer()); - member.setBirthday(merMemberAddDto.getBirthday()); - member.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png"); - member.setMemberId(memberId); - member.setRelationShopId(1L); - member.setWxUnionid(null); - member.setMiniOpenid(null); - member.setBindingFlag(1); - member.setRelationShopId(merMemberAddDto.getShopId()); - member.setCreateTime(new Date()); - log.info("member-----------------"+member.toString()); - this.saveOrUpdate(member); + return sysUser.getUserId(); } /** * 编辑会员 + * * @param merMemberEditDto */ @Override - public void editMerMember(MerMemberEditDto merMemberEditDto){ - + public void editMerMember(MerMemberEditDto merMemberEditDto) { + // 获取用户信息 Member member = this.getByUserId(merMemberEditDto.getEditUserId()); - if(!member.getMobile().equals(merMemberEditDto.getPhonenumber())){ + // 检查手机号是否已经存在 + if (!member.getMobile().equals(merMemberEditDto.getPhonenumber())) { Member memberOld = getByMobile(merMemberEditDto.getPhonenumber()); - if(memberOld!=null){ + if (memberOld != null) { throw new ServiceException(AppErrorConstant.MOBILE_DOUBLE); } } - member.setRealName(merMemberEditDto.getNickName()); + // 更新用户信息 + member.setRealName(merMemberEditDto.getRealName()); member.setMobile(merMemberEditDto.getPhonenumber()); member.setGender(merMemberEditDto.getGender()); member.setReferrer(merMemberEditDto.getReferrer()); @@ -535,21 +738,42 @@ member.setBirthday(merMemberEditDto.getBirthday()); member.setUpdateUserId(merMemberEditDto.getUserId()); member.setUpdateTime(new Date()); - log.info("member-----------------"+member.toString()); + List<String> memberNurse = merMemberEditDto.getMemberNurse(); + if(memberNurse!=null&&!memberNurse.isEmpty()){ + String memberNurseString = String.join(",", memberNurse); + member.setMemberNurse(memberNurseString); + } this.saveOrUpdate(member); + // 更新用户手机号 SysUser sysUser = new SysUser(); sysUser.setUserId(merMemberEditDto.getEditUserId()); sysUser.setPhonenumber(merMemberEditDto.getPhonenumber()); sysUserService.updateUserMobile(sysUser); + // 删除用户的档案信息 + memberArchiveService.deleteByUserId(sysUser.getUserId()); + // 添加用户的档案信息 + List<MemberArchiveVo> achiveList = merMemberEditDto.getAchiveList(); + if (achiveList != null && !achiveList.isEmpty()) { + // 构造用户档案列表 + List<MemberArchive> memberArchiveList = achiveList.stream().map(memberArchiveVo -> { + MemberArchive memberArchive = new MemberArchive(); + memberArchive.setDelFlag(0); + memberArchive.setUserId(sysUser.getUserId()); + memberArchive.setFieldId(memberArchiveVo.getFieldId()); + memberArchive.setFieldValue(memberArchiveVo.getFieldValue()); + return memberArchive; + }).collect(Collectors.toList()); + // 批量保存用户档案信息 + memberArchiveService.saveBatch(memberArchiveList); + } } /** - * * @param mobile * @return */ @Override - public Member getByMobile(String mobile){ + public Member getByMobile(String mobile) { LambdaQueryWrapper<Member> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(Member::getDelFlag, 0).eq(Member::getMobile, mobile); Member member = this.getOne(queryWrapper); @@ -558,30 +782,1489 @@ /** * 更新用户商品类型 + * * @param appMemberGoodsTypeDto */ @Override - public void updateMemberGoodsType(AppMemberGoodsTypeDto appMemberGoodsTypeDto){ + public void updateMemberGoodsType(AppMemberGoodsTypeDto appMemberGoodsTypeDto) { + // 根据用户ID获取会员信息 Member member = this.getByUserId(appMemberGoodsTypeDto.getUserId()); + // 获取商品类型集合和商品护理集合 HashSet<String> goodsTypeSet = appMemberGoodsTypeDto.getGoodsTypeSet(); - if(member!=null){ - String goodsType = member.getGoodsType(); + HashSet<String> goodsNurseSet = appMemberGoodsTypeDto.getGoodsNurseSet(); + // 如果会员存在 + if (member != null) { + // 标识是否有变化 Boolean change = false; - for(String str : goodsTypeSet){ - if(goodsType != null){ - if(!goodsType.contains(str)){ - goodsType = goodsType + "," + str; + // 更新商品类型 + if (goodsTypeSet != null && goodsTypeSet.size() > 0) { + String goodsType = member.getGoodsType(); + HashSet<String> goodsTypeOldSet = new HashSet<>(); + // 如果商品类型不为空 + if (StringUtils.isNotBlank(goodsType)) { + goodsTypeOldSet = new HashSet<>(Arrays.asList(goodsType.split(","))); + // 如果商品类型集合相等 + if (!goodsTypeSet.equals(goodsTypeOldSet)) { change = true; } - }else{ - goodsType = str; + } else { change = true; } + goodsTypeOldSet.addAll(goodsTypeSet); + member.setGoodsType(String.join(",", goodsTypeOldSet)); } - if(change){ - member.setGoodsType(goodsType); + // 更新商品护理 + if (goodsNurseSet != null && goodsNurseSet.size() > 0) { + String memberNurse = member.getMemberNurse(); + HashSet<String> memberNurseOldSet = new HashSet<>(); + // 如果会员护理不为空 + if (StringUtils.isNotBlank(memberNurse)) { + memberNurseOldSet = new HashSet<>(Arrays.asList(memberNurse.split(","))); + // 如果商品护理集合相等 + if (!goodsNurseSet.equals(memberNurseOldSet)) { + change = true; + } + } else { + change = true; + } + memberNurseOldSet.addAll(goodsNurseSet); + member.setMemberNurse(String.join(",", memberNurseOldSet)); + } + // 如果有变化,则保存或更新会员信息 + if (change) { this.saveOrUpdate(member); } } } + + + /** + * 订单创建新用户 + * + * @param member + */ + @Override + public void createNewMember(Member member) { + String memberNo = createMemberNo(); + member.setMemberNo(memberNo); + member.setDelFlag(0); + member.setFrozenFlag(0); + member.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png"); + member.setCreateTime(new Date()); + member.setCustomerSource("商户订单添加"); + this.saveOrUpdate(member); + initMemberTotal(member.getMemberId()); + } + + /** + * 生成会员统计 + * + * @param memberId + * @return + */ + private void initMemberTotal(String memberId) { + MemberTotal memberTotal = new MemberTotal(); + memberTotal.setMemberId(memberId); + memberTotal.setDelFlag(0); + memberTotal.setTotalIntegral(0); + memberTotal.setUsedIntegral(0); + memberTotal.setUseableIntegral(0); + memberTotal.setTotalPayMoney(new BigDecimal("0.00")); + memberTotal.setTotalPayCount(0); + memberTotal.setLastPayMoney(new BigDecimal("0.00")); + memberTotal.setTotalServiceCount(0); + memberTotal.setUsedServiceCount(0); + memberTotal.setUseableServiceCount(0); + memberTotal.setTotalActivityCount(0); + memberTotal.setTotalCycleOrder(0); + memberTotal.setTotalExperienceOrder(0); + memberTotal.setTotalServiceOrder(0); + memberTotal.setTotalGoodsOrder(0); + memberTotal.setShareFlag(0); + memberTotal.setPlSuggestFlag(0); + memberTotal.setShopSuggestFlag(0); + memberTotal.setSignFlag(0); + memberTotal.setBuyFlag(0); + memberTotal.setTotalConsumeCount(0); + memberTotalService.saveOrUpdate(memberTotal); + } + + /** + * 生成会员编号 + * + * @return + */ + private String createMemberNo() { + int memberTotal = memberMapper.selectCount(new LambdaQueryWrapper<Member>()); + String memberNo = CodeFactoryUtil.getMemberNo(Long.valueOf(memberTotal + 1)); + return memberNo; + } + + + /** + * 平台分页获取会员列表 + * + * @param page + * @param merMemberPageDto + * @return + */ + @Override + public List<MgtMemberPageVo> pageMgtMember(Page page, MgtMemberPageDto merMemberPageDto) { + + List<Activeness> activenessList = remoteConfigService.listActiveness().getData(); + Date nowDay = new Date(); + if (merMemberPageDto.getActivenessId() != null) { + //处理活跃度筛选 + activenessList.stream() + .filter(activeness -> activeness.getActivenessId().equals(merMemberPageDto.getActivenessId())) + .findFirst() + .ifPresent(activeness -> { + merMemberPageDto.setActStartDate(DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(nowDay, -activeness.getEndDay()))); + merMemberPageDto.setActEndDate(DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(nowDay, -activeness.getStartDay()))); + }); + } + //处理标签为正则表达 + if (StringUtils.isNotBlank(merMemberPageDto.getMemberTags())) { + merMemberPageDto.setMemberTags(merMemberPageDto.getMemberTags().replace(",", "|")); + } + //处理生日 + if(merMemberPageDto.getStartAge()!=null){ + LocalDate currentDate = LocalDate.now(); + LocalDate endBirthday = currentDate.minusYears(merMemberPageDto.getStartAge()); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + merMemberPageDto.setEndBirthday(endBirthday.format(formatter)); + } + if(merMemberPageDto.getEndAge()!=null){ + LocalDate currentDate = LocalDate.now(); + LocalDate startBirthday = currentDate.minusYears(merMemberPageDto.getEndAge()+1); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + merMemberPageDto.setStartBirthday(startBirthday.format(formatter)); + } + // 获取当前登陆人的可视权限 + SysUser sysUser = SecurityUtils.getSysUser(); + // 店铺ids + List<Long> scope = new ArrayList<>(); + if (sysUser!=null){ + String dataScope = sysUser.getDataScope(); + if (!sysUser.getUserName().equals("admin")){ + if (org.springframework.util.StringUtils.hasLength(dataScope)){ + switch (dataScope){ + case "3": + // 本部门数据 查询当前登陆人属于哪个部门 查询这个部门下所有员工关联的所有店铺 + // 根据用户id 查询同部门下所有员工id + List<Long> userIds = sysUserService.getUserIdsByDept(sysUser.getUserId()).getData(); + // 获取店铺ids + List<Long> data = shopService.getShopIdsByUserIds(userIds).getData(); + if (data.size()==0){ + scope.add(0L); + }else{ + scope.addAll(data); + } + break; + case "5": + // 仅个人数据 查询当前登陆人关联店铺下的用户 + List<Long> longs = new ArrayList<>(); + longs.add(sysUser.getUserId()); + // 获取店铺ids + List<Long> data1 = shopService.getShopIdsByUserIds(longs).getData(); + if (data1.size()==0){ + scope.add(0L); + }else{ + scope.addAll(data1); + } + + break; + } + } + } + } + //查询获取结果列表 + List<MgtMemberPageVo> memberPageVoList = memberMapper.pageMgtMember(page, merMemberPageDto,scope); + //处理活跃度返回 + if (memberPageVoList != null && !memberPageVoList.isEmpty()) { + if (activenessList != null && !activenessList.isEmpty()) { + //生成活跃度时间段列表 + List<MgtActivenessJudgeVo> mgtActivenessJudgeVoList = new ArrayList<>(); + MgtActivenessJudgeVo mgtActivenessJudgeVo; + for (Activeness activeness : activenessList) { + mgtActivenessJudgeVo = new MgtActivenessJudgeVo(); + mgtActivenessJudgeVo.setStartDay(DateUtils.addDays(new Date(), -activeness.getEndDay())); + mgtActivenessJudgeVo.setEndDay(DateUtils.addDays(new Date(), -activeness.getStartDay())); + mgtActivenessJudgeVo.setActivenessName(activeness.getActivenessName()); + } + //活跃度赋值 + Date lastPayTime; + for (MgtMemberPageVo mgtMemberPageVo : memberPageVoList) { + if(null != mgtMemberPageVo.getRelationShopId() && 1 == mgtMemberPageVo.getBindingFlag()){ + R<Shop> shop_r = remoteShopService.getShop(mgtMemberPageVo.getRelationShopId()); + if(shop_r.getCode() == 200){ + Shop data = shop_r.getData(); + if(null != data){ + mgtMemberPageVo.setRelationShopName(data.getShopName()); + } + } + } + lastPayTime = mgtMemberPageVo.getLastPayTime(); + StringJoiner sj = new StringJoiner(","); + if (lastPayTime != null) { + for (MgtActivenessJudgeVo entity : mgtActivenessJudgeVoList) { + if (lastPayTime.compareTo(entity.getStartDay()) >= 0 && lastPayTime.compareTo(entity.getEndDay()) <= 0) { + sj.add(entity.getActivenessName()); + } + } + if (sj.length() > 0) { + mgtMemberPageVo.setActiveness(sj.toString()); + } + } + } + } + } + return memberPageVoList; + } + + + /** + * 修改会员关联商户 + * + * @param mgtMemberRelEditDto + */ + @Override + public void editMemberRelationShop(MgtMemberRelEditDto mgtMemberRelEditDto) { + if (StringUtils.isNotBlank(mgtMemberRelEditDto.getMemberUserIds())) { + Shop shop = shopService.getShop(mgtMemberRelEditDto.getShopId()).getData(); + String memberUserIds = mgtMemberRelEditDto.getMemberUserIds(); + String[] memberUserIdArr = memberUserIds.split(","); + for (String str : memberUserIdArr) { + Member member = this.getByUserId(Long.valueOf(str)); + member.setRelationShopId(shop.getShopId()); + member.setRelationShopName(shop.getShopName()); + member.setBindingFlag(1); + member.setBindingType(7); + member.setBindingTime(new Date()); + member.setUpdateTime(new Date()); + member.setUpdateUserId(mgtMemberRelEditDto.getUserId()); + this.saveOrUpdate(member); + memberMapper.updateById(member); + } + } + } + + + /** + * 删除会员关联商户 + * + * @param mgtMemberRelDelDto + */ + @Override + public void deleteMemberRelationShop(MgtMemberRelDelDto mgtMemberRelDelDto) { + if (StringUtils.isNotBlank(mgtMemberRelDelDto.getMemberUserIds())) { + String memberUserIds = mgtMemberRelDelDto.getMemberUserIds(); + String[] memberUserIdArr = memberUserIds.split(","); + for (String str : memberUserIdArr) { + LambdaUpdateWrapper<Member> updateWrapper = Wrappers.lambdaUpdate(); + updateWrapper.eq(Member::getUserId, str) + .set(Member::getBindingFlag, 0) + .set(Member::getRelationShopId,null) + .set(Member::getRelationShopName,null) + .set(Member::getUpdateUserId,mgtMemberRelDelDto.getUserId()) + .set(Member::getUpdateTime,new Date()); + this.update(updateWrapper); + } + } + } + + /** + * 修改会员积分 + * + * @param mgtMemberIntEditDto + */ + @Override + public void editMemberIntegral(MgtMemberIntEditDto mgtMemberIntEditDto) { + if (StringUtils.isNotBlank(mgtMemberIntEditDto.getMemberUserIds())) { + String memberUserIds = mgtMemberIntEditDto.getMemberUserIds(); + String[] memberUserIdArr = memberUserIds.split(","); + MemberIntegralChangeDto memberIntegralChangeDto; + for (String str : memberUserIdArr) { + memberIntegralChangeDto = new MemberIntegralChangeDto(); + Member member = this.getByUserId(Long.valueOf(str)); + memberIntegralChangeDto.setUserId(Long.valueOf(str)); + memberIntegralChangeDto.setMemberId(member.getMemberId()); + memberIntegralChangeDto.setChangeType(1); + memberIntegralChangeDto.setRecordType(3); + memberIntegralChangeDto.setIntegral(mgtMemberIntEditDto.getIntegral()); + //调用积分变动 + memberIntegralChange(memberIntegralChangeDto); + } + } + } + + + /** + * 会员积分变动 + * + * @param memberIntegralChangeDto + */ + @Override + public void memberIntegralChange(MemberIntegralChangeDto memberIntegralChangeDto) { + log.info("会员积分变动---"+memberIntegralChangeDto.toString()); + MemberTotal memberTotal = memberTotalService.getById(memberIntegralChangeDto.getMemberId()); + Integer recordType = memberIntegralChangeDto.getRecordType(); + Integer changeType = memberIntegralChangeDto.getChangeType(); + Integer integer = memberIntegralChangeDto.getIntegral(); + Integer totalIntegral = memberTotal.getTotalIntegral(); + Integer usedIntegral = memberTotal.getUsedIntegral(); + Integer useableIntegral = memberTotal.getUseableIntegral(); + //变动统计 + if (changeType == 1) { + totalIntegral = totalIntegral + integer; + useableIntegral = useableIntegral + integer; + memberTotal.setTotalIntegral(totalIntegral); + memberTotal.setUseableIntegral(useableIntegral); + } else if (changeType == 2) { + usedIntegral = usedIntegral + integer; + useableIntegral = useableIntegral - integer; + if (useableIntegral < 0) { + throw new ServiceException(AppErrorConstant.INTEGRAL_USE_FAILED); + } + memberTotal.setTotalIntegral(totalIntegral); + memberTotal.setUseableIntegral(useableIntegral); + memberTotal.setUsedIntegral(usedIntegral); + } + memberTotalService.saveOrUpdate(memberTotal); + //记录变动 + IntegralRecord integralRecord = new IntegralRecord(); + integralRecord.setDelFlag(0); + integralRecord.setUserId(memberIntegralChangeDto.getUserId()); + integralRecord.setChangeType(recordType); + if (changeType == 1) { + integralRecord.setChangeIntegral(integer); + } else if (changeType == 2) { + integralRecord.setChangeIntegral(0 - integer); + } + integralRecord.setSurpIntegral(useableIntegral); + integralRecord.setCreateTime(new Date()); + integralRecord.setOrderId(memberIntegralChangeDto.getOrderId()); + integralRecord.setOrderNo(memberIntegralChangeDto.getOrderNo()); + switch (recordType) { + case 1: + integralRecord.setChangeReason("购物赠送"); + break; + case 2: + integralRecord.setChangeReason("活动赠送"); + break; + case 3: + integralRecord.setChangeReason("平台赠送"); + break; + default: + break; + } + integralRecordService.saveOrUpdate(integralRecord); + } + + /** + * 平台获取会员信息 + * + * @param userId + * @return + */ + @Override + public MgtMemberGetVo getMgtMemberInfo(Long userId) { + MgtMemberGetVo mgtMemberGetVo = new MgtMemberGetVo(); + Member member = this.getByUserId(userId); + MemberTotal memberTotal = memberTotalService.getById(member.getMemberId()); + List<MemberArchiveVo> memberArchiveVoList = memberArchiveService.listMgtVoByUserId(member.getUserId()); + if (memberArchiveVoList != null && !memberArchiveVoList.isEmpty()) { + //去掉未完善信息 + memberArchiveVoList.removeIf(o -> Objects.isNull(o.getFieldValue())); + } + mgtMemberGetVo.setMemberId(member.getMemberId()); + mgtMemberGetVo.setUserId(member.getUserId()); + mgtMemberGetVo.setMemberNo(member.getMemberNo()); + mgtMemberGetVo.setRealName(member.getRealName()); + mgtMemberGetVo.setNickName(member.getNickName()); + mgtMemberGetVo.setAvatar(member.getAvatar()); + mgtMemberGetVo.setMobile(member.getMobile()); + if(member.getGender()!=null){ + if (member.getGender() == 0) { + mgtMemberGetVo.setGender("男"); + } else if (member.getGender() == 1) { + mgtMemberGetVo.setGender("女"); + } + }else { + mgtMemberGetVo.setGender("未知"); + } + mgtMemberGetVo.setBirthday(member.getBirthday()); + mgtMemberGetVo.setBelongDistrict(member.getBelongDistrict()); + mgtMemberGetVo.setCreateTime(member.getCreateTime()); + mgtMemberGetVo.setLastPayTime(memberTotal.getLastPayTime()); + mgtMemberGetVo.setGoodsType(member.getGoodsType()); + if(member.getBindingFlag()==1){ + R<Shop> shop = remoteShopService.getShop(member.getRelationShopId()); + if(shop.getCode() == 200){ + Shop data = shop.getData(); + if(null != data){ + mgtMemberGetVo.setRelationShopName(data.getShopName()); + } + } + } + mgtMemberGetVo.setIntegral(memberTotal.getTotalIntegral()); + mgtMemberGetVo.setMemberFrom(member.getCustomerSource()); + mgtMemberGetVo.setTotalActivityCount(memberTotal.getTotalActivityCount()); + mgtMemberGetVo.setTotalPayMoney(memberTotal.getTotalPayMoney()); + mgtMemberGetVo.setMemberRemark(null); + mgtMemberGetVo.setMemberArchiveVoList(memberArchiveVoList); + mgtMemberGetVo.setMemberTags(member.getUserTags()); + return mgtMemberGetVo; + } + + /** + * @param memberTag + * @return void + * @description 删除标签 + * @author jqs + * @date 2023/6/8 15:18 + */ + @Override + public void deleteMemberTag(String memberTag) { + memberMapper.deleteMemberTag(memberTag); + } + + /** + * @param sendType + * @return List<Long> + * @description 通过发送类型获取userId + * @author jqs + * @date 2023/6/13 17:53 + */ + @Override + public List<Long> listIdBySendType(Integer sendType,Long shopId) { + //1.手动领取2.全部用户3.会员用户4非会员用户5自定义 + return memberMapper.listIdBySendType(sendType,shopId); + } + + + public List<Long> listIdBySendType2(Long shopId) { + //1.手动领取2.全部用户3.会员用户4非会员用户5自定义 + return memberMapper.listIdBySendType2(shopId); + } + + + /** + * @param userIds + * @return List<MgtSimpleMemberVo> + * @description 通过ids获取用户简易返回 + * @author jqs + * @date 2023/6/16 11:06 + */ + @Override + public List<MgtSimpleMemberVo> listSimpleVoByIds(String userIds) { + return memberMapper.listSimpleVoByIds(userIds); + } + + /** + * @param mgtUserIdByKeywordDto + * @return MgtUserIdByKeywordVo + * @description + * @author jqs + * @date 2023/6/16 12:41 + */ + @Override + public MgtUserIdByKeywordVo getUserIdByKeyword(MgtUserIdByKeywordDto mgtUserIdByKeywordDto) { + MgtUserIdByKeywordVo mgtUserIdByKeywordVo = new MgtUserIdByKeywordVo(); + List<Long> userIdList = memberMapper.getUserIdByKeyword(mgtUserIdByKeywordDto); + if (userIdList != null && !userIdList.isEmpty()) { + String userIdStr = userIdList.stream() + .map(Object::toString) + .collect(Collectors.joining(",")); + mgtUserIdByKeywordVo.setUserIds(userIdStr); + } + return mgtUserIdByKeywordVo; + } + + /** + * @param + * @return MgtBulletinBoardVo + * @description boardMemberTotal + * @author jqs34 + * @date 2023/6/18 16:45 + */ + @Override + public MgtBulletinBoardVo boardMemberTotal(List<Long> shopIds) { + MgtBulletinBoardVo mgtBulletinBoardVo = new MgtBulletinBoardVo(); + mgtBulletinBoardVo.setMemberTotal(memberMapper.memberTotal(shopIds)); + mgtBulletinBoardVo.setMemberToday(memberMapper.memberToday(shopIds)); + return mgtBulletinBoardVo; + } + + /** + * @param + * @return MgtTotalMemberTotalVo + * @description 会员人数统计 + * @author jqs + * @date 2023/6/19 15:26 + */ + @Override + public MgtTotalMemberTotalVo getTotalMemberTotal(MgtBaseShopDto mgtBaseShopDto) { + Date nowDay = DateUtils.getNowDate(); + MgtTotalMemberTotalVo mgtTotalMemberTotalVo = new MgtTotalMemberTotalVo(); + mgtTotalMemberTotalVo.setMemberTotal(0); + mgtTotalMemberTotalVo.setOnlineTotal(0); + mgtTotalMemberTotalVo.setOfflineTotal(0); + mgtTotalMemberTotalVo.setIntroduceTotal(0); + mgtTotalMemberTotalVo.setCycleTotal(0); + mgtTotalMemberTotalVo.setExperienceTotal(0); + mgtTotalMemberTotalVo.setServiceTotal(0); + mgtTotalMemberTotalVo.setManTotal(0); + mgtTotalMemberTotalVo.setManPercent(new BigDecimal("0")); + mgtTotalMemberTotalVo.setWomenTotal(0); + mgtTotalMemberTotalVo.setWomenPercent(new BigDecimal("0")); + mgtTotalMemberTotalVo.setAgeKey(new String[0]); + mgtTotalMemberTotalVo.setAgeValue(new Integer[0]); + mgtTotalMemberTotalVo.setNurseTotalVos(Lists.newArrayList()); + mgtTotalMemberTotalVo.setMemberLevelTotalVos(Lists.newArrayList()); + mgtTotalMemberTotalVo.setGoodsTypeTotalVos(Lists.newArrayList()); + mgtTotalMemberTotalVo.setActivenessList(Lists.newArrayList()); + mgtTotalMemberTotalVo.setCustomerSourceList(Lists.newArrayList()); + mgtTotalMemberTotalVo.setMemberPayList(Lists.newArrayList()); + // 获取店铺ID + Long shopId = mgtBaseShopDto.getShopId(); + // 获取总会员数和不同年龄段的会员数 + MgtTotalMemberTotalVo totalMemberTotalVo = memberMapper.getTotalMemberTotal(mgtBaseShopDto); + mgtTotalMemberTotalVo.setMemberTotal(totalMemberTotalVo.getMemberTotal()); + mgtTotalMemberTotalVo.setOnlineTotal(totalMemberTotalVo.getOnlineTotal()); + mgtTotalMemberTotalVo.setOfflineTotal(totalMemberTotalVo.getOfflineTotal()); + mgtTotalMemberTotalVo.setCycleTotal(totalMemberTotalVo.getCycleTotal()); + mgtTotalMemberTotalVo.setExperienceTotal(totalMemberTotalVo.getExperienceTotal()); + mgtTotalMemberTotalVo.setServiceTotal(totalMemberTotalVo.getServiceTotal()); + MgtAgeTotalVo mgtAgeTotalVo = memberMapper.getTotalMemberTotalAge(mgtBaseShopDto); + Integer manTotal = mgtAgeTotalVo.getManTotal(); + Integer womenTotal = mgtAgeTotalVo.getWomenTotal(); + mgtTotalMemberTotalVo.setManTotal(manTotal); + mgtTotalMemberTotalVo.setWomenTotal(womenTotal); + Integer personTotal = manTotal + womenTotal; + BigDecimal manTotalBig = new BigDecimal(manTotal); + BigDecimal personTotalBig = new BigDecimal(personTotal); + BigDecimal bigTen = new BigDecimal("100.00"); + BigDecimal menPercent = new BigDecimal("100.00"); + BigDecimal womenPercent = new BigDecimal("100.00"); + if(personTotal==0){ + personTotalBig = bigTen; + } + if(manTotal==0&&womenTotal==0){ + menPercent = new BigDecimal("50.00"); + womenPercent = new BigDecimal("50.00"); + }else if(manTotal==0&&womenTotal>0){ + menPercent = new BigDecimal("0.00"); + womenPercent = new BigDecimal("100.00"); + }else if(manTotal>0&&womenTotal==0){ + menPercent = new BigDecimal("100.00"); + womenPercent = new BigDecimal("0.00"); + }else{ + menPercent = manTotalBig.divide(personTotalBig,2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")); + womenPercent = bigTen.subtract(menPercent); + } + mgtTotalMemberTotalVo.setManPercent(menPercent); + mgtTotalMemberTotalVo.setWomenPercent(womenPercent); + // 年龄段数组 + String[] ageKey = {"<20", "21-30", "31-40", "41-50", ">50"}; + // 不同年龄段的会员数数组 + Integer[] ageValue = {mgtAgeTotalVo.getTenAge(), mgtAgeTotalVo.getTwentyAge(), mgtAgeTotalVo.getThirtyAge(), mgtAgeTotalVo.getFortyAge(), mgtAgeTotalVo.getFiftyAge()}; + BigDecimal[] agePercentValue = new BigDecimal[5]; + Integer totalPerson = mgtAgeTotalVo.getTenAge()+mgtAgeTotalVo.getTwentyAge()+ mgtAgeTotalVo.getThirtyAge()+mgtAgeTotalVo.getFortyAge()+mgtAgeTotalVo.getFiftyAge(); + BigDecimal totalPersonBig = new BigDecimal(totalPerson.toString()); + BigDecimal hundredBig = new BigDecimal("100"); + if(totalPerson==0){ + totalPersonBig = hundredBig; + } + agePercentValue[0] = new BigDecimal(mgtAgeTotalVo.getTenAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[1] = new BigDecimal(mgtAgeTotalVo.getTwentyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[2] = new BigDecimal(mgtAgeTotalVo.getThirtyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[3] = new BigDecimal(mgtAgeTotalVo.getFortyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[4] = new BigDecimal(mgtAgeTotalVo.getFiftyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + // 设置年龄段数组和不同年龄段的会员数数组 + mgtTotalMemberTotalVo.setAgeKey(ageKey); + mgtTotalMemberTotalVo.setAgeValue(ageValue); + // 获取不同护理类型的会员数 + List<MgtMapIntTotalVo> nurseTotalVos = memberMapper.getTotalMemberTotalNurse(mgtBaseShopDto); + if (nurseTotalVos != null && nurseTotalVos.size() > 0) { + nurseTotalVos = listRemoveNull(nurseTotalVos); + mgtTotalMemberTotalVo.setNurseTotalVos(nurseTotalVos); + } + //获取不同等级的会员数 + List<MgtMapIntTotalVo> memberLevelTotalVos = memberMapper.getTotalMemberTotalLevel(mgtBaseShopDto); + if (memberLevelTotalVos != null && memberLevelTotalVos.size() > 0) { + memberLevelTotalVos = listRemoveNull(memberLevelTotalVos); + mgtTotalMemberTotalVo.setMemberLevelTotalVos(memberLevelTotalVos); + } + // 获取不同商品类型的会员数 + List<MgtMapIntTotalVo> goodsTypeTotalVos = memberMapper.getTotalMemberTotalGoodsType(mgtBaseShopDto); + if (goodsTypeTotalVos != null && goodsTypeTotalVos.size() > 0) { + goodsTypeTotalVos = listRemoveNull(goodsTypeTotalVos); + mgtTotalMemberTotalVo.setGoodsTypeTotalVos(goodsTypeTotalVos); + } + // 获取不同活跃度的会员数 + List<Activeness> activenessList = remoteConfigService.listActiveness().getData(); + if (activenessList != null && !activenessList.isEmpty()) { + Activeness activeness; + String actStartDate; + String actEndDate; + Integer count; + List<MgtMapIntTotalVo> MgtMapIntTotalVoList = new ArrayList<>(); + MgtMapIntTotalVo MgtMapIntTotalVo; + // 遍历不同活跃度列表,设置活跃度数组和对应的会员数数组 + for (int i = 0; i < activenessList.size(); i++) { + activeness = activenessList.get(i); + actStartDate = DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(nowDay, -activeness.getEndDay())); + actEndDate = DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(nowDay, -activeness.getStartDay())); + count = memberMapper.getTotalMemberTotalActiveness(shopId, actStartDate, actEndDate); + MgtMapIntTotalVo = new MgtMapIntTotalVo(); + MgtMapIntTotalVo.setMapKey(activeness.getActivenessName()); + MgtMapIntTotalVo.setMapValue(count); + MgtMapIntTotalVoList.add(MgtMapIntTotalVo); + } + mgtTotalMemberTotalVo.setActivenessList(MgtMapIntTotalVoList); + } + //获取会员消费排名 + List<MgtMapIntTotalVo> memberPayList = memberMapper.getTotalMemberRankPay(mgtBaseShopDto); + if (memberPayList != null && memberPayList.size() > 0) { + //memberPayList = listRemoveNull(memberPayList); + mgtTotalMemberTotalVo.setMemberPayList(memberPayList); + } + //获取来源渠道排名 + List<MgtMapIntTotalVo> customerSourceList = memberMapper.getTotalMemberRankCustomerSource(mgtBaseShopDto); + if (customerSourceList != null && customerSourceList.size() > 0) { + customerSourceList = listRemoveNull(customerSourceList); + mgtTotalMemberTotalVo.setCustomerSourceList(customerSourceList); + } + // 返回总会员数和不同类型会员数的统计结果 + return mgtTotalMemberTotalVo; + } + + + /** + * @param mgtActivityAgeDto + * @return List<Long> + * @description + * @author jqs + * @date 2023/6/20 11:42 + */ + @Override + public List<Long> listUserIdByAge(MgtActivityAgeDto mgtActivityAgeDto) { + List<Long> userIdList = memberMapper.listUserIdByAge(mgtActivityAgeDto); + return userIdList; + } + + /** + * @param mgtBasePlatformDto + * @return MgtPlTotalMemberTotalVo + * @description 会员人数统计 + * @author jqs + * @date 2023/6/21 10:59 + */ + @Override + public MgtPlTotalMemberTotalVo getPlTotalMemberTotal(MgtBasePlatformDto mgtBasePlatformDto) { + MgtPlTotalMemberTotalVo plTotalMemberTotalVo = new MgtPlTotalMemberTotalVo(); + plTotalMemberTotalVo.setMemberTotal(0); + plTotalMemberTotalVo.setMemberYesterday(0); + plTotalMemberTotalVo.setMemberSeven(0); + plTotalMemberTotalVo.setManTotal(0); + plTotalMemberTotalVo.setManPercent(new BigDecimal("0")); + plTotalMemberTotalVo.setWomenTotal(0); + plTotalMemberTotalVo.setWomenPercent(new BigDecimal("0")); + plTotalMemberTotalVo.setAgeKey(new String[0]); + plTotalMemberTotalVo.setAgeValue(new Integer[0]); + plTotalMemberTotalVo.setAgePercent(new BigDecimal[0]); + plTotalMemberTotalVo.setNurseTotalVos(Lists.newArrayList()); + plTotalMemberTotalVo.setMemberLevelTotalVos(Lists.newArrayList()); + plTotalMemberTotalVo.setGoodsTypeTotalVos(Lists.newArrayList()); + plTotalMemberTotalVo.setActivenessList(Lists.newArrayList()); + plTotalMemberTotalVo.setCustomerSourceList(Lists.newArrayList()); + plTotalMemberTotalVo.setMemberPayList(Lists.newArrayList()); + plTotalMemberTotalVo.setMemberGoodsRankList(Lists.newArrayList()); + plTotalMemberTotalVo.setShopMemberRankList(Lists.newArrayList()); + Date nowDay = DateUtils.getNowDate(); + //如果区域代码不为null获取对应的商户id + List<Long> list = new ArrayList<>(); + if (StringUtils.isNotBlank(mgtBasePlatformDto.getShopProvinceCode()) || StringUtils.isNotBlank(mgtBasePlatformDto.getShopCityCode()) || StringUtils.isNotBlank(mgtBasePlatformDto.getShopAreaCode())) { + MgtShopIdByCodeDto mgtShopIdByCodeDto = new MgtShopIdByCodeDto(); + mgtShopIdByCodeDto.setShopProvinceCode(mgtBasePlatformDto.getShopProvinceCode()); + mgtShopIdByCodeDto.setShopCityCode(mgtBasePlatformDto.getShopCityCode()); + mgtShopIdByCodeDto.setShopAreaCode(mgtBasePlatformDto.getShopAreaCode()); + MgtShopIdByCodeVo mgtShopIdByCodeVo = remoteShopService.getShopIdByCode(mgtShopIdByCodeDto).getData(); + + if (StringUtils.isNotBlank(mgtShopIdByCodeVo.getShopIds())) { + list = Arrays.stream(mgtShopIdByCodeVo.getShopIds().split(",")) + .map(Long::valueOf) + .collect(Collectors.toList()); + }else{ + return plTotalMemberTotalVo; + } + } + //数据权限 + List<Long> userId = remoteUserService.getScopeOfAuthorityUserId(); + BoardMemberTotalDto boardMemberTotalDto = new BoardMemberTotalDto(); + boardMemberTotalDto.setUserIds(userId); + List<Shop> shops = remoteShopService.getShopBySysUserIds(boardMemberTotalDto); + List<Long> collect = shops.stream().map(Shop::getShopId).collect(Collectors.toList()); + list.addAll(collect); + mgtBasePlatformDto.setShopIdList(list); + + + //获取基础统计 + MgtPlTotalMemberTotalVo plTotalMemberTotalByDayVo = memberMapper.getPlTotalMemberTotal(mgtBasePlatformDto); + plTotalMemberTotalVo.setMemberTotal(plTotalMemberTotalByDayVo.getMemberTotal()); + plTotalMemberTotalVo.setMemberYesterday(plTotalMemberTotalByDayVo.getMemberYesterday()); + plTotalMemberTotalVo.setMemberSeven(plTotalMemberTotalByDayVo.getMemberSeven()); + MgtAgeTotalVo mgtAgeTotalVo = memberMapper.getPlTotalMemberTotalAge(mgtBasePlatformDto); + if (mgtAgeTotalVo != null) { + Integer manTotal = mgtAgeTotalVo.getManTotal(); + Integer womenTotal = mgtAgeTotalVo.getWomenTotal(); + Integer personTotal = manTotal + womenTotal; + BigDecimal manTotalBig = new BigDecimal(manTotal); + BigDecimal personTotalBig = new BigDecimal(personTotal); + BigDecimal bigTen = new BigDecimal("100.00"); + BigDecimal menPercent = new BigDecimal("100.00"); + BigDecimal womenPercent = new BigDecimal("100.00"); + if(personTotal==0){ + personTotalBig = bigTen; + } + if(manTotal==0&&womenTotal==0){ + menPercent = new BigDecimal("50.00"); + womenPercent = new BigDecimal("50.00"); + }else if(manTotal==0&&womenTotal>0){ + menPercent = new BigDecimal("0.00"); + womenPercent = new BigDecimal("100.00"); + }else if(manTotal>0&&womenTotal==0){ + menPercent = new BigDecimal("100.00"); + womenPercent = new BigDecimal("0.00"); + }else{ + menPercent = manTotalBig.divide(personTotalBig,2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")); + womenPercent = bigTen.subtract(menPercent); + } + plTotalMemberTotalVo.setManTotal(manTotal); + plTotalMemberTotalVo.setWomenTotal(womenTotal); + plTotalMemberTotalVo.setManPercent(menPercent); + plTotalMemberTotalVo.setWomenPercent(womenPercent); + } + // 年龄段数组 + String[] ageKey = {"<20", "21-30", "31-40", "41-50", ">50"}; + // 不同年龄段的会员数数组 + Integer[] ageValue = {mgtAgeTotalVo.getTenAge(), mgtAgeTotalVo.getTwentyAge(), mgtAgeTotalVo.getThirtyAge(), mgtAgeTotalVo.getFortyAge(), mgtAgeTotalVo.getFiftyAge()}; + BigDecimal[] agePercentValue = new BigDecimal[5]; + Integer totalPerson = mgtAgeTotalVo.getTenAge()+mgtAgeTotalVo.getTwentyAge()+ mgtAgeTotalVo.getThirtyAge()+mgtAgeTotalVo.getFortyAge()+mgtAgeTotalVo.getFiftyAge(); + BigDecimal totalPersonBig = new BigDecimal(totalPerson.toString()); + BigDecimal hundredBig = new BigDecimal("100"); + if(totalPerson==0){ + totalPersonBig = hundredBig; + } + agePercentValue[0] = new BigDecimal(mgtAgeTotalVo.getTenAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[1] = new BigDecimal(mgtAgeTotalVo.getTwentyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[2] = new BigDecimal(mgtAgeTotalVo.getThirtyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[3] = new BigDecimal(mgtAgeTotalVo.getFortyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[4] = new BigDecimal(mgtAgeTotalVo.getFiftyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + // 设置年龄段数组和不同年龄段的会员数数组 + plTotalMemberTotalVo.setAgeKey(ageKey); + plTotalMemberTotalVo.setAgeValue(ageValue); + plTotalMemberTotalVo.setAgePercent(agePercentValue); + // 获取不同调理类型的会员数 + List<MgtMapIntTotalVo> nurseTotalVos = memberMapper.getPlTotalMemberTotalNurse(mgtBasePlatformDto); + if (nurseTotalVos != null && nurseTotalVos.size() > 0) { + nurseTotalVos = listRemoveNull(nurseTotalVos); + plTotalMemberTotalVo.setNurseTotalVos(nurseTotalVos); + } + //获取不同等级的会员数 + List<MgtMapIntTotalVo> memberLevelTotalVos = memberMapper.getPlTotalMemberTotalLevel(mgtBasePlatformDto); + if (memberLevelTotalVos != null && memberLevelTotalVos.size() > 0) { + memberLevelTotalVos = listRemoveNull(memberLevelTotalVos); + plTotalMemberTotalVo.setMemberLevelTotalVos(memberLevelTotalVos); + } + // 获取不同商品类型的会员数 + List<MgtMapIntTotalVo> goodsTypeTotalVos = memberMapper.getPlTotalMemberTotalGoodsType(mgtBasePlatformDto); + if (goodsTypeTotalVos != null && goodsTypeTotalVos.size() > 0) { + goodsTypeTotalVos = listRemoveNull(goodsTypeTotalVos); + plTotalMemberTotalVo.setGoodsTypeTotalVos(goodsTypeTotalVos); + } + // 获取不同活跃度的会员数 + List<Long> shopIdList = mgtBasePlatformDto.getShopIdList(); + List<Activeness> activenessList = remoteConfigService.listActiveness().getData(); + if (activenessList != null && !activenessList.isEmpty()) { + Activeness activeness; + String actStartDate; + String actEndDate; + Integer count; + List<MgtMapIntTotalVo> MgtMapIntTotalVoList = new ArrayList<>(); + MgtMapIntTotalVo MgtMapIntTotalVo; + // 遍历不同活跃度列表,设置活跃度数组和对应的会员数数组 + for (int i = 0; i < activenessList.size(); i++) { + activeness = activenessList.get(i); + actStartDate = DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(nowDay, -activeness.getEndDay())); + actEndDate = DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(nowDay, -activeness.getStartDay())); + count = memberMapper.getPlTotalMemberTotalActiveness(shopIdList, actStartDate, actEndDate); + if (StringUtils.isNotBlank(activeness.getActivenessName())) { + MgtMapIntTotalVo = new MgtMapIntTotalVo(); + MgtMapIntTotalVo.setMapKey(activeness.getActivenessName()); + MgtMapIntTotalVo.setMapValue(count); + MgtMapIntTotalVoList.add(MgtMapIntTotalVo); + } + } + plTotalMemberTotalVo.setActivenessList(MgtMapIntTotalVoList); + } + //获取会员消费排名 + List<MgtMapIntTotalVo> memberPayList = memberMapper.getPlTotalMemberRankPay(mgtBasePlatformDto); + if (memberPayList != null && memberPayList.size() > 0) { + memberPayList = listRemoveNull(memberPayList); + plTotalMemberTotalVo.setMemberPayList(memberPayList); + } + //获取来源渠道排名 + List<MgtMapIntTotalVo> customerSourceList = memberMapper.getPlTotalMemberRankCustomerSource(mgtBasePlatformDto); + if (customerSourceList != null && customerSourceList.size() > 0) { + customerSourceList = listRemoveNull(customerSourceList); + plTotalMemberTotalVo.setCustomerSourceList(customerSourceList); + } + //获取商铺会员排名 + List<MgtMapIntTotalVo> shopMemberRankList = memberMapper.getPlTotalMemberRank(mgtBasePlatformDto); + if (shopMemberRankList != null && shopMemberRankList.size() > 0) { + shopMemberRankList = listRemoveNull(shopMemberRankList); + plTotalMemberTotalVo.setShopMemberRankList(shopMemberRankList); + } + List<MgtMapIntTotalVo> memberGoodsRankList = remoteOrderService.listMemberGoodsRank(mgtBasePlatformDto).getData(); + if (memberGoodsRankList != null && memberGoodsRankList.size() > 0) { + memberGoodsRankList = listRemoveNull(memberGoodsRankList); + plTotalMemberTotalVo.setMemberGoodsRankList(memberGoodsRankList); + } + return plTotalMemberTotalVo; + } + + /** + * @param MgtMapIntTotalVos + * @return List<MgtMapIntTotalVo> + * @description 去除空字符串 + * @author jqs + * @date 2023/6/27 17:35 + */ + private List<MgtMapIntTotalVo> listRemoveNull(List<MgtMapIntTotalVo> MgtMapIntTotalVos) { + for (int i = 0; i < MgtMapIntTotalVos.size(); i++) { + if (StringUtils.isBlank(MgtMapIntTotalVos.get(i).getMapKey())) { + MgtMapIntTotalVos.remove(i); + } + } + return MgtMapIntTotalVos; + } + + /** + * @param shopIdList + * @return List<Long> + * @description 通过shopId获取userId + * @author jqs + * @date 2023/6/21 17:11 + */ + @Override + public List<Long> listUserIdByShopId(List<Long> shopIdList) { + return memberMapper.listUserIdByShopId(shopIdList); + } + + /** + * @param shopIdList + * @return MgtShopTotalMemberVo + * @description 通过shopId获取user统计 + * @author jqs + * @date 2023/6/21 17:19 + */ + @Override + public MgtShopTotalMemberVo getUserTotalByShopId(List<Long> shopIdList) { + MgtShopTotalMemberVo mgtShopTotalMemberVo = new MgtShopTotalMemberVo(); + MgtBasePlatformDto mgtBasePlatformDto = new MgtBasePlatformDto(); + mgtBasePlatformDto.setShopIdList(shopIdList); + MgtAgeTotalVo mgtAgeTotalVo = memberMapper.getPlTotalMemberTotalAge(mgtBasePlatformDto); + mgtShopTotalMemberVo.setManTotal(mgtAgeTotalVo.getManTotal()); + mgtShopTotalMemberVo.setWomenTotal(mgtAgeTotalVo.getWomenTotal()); + // 年龄段数组 + String[] ageKey = {"<20", "21-30", "31-40", "41-50", ">50"}; + // 不同年龄段的会员数数组 + Integer[] ageValue = {mgtAgeTotalVo.getTenAge(), mgtAgeTotalVo.getTwentyAge(), mgtAgeTotalVo.getThirtyAge(), mgtAgeTotalVo.getFortyAge(), mgtAgeTotalVo.getFiftyAge()}; + BigDecimal[] agePercentValue = new BigDecimal[5]; + Integer totalPerson = mgtAgeTotalVo.getTenAge()+mgtAgeTotalVo.getTwentyAge()+ mgtAgeTotalVo.getThirtyAge()+mgtAgeTotalVo.getFortyAge()+mgtAgeTotalVo.getFiftyAge(); + BigDecimal totalPersonBig = new BigDecimal(totalPerson.toString()); + BigDecimal hundredBig = new BigDecimal("100"); + if(totalPerson==0){ + totalPersonBig = hundredBig; + } + agePercentValue[0] = new BigDecimal(mgtAgeTotalVo.getTenAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[1] = new BigDecimal(mgtAgeTotalVo.getTwentyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[2] = new BigDecimal(mgtAgeTotalVo.getThirtyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[3] = new BigDecimal(mgtAgeTotalVo.getFortyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[4] = new BigDecimal(mgtAgeTotalVo.getFiftyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + // 设置年龄段数组和不同年龄段的会员数数组 + mgtShopTotalMemberVo.setAgeKey(ageKey); + mgtShopTotalMemberVo.setAgeValue(ageValue); + return mgtShopTotalMemberVo; + } + + /** + * @param memberTotalChangeDto + * @return void + * @description 会员统计变动 + * @author jqs + * @date 2023/6/28 14:34 + */ + @Override + public void changeMemberTotal(MemberTotalChangeDto memberTotalChangeDto) { + log.info("会员统计变动---"+memberTotalChangeDto.toString()); + Member member = this.getByUserId(memberTotalChangeDto.getUserId()); + MemberTotal memberTotal = memberTotalService.getById(member.getMemberId()); + //积分变动 + if (memberTotalChangeDto.getChangeIntegral() != null) { + if (memberTotalChangeDto.getTypeIntegral() == 2) { + memberTotal.setUseableIntegral(memberTotal.getUseableIntegral() - memberTotalChangeDto.getChangeIntegral()); + memberTotal.setUsedIntegral(memberTotal.getUsedIntegral() + memberTotalChangeDto.getChangeIntegral()); + } else { + memberTotal.setUseableIntegral(memberTotal.getUseableIntegral() + memberTotalChangeDto.getChangeIntegral()); + memberTotal.setTotalIntegral(memberTotal.getTotalIntegral() + memberTotalChangeDto.getChangeIntegral()); + IntegralRecord integralRecord = new IntegralRecord(); + integralRecord.setDelFlag(0); + integralRecord.setUserId(memberTotalChangeDto.getUserId()); + integralRecord.setChangeType(5); + integralRecord.setCreateTime(new Date()); + integralRecord.setChangeIntegral(memberTotalChangeDto.getChangeIntegral()); + integralRecord.setSurpIntegral(memberTotal.getUseableIntegral()+memberTotalChangeDto.getChangeIntegral()); + integralRecord.setChangeReason("订单【"+memberTotalChangeDto.getOrderNo()+"】获得积分"); + integralRecord.setOrderId(memberTotalChangeDto.getOrderId()); + integralRecord.setOrderNo(memberTotalChangeDto.getOrderNo()); + integralRecordService.saveOrUpdate(integralRecord); + } + } + //消费变动 + if (memberTotalChangeDto.getPayMoney() != null) { + if(memberTotalChangeDto.getPayMoney().compareTo(BigDecimal.ZERO)>=0){ + memberTotal.setTotalPayMoney(memberTotal.getTotalPayMoney().add(memberTotalChangeDto.getPayMoney())); + memberTotal.setTotalPayCount(memberTotal.getTotalPayCount() + 1); + memberTotal.setLastPayMoney(memberTotalChangeDto.getPayMoney()); + memberTotal.setLastPayTime(memberTotalChangeDto.getPayTime()); + }else{ + memberTotal.setTotalPayMoney(memberTotal.getTotalPayMoney().add(memberTotalChangeDto.getPayMoney())); + memberTotal.setTotalPayCount(memberTotal.getTotalPayCount() - 1); + } + } + //服务次数变动 + if (memberTotalChangeDto.getServiceCount() != null) { + if (memberTotalChangeDto.getTypeService() == 2) { + memberTotal.setUseableServiceCount(memberTotal.getUseableServiceCount() - memberTotalChangeDto.getServiceCount()); + memberTotal.setUsedServiceCount(memberTotal.getUsedServiceCount() + memberTotalChangeDto.getServiceCount()); + memberTotal.setLastServiceTime(new Date()); + } else { + memberTotal.setUseableServiceCount(memberTotal.getUseableServiceCount() + memberTotalChangeDto.getServiceCount()); + memberTotal.setTotalServiceCount(memberTotal.getTotalServiceCount() + memberTotalChangeDto.getServiceCount()); + } + } + //跟进时间 + if (memberTotalChangeDto.getNextTaskTime() != null) { + memberTotal.setNextTaskTime(memberTotalChangeDto.getNextTaskTime()); + } + //活动次数变动 + if (memberTotalChangeDto.getActivityTime() != null) { + memberTotal.setTotalActivityCount(memberTotal.getTotalActivityCount() + 1); + memberTotal.setLastActivityTime(memberTotalChangeDto.getActivityTime()); + } + //订单数量变动 + if (memberTotalChangeDto.getCycleOrderChange() != null) { + memberTotal.setTotalCycleOrder(memberTotal.getTotalCycleOrder() + memberTotalChangeDto.getCycleOrderChange()); + } + if (memberTotalChangeDto.getExperienceOrderChange() != null) { + memberTotal.setTotalExperienceOrder(memberTotal.getTotalExperienceOrder() + memberTotalChangeDto.getExperienceOrderChange()); + } + if (memberTotalChangeDto.getServiceOrderChange() != null) { + memberTotal.setTotalServiceOrder(memberTotal.getTotalServiceOrder() + memberTotalChangeDto.getServiceOrderChange()); + } + if (memberTotalChangeDto.getGoodsOrderChange() != null) { + memberTotal.setTotalGoodsOrder(memberTotal.getTotalGoodsOrder() + memberTotalChangeDto.getGoodsOrderChange()); + } + //消费记录 + if(memberTotalChangeDto.getConsumeTime()!=null){ + memberTotal.setTotalConsumeCount(memberTotal.getTotalConsumeCount()+1); + memberTotal.setLastConsumeTime(memberTotalChangeDto.getConsumeTime()); + } + memberTotalService.saveOrUpdate(memberTotal); + } + + /** + * @description 商户获取会员统计 + * @author jqs + * @date 2023/7/3 17:16 + * @param merTotalDto + * @return MerMemberTotalVo + */ + @Override + public MerMemberTotalVo getMerMemberTotal(MerTotalDto merTotalDto){ + if(merTotalDto.getShopAllFlag()!=null&&merTotalDto.getShopAllFlag()==1){ + List<Long> shopIdList = remoteShopService.listShopIdByShopId(merTotalDto.getShopId()).getData(); + merTotalDto.setShopIdList(shopIdList); + merTotalDto.setShopId(null); + } + MerMemberTotalVo merMemberTotalVo = memberMapper.getMerMemberTotal(merTotalDto); + return merMemberTotalVo; + } + + /** + * @description 商户获取会员固定统计 + * @author jqs + * @date 2023/7/3 18:34 + * @param merTotalDto + * @return MerMemberFixedTotalVo + */ + @Override + public MerMemberFixedTotalVo getMerMemberFixedTotal(MerTotalDto merTotalDto){ + if(merTotalDto.getShopAllFlag()!=null&&merTotalDto.getShopAllFlag()==1){ + List<Long> shopIdList = remoteShopService.listShopIdByShopId(merTotalDto.getShopId()).getData(); + merTotalDto.setShopIdList(shopIdList); + merTotalDto.setShopId(null); + } + MerMemberFixedTotalVo memberFixedTotalVo = new MerMemberFixedTotalVo(); + Date nowDay = DateUtils.getNowDate(); + MgtAgeTotalVo mgtAgeTotalVo = memberMapper.getMerMemberTotalAge(merTotalDto); + Integer manTotal = mgtAgeTotalVo.getManTotal(); + Integer womenTotal = mgtAgeTotalVo.getWomenTotal(); + memberFixedTotalVo.setManTotal(manTotal); + memberFixedTotalVo.setWomenTotal(womenTotal); + Integer personTotal = manTotal + womenTotal; + BigDecimal manTotalBig = new BigDecimal(manTotal); + BigDecimal personTotalBig = new BigDecimal(personTotal); + BigDecimal bigTen = new BigDecimal("100.00"); + BigDecimal menPercent = new BigDecimal("100.00"); + BigDecimal womenPercent = new BigDecimal("100.00"); + if(personTotal==0){ + personTotalBig = bigTen; + } + if(manTotal==0&&womenTotal==0){ + menPercent = new BigDecimal("50.00"); + womenPercent = new BigDecimal("50.00"); + }else if(manTotal==0&&womenTotal>0){ + menPercent = new BigDecimal("0.00"); + womenPercent = new BigDecimal("100.00"); + }else if(manTotal>0&&womenTotal==0){ + menPercent = new BigDecimal("100.00"); + womenPercent = new BigDecimal("0.00"); + }else{ + menPercent = manTotalBig.divide(personTotalBig,2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")); + womenPercent = bigTen.subtract(menPercent); + } + memberFixedTotalVo.setManPercent(menPercent); + memberFixedTotalVo.setWomenPercent(womenPercent); + // 年龄段数组 + String[] ageKey = {"<20", "21-30", "31-40", "41-50", ">50"}; + // 不同年龄段的会员数数组 + Integer[] ageValue = {mgtAgeTotalVo.getTenAge(), mgtAgeTotalVo.getTwentyAge(), mgtAgeTotalVo.getThirtyAge(), mgtAgeTotalVo.getFortyAge(), mgtAgeTotalVo.getFiftyAge()}; + BigDecimal[] agePercentValue = new BigDecimal[5]; + Integer totalPerson = mgtAgeTotalVo.getTenAge()+mgtAgeTotalVo.getTwentyAge()+ mgtAgeTotalVo.getThirtyAge()+mgtAgeTotalVo.getFortyAge()+mgtAgeTotalVo.getFiftyAge(); + BigDecimal totalPersonBig = new BigDecimal(totalPerson.toString()); + BigDecimal hundredBig = new BigDecimal("100"); + if(totalPerson==0){ + totalPersonBig = hundredBig; + } + agePercentValue[0] = new BigDecimal(mgtAgeTotalVo.getTenAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[1] = new BigDecimal(mgtAgeTotalVo.getTwentyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[2] = new BigDecimal(mgtAgeTotalVo.getThirtyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[3] = new BigDecimal(mgtAgeTotalVo.getFortyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + agePercentValue[4] = new BigDecimal(mgtAgeTotalVo.getFiftyAge().toString()).divide(totalPersonBig,2,BigDecimal.ROUND_HALF_UP).multiply(hundredBig); + // 设置年龄段数组和不同年龄段的会员数数组 + memberFixedTotalVo.setAgeKey(ageKey); + memberFixedTotalVo.setAgeValue(ageValue); + memberFixedTotalVo.setAgePercentValue(agePercentValue); + // 获取不同护理类型的会员数 + List<MgtMapIntTotalVo> nurseTotalVos = memberMapper.getMerMemberTotalNurse(merTotalDto); + if (nurseTotalVos != null && nurseTotalVos.size() > 0) { + nurseTotalVos = listRemoveNull(nurseTotalVos); + memberFixedTotalVo.setNurseTotalVos(nurseTotalVos); + }else{ + nurseTotalVos = new ArrayList<>(); + memberFixedTotalVo.setNurseTotalVos(nurseTotalVos); + } + //获取不同等级的会员数 + List<MgtMapIntTotalVo> memberLevelTotalVos = memberMapper.getMerMemberTotalLevel(merTotalDto); + if (memberLevelTotalVos != null && memberLevelTotalVos.size() > 0) { + memberLevelTotalVos = listRemoveNull(memberLevelTotalVos); + memberFixedTotalVo.setMemberLevelTotalVos(memberLevelTotalVos); + }else{ + memberLevelTotalVos = new ArrayList<>(); + memberFixedTotalVo.setMemberLevelTotalVos(memberLevelTotalVos); + } + // 获取不同商品类型的会员数 + List<MgtMapIntTotalVo> goodsTypeTotalVos = memberMapper.getMerMemberTotalGoodsType(merTotalDto); + if (goodsTypeTotalVos != null && goodsTypeTotalVos.size() > 0) { + goodsTypeTotalVos = listRemoveNull(goodsTypeTotalVos); + memberFixedTotalVo.setGoodsTypeTotalVos(goodsTypeTotalVos); + }else{ + goodsTypeTotalVos = new ArrayList<>(); + memberFixedTotalVo.setGoodsTypeTotalVos(goodsTypeTotalVos); + } + //获取会员消费排名 + List<MgtMapIntTotalVo> memberPayList = memberMapper.getMerMemberPayRank(merTotalDto); + if (memberPayList != null && memberPayList.size() > 0) { + memberPayList = listRemoveNull(memberPayList); + memberFixedTotalVo.setMemberPayList(memberPayList); + }else{ + memberPayList = new ArrayList<>(); + memberFixedTotalVo.setMemberPayList(memberPayList); + } + // 获取不同活跃度的会员数 + List<Activeness> activenessList = remoteConfigService.listActiveness().getData(); + if (activenessList != null && !activenessList.isEmpty()) { + Activeness activeness; + String actStartDate; + String actEndDate; + Integer count; + List<MgtMapIntTotalVo> mgtMapIntTotalVoList = new ArrayList<>(); + MgtMapIntTotalVo MgtMapIntTotalVo; + // 遍历不同活跃度列表,设置活跃度数组和对应的会员数数组 + for (int i = 0; i < activenessList.size(); i++) { + activeness = activenessList.get(i); + actStartDate = DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(nowDay, -activeness.getEndDay())); + actEndDate = DateUtils.parseDateToStr("yyyy-MM-dd", DateUtils.addDays(nowDay, -activeness.getStartDay())); + merTotalDto.setStartDate(actStartDate); + merTotalDto.setEndDate(actEndDate); + count = memberMapper.getMerMemberTotalActiveness(merTotalDto); + MgtMapIntTotalVo = new MgtMapIntTotalVo(); + MgtMapIntTotalVo.setMapKey(activeness.getActivenessName()); + MgtMapIntTotalVo.setMapValue(count); + mgtMapIntTotalVoList.add(MgtMapIntTotalVo); + } + memberFixedTotalVo.setActivenessList(mgtMapIntTotalVoList); + }else{ + List<MgtMapIntTotalVo> mgtMapIntTotalVoList = new ArrayList<>(); + memberFixedTotalVo.setActivenessList(mgtMapIntTotalVoList); + } + return memberFixedTotalVo; + } + + /** + * @description 商会获取会员来源统计 + * @author jqs + * @date 2023/7/3 19:09 + * @param merTotalDto + * @return MerMemberSourceTotalVo + */ + @Override + public MerMemberSourceTotalVo getMerMemberSourceTotal(MerTotalDto merTotalDto){ + if(merTotalDto.getShopAllFlag()!=null&&merTotalDto.getShopAllFlag()==1){ + List<Long> shopIdList = remoteShopService.listShopIdByShopId(merTotalDto.getShopId()).getData(); + merTotalDto.setShopIdList(shopIdList); + merTotalDto.setShopId(null); + } + MerMemberSourceTotalVo memberSourceTotalVo = new MerMemberSourceTotalVo(); + //获取来源渠道排名 + List<MgtMapIntTotalVo> customerSourceList = memberMapper.getMerMemberCustomerSourceRank(merTotalDto); + if (customerSourceList != null && customerSourceList.size() > 0) { + customerSourceList = listRemoveNull(customerSourceList); + memberSourceTotalVo.setCustomerSourceList(customerSourceList); + } + + return memberSourceTotalVo; + } + + /** + * @description 商会获取会员推荐排名 + * @author jqs + * @date 2023/7/3 19:14 + * @param merTotalDto + * @return MerMemberRecommendTotalVo + */ + @Override + public MerMemberRecommendTotalVo getMerMemberRecommendTotal(MerTotalDto merTotalDto){ + if(merTotalDto.getShopAllFlag()!=null&&merTotalDto.getShopAllFlag()==1){ + List<Long> shopIdList = remoteShopService.listShopIdByShopId(merTotalDto.getShopId()).getData(); + merTotalDto.setShopIdList(shopIdList); + merTotalDto.setShopId(null); + } + MerMemberRecommendTotalVo memberRecommendTotalVo = new MerMemberRecommendTotalVo(); + //获取会员推荐排名 + /*List<MgtMapIntTotalVo> recommendList = memberMapper.getMerMemberRecommendRank(merTotalDto); + if (recommendList != null && recommendList.size() > 0) { + recommendList = listRemoveNull(recommendList); + memberRecommendTotalVo.setRecommendList(recommendList); + }*/ + List<MgtMapIntTotalVo> recommendList = new ArrayList<>(); + memberRecommendTotalVo.setRecommendList(recommendList); + return memberRecommendTotalVo; + } + + /** + * @description 获取各年龄层用户 + * @author jqs + * @date 2023/7/4 9:50 + * @param merTotalDto + * @return MerOrderAgeUserVo + */ + @Override + public List<MerOrderAgeUserVo> listOrderAgeUser(MerTotalDto merTotalDto){ + List<MerOrderAgeUserVo> orderAgeUserVoList = new ArrayList<>(); + MerOrderAgeUserVo merOrderAgeUserVo = new MerOrderAgeUserVo(); + merTotalDto.setAgeType(1); + List<Long> userIdList = memberMapper.listOrderAgeUser(merTotalDto); + merOrderAgeUserVo.setAgeType(1); + merOrderAgeUserVo.setUserIdList(userIdList); + orderAgeUserVoList.add(merOrderAgeUserVo); + merOrderAgeUserVo = new MerOrderAgeUserVo(); + merTotalDto.setAgeType(2); + userIdList = memberMapper.listOrderAgeUser(merTotalDto); + merOrderAgeUserVo.setAgeType(2); + merOrderAgeUserVo.setUserIdList(userIdList); + orderAgeUserVoList.add(merOrderAgeUserVo); + merOrderAgeUserVo = new MerOrderAgeUserVo(); + merTotalDto.setAgeType(3); + userIdList = memberMapper.listOrderAgeUser(merTotalDto); + merOrderAgeUserVo.setAgeType(3); + merOrderAgeUserVo.setUserIdList(userIdList); + orderAgeUserVoList.add(merOrderAgeUserVo); + merOrderAgeUserVo = new MerOrderAgeUserVo(); + merTotalDto.setAgeType(4); + userIdList = memberMapper.listOrderAgeUser(merTotalDto); + merOrderAgeUserVo.setAgeType(4); + merOrderAgeUserVo.setUserIdList(userIdList); + orderAgeUserVoList.add(merOrderAgeUserVo); + merOrderAgeUserVo = new MerOrderAgeUserVo(); + merTotalDto.setAgeType(5); + userIdList = memberMapper.listOrderAgeUser(merTotalDto); + merOrderAgeUserVo.setAgeType(4); + merOrderAgeUserVo.setUserIdList(userIdList); + orderAgeUserVoList.add(merOrderAgeUserVo); + return orderAgeUserVoList; + } + /** + * @description 通过年龄层获取用户id列表 + * @author jqs + * @date 2023/8/23 18:59 + * @param ageType + * @return List<Long> + */ + @Override + public List<Long> listUserIdByAgeType(Integer ageType){ + MerTotalDto merTotalDto = new MerTotalDto(); + merTotalDto.setAgeType(ageType); + List<Long> userIdList = memberMapper.listOrderAgeUser(merTotalDto); + return userIdList; + } + /** + * @description + * @author jqs + * @date 2023/7/5 21:18 + * @param mgtFrozenMemberDto + * @return void + */ + @Override + public void mgtFrozenMember(MgtFrozenMemberDto mgtFrozenMemberDto){ + Long userId = mgtFrozenMemberDto.getId(); + Member member = this.getByUserId(userId); + member.setFrozenFlag(mgtFrozenMemberDto.getFrozenFlag()); + this.saveOrUpdate(member); + sysUserService.frozenUser(mgtFrozenMemberDto); + } + + /** + * @description 获取用户任务列表 + * @author jqs + * @date 2023/7/12 15:07 + * @param userId + * @return List<AppIntegralTaskListVo> + */ + @Override + public List<AppIntegralTaskListVo> listAppMemberIntegralTask(Long userId){ + // 获取指定用户的会员信息 + Member member = this.getByUserId(userId); + // 获取会员的总积分信息 + MemberTotal memberTotal = memberTotalService.getById(member.getMemberId()); + // 获取其他配置信息 + AppOtherConfigGetVo appOtherConfigGetVo = remoteConfigService.getAppOtherConfigGetVo().getData(); + // 创建一个空的积分任务列表 + List<AppIntegralTaskListVo> appIntegralTaskListVoList = new ArrayList<>(); + // 创建分享小程序任务 + AppIntegralTaskListVo shareTask = new AppIntegralTaskListVo(); + shareTask.setTaskContent("分享小程序给微信好友"); + shareTask.setTaskDesc("完成任务+" + appOtherConfigGetVo.getShareIntegral() + "积分"); + shareTask.setRecommendFlag(1); + shareTask.setCompleteFlag(memberTotal.getShareFlag()); + appIntegralTaskListVoList.add(shareTask); + // 创建提交平台建议任务 + AppIntegralTaskListVo plSuggestTask = new AppIntegralTaskListVo(); + plSuggestTask.setTaskContent("提交平台建议"); + plSuggestTask.setTaskDesc("完成任务+" + appOtherConfigGetVo.getSuggestPlatformIntegral() + "积分"); + plSuggestTask.setRecommendFlag(1); + plSuggestTask.setCompleteFlag(memberTotal.getPlSuggestFlag()); + appIntegralTaskListVoList.add(plSuggestTask); + // 创建提交门店建议任务 + AppIntegralTaskListVo shopSuggestTask = new AppIntegralTaskListVo(); + shopSuggestTask.setTaskContent("提交门店建议"); + shopSuggestTask.setTaskDesc("完成任务+" + appOtherConfigGetVo.getSuggestShopIntegral() + "积分"); + shopSuggestTask.setRecommendFlag(1); + shopSuggestTask.setCompleteFlag(memberTotal.getShopSuggestFlag()); + appIntegralTaskListVoList.add(shopSuggestTask); + // 创建每日签到任务 + AppIntegralTaskListVo signTask = new AppIntegralTaskListVo(); + signTask.setTaskContent("每日签到"); + signTask.setTaskDesc("完成任务+" + appOtherConfigGetVo.getSignInIntegral() + "积分"); + signTask.setRecommendFlag(1); + signTask.setCompleteFlag(memberTotal.getSignFlag()); + appIntegralTaskListVoList.add(signTask); + // 创建消费得积分任务 + AppIntegralTaskListVo buyTask = new AppIntegralTaskListVo(); + buyTask.setTaskContent("消费得积分"); + buyTask.setTaskDesc("每消费1元+" + appOtherConfigGetVo.getPayMoneyIntegral() + "积分"); + buyTask.setRecommendFlag(1); + buyTask.setCompleteFlag(memberTotal.getBuyFlag()); + appIntegralTaskListVoList.add(buyTask); + // 返回积分任务列表 + return appIntegralTaskListVoList; + } + + /** + * @description 积分变动 + * @author jqs + * @date 2023/7/12 15:59 + * @param integralChangeDto + * @return void + */ + @Override + public Boolean changeIntegral(IntegralChangeDto integralChangeDto){ + log.info("会员积分变动---"+integralChangeDto.toString()); + Member member = this.getByUserId(integralChangeDto.getUserId()); + Integer integralType = integralChangeDto.getIntegralType(); + Integer changeIntegral = integralChangeDto.getChangeIntegral(); + MemberTotal memberTotal = memberTotalService.getById(member.getMemberId()); + Boolean completeFlag = false; + switch(integralType){ + case 1: + if(memberTotal.getShareFlag()==1){ + completeFlag = true; + } + break; + case 2: + if(memberTotal.getPlSuggestFlag()==1){ + completeFlag = true; + } + break; + case 3: + if(memberTotal.getShopSuggestFlag()==1){ + completeFlag = true; + } + break; + case 4: + if(memberTotal.getSignFlag()==1){ + completeFlag = true; + } + break; + default: + break; + } + if(completeFlag){ + return completeFlag; + } + AppOtherConfigGetVo appOtherConfigGetVo = remoteConfigService.getAppOtherConfigGetVo().getData(); + IntegralRecord integralRecord = new IntegralRecord(); + integralRecord.setDelFlag(0); + integralRecord.setUserId(integralChangeDto.getUserId()); + integralRecord.setChangeType(integralType); + integralRecord.setCreateTime(new Date()); + //1分享获取2平台建议获取3门店建议获取4每日签到5消费得积分 + switch(integralType){ + case 1: + changeIntegral = appOtherConfigGetVo.getShareIntegral(); + integralRecord.setChangeIntegral(changeIntegral); + integralRecord.setSurpIntegral(memberTotal.getUseableIntegral()+changeIntegral); + integralRecord.setChangeReason("每日任务【分享小程序】获得积分"); + memberTotal.setTotalIntegral(memberTotal.getTotalIntegral()+changeIntegral); + memberTotal.setUseableIntegral(memberTotal.getUseableIntegral()+changeIntegral); + memberTotal.setShareFlag(1); + break; + case 2: + changeIntegral = appOtherConfigGetVo.getSuggestPlatformIntegral(); + integralRecord.setChangeIntegral(changeIntegral); + integralRecord.setSurpIntegral(memberTotal.getUseableIntegral()+changeIntegral); + integralRecord.setChangeReason("每日任务【提交平台建议】获得积分"); + memberTotal.setTotalIntegral(memberTotal.getTotalIntegral()+changeIntegral); + memberTotal.setUseableIntegral(memberTotal.getUseableIntegral()+changeIntegral); + memberTotal.setPlSuggestFlag(1); + break; + case 3: + changeIntegral = appOtherConfigGetVo.getSuggestShopIntegral(); + integralRecord.setChangeIntegral(changeIntegral); + integralRecord.setSurpIntegral(memberTotal.getUseableIntegral()+changeIntegral); + integralRecord.setChangeReason("每日任务【提交门店建议】获得积分"); + memberTotal.setTotalIntegral(memberTotal.getTotalIntegral()+changeIntegral); + memberTotal.setUseableIntegral(memberTotal.getUseableIntegral()+changeIntegral); + memberTotal.setShopSuggestFlag(1); + break; + case 4: + changeIntegral = appOtherConfigGetVo.getSignInIntegral(); + integralRecord.setChangeIntegral(changeIntegral); + integralRecord.setSurpIntegral(memberTotal.getUseableIntegral()+changeIntegral); + integralRecord.setChangeReason("每日任务【签到】获得积分"); + memberTotal.setTotalIntegral(memberTotal.getTotalIntegral()+changeIntegral); + memberTotal.setUseableIntegral(memberTotal.getUseableIntegral()+changeIntegral); + memberTotal.setSignFlag(1); + break; + case 5: + integralRecord.setChangeIntegral(changeIntegral); + integralRecord.setSurpIntegral(memberTotal.getUseableIntegral()+changeIntegral); + integralRecord.setChangeReason("订单【"+integralChangeDto.getOrderNo()+"】获得积分"); + integralRecord.setOrderId(integralChangeDto.getOrderId()); + integralRecord.setOrderNo(integralChangeDto.getOrderNo()); + memberTotal.setTotalIntegral(memberTotal.getTotalIntegral()+changeIntegral); + memberTotal.setUseableIntegral(memberTotal.getUseableIntegral()+changeIntegral); + memberTotal.setBuyFlag(1); + break; + default: + break; + } + memberTotalService.saveOrUpdate(memberTotal); + integralRecordService.saveOrUpdate(integralRecord); + return completeFlag; + } + + /** + * @description 统计商户今日新增会员 + * @author jqs + * @date 2023/7/14 19:54 + * @param shopIdList + * @return Integer + */ + @Override + public Integer getAreaNewMember(List<Long> shopIdList){ + return memberMapper.getAreaNewMember(shopIdList); + } + + /** + * @description 更新会员绑定商户名 + * @author jqs + * @date 2023/7/26 17:08 + * @param mgtMemberShopNameDto + * @return void + */ + @Override + public void updateMemberShopName(MgtMemberShopNameDto mgtMemberShopNameDto){ + LambdaUpdateWrapper<Member> updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(Member::getRelationShopId,mgtMemberShopNameDto.getShopId()); + updateWrapper.set(Member::getRelationShopName,mgtMemberShopNameDto.getShopName()); + this.update(updateWrapper); + } + + /** + * @description 发送生日祝福 + * @author jqs + * @date 2023/8/7 15:40 + * @param + * @return void + */ + @Override + public void sendBirthdayBless(){ + List<Member> mobileList = memberMapper.listTodayBirthday(); + if(mobileList!=null&&!mobileList.isEmpty()){ + log.info("生日祝福发送短信---"+mobileList.toString()); + for(Member member : mobileList){ + try { + String msg = "{\"name\":\"" + (StringUtils.isEmpty(member.getRealName()) ? member.getNickName() : member.getRealName()) + "\"}"; + MsgUtils.sendMsg(member.getMobile(),null, msg); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + } } -- Gitblit v1.7.1