Explorar el Código

fix 新人福利

zoujiajian hace 3 años
padre
commit
f267fc6117

+ 2 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -125,4 +125,6 @@ public interface Constant {
 	 * 普通推广 关联优惠券id
 	 */
 	Long GENERAL_POPULARIZE_COUPON_ID = 111l;
+
+	String NEW_USER_WELFARE_KEY = "new_user_welfare_key";
 }

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/NewUserWelfareDto.java

@@ -0,0 +1,18 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: NewUserWelfareDto
+ *创建者: JavaZou
+ *创建时间:2023/7/11 15:03
+ */
+@Getter
+@Setter
+public class NewUserWelfareDto {
+	private List<Long> couponIds;
+}

+ 6 - 5
netflix-dao/src/main/java/com/cyksj/model/entity/CouponUser.java

@@ -56,11 +56,12 @@ public class CouponUser extends BaseEntity {
 		center("unused", "领卷中心"),
 		exCode("exCode", "兑换码"),
 		wxCorp("wxCorp", "企业微信"),
-		manual("manual","手动发放"),
-		lottery("lottery","抽奖"),
-		task("task","完成任务"),
-		equipment("equipment","实物设备分销"),
-		ques_response("ques_response","问卷回答"),
+		manual("manual", "手动发放"),
+		lottery("lottery", "抽奖"),
+		task("task", "完成任务"),
+		equipment("equipment", "实物设备分销"),
+		ques_response("ques_response", "问卷回答"),
+		new_welfare("new_welfare", "新人福利"),
 		;
 		private String channel;
 		private String desc;

+ 7 - 1
netflix-service/src/main/java/com/cyksj/service/user/UserService.java

@@ -5,6 +5,7 @@ import com.cyksj.model.dto.GzhOAuth2UserInfo;
 import com.cyksj.model.dto.UserWhoami;
 import com.cyksj.model.entity.User;
 import com.cyksj.model.entity.WxSyncLog;
+import com.cyksj.model.request.LoginReq;
 
 import java.util.List;
 
@@ -14,7 +15,7 @@ import java.util.List;
  */
 public interface UserService extends IService<User> {
 
-    User saveAuth(GzhOAuth2UserInfo userinfo, Long sharedId, Integer dsType, Long pid, User.RegisterEnv registerEnv, String dsCode);
+	User saveAuth(GzhOAuth2UserInfo userinfo, Long sharedId, Integer dsType, Long pid, User.RegisterEnv registerEnv, String dsCode);
 
     UserWhoami whoami(long userId);
 
@@ -41,4 +42,9 @@ public interface UserService extends IService<User> {
 	 * 根据showId 获取用户id
 	 */
 	Long getUserIdByShowId(String showId);
+
+	/**
+	 * 验证码登录
+	 */
+	User webLogin(LoginReq loginReq) throws Exception;
 }

+ 121 - 0
netflix-service/src/main/java/com/cyksj/service/user/impl/UserServiceImpl.java

@@ -1,6 +1,8 @@
 package com.cyksj.service.user.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -8,15 +10,19 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
+import com.cyksj.common.util.Codec;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
+import com.cyksj.mapper.PhoneCodeMapper;
 import com.cyksj.mapper.UserMapper;
 import com.cyksj.mapper.channel.ChannelPopularizeMapper;
 import com.cyksj.mapper.manage.cps.UserDistributePopularizeMapper;
 import com.cyksj.mapper.market.task.UserBindDetailMapper;
 import com.cyksj.model.dto.GzhOAuth2UserInfo;
+import com.cyksj.model.dto.NewUserWelfareDto;
 import com.cyksj.model.dto.UserWhoami;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.request.LoginReq;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.distribute.DistributeService;
 import com.cyksj.service.distribute.equipment.EquipmentDistributeService;
@@ -30,6 +36,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 
@@ -59,6 +66,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
 	private final UserMapper userMapper;
 
+	private final PhoneCodeMapper phoneCodeMapper;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
 	@Override
@@ -96,6 +105,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 						.eq(User::getUnionid, unionid).last("limit 1"));
 			}
 			this.save(user);
+			//发放新用户福利
+			final Long fUid = user.getId();
+			TASK_POOL.execute(() -> sendNewUserWelfare(fUid));
 		} else {
 			if (StrUtil.isEmpty(user.getRegisterEnv())) {
 				user.setRegisterEnv(registerEnv.name());
@@ -290,4 +302,113 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 		return userMapper.getUserIdByShowId(showId);
 	}
 
+	@Override
+	public User webLogin(LoginReq loginReq) throws Exception {
+		LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class).last("limit 1");
+		if (loginReq.getType() == null || loginReq.getType() < 1 && loginReq.getType() > 2) {
+			throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新操作");
+		}
+		if (loginReq.getType() == 1) {
+			if (StrUtil.hasEmpty(loginReq.getPhone(), loginReq.getCode())) {
+				throw BusinessRuntimeException.getInstance("请输入对应信息");
+			}
+			DateTime now = DateTime.now();
+			PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, loginReq.getPhone()).last("limit 1"));
+			if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
+				throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
+			}
+			//3分钟失效
+			Date updateTime = phoneCode.getUpdateTime();
+			DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
+			if (now.isAfter(afterFiveMinutes)) {
+				throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
+			}
+			if (!StrUtil.equals(loginReq.getCode(), phoneCode.getCode())) {
+				throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
+			}
+			wrapper.eq(User::getLoginPhone, loginReq.getPhone());
+		}
+		if (loginReq.getType() == 2) {
+			if (StrUtil.isEmpty(loginReq.getEmail())) {
+				throw BusinessRuntimeException.getInstance("邮箱不能为空");
+			}
+			String code = redisService.getStr(RedisService.key.EMAIL_CODE_KEY.getNameFormat(loginReq.getEmail()));
+			if (StrUtil.isEmpty(code)) {
+				throw BusinessRuntimeException.getInstance("邮箱验证码已失效,请重新获取");
+			}
+			if (!StrUtil.equals(loginReq.getCode(), code)) {
+				throw BusinessRuntimeException.getInstance("邮箱验证码错误,请重新输入");
+			}
+			wrapper.eq(User::getEmail, loginReq.getEmail());
+			redisService.del(RedisService.key.EMAIL_CODE_KEY.getNameFormat(loginReq.getEmail()));
+		}
+		//保存用户信息
+		User user = this.getOne(wrapper);
+		String dsCode = loginReq.getDsCode();
+		Long sharedId = loginReq.getSharedId();
+		Long dsPopularizeId = null;
+		if (StrUtil.isNotBlank(dsCode)) {
+			dsCode = dsCode.trim();
+			User sharedUser = this.getOne(Wrappers.lambdaQuery(User.class)
+					.eq(User::getShowId, dsCode).last("limit 1"));
+			if (sharedUser != null) {
+				sharedId = sharedUser.getId();
+			} else {
+				UserDistributePopularize distributePopularize = distributePopularizeMapper.selectOne(Wrappers.lambdaQuery(UserDistributePopularize.class)
+						.eq(UserDistributePopularize::getCode, dsCode)
+						.select(UserDistributePopularize::getUserId, UserDistributePopularize::getId).last("limit 1"));
+				if (distributePopularize != null) {
+					log.info("渠道sharedId:{}设置固定推广链接PC用户分销", distributePopularize.getUserId());
+					sharedId = distributePopularize.getUserId();
+					dsPopularizeId = distributePopularize.getId();
+				}
+			}
+		}
+		if (user == null) {
+			user = new User();
+			StringBuilder name = new StringBuilder();
+			name.append(Constant.DEFAULT_NAME);
+			if (loginReq.getPopularizeId() != null) {
+				user.setPopularizeId(loginReq.getPopularizeId());
+			}
+			if (loginReq.getType() == 1) {
+				user.setLoginPhone(loginReq.getPhone());
+			}
+			if (loginReq.getType() == 2) {
+				user.setEmail(loginReq.getEmail());
+				name.append("@");
+			}
+			user.setNickname(String.format("%s%s", name.toString(), Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.MD5).setStringData(String.format("%s%s", user.getId(), loginReq.getType() == 1 ? user.getLoginPhone() : user.getEmail())).toHexString().substring(0, 6)));
+			//默认头像
+			user.setHeadimgurl(Constant.DEFAULT_HEAD_IMG);
+			String registerEnv = loginReq.getRegisterEnv();
+			user.setRegisterEnv(StrUtil.isEmpty(registerEnv) ? User.RegisterEnv.pc.name() : registerEnv);
+			this.save(user);
+			//新用户分销
+			if (sharedId != null) {
+				distributeService.saveDistributionInvitation(sharedId, user.getId(), dsPopularizeId);
+			}
+			//发放新用户福利
+			final Long fUid = user.getId();
+			TASK_POOL.execute(() -> sendNewUserWelfare(fUid));
+		}
+		if (StrUtil.isEmpty(user.getShowId())) {
+			user.setShowId(getUserShowId(user.getId()));
+		}
+		return user;
+	}
+
+
+	/**
+	 * 发放新用户福利
+	 */
+	public void sendNewUserWelfare(Long userId) {
+		SysConfig newUserWelfareConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
+				.eq(SysConfig::getSysKey, Constant.NEW_USER_WELFARE_KEY).last("limit 1"));
+		NewUserWelfareDto newUserWelfareDto = Jsons.parseObject(newUserWelfareConfig, NewUserWelfareDto.class);
+		if (newUserWelfareDto != null) {
+			List<Long> couponIds = newUserWelfareDto.getCouponIds();
+			couponIds.forEach(couponId -> couponCommonService.sendCouponToUser(userId, couponId, null, null, null, CouponUser.Channel.new_welfare));
+		}
+	}
 }

+ 1 - 92
netflix-web/src/main/java/com/cyksj/web/controller/user/AuthorizationController.java

@@ -1,16 +1,12 @@
 package com.cyksj.web.controller.user;
 
 import cn.hutool.core.codec.Base64;
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.annotation.NoSubmit;
-import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.util.*;
@@ -26,7 +22,6 @@ import com.cyksj.model.dto.GzhOAuth2UserInfo;
 import com.cyksj.model.dto.JsSdkTicket;
 import com.cyksj.model.entity.PhoneCode;
 import com.cyksj.model.entity.User;
-import com.cyksj.model.entity.UserDistributePopularize;
 import com.cyksj.model.request.LoginReq;
 import com.cyksj.model.response.LoginPhoneRep;
 import com.cyksj.model.response.WxGzhQrCodeTicketRep;
@@ -47,7 +42,6 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.Date;
 import java.util.Optional;
 
 /**
@@ -373,94 +367,9 @@ public class AuthorizationController {
     @PostMapping("/login/phone")
     @NoSubmit
     public Result<LoginPhoneRep> loginByPhone(@RequestBody LoginReq loginReq) throws Exception {
-        LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(User.class).last("limit 1");
-        if (loginReq.getType() == 1) {
-            if (StrUtil.hasEmpty(loginReq.getPhone(), loginReq.getCode())) {
-                throw BusinessRuntimeException.getInstance("请输入对应信息");
-            }
-            DateTime now = DateTime.now();
-            PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, loginReq.getPhone()).last("limit 1"));
-            if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
-                throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
-            }
-            //3分钟失效
-            Date updateTime = phoneCode.getUpdateTime();
-            DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
-            if (now.isAfter(afterFiveMinutes)) {
-                throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
-            }
-            if (!StrUtil.equals(loginReq.getCode(), phoneCode.getCode())) {
-                throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
-            }
-            wrapper.eq(User::getLoginPhone, loginReq.getPhone());
-        } else if (loginReq.getType() == 2) {
-            if (StrUtil.isEmpty(loginReq.getEmail())) {
-                throw BusinessRuntimeException.getInstance("邮箱不能为空");
-            }
-            String code = redisService.getStr(RedisService.key.EMAIL_CODE_KEY.getNameFormat(loginReq.getEmail()));
-            if (StrUtil.isEmpty(code)) {
-                throw BusinessRuntimeException.getInstance("邮箱验证码已失效,请重新获取");
-            }
-            if (!StrUtil.equals(loginReq.getCode(), code)) {
-                throw BusinessRuntimeException.getInstance("邮箱验证码错误,请重新输入");
-            }
-            wrapper.eq(User::getEmail, loginReq.getEmail());
-            redisService.del(RedisService.key.EMAIL_CODE_KEY.getNameFormat(loginReq.getEmail()));
-        } else {
-            throw BusinessRuntimeException.getInstance("系统异常,请刷新页面重新操作");
-        }
-        //保存用户信息
-        User user = userService.getOne(wrapper);
-        String dsCode = loginReq.getDsCode();
-        Long sharedId = loginReq.getSharedId();
-        Long dsPopularizeId = null;
-        if (StrUtil.isNotBlank(dsCode)) {
-            dsCode = dsCode.trim();
-            User sharedUser = userService.getOne(Wrappers.lambdaQuery(User.class)
-                    .eq(User::getShowId, dsCode).last("limit 1"));
-            if (sharedUser != null) {
-                sharedId = sharedUser.getId();
-            } else {
-                UserDistributePopularize distributePopularize = distributePopularizeMapper.selectOne(Wrappers.lambdaQuery(UserDistributePopularize.class)
-                        .eq(UserDistributePopularize::getCode, dsCode)
-                        .select(UserDistributePopularize::getUserId, UserDistributePopularize::getId).last("limit 1"));
-                if (distributePopularize != null) {
-                    log.info("渠道sharedId:{}设置固定推广链接PC用户分销", distributePopularize.getUserId());
-                    sharedId = distributePopularize.getUserId();
-                    dsPopularizeId = distributePopularize.getId();
-                }
-            }
-        }
-        if (user == null) {
-            user = new User();
-            if (loginReq.getPopularizeId() != null) {
-                user.setPopularizeId(loginReq.getPopularizeId());
-            }
-            if (loginReq.getType() == 1) {
-                user.setLoginPhone(loginReq.getPhone());
-            } else if (loginReq.getType() == 2) {
-                user.setEmail(loginReq.getEmail());
-            }
-            String name = Constant.DEFAULT_NAME;
-            if (loginReq.getType() == 2) {
-                name += "@";
-            }
-            user.setNickname(String.format("%s%s", name, Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.MD5).setStringData(String.format("%s%s", user.getId(), loginReq.getType() == 1 ? user.getLoginPhone() : user.getEmail())).toHexString().substring(0, 6)));
-            //默认头像
-            user.setHeadimgurl(Constant.DEFAULT_HEAD_IMG);
-            String registerEnv = loginReq.getRegisterEnv();
-            user.setRegisterEnv(StrUtil.isEmpty(registerEnv) ? User.RegisterEnv.pc.name() : registerEnv);
-            userService.save(user);
-            //新用户分销
-            if (sharedId != null) {
-                distributeService.saveDistributionInvitation(sharedId, user.getId(), dsPopularizeId);
-            }
-        }
+        User user = userService.webLogin(loginReq);
         //写回登陆信息
         StpUserUtil.login(user.getId());
-        if (StrUtil.isEmpty(user.getShowId())) {
-            user.setShowId(userService.getUserShowId(user.getId()));
-        }
         LoginPhoneRep loginPhoneRep = new LoginPhoneRep(StpUserUtil.getTokenValue(), user.getShowId(), user.getNickname(), user.getHeadimgurl());
         return GatewayResponse.SUCCESS.newBuilder().toResult(loginPhoneRep);
     }