Преглед на файлове

fix: ios服务游客校验逻辑调整及合并

hidewnd преди 5 дни
родител
ревизия
c250e1b2d1

+ 10 - 0
yt-common/src/main/java/com/ytpm/app/param/IosLoginParam.java

@@ -1,9 +1,13 @@
 package com.ytpm.app.param;
 
+import com.ytpm.app.model.YtDyzAdRecord;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
+import java.util.List;
+
 @ApiModel("IOS登录参数")
 @Data
 public class IosLoginParam {
@@ -37,4 +41,10 @@ public class IosLoginParam {
     private String phoneJson;
     @ApiModelProperty(value = "幂等ID")
     private String requestId;
+
+    @ApiModelProperty("登陆前广告记录")
+    private List<DyzAdRecordParam> preAdList;
+
+    @ApiModelProperty("登陆广告风控")
+    private Date adStartTime;
 }

+ 61 - 7
yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/controller/WxController.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson.JSON;
+import com.ytpm.agent.enums.AdRecordEnum;
 import com.ytpm.agent.enums.UserStatusEnum;
 import com.ytpm.agent.model.YtDitch;
 import com.ytpm.app.enums.LoginType;
@@ -12,7 +13,10 @@ import com.ytpm.app.model.YtAppDefaultConfig;
 import com.ytpm.app.model.YtDyzAdRecord;
 import com.ytpm.app.model.YtDyzUser;
 import com.ytpm.app.param.AppConfigUpdateParam;
+import com.ytpm.app.param.DyzAdRecordParam;
 import com.ytpm.app.param.IosLoginParam;
+import com.ytpm.app.param.LoginParam;
+import com.ytpm.app.param.VisitorLoginParam;
 import com.ytpm.app.param.WxLoginParam;
 import com.ytpm.app.view.IosPowerResView;
 import com.ytpm.app.view.IosUserInfo;
@@ -23,10 +27,12 @@ import com.ytpm.feign.RiskFeign;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
 import com.ytpm.general.StatusCode;
+import com.ytpm.handle.CustomerException;
 import com.ytpm.lemonios.dao.AdRecordMapper;
 import com.ytpm.lemonios.dao.AppUserMapper;
 import com.ytpm.lemonios.dao.DitchMapper;
 import com.ytpm.lemonios.redis.RedisService;
+import com.ytpm.lemonios.service.AdService;
 import com.ytpm.lemonios.service.AppUserService;
 import com.ytpm.util.HttpClientUtil;
 import io.swagger.annotations.Api;
@@ -45,6 +51,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.List;
@@ -64,6 +71,8 @@ public class WxController {
     @Resource
     private AdRecordMapper recordMapper;
     @Resource
+    private AdService adService;
+    @Resource
     private RiskFeign riskFeign;
     @Resource
     private AppUserService appUserService;
@@ -160,22 +169,67 @@ public class WxController {
         }
         IosUserInfo userInfo = setIosUserInfo(param);
         param.setLoginIp(HttpClientUtil.getClientIp(request));
-        YtDyzUser old = appUserService.crudForNewTransIos(param, userInfo, LoginType.IOS.getTypeName());
+        YtDyzUser dyzUser = appUserService.crudForNewTransIos(param, userInfo, LoginType.IOS.getTypeName());
+        // 游客登陆校验
+        if (CollUtil.isNotEmpty(param.getPreAdList())) {
+            dyzUser.setLoginType(LoginType.VISITOR);
+            saveVisitorAdRecord(dyzUser, param, defaultConfig);
+            Result<?> result = riskFeign.checkLoginRisk(dyzUser);
+            if (result.getCode() != 200) {
+                String errorMessage = result.getMessage();
+                if (RepMessage.RISK_VISITOR_LOWER_VALUE.equals(errorMessage)) {
+                    return Result.resultErr(StrUtil.emptyToDefault(defaultConfig.getLowValueTip(), errorMessage));
+                }
+                return Result.resultErr(errorMessage);
+            }
+        }
+        // 状态 游客登陆前风控 -> 正常
+        YtDyzUser newUser = new YtDyzUser();
+        newUser.setUserId(dyzUser.getUserId());
+        newUser.setUserStatus(UserStatusEnum.NORMAL.getCode());
+        appUserMapper.updateUser(newUser);
         //调用风控服务校验默认风控配置
-        old.setRiskCode("313");
-        Result<?> result = riskFeign.checkRisk(old);
+        dyzUser.setLoginType(LoginType.IOS);
+        dyzUser.setRiskCode("313");
+        Result<?> result = riskFeign.checkRisk(dyzUser);
         if (result.getCode() != 200) {
             return new Result<>(StatusCode.ACCESS_ERR, result.getMessage());
         }
-        if (old.getLastLoginTime() != null && old.getRegistryTime() != null) {
+        if (dyzUser.getLastLoginTime() != null && dyzUser.getRegistryTime() != null) {
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-            old.setLastLoginTimeStr(sdf.format(old.getLastLoginTime()));
-            old.setRegistryTimeStr(sdf.format(old.getRegistryTime()));
+            dyzUser.setLastLoginTimeStr(sdf.format(dyzUser.getLastLoginTime()));
+            dyzUser.setRegistryTimeStr(sdf.format(dyzUser.getRegistryTime()));
         }
         //调用风控服务校验默认风控配置
-        return Result.resultOk(RepMessage.LOGIN_SUCCESS, old);
+        return Result.resultOk(RepMessage.LOGIN_SUCCESS, dyzUser);
+    }
+
+    private void saveVisitorAdRecord(YtDyzUser ytDyzUser,IosLoginParam visitorLoginParam, WxDefaultConfig defaultConfig) {
+        List<DyzAdRecordParam> preAdList = visitorLoginParam.getPreAdList();
+        // 保存登陆前传递的广告记录
+        List<String> adRecordIds = new ArrayList<>();
+        if (CollUtil.isNotEmpty(preAdList)) {
+            BigDecimal totalRevenue = BigDecimal.ZERO;
+            for (DyzAdRecordParam adRecordParam : preAdList) {
+                if (adRecordParam == null) {
+                    continue;
+                }
+                adRecordParam.setUserId(ytDyzUser.getUserId());
+                adRecordParam.setNickName(ytDyzUser.getNickName());
+                adRecordParam.setAppId(ytDyzUser.getAppId());
+                adRecordParam.setLoginStatus(AdRecordEnum.LOGIN_BEFORE.getCode());
+                String recordId = adService.saveRecordAndChangeUser(adRecordParam, ytDyzUser);
+                adRecordIds.add(recordId);
+                totalRevenue = adRecordParam.getRevenue() == null ? totalRevenue : totalRevenue.add(adRecordParam.getRevenue());
+            }
+            log.info(StrUtil.format("[visitor adRecords]userId:{} recordCount:{} revenue:{}",
+                    ytDyzUser.getUserId(), adRecordIds.size(), totalRevenue.toPlainString()));
+        }
+        ytDyzUser.setPreAdRecordList(recordMapper.selectRecordByIds(AdRecordEnum.LOGIN_BEFORE.getCode(), adRecordIds));
     }
 
+
+    @Deprecated
     @PostMapping("/iosLoginCheck")
     @ApiOperation("IOS登录校验")
     @Transactional

+ 7 - 0
yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/dao/AdRecordMapper.java

@@ -76,4 +76,11 @@ public interface AdRecordMapper {
     Integer getRecordMonthCount(@Param("userId") String userId,
                                 @Param("adSourceType") Integer adSourceType,
                                 @Param("startTime") Date startTime);
+
+
+    /**
+     * 查询指定广告记录
+     */
+    List<YtDyzAdRecord> selectRecordByIds(@Param("loginStatus") Integer loginStatus, @Param("ids") List<String> adRecordIds);
+
 }

+ 4 - 0
yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/service/AdService.java

@@ -2,6 +2,7 @@ package com.ytpm.lemonios.service;
 
 import com.ytpm.agent.view.AgentAdGroupStaticsVO;
 import com.ytpm.agent.view.AgentTopCountView;
+import com.ytpm.app.model.YtDyzUser;
 import com.ytpm.app.param.DyzAdRecordParam;
 import com.ytpm.general.Result;
 import com.ytpm.middle.view.DashboardRankingListVO;
@@ -18,6 +19,9 @@ public interface AdService {
      */
     Result<?> saveRecord(DyzAdRecordParam param);
 
+    //    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
+    String saveRecordAndChangeUser(DyzAdRecordParam param, YtDyzUser user);
+
     /**
      * 根据应用查询广告数量
      */

+ 7 - 3
yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/service/impl/AdServiceImpl.java

@@ -150,7 +150,8 @@ public class AdServiceImpl implements AdService {
      *  始终创建新的事务以保障子方法的独立事务
      */
 //    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
-    public void saveRecordAndChangeUser(DyzAdRecordParam param, YtDyzUser user) {
+    @Override
+    public String saveRecordAndChangeUser(DyzAdRecordParam param, YtDyzUser user) {
         //增加广告记录
         //修改用户信息, 广告次数+1  总收益 + revenue
 //        YtDyzUser dyzUser = new YtDyzUser();
@@ -158,16 +159,18 @@ public class AdServiceImpl implements AdService {
 //        dyzUser.setTotalVideo(Objects.isNull(user.getTotalVideo())?1:(user.getTotalVideo()+1));
 //        dyzUser.setTotalIncome(user.getTotalIncome().add(param.getRevenue()));
 //        appUserMapper.updateUser(dyzUser);
-        YtDyzAdRecord adRecord = new YtDyzAdRecord();
         handleParam(param);
+        String recordId = IdUtil.fastSimpleUUID();
+        YtDyzAdRecord adRecord = new YtDyzAdRecord();
         BeanUtils.copyProperties(param, adRecord);
-        adRecord.setRecordId(IdUtil.fastSimpleUUID());
+        adRecord.setRecordId(recordId);
         adRecord.setIosId(param.getIosId());
         adRecord.setNetworkName(AdPlatformTypeEnum.getDesc(Integer.parseInt(param.getNetworkFormId())));
         if (user == null) {
             adRecord.setAppId(appId);
             adRecordMapper.addOneVisitor(adRecord);
         } else {
+            adRecord.setAppId(user.getAppId());
             adRecord.setUserId(user.getUserId());
             adRecordMapper.addOne(adRecord);
             if (param.getRevenue() == null) {
@@ -175,6 +178,7 @@ public class AdServiceImpl implements AdService {
             }
             appUserMapper.updateTotal(user.getUserId(), 1, param.getRevenue());
         }
+        return recordId;
     }
 
     private String getTipsMsg(){

+ 2 - 1
yt-ios-lemon/lemon-ios-service/src/main/java/com/ytpm/lemonios/service/impl/AppUserServiceImpl.java

@@ -234,7 +234,8 @@ public class AppUserServiceImpl implements AppUserService {
      */
     private void deadWithUserCrudForIos(YtDyzUser old, IosUserInfo userInfo, IosLoginParam param) {
         //处于风控状态的用户不允许登录
-        if(!old.getUserStatus().equals(UserStatusEnum.NORMAL.getCode())){
+        if(!old.getUserStatus().equals(UserStatusEnum.NORMAL.getCode())
+            && !old.getUserStatus().equals(UserStatusEnum.VISITOR_LOCK.getCode())){
             throw new CustomerException(getTipsMsg());
         }
         YtDyzUser newUser = new YtDyzUser();

+ 12 - 0
yt-ios-lemon/lemon-ios-service/src/main/resources/mapper/AdRecordMapper.xml

@@ -257,4 +257,16 @@
             and finish_time > #{startTime}
         </if>
     </select>
+    <select id="selectRecordByIds" resultType="com.ytpm.app.model.YtDyzAdRecord">
+        select
+        record_id, user_id, app_id, nick_name, placement_id, ad_source_id, ad_source_type, ad_source_index,
+        revenue, ecpm, network_form_id, network_name, network_placement_id, finish_time, begin_time, result_json
+        <if test="loginStatus != null and loginStatus == 1">
+            from yt_dyz_ad_record_visitor
+        </if>
+        <if test="loginStatus == null or loginStatus != 1">
+            from yt_dyz_ad_record
+        </if>
+        where record_id in <foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach>
+    </select>
 </mapper>