Prechádzať zdrojové kódy

增加反射工具类
增加风控动态配置接口

marxjaw 5 mesiacov pred
rodič
commit
0bac701ada

+ 55 - 0
yt-common/src/main/java/com/ytpm/agent/model/YtAppUser.java

@@ -0,0 +1,55 @@
+package com.ytpm.agent.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@ApiModel("易推App用户表")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class YtAppUser {
+    @ApiModelProperty("应用ID")
+    private String appId;
+    @ApiModelProperty("用户ID")
+    private String userId;
+    @ApiModelProperty("昵称")
+    private String nickName;
+    @ApiModelProperty("注册时间")
+    private Date registryTime;
+    @ApiModelProperty("最新登录时间")
+    private Date lastLoginTime;
+    @ApiModelProperty("最新登录IP")
+    private String lastLoginIp;
+    @ApiModelProperty("登录天数")
+    private Integer loginDays;
+    @ApiModelProperty("渠道类型")
+    private Integer channelType;
+    @ApiModelProperty("渠道来源")
+    private Integer channelOrigin;
+    @ApiModelProperty("用户类型")
+    private Integer userType;
+    @ApiModelProperty("广告总播放数")
+    private Integer totalVideo;
+    @ApiModelProperty("总收益")
+    private BigDecimal totalIncome;
+    @ApiModelProperty("红包余额")
+    private BigDecimal redPacketBalance;
+    @ApiModelProperty("红包总额")
+    private BigDecimal redPacketAmount;
+    @ApiModelProperty("积分余额")
+    private BigDecimal pointsBalance;
+    @ApiModelProperty("积分总额")
+    private BigDecimal pointsTotal;
+    @ApiModelProperty("提现总额")
+    private BigDecimal withdrawTotal;
+    @ApiModelProperty("登录天数")
+    private Integer signDays;
+    @ApiModelProperty("用户状态")
+    private Integer userStatus ;
+}

+ 7 - 4
yt-common/src/main/java/com/ytpm/app/view/YtAppUserListView.java

@@ -1,12 +1,10 @@
 package com.ytpm.app.view;
 
+import com.ytpm.custom.CustomField;
 import com.ytpm.general.PageMeta;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
+import lombok.*;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -38,8 +36,10 @@ public class YtAppUserListView {
     private Integer channelType;
     @ApiModelProperty("渠道来源")
     private Integer channelOrigin;
+    @CustomField(value = "user_type",desc = "用户类型")
     @ApiModelProperty("用户类型")
     private Integer userType;
+    @CustomField(value = "user_status",desc = "用户状态")
     @ApiModelProperty("用户状态")
     private Integer userStatus;
     @ApiModelProperty("今日视频播放数")
@@ -48,6 +48,7 @@ public class YtAppUserListView {
     private Integer totalVideo;
     @ApiModelProperty("登录天数")
     private Integer loginDays;
+    @CustomField
     @ApiModelProperty("总收益")
     private BigDecimal totalIncome;
     @ApiModelProperty("红包余额")
@@ -62,8 +63,10 @@ public class YtAppUserListView {
     private BigDecimal withdrawTotal;
     @ApiModelProperty("提现笔数")
     private Integer withdrawCount;
+    @CustomField
     @ApiModelProperty("IP重复数量")
     private Integer ipRepeatCount;
+    @CustomField
     @ApiModelProperty("设备重复数量")
     private Integer deviceRepeatCount;
     @ApiModelProperty("通信运营商")

+ 14 - 0
yt-common/src/main/java/com/ytpm/custom/CustomField.java

@@ -0,0 +1,14 @@
+package com.ytpm.custom;
+
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface CustomField {
+    String value() default "";
+    String desc() default "";
+}

+ 30 - 0
yt-common/src/main/java/com/ytpm/risk/model/YtRiskConfig.java

@@ -0,0 +1,30 @@
+package com.ytpm.risk.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@ApiModel("易推风控配置表")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class YtRiskConfig {
+    @ApiModelProperty("配置ID")
+    private String configId;
+    @ApiModelProperty("生效目标ID")
+    private String targetId;
+    @ApiModelProperty("生效目标类型 1-渠道 2-app")
+    private String targetType;
+    @ApiModelProperty("字段名称")
+    private String fieldName;
+    @ApiModelProperty("字段描述")
+    private String fieldDesc;
+    @ApiModelProperty("配置类型 1-输入框 2-选择框 3-日期")
+    private Integer configType;
+    @ApiModelProperty("配置值")
+    private String configVal;
+    @ApiModelProperty("是否多个")
+    private Integer multy;
+}

+ 26 - 0
yt-common/src/main/java/com/ytpm/risk/view/DictView.java

@@ -0,0 +1,26 @@
+package com.ytpm.risk.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("数据字典信息")
+public class DictView {
+    @ApiModelProperty("字典ID")
+    private Integer dictionaryId;
+    @ApiModelProperty("字典类型编码")
+    private String typeCode;
+    @ApiModelProperty("字典类型描述")
+    private String typeName;
+    @ApiModelProperty("字典码")
+    private String dictionaryCode;
+    @ApiModelProperty("码值")
+    private String dictionaryName;
+    @ApiModelProperty("排序")
+    private Integer sort;
+}

+ 34 - 0
yt-common/src/main/java/com/ytpm/risk/view/RiskConfigView.java

@@ -0,0 +1,34 @@
+package com.ytpm.risk.view;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("易推风控配置")
+public class RiskConfigView {
+    @ApiModelProperty("配置ID")
+    private String configId;
+    @ApiModelProperty("生效目标ID")
+    private String targetId;
+    @ApiModelProperty("生效目标类型 1-渠道 2-app")
+    private String targetType;
+    @ApiModelProperty("字段名称")
+    private String fieldName;
+    @ApiModelProperty("字段描述")
+    private String fieldDesc;
+    @ApiModelProperty("配置类型 1-输入框 2-选择框 3-日期")
+    private Integer configType;
+    @ApiModelProperty("配置值")
+    private String configVal;
+    @ApiModelProperty("是否多个")
+    private Integer multy;
+    @ApiModelProperty("字段选项")
+    private List<DictView> dictList;
+}

+ 14 - 0
yt-common/src/main/java/com/ytpm/util/ReflectUtil.java

@@ -0,0 +1,14 @@
+package com.ytpm.util;
+
+
+import java.lang.reflect.Field;
+
+public class ReflectUtil {
+
+    /**
+     * 根据类获取其字段名称和字段描述
+     */
+    public static Field[] getClassField(Class<?> clazz){
+        return clazz.getDeclaredFields();
+    }
+}

+ 2 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/RiskManageApplication.java

@@ -4,12 +4,14 @@ import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
 @SpringBootApplication
 @EnableDiscoveryClient
 @MapperScan(basePackages = "com.ytpm.dao")
+@EnableFeignClients(basePackages = {"com.ytpm.feign"})
 public class RiskManageApplication
 {
     public static void main( String[] args )

+ 31 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/controller/RiskConfigController.java

@@ -0,0 +1,31 @@
+package com.ytpm.controller;
+
+import com.ytpm.general.ResultTable;
+import com.ytpm.risk.view.RiskConfigView;
+import com.ytpm.service.RiskService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@Api(tags = "风控配置模块")
+@RestController
+@RequestMapping("/riskConfig")
+public class RiskConfigController {
+
+    @Resource
+    private RiskService riskService;
+
+    /**
+     * 查询配置字段选项
+     */
+    @ApiOperation("查询配置字段选项")
+    @GetMapping("/options")
+    public ResultTable<RiskConfigView> getRiskConfig() {
+        return riskService.getRiskConfig();
+    }
+
+}

+ 17 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/dao/DictMapper.java

@@ -0,0 +1,17 @@
+package com.ytpm.dao;
+
+import com.ytpm.risk.view.DictView;
+import org.apache.ibatis.annotations.Param;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface DictMapper {
+    /**
+     * 根据类型编码获取字典数据
+     * @param typeCode
+     * @return
+     */
+    List<DictView> getByTypeCode(@Param("typeCode") String typeCode);
+}

+ 11 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/service/RiskService.java

@@ -0,0 +1,11 @@
+package com.ytpm.service;
+
+import com.ytpm.general.ResultTable;
+import com.ytpm.risk.view.RiskConfigView;
+
+public interface RiskService {
+    /**
+     * 查询配置字段选项
+     */
+    ResultTable<RiskConfigView> getRiskConfig();
+}

+ 48 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/service/impl/RiskServiceImpl.java

@@ -0,0 +1,48 @@
+package com.ytpm.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.github.pagehelper.PageInfo;
+import com.ytpm.app.view.YtAppUserListView;
+import com.ytpm.custom.CustomField;
+import com.ytpm.dao.DictMapper;
+import com.ytpm.general.ResultTable;
+import com.ytpm.risk.view.RiskConfigView;
+import com.ytpm.service.RiskService;
+import com.ytpm.util.ReflectUtil;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class RiskServiceImpl extends ReflectUtil implements RiskService {
+
+    @Resource
+    private DictMapper  dictMapper;
+
+    /**
+     * 查询配置字段选项
+     */
+    @Override
+    public ResultTable<RiskConfigView> getRiskConfig() {
+        Field[] fields = ReflectUtil.getClassField(YtAppUserListView.class);
+        List<RiskConfigView> configList = new ArrayList<RiskConfigView>();
+        RiskConfigView view;
+        for (Field field : fields) {
+            field.setAccessible(true);
+            if(!field.isAnnotationPresent(CustomField.class))continue;
+            view = new RiskConfigView();
+            view.setFieldName(field.getName());
+            if(StrUtil.isNotBlank(field.getAnnotation(CustomField.class).value())){
+                view.setDictList(dictMapper.getByTypeCode(field.getAnnotation(CustomField.class).value()));
+            }
+            view.setFieldDesc(field.getAnnotation(ApiModelProperty.class).value());
+            configList.add(view);
+        }
+        return ResultTable.resultTableOk(new PageInfo<RiskConfigView>(configList));
+    }
+
+}

+ 11 - 0
yt-risk/risk-manage/src/main/resources/mapper/DictMapper.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ytpm.dao.DictMapper">
+
+    <select id="getByTypeCode" resultType="com.ytpm.risk.view.DictView">
+        select
+            dictionary_id, type_code, type_name, dictionary_code, dictionary_name, sort, enabled
+        from yt_platform_dict
+        where type_code = #{typeCode}
+    </select>
+</mapper>