Explorar o código

1、新增关注、取消关注接口。2、根据code获取用户openid.

jessie %!s(int64=5) %!d(string=hai) anos
pai
achega
1af22970df
Modificáronse 29 ficheiros con 955 adicións e 78 borrados
  1. 14 0
      pom.xml
  2. 20 0
      src/main/java/com/pavis/ai/app/fda/common/config/constants/Constants.java
  3. 119 0
      src/main/java/com/pavis/ai/app/fda/common/utils/GeneralUtils.java
  4. 17 15
      src/main/java/com/pavis/ai/app/fda/controller/BaseController.java
  5. 1 1
      src/main/java/com/pavis/ai/app/fda/controller/NewsController.java
  6. 103 0
      src/main/java/com/pavis/ai/app/fda/controller/WechatController.java
  7. 19 0
      src/main/java/com/pavis/ai/app/fda/form/follow/FollowDetails.java
  8. 22 0
      src/main/java/com/pavis/ai/app/fda/form/follow/Follower.java
  9. 1 0
      src/main/java/com/pavis/ai/app/fda/form/his/IndustryDetailsInfo.java
  10. 18 0
      src/main/java/com/pavis/ai/app/fda/form/search/FindDetail.java
  11. 2 4
      src/main/java/com/pavis/ai/app/fda/form/sel/QueryForm.java
  12. 26 0
      src/main/java/com/pavis/ai/app/fda/form/user/UserInfo.java
  13. 15 0
      src/main/java/com/pavis/ai/app/fda/mapper/FollowInfoMapper.java
  14. 9 0
      src/main/java/com/pavis/ai/app/fda/mapper/IndustryPlateResMapper.java
  15. 16 0
      src/main/java/com/pavis/ai/app/fda/mapper/UserMapper.java
  16. 16 0
      src/main/java/com/pavis/ai/app/fda/mapper/WechatUserMapper.java
  17. 60 0
      src/main/java/com/pavis/ai/app/fda/model/FollowInfo.java
  18. 68 0
      src/main/java/com/pavis/ai/app/fda/model/User.java
  19. 53 0
      src/main/java/com/pavis/ai/app/fda/model/WechatUser.java
  20. 15 2
      src/main/java/com/pavis/ai/app/fda/service/InternalSendService.java
  21. 27 4
      src/main/java/com/pavis/ai/app/fda/service/SearchService.java
  22. 18 0
      src/main/java/com/pavis/ai/app/fda/service/UserService.java
  23. 147 36
      src/main/java/com/pavis/ai/app/fda/service/impl/SearchServiceImpl.java
  24. 81 0
      src/main/java/com/pavis/ai/app/fda/service/impl/UserServiceImpl.java
  25. 1 1
      src/main/resources/application-dev.yml
  26. 1 0
      src/main/resources/mapper/IndustryPlateMapper.xml
  27. 20 0
      src/main/resources/mapper/IndustryPlateResMapper.xml
  28. 22 0
      src/test/java/com/pavis/ai/app/fda/FdaApplicationTests.java
  29. 24 15
      src/test/java/com/pavis/ai/app/fda/LocalDateTest.java

+ 14 - 0
pom.xml

@@ -161,6 +161,20 @@
             <groupId>org.springframework.boot</groupId>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-neo4j</artifactId>
             <artifactId>spring-boot-starter-data-neo4j</artifactId>
         </dependency>
         </dependency>
+
+
+        <!-- 微信框架 参考:https://github.com/Wechat-Group/weixin-java-tools -->
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-mp</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>3.11.0</version>
+        </dependency>
     </dependencies>
     </dependencies>
 
 
     <dependencyManagement>
     <dependencyManagement>

+ 20 - 0
src/main/java/com/pavis/ai/app/fda/common/config/constants/Constants.java

@@ -11,4 +11,24 @@ public class Constants {
 
 
     public static final String CONCETPT_NODE = "Concept";
     public static final String CONCETPT_NODE = "Concept";
     public static final String KWYWORD_NODE = "KeyWord";
     public static final String KWYWORD_NODE = "KeyWord";
+
+    /**
+     *  根据code换取openId
+     *  本接口应在后端服务器调用
+     */
+    public final static String CODE_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=";
+    // https://api.weixin.qq.com/sns/jscode2session
+    // ?appid=APPID&secret=SECRET
+    // &js_code=JSCODE&grant_type=authorization_code
+
+    /**
+     * AppID(小程序ID)
+     // */
+    // public final static String APP_ID = "wx85f9298d699fc12f";
+    public final static String APP_ID = "wx24f8183c606b4916";
+
+    /**
+     * AppSecret(小程序密钥)
+     */
+    public final static String SECRET = "d594af73e610917d171e128d8e0ee056";
 }
 }

+ 119 - 0
src/main/java/com/pavis/ai/app/fda/common/utils/GeneralUtils.java

@@ -1,6 +1,22 @@
 package com.pavis.ai.app.fda.common.utils;
 package com.pavis.ai.app.fda.common.utils;
 
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.net.MediaType;
+import com.pavis.ai.app.fda.common.config.constants.Constants;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 
 /**
 /**
  * @author guanhuijuan
  * @author guanhuijuan
@@ -11,6 +27,7 @@ public class GeneralUtils {
 
 
     /**
     /**
      * json格式判定。
      * json格式判定。
+     *
      * @param str
      * @param str
      * @return
      * @return
      */
      */
@@ -24,4 +41,106 @@ public class GeneralUtils {
         }
         }
         return result;
         return result;
     }
     }
+
+    public static JSONObject toOpenId(String codeId) throws IOException {
+        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
+        OkHttpClient client = new OkHttpClient.Builder()
+                .readTimeout(10, TimeUnit.MINUTES)
+                .writeTimeout(10, TimeUnit.MINUTES)
+                .connectTimeout(10, TimeUnit.MINUTES)
+                .build();
+        Request request = new Request.Builder()
+                .url("https://api.weixin.qq.com/sns/jscode2session?appid=" + Constants.APP_ID +
+                        "&secret=" + Constants.SECRET + "&js_code=" + codeId + "&grant_type=authorization_code")
+                .build();
+        Response response = client.newCall(request).execute();
+        String res = response.body().string();
+        return JSONObject.parseObject(res);
+    }
+
+    public static Map<String, Object> parseJSON2Map(JSONObject json) {
+        Map<String, Object> map = new HashMap<String, Object>();
+        // 最外层解析
+        for (Object k : json.keySet()) {
+            Object v = json.get(k);
+            // 如果内层还是数组的话,继续解析
+            if (v instanceof JSONArray) {
+                List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
+                @SuppressWarnings("unchecked")
+                Iterator<Object> it = ((JSONArray) v).iterator();
+                while (it.hasNext()) {
+
+                    JSONObject json2 = (JSONObject) it.next();
+
+                    list.add(parseJSON2Map(json2));
+                }
+                map.put(k.toString(), list);
+            } else {
+                map.put(k.toString(), v);
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 获取小程序codeid换取openid
+     *
+     * @param codeId
+     * @return
+     */
+    public static String getOpenId(String codeId) {
+        // https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
+        String url = Constants.CODE_URL + Constants.APP_ID + "&secret=" + Constants.SECRET + "&js_code=" +
+                codeId + "&grant_type=authorization_code";
+        PrintWriter out = null;
+        BufferedReader in = null;
+        String line;
+        StringBuffer stringBuffer = new StringBuffer();
+        try {
+            URL realUrl = new URL(url);
+            // 打开和URL之间的连接
+            URLConnection conn = realUrl.openConnection();
+
+            // 设置通用的请求属性 设置请求格式
+            //设置返回类型
+            conn.setRequestProperty("contentType", "text/plain");
+            //设置请求类型
+            conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
+            //设置超时时间
+            conn.setConnectTimeout(1000);
+            conn.setReadTimeout(1000);
+            conn.setDoOutput(true);
+            conn.connect();
+            // 获取URLConnection对象对应的输出流
+            out = new PrintWriter(conn.getOutputStream());
+            // flush输出流的缓冲
+            out.flush();
+            // 定义BufferedReader输入流来读取URL的响应    设置接收格式
+            in = new BufferedReader(
+                    new InputStreamReader(conn.getInputStream(), "UTF-8"));
+            while ((line = in.readLine()) != null) {
+                stringBuffer.append(line);
+            }
+            JSONObject jsonObject = JSONObject.parseObject(stringBuffer.toString());
+            System.err.println(jsonObject.toJSONString());
+            return jsonObject.get("openid").toString();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        //使用finally块来关闭输出流、输入流
+        finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException ex) {
+                ex.printStackTrace();
+            }
+        }
+        return null;
+    }
 }
 }

+ 17 - 15
src/main/java/com/pavis/ai/app/fda/controller/BaseController.java

@@ -3,11 +3,14 @@ package com.pavis.ai.app.fda.controller;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiSort;
 import com.github.xiaoymin.knife4j.annotations.ApiSort;
 import com.pavis.ai.app.fda.common.http.ResultBody;
 import com.pavis.ai.app.fda.common.http.ResultBody;
+import com.pavis.ai.app.fda.form.follow.Follower;
+import com.pavis.ai.app.fda.form.search.FindDetail;
 import com.pavis.ai.app.fda.service.HisService;
 import com.pavis.ai.app.fda.service.HisService;
 import com.pavis.ai.app.fda.service.SearchService;
 import com.pavis.ai.app.fda.service.SearchService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
@@ -32,34 +35,31 @@ public class BaseController {
     private SearchService searchService;
     private SearchService searchService;
 
 
 
 
-
-
-
     @ApiOperation("根据行业id查询详情接口")
     @ApiOperation("根据行业id查询详情接口")
     @ApiOperationSupport(order = 1)
     @ApiOperationSupport(order = 1)
     @PostMapping("/his/find")
     @PostMapping("/his/find")
-    public ResultBody hisFind(@RequestBody List<String> ids){
+    public ResultBody hisFind(@RequestBody List<FindDetail> findDetails) {
         // id 等同于plateCodeId
         // id 等同于plateCodeId
         // 返回 HisInfo
         // 返回 HisInfo
         // todo 告诉我是上周预测 上周实际 本周预测,再去查询。返回行业信息啥的。
         // todo 告诉我是上周预测 上周实际 本周预测,再去查询。返回行业信息啥的。
-        return ResultBody.ok().data(searchService.hisFind(ids));
+        return ResultBody.ok().data(searchService.hisFind(findDetails));
     }
     }
 
 
     @ApiOperation("下周预测(未来7天预测)接口")
     @ApiOperation("下周预测(未来7天预测)接口")
     @ApiOperationSupport(order = 2)
     @ApiOperationSupport(order = 2)
     @PostMapping("/pred/find")
     @PostMapping("/pred/find")
-    public ResultBody predictFind(@RequestBody List<String> ids){
+    public ResultBody predictFind(@RequestBody List<FindDetail> findDetails) {
         // 返回List<HisInfo>
         // 返回List<HisInfo>
         // 历史数据list,但是close="",pred有值。
         // 历史数据list,但是close="",pred有值。
         // todo 根据id进入详情,计算值。包含下周预测。
         // todo 根据id进入详情,计算值。包含下周预测。
-        return ResultBody.ok().data(searchService.predictFind(ids));
+        return ResultBody.ok().data(searchService.predictFind(findDetails));
     }
     }
 
 
 
 
     @ApiOperation("沪深接口")
     @ApiOperation("沪深接口")
     @ApiOperationSupport(order = 3)
     @ApiOperationSupport(order = 3)
     @GetMapping("/his/hushen")
     @GetMapping("/his/hushen")
-    public ResultBody closeHushenSum(){
+    public ResultBody closeHushenSum() {
         // 查询最近的close的sum和pred_close的值。
         // 查询最近的close的sum和pred_close的值。
         return ResultBody.ok().data(searchService.hisHushenSum());
         return ResultBody.ok().data(searchService.hisHushenSum());
     }
     }
@@ -67,7 +67,7 @@ public class BaseController {
     @ApiOperation("涨幅---上周实际榜分页")
     @ApiOperation("涨幅---上周实际榜分页")
     @ApiOperationSupport(order = 5)
     @ApiOperationSupport(order = 5)
     @GetMapping("/inc/last/page")
     @GetMapping("/inc/last/page")
-    public ResultBody incLastWeekPage(){
+    public ResultBody incLastWeekPage() {
         // 返回hisInfos
         // 返回hisInfos
         // 备注:此id是板块id,不传值。
         // 备注:此id是板块id,不传值。
         // 去数据库查,该表的结构与hisinfo相同。涨跌幅的值。
         // 去数据库查,该表的结构与hisinfo相同。涨跌幅的值。
@@ -81,7 +81,7 @@ public class BaseController {
     @ApiOperation("涨幅---上周实际榜")
     @ApiOperation("涨幅---上周实际榜")
     @ApiOperationSupport(order = 5)
     @ApiOperationSupport(order = 5)
     @GetMapping("/inc/last")
     @GetMapping("/inc/last")
-    public ResultBody incLastWeek(){
+    public ResultBody incLastWeek() {
         // 返回hisInfos
         // 返回hisInfos
         // 备注:此id是板块id,不传值。
         // 备注:此id是板块id,不传值。
         // 去数据库查,该表的结构与hisinfo相同。涨跌幅的值。
         // 去数据库查,该表的结构与hisinfo相同。涨跌幅的值。
@@ -94,7 +94,7 @@ public class BaseController {
     @ApiOperation("涨幅-下周预测榜")
     @ApiOperation("涨幅-下周预测榜")
     @ApiOperationSupport(order = 6)
     @ApiOperationSupport(order = 6)
     @GetMapping("/inc/npred")
     @GetMapping("/inc/npred")
-    public ResultBody incNextWeekPred(){
+    public ResultBody incNextWeekPred() {
         // 返回hisInfos。
         // 返回hisInfos。
         // 备注close没值。pre
         // 备注close没值。pre
         // 预测:List<NextWeekPred>
         // 预测:List<NextWeekPred>
@@ -106,7 +106,7 @@ public class BaseController {
     @ApiOperation("涨幅-上周预测榜")
     @ApiOperation("涨幅-上周预测榜")
     @ApiOperationSupport(order = 7)
     @ApiOperationSupport(order = 7)
     @GetMapping("/inc/lpred")
     @GetMapping("/inc/lpred")
-    public ResultBody incLastWeekPred(){
+    public ResultBody incLastWeekPred() {
         // 返回hisInfos。
         // 返回hisInfos。
         // 备注close有值。从数据库查。
         // 备注close有值。从数据库查。
         // 预测:List<NextWeekPred>
         // 预测:List<NextWeekPred>
@@ -117,12 +117,13 @@ public class BaseController {
 
 
     /**
     /**
      * 上周的close。预测的close均没值。
      * 上周的close。预测的close均没值。
+     *
      * @return
      * @return
      */
      */
     @ApiOperation("跌幅-上周实际榜")
     @ApiOperation("跌幅-上周实际榜")
     @ApiOperationSupport(order = 8)
     @ApiOperationSupport(order = 8)
     @GetMapping("/dec/last")
     @GetMapping("/dec/last")
-    public ResultBody decLastWeek(){
+    public ResultBody decLastWeek() {
 
 
         return ResultBody.ok().data(searchService.decLastWeek());
         return ResultBody.ok().data(searchService.decLastWeek());
     }
     }
@@ -130,14 +131,14 @@ public class BaseController {
     @ApiOperation("跌幅-下周预测榜")
     @ApiOperation("跌幅-下周预测榜")
     @ApiOperationSupport(order = 9)
     @ApiOperationSupport(order = 9)
     @GetMapping("/dec/npred")
     @GetMapping("/dec/npred")
-    public ResultBody decNextWeekPred(){
+    public ResultBody decNextWeekPred() {
         return ResultBody.ok().data(searchService.decNextWeekPred());
         return ResultBody.ok().data(searchService.decNextWeekPred());
     }
     }
 
 
     @ApiOperation("跌幅-上周预测榜")
     @ApiOperation("跌幅-上周预测榜")
     @ApiOperationSupport(order = 10)
     @ApiOperationSupport(order = 10)
     @GetMapping("/dec/lpred")
     @GetMapping("/dec/lpred")
-    public ResultBody decLastWeekPred(){
+    public ResultBody decLastWeekPred() {
         return ResultBody.ok().data(searchService.decLastWeekPred());
         return ResultBody.ok().data(searchService.decLastWeekPred());
     }
     }
 
 
@@ -148,4 +149,5 @@ public class BaseController {
     // public ResultBody nodes() throws ParseException {
     // public ResultBody nodes() throws ParseException {
     //     return ResultBody.ok().data(null);
     //     return ResultBody.ok().data(null);
     // }
     // }
+
 }
 }

+ 1 - 1
src/main/java/com/pavis/ai/app/fda/controller/NewsController.java

@@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.*;
 @Slf4j
 @Slf4j
 @RestController
 @RestController
 @Api(tags = "新闻接口")
 @Api(tags = "新闻接口")
-@ApiSort(1)
+@ApiSort(2)
 @RequestMapping("/api/news")
 @RequestMapping("/api/news")
 public class NewsController {
 public class NewsController {
 
 

+ 103 - 0
src/main/java/com/pavis/ai/app/fda/controller/WechatController.java

@@ -0,0 +1,103 @@
+package com.pavis.ai.app.fda.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSort;
+import com.pavis.ai.app.fda.common.http.ResultBody;
+import com.pavis.ai.app.fda.common.utils.GeneralUtils;
+import com.pavis.ai.app.fda.form.follow.FollowDetails;
+import com.pavis.ai.app.fda.form.follow.Follower;
+import com.pavis.ai.app.fda.form.user.UserInfo;
+import com.pavis.ai.app.fda.service.SearchService;
+import com.pavis.ai.app.fda.service.UserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-22 10:12
+ * @desc
+ **/
+@Slf4j
+@RestController
+@Api(tags = "wechat接口")
+@ApiSort(3)
+@RequestMapping("/api")
+public class WechatController {
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private SearchService searchService;
+
+    @ApiOperation("用户信息保存接口")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/user/save")
+    public ResultBody saveUser(@RequestBody UserInfo userInfo){
+        int userId = userService.toLogin(userInfo);
+        if (userId == -1){
+            return ResultBody.ok().data(userId).msg("用户信息已存在。");
+        }else {
+            return ResultBody.ok().data(userId).msg("用户信息保存成功。");
+        }
+    }
+
+    @ApiOperation("获取用户唯一标识id接口")
+    @ApiOperationSupport(order = 2)
+    @GetMapping("/user/openId")
+    private ResultBody getOpenId(String codeId) throws IOException {
+        JSONObject js = GeneralUtils.toOpenId(codeId);
+        System.err.println(js.toJSONString());
+        return ResultBody.ok().data(js);
+    }
+
+    @ApiOperation("关注某个行业接口")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/follow")
+    public ResultBody toFollow(@RequestBody Follower follower) {
+        if (!StringUtils.isEmpty(follower.getPlateId()) && !StringUtils.isEmpty(follower.getUserId())) {
+            int fId = searchService.toFollow(follower);
+            if (fId > 0) {
+                return ResultBody.ok().data(fId).msg("关注成功");
+            } else {
+                return ResultBody.failed().data(fId).msg("您已关注,请勿重复关注");
+            }
+        } else {
+            return ResultBody.failed().data(null).msg("关注失败,参数不能为空。");
+        }
+    }
+
+    @ApiOperation("取消关注某个行业接口")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/follow/cancel")
+    public ResultBody toCancelFollow(@RequestBody Follower follower) {
+        if (!StringUtils.isEmpty(follower.getPlateId()) && !StringUtils.isEmpty(follower.getUserId())) {
+            int fId = searchService.toCancelFollow(follower);
+            if (fId > 0) {
+                return ResultBody.ok().data(fId).msg("取消关注成功");
+            } else {
+                return ResultBody.failed().data(fId).msg("您还未关注,不能取消噢");
+            }
+        } else {
+            return ResultBody.failed().data(null).msg("关注失败,参数不能为空。");
+        }
+    }
+
+    @ApiOperation("个人关注详情接口")
+    @ApiOperationSupport(order = 4)
+    @PostMapping("/follow/list")
+    public ResultBody followDetails(@RequestBody FollowDetails userId) {
+        if (!StringUtils.isEmpty(userId.getUserId())) {
+            return ResultBody.ok().data(searchService.followDetails(userId.getUserId()));
+        } else {
+            return ResultBody.failed().data(null).msg("获取失败,参数不能为空。");
+        }
+    }
+}

+ 19 - 0
src/main/java/com/pavis/ai/app/fda/form/follow/FollowDetails.java

@@ -0,0 +1,19 @@
+package com.pavis.ai.app.fda.form.follow;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-22 15:40
+ * @desc
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class FollowDetails {
+    private String userId;
+}

+ 22 - 0
src/main/java/com/pavis/ai/app/fda/form/follow/Follower.java

@@ -0,0 +1,22 @@
+package com.pavis.ai.app.fda.form.follow;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-22 9:12
+ * @desc
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class Follower {
+    private String userId;
+    private String userName;
+    private String plateId;
+    private String plateName;
+}

+ 1 - 0
src/main/java/com/pavis/ai/app/fda/form/his/IndustryDetailsInfo.java

@@ -20,4 +20,5 @@ public class IndustryDetailsInfo {
     private List<IndustryDetail> actuals;
     private List<IndustryDetail> actuals;
     private List<NewsList> news;
     private List<NewsList> news;
     private Boolean tag;
     private Boolean tag;
+    private Boolean isFollowed;
 }
 }

+ 18 - 0
src/main/java/com/pavis/ai/app/fda/form/search/FindDetail.java

@@ -0,0 +1,18 @@
+package com.pavis.ai.app.fda.form.search;
+
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-22 15:28
+ * @desc
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class FindDetail {
+    private String plateId;
+    private String userId;
+}

+ 2 - 4
src/main/java/com/pavis/ai/app/fda/form/sel/QueryForm.java

@@ -1,9 +1,6 @@
 package com.pavis.ai.app.fda.form.sel;
 package com.pavis.ai.app.fda.form.sel;
 
 
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
+import lombok.*;
 
 
 /**
 /**
  * @author guanhuijuan
  * @author guanhuijuan
@@ -14,6 +11,7 @@ import lombok.Setter;
 @Setter
 @Setter
 @NoArgsConstructor
 @NoArgsConstructor
 @AllArgsConstructor
 @AllArgsConstructor
+@Builder
 public class QueryForm {
 public class QueryForm {
     private String plateId;
     private String plateId;
     private String plateName;
     private String plateName;

+ 26 - 0
src/main/java/com/pavis/ai/app/fda/form/user/UserInfo.java

@@ -0,0 +1,26 @@
+package com.pavis.ai.app.fda.form.user;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-18 20:59
+ * @desc
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserInfo {
+    private String userName;
+    private String nickName;
+    private String avatarUrl;
+    private String city;
+    private String country;
+    private String gender;
+    private String language;
+    private String province;
+}

+ 15 - 0
src/main/java/com/pavis/ai/app/fda/mapper/FollowInfoMapper.java

@@ -0,0 +1,15 @@
+package com.pavis.ai.app.fda.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ai.app.fda.model.FollowInfo;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-22 9:08
+ * @desc FollowInfo
+ **/
+@Component
+public interface FollowInfoMapper extends BaseMapper<FollowInfo> {
+
+}

+ 9 - 0
src/main/java/com/pavis/ai/app/fda/mapper/IndustryPlateResMapper.java

@@ -1,9 +1,16 @@
 package com.pavis.ai.app.fda.mapper;
 package com.pavis.ai.app.fda.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.pavis.ai.app.fda.form.sel.QueryForm;
+import com.pavis.ai.app.fda.model.IndustryPlate;
 import com.pavis.ai.app.fda.model.IndustryPlateRes;
 import com.pavis.ai.app.fda.model.IndustryPlateRes;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
+import java.util.List;
+
 /**
 /**
  * @author guanhuijuan
  * @author guanhuijuan
  * @create 2020-07-20 16:42
  * @create 2020-07-20 16:42
@@ -11,4 +18,6 @@ import org.springframework.stereotype.Component;
  **/
  **/
 @Component
 @Component
 public interface IndustryPlateResMapper extends BaseMapper<IndustryPlateRes> {
 public interface IndustryPlateResMapper extends BaseMapper<IndustryPlateRes> {
+
+    List<IndustryPlateRes> findPlateByIdOrName(@Param("params") QueryForm params);
 }
 }

+ 16 - 0
src/main/java/com/pavis/ai/app/fda/mapper/UserMapper.java

@@ -0,0 +1,16 @@
+package com.pavis.ai.app.fda.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ai.app.fda.model.FollowInfo;
+import com.pavis.ai.app.fda.model.User;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-22 9:08
+ * @desc FollowInfo
+ **/
+@Component
+public interface UserMapper extends BaseMapper<User> {
+
+}

+ 16 - 0
src/main/java/com/pavis/ai/app/fda/mapper/WechatUserMapper.java

@@ -0,0 +1,16 @@
+package com.pavis.ai.app.fda.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ai.app.fda.model.User;
+import com.pavis.ai.app.fda.model.WechatUser;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-22 9:08
+ * @desc FollowInfo
+ **/
+@Component
+public interface WechatUserMapper extends BaseMapper<WechatUser> {
+
+}

+ 60 - 0
src/main/java/com/pavis/ai/app/fda/model/FollowInfo.java

@@ -0,0 +1,60 @@
+package com.pavis.ai.app.fda.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-16 16:13
+ * @desc 个人关注。
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class FollowInfo {
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+    /**
+     * 用户id
+     */
+    private String userId;
+    /**
+     * 用户名称
+     */
+    private String userName;
+
+    /**
+     * 行业ID
+     */
+    private String plateId;
+
+    /**
+     * 行业名称
+     */
+    private String plateName;
+    /**
+     * 时间
+     */
+    private String plateDate;
+
+    /**
+     * 值
+     */
+    private String plateValue;
+    /**
+     * 涨跌幅
+     */
+    private String plateTag;
+
+    /**
+     * 其他
+     */
+    private String operator;
+    private String operatorId;
+    private String operateTime;
+    private String operateIp;
+    private String remarks;
+}

+ 68 - 0
src/main/java/com/pavis/ai/app/fda/model/User.java

@@ -0,0 +1,68 @@
+package com.pavis.ai.app.fda.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-16 16:13
+ * @desc 用户信息
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class User {
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+    /**
+     * 用户名称
+     */
+    private String userName;
+
+    /**
+     * 用户昵称
+     */
+    private String nickName;
+
+    /**
+     * 头像
+     */
+    private String avatarUrl;
+
+    /**
+     * 城市
+     */
+    private String city;
+    /**
+     * 国家
+     */
+    private String country;
+
+    /**
+     * 性别
+     */
+    private String gender;
+
+    /**
+     * 语言
+     */
+    private String language;
+
+    /**
+     * 城市
+     */
+    private String province;
+
+
+    /**
+     * 其他
+     */
+    private String operator;
+    private String operatorId;
+    private String operateTime;
+    private String operateIp;
+    private String remarks;
+}

+ 53 - 0
src/main/java/com/pavis/ai/app/fda/model/WechatUser.java

@@ -0,0 +1,53 @@
+package com.pavis.ai.app.fda.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.*;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-16 16:13
+ * @desc 用户信息
+ **/
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class WechatUser {
+    @TableId(type = IdType.ID_WORKER_STR)
+    private String id;
+    /**
+     * 用户唯一标识
+     */
+    private String openId;
+
+    /**
+     * 用户在开放平台的唯一标识符
+     */
+    private String unionId;
+
+    /**
+     * 会话密钥
+     */
+    private String sessionKey;
+
+    /**
+     * 用户id
+     */
+    private String userId;
+
+    /**
+     * 电话
+     */
+    private String phone;
+
+    /**
+     * 其他
+     */
+    private String operator;
+    private String operatorId;
+    private String operateTime;
+    private String operateIp;
+    private String remarks;
+}

+ 15 - 2
src/main/java/com/pavis/ai/app/fda/service/InternalSendService.java

@@ -1,7 +1,10 @@
 package com.pavis.ai.app.fda.service;
 package com.pavis.ai.app.fda.service;
 
 
+import feign.Param;
+import feign.RequestLine;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
 import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 
 
 import java.util.Map;
 import java.util.Map;
@@ -15,16 +18,26 @@ import java.util.Map;
 // @FeignClient(value = "internalSendService",url = "http://192.168.1.200:28001")
 // @FeignClient(value = "internalSendService",url = "http://192.168.1.200:28001")
 // 测试环境
 // 测试环境
 // @FeignClient(value = "internalSendService",url = "http://180.76.146.227:8099")
 // @FeignClient(value = "internalSendService",url = "http://180.76.146.227:8099")
-@FeignClient(value = "internalSendService",url = "http://192.168.1.202:28001")
+// @FeignClient(value = "internalSendService",url = "http://192.168.1.202:28001")
+// @FeignClient(value = "internalSendService",url = "https://api.weixin.qq.com/sns/jscode2session" +
+//         "?appid=")
+
+@FeignClient(value = "internalSendService",url = "https://api.weixin.qq.com/sns")
 // 生产环境
 // 生产环境
 // @FeignClient(value = "internalSendService",url = "http://47.104.109.52:8089")
 // @FeignClient(value = "internalSendService",url = "http://47.104.109.52:8089")
 public interface InternalSendService {
 public interface InternalSendService {
 
 
-
     @PostMapping(value = "/ext",produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
     @PostMapping(value = "/ext",produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
             consumes = "application/json")
             consumes = "application/json")
     String ext(Map<String, ?> params);
     String ext(Map<String, ?> params);
 
 
+    @GetMapping
+    String login();
+
+    // @RequestLine("POST /jscode2session?appid={appId}&secret={secret}&js_code={jsCode}&grant_type=authorization_code")
+    // String toLogin(@Param("appId") String appId, @Param("secret") String secret
+    //         , @Param("jsCode") String jsCode);
+
     // @PostMapping(value = "/test",
     // @PostMapping(value = "/test",
     //         consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
     //         consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
     //         produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
     //         produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

+ 27 - 4
src/main/java/com/pavis/ai/app/fda/service/SearchService.java

@@ -1,8 +1,10 @@
 package com.pavis.ai.app.fda.service;
 package com.pavis.ai.app.fda.service;
 
 
+import com.pavis.ai.app.fda.form.follow.Follower;
 import com.pavis.ai.app.fda.form.his.IndustryDetail;
 import com.pavis.ai.app.fda.form.his.IndustryDetail;
 import com.pavis.ai.app.fda.form.his.IndustryDetailsInfo;
 import com.pavis.ai.app.fda.form.his.IndustryDetailsInfo;
 import com.pavis.ai.app.fda.form.inc.IncInfo;
 import com.pavis.ai.app.fda.form.inc.IncInfo;
+import com.pavis.ai.app.fda.form.search.FindDetail;
 import com.pavis.ai.app.fda.form.search.HotSearch;
 import com.pavis.ai.app.fda.form.search.HotSearch;
 import com.pavis.ai.app.fda.form.search.SearchInfo;
 import com.pavis.ai.app.fda.form.search.SearchInfo;
 
 
@@ -28,18 +30,18 @@ public interface SearchService {
 
 
     /**
     /**
      * 根据行业id查询进入详情接口
      * 根据行业id查询进入详情接口
-     * @param ids
+     * @param findDetails
      * @return
      * @return
      */
      */
-    IndustryDetailsInfo hisFind(List<String> ids);
+    IndustryDetailsInfo hisFind(List<FindDetail> findDetails);
 
 
     /**
     /**
      * 未来7天预测数据查询接口
      * 未来7天预测数据查询接口
      *
      *
-     * @param ids
+     * @param findDetails
      * @return
      * @return
      */
      */
-    IndustryDetailsInfo predictFind(List<String> ids);
+    IndustryDetailsInfo predictFind(List<FindDetail> findDetails);
 
 
     /**
     /**
      * 沪深接口。
      * 沪深接口。
@@ -89,4 +91,25 @@ public interface SearchService {
      */
      */
     List<IncInfo> decLastWeekPred();
     List<IncInfo> decLastWeekPred();
 
 
+    /**
+     * 关注
+     * @return
+     */
+    int toFollow(Follower follower);
+
+    /**
+     * 取消关注。
+     * @param follower
+     * @return
+     */
+    int toCancelFollow(Follower follower);
+
+    /**
+     * 获取该用户的关注详情。
+     * @param userId
+     * @return
+     */
+    List<IncInfo> followDetails(String userId);
+
+
 }
 }

+ 18 - 0
src/main/java/com/pavis/ai/app/fda/service/UserService.java

@@ -0,0 +1,18 @@
+package com.pavis.ai.app.fda.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.pavis.ai.app.fda.form.user.UserInfo;
+
+import java.io.IOException;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-22 13:59
+ * @desc
+ **/
+public interface UserService {
+
+    int toLogin(UserInfo userInfo);
+
+    JSONObject toOpenId(String codeId) throws IOException;
+}

+ 147 - 36
src/main/java/com/pavis/ai/app/fda/service/impl/SearchServiceImpl.java

@@ -6,15 +6,18 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.pavis.ai.app.fda.common.utils.DateUtils;
 import com.pavis.ai.app.fda.common.utils.DateUtils;
 import com.pavis.ai.app.fda.form.TestCommon;
 import com.pavis.ai.app.fda.form.TestCommon;
+import com.pavis.ai.app.fda.form.follow.Follower;
 import com.pavis.ai.app.fda.form.his.IndustryDetail;
 import com.pavis.ai.app.fda.form.his.IndustryDetail;
 import com.pavis.ai.app.fda.form.his.IndustryDetailsInfo;
 import com.pavis.ai.app.fda.form.his.IndustryDetailsInfo;
 import com.pavis.ai.app.fda.form.inc.IncInfo;
 import com.pavis.ai.app.fda.form.inc.IncInfo;
 import com.pavis.ai.app.fda.form.news.NewsList;
 import com.pavis.ai.app.fda.form.news.NewsList;
+import com.pavis.ai.app.fda.form.search.FindDetail;
 import com.pavis.ai.app.fda.form.search.HotSearch;
 import com.pavis.ai.app.fda.form.search.HotSearch;
 import com.pavis.ai.app.fda.form.search.SearchInfo;
 import com.pavis.ai.app.fda.form.search.SearchInfo;
 import com.pavis.ai.app.fda.form.sel.QueryForm;
 import com.pavis.ai.app.fda.form.sel.QueryForm;
 import com.pavis.ai.app.fda.mapper.*;
 import com.pavis.ai.app.fda.mapper.*;
 import com.pavis.ai.app.fda.model.*;
 import com.pavis.ai.app.fda.model.*;
+import com.pavis.ai.app.fda.model.FollowInfo;
 import com.pavis.ai.app.fda.service.NewsService;
 import com.pavis.ai.app.fda.service.NewsService;
 import com.pavis.ai.app.fda.service.SearchService;
 import com.pavis.ai.app.fda.service.SearchService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
@@ -51,6 +54,9 @@ public class SearchServiceImpl implements SearchService {
     @Autowired
     @Autowired
     private IndustryPlateSumMapper industryPlateSumMapper;
     private IndustryPlateSumMapper industryPlateSumMapper;
 
 
+    @Autowired
+    private FollowInfoMapper followInfoMapper;
+
     @Override
     @Override
     public List<IncInfo> incLastWeekPage() {
     public List<IncInfo> incLastWeekPage() {
         return toIncInfosPage(true, false, false, false, null);
         return toIncInfosPage(true, false, false, false, null);
@@ -113,15 +119,15 @@ public class SearchServiceImpl implements SearchService {
 
 
 
 
     @Override
     @Override
-    public IndustryDetailsInfo hisFind(List<String> ids) {
-        return toDetailsByPlateId(ids, false);
+    public IndustryDetailsInfo hisFind(List<FindDetail> findDetails) {
+        return toDetailsByPlateId(findDetails, false);
         // return toFindDetailsByPlateId(ids, false);
         // return toFindDetailsByPlateId(ids, false);
     }
     }
 
 
 
 
     @Override
     @Override
-    public IndustryDetailsInfo predictFind(List<String> ids) {
-        return toDetailsByPlateId(ids, true);
+    public IndustryDetailsInfo predictFind(List<FindDetail> findDetails) {
+        return toDetailsByPlateId(findDetails, true);
         // return toFindDetailsByPlateId(ids, true);
         // return toFindDetailsByPlateId(ids, true);
 
 
         // List<IndustryDetail> industryDetails = new ArrayList<>();
         // List<IndustryDetail> industryDetails = new ArrayList<>();
@@ -212,25 +218,92 @@ public class SearchServiceImpl implements SearchService {
     }
     }
 
 
 
 
+    @Override
+    public int toFollow(Follower follower) {
+        // 1、查询该用户已关注的行业。
+        List<FollowInfo> followInfos = getFollowed(follower.getUserId(),follower.getPlateId());
+        // 2、判断是否需要入库。
+        if (followInfos.size() > 0){
+            // 已关注过请勿重复关注。
+            return -1;
+        }else {
+            // 未关注过该行业,新增关注记录。
+            FollowInfo followInfo = new FollowInfo();
+            BeanUtils.copyProperties(follower, followInfo);
+            followInfo.setOperator("ghj");
+            followInfo.setOperatorId("");
+            followInfo.setOperateIp("192.168.1.73");
+            followInfo.setOperateTime(DateUtils.getCurrentTime());
+            return followInfoMapper.insert(followInfo);
+        }
+        // return 0;
+    }
+
+    @Override
+    public int toCancelFollow(Follower follower) {
+        List<FollowInfo> followInfos = getFollowed(follower.getUserId(),follower.getPlateId());
+        if (followInfos.size() < 0){
+            return -1;
+        }else {
+            int deletedId = 0;
+            for (FollowInfo followInfo : followInfos) {
+                QueryWrapper<FollowInfo> queryWrapper = new QueryWrapper<>();
+                queryWrapper.lambda()
+                        .eq(FollowInfo::getUserId,follower.getUserId())
+                        .eq(FollowInfo::getPlateId,follower.getPlateId());
+                deletedId = followInfoMapper.delete(queryWrapper);
+            }
+            return deletedId;
+        }
+    }
+
+    @Override
+    public List<IncInfo> followDetails(String userId) {
+        QueryWrapper<FollowInfo> followInfoQueryWrapper = new QueryWrapper<>();
+        followInfoQueryWrapper.lambda()
+                .eq(FollowInfo::getUserId,userId);
+        List<FollowInfo> followInfos = followInfoMapper.selectList(followInfoQueryWrapper);
+        IncInfo incInfo;
+        List<IncInfo> incInfos = new ArrayList<>();
+        for (FollowInfo followInfo : followInfos) {
+            QueryWrapper<IndustryPlate> industryPlateQueryWrapper = new QueryWrapper<>();
+            industryPlateQueryWrapper.lambda()
+                    .eq(IndustryPlate::getPlateId, followInfo.getPlateId())
+                    .orderByDesc(IndustryPlate::getPlateDate);
+            List<IndustryPlate> datePlates = industryPlateMapper.selectList(industryPlateQueryWrapper);
+            String date = datePlates.size() > 0 ? datePlates.get(0).getPlateDate() : TestCommon.getWeek();
+            Float value = calLastWeekActual(date,followInfo.getPlateId());
+            incInfo = IncInfo.builder()
+                    .industryId(followInfo.getPlateId())
+                    .industryValue(value)
+                    .industryTag(value > 0.0F ? true : false)
+                    .industryName(followInfo.getPlateName())
+                    .build();
+            incInfos.add(incInfo);
+        }
+
+        return incInfos;
+    }
+
 
 
     /**
     /**
      * 根据行业id获取详情或者未来七天预测接口
      * 根据行业id获取详情或者未来七天预测接口
      *
      *
-     * @param ids
+     * @param findDetails
      * @param detailsFlag
      * @param detailsFlag
      * @return
      * @return
      */
      */
-    public IndustryDetailsInfo toDetailsByPlateId(List<String> ids, Boolean detailsFlag) {
+    public IndustryDetailsInfo toDetailsByPlateId(List<FindDetail> findDetails, Boolean detailsFlag) {
         // todo 根据id进入详情,计算值。包含下周预测。
         // todo 根据id进入详情,计算值。包含下周预测。
         List<IndustryDetail> industryDetails = new ArrayList<>();
         List<IndustryDetail> industryDetails = new ArrayList<>();
-        for (String id : ids) {
+        for (FindDetail findDetail : findDetails) {
             // 上周的每一天,下周的每一天。
             // 上周的每一天,下周的每一天。
             // toIncInfos();
             // toIncInfos();
             // 1、根据plateid、platename查询出该行业的所有信息。按照日期倒序排序,获取该时间,然后得出该时间的一周内每天的数据。
             // 1、根据plateid、platename查询出该行业的所有信息。按照日期倒序排序,获取该时间,然后得出该时间的一周内每天的数据。
             // 实际数据也即本周数据。
             // 实际数据也即本周数据。
             QueryWrapper<IndustryPlate> industryPlateQueryWrapper = new QueryWrapper<>();
             QueryWrapper<IndustryPlate> industryPlateQueryWrapper = new QueryWrapper<>();
             industryPlateQueryWrapper.lambda()
             industryPlateQueryWrapper.lambda()
-                    .eq(IndustryPlate::getPlateId, id)
+                    .eq(IndustryPlate::getPlateId, findDetail.getPlateId())
                     .orderByDesc(IndustryPlate::getPlateDate);
                     .orderByDesc(IndustryPlate::getPlateDate);
             List<IndustryPlate> datePlates = industryPlateMapper.selectList(industryPlateQueryWrapper);
             List<IndustryPlate> datePlates = industryPlateMapper.selectList(industryPlateQueryWrapper);
             if (datePlates.size() > 0) {
             if (datePlates.size() > 0) {
@@ -243,14 +316,14 @@ public class SearchServiceImpl implements SearchService {
                 // todo
                 // todo
                 String monday = weekMap.get("MONDAY").toString();
                 String monday = weekMap.get("MONDAY").toString();
                 String sunday = weekMap.get("SUNDAY").toString();
                 String sunday = weekMap.get("SUNDAY").toString();
-                List<IndustryPlate> industryPlates = toIndustryPlates(id, monday, sunday);
+                List<IndustryPlate> industryPlates = toIndustryPlates(findDetail.getPlateId(), monday, sunday);
                 // 3、下周预测放上面,实际数据放下面。
                 // 3、下周预测放上面,实际数据放下面。
                 List<IndustryPlate> nextIndustryPlates = new ArrayList<>();
                 List<IndustryPlate> nextIndustryPlates = new ArrayList<>();
                 if (detailsFlag.equals(true)) {
                 if (detailsFlag.equals(true)) {
                     Map<String, Object> nextWeekMap = DateUtils.getEverydayOfNexWeek(date);
                     Map<String, Object> nextWeekMap = DateUtils.getEverydayOfNexWeek(date);
                     String nextMonday = nextWeekMap.get("monday").toString();
                     String nextMonday = nextWeekMap.get("monday").toString();
                     String nextSunday = nextWeekMap.get("sunday").toString();
                     String nextSunday = nextWeekMap.get("sunday").toString();
-                    nextIndustryPlates = toIndustryPlates(id, nextMonday, nextSunday);
+                    nextIndustryPlates = toIndustryPlates(findDetail.getPlateId(), nextMonday, nextSunday);
                     log.info("预测:{}", JSON.toJSONString(nextIndustryPlates));
                     log.info("预测:{}", JSON.toJSONString(nextIndustryPlates));
                     for (IndustryPlate nextIndustryPlate : nextIndustryPlates) {
                     for (IndustryPlate nextIndustryPlate : nextIndustryPlates) {
                         industryDetails.add(toIndustryDetail(nextIndustryPlate));
                         industryDetails.add(toIndustryDetail(nextIndustryPlate));
@@ -274,19 +347,36 @@ public class SearchServiceImpl implements SearchService {
         }
         }
         // 4、附带新闻数据。
         // 4、附带新闻数据。
         SearchInfo searchInfo = SearchInfo.builder()
         SearchInfo searchInfo = SearchInfo.builder()
-                .searchParam(ids.get(0))
+                .searchParam(findDetails.get(0).getPlateId())
                 .build();
                 .build();
         // todo 需要修改接口。
         // todo 需要修改接口。
         List<NewsList> newsLists = newsService.getNewsByPlateId(searchInfo.getSearchParam());
         List<NewsList> newsLists = newsService.getNewsByPlateId(searchInfo.getSearchParam());
-
+        List<FollowInfo> followInfos = getFollowed(findDetails.get(0).getUserId(),findDetails.get(0).getPlateId());
+        Boolean isFollowed = followInfos.size() > 0 ? true : false;
         IndustryDetailsInfo industryInfo = IndustryDetailsInfo.builder()
         IndustryDetailsInfo industryInfo = IndustryDetailsInfo.builder()
                 .actuals(industryDetails)
                 .actuals(industryDetails)
                 .news(newsLists)
                 .news(newsLists)
                 .tag(true)
                 .tag(true)
+                .isFollowed(isFollowed)
                 .build();
                 .build();
         return industryInfo;
         return industryInfo;
     }
     }
 
 
+    /**
+     * 判断该用户是否关注过该行业。
+     * @param userId
+     * @param plateId
+     * @return
+     */
+    public List<FollowInfo> getFollowed(String userId,String plateId){
+        QueryWrapper<FollowInfo> followInfoQueryWrapper = new QueryWrapper<>();
+        followInfoQueryWrapper.lambda()
+                .eq(FollowInfo::getUserId,userId)
+                .eq(FollowInfo::getPlateId,plateId);
+        List<FollowInfo> followInfos = followInfoMapper.selectList(followInfoQueryWrapper);
+        return followInfos;
+    }
+
     /**
     /**
      * 创建每一天的close、pred值。
      * 创建每一天的close、pred值。
      *
      *
@@ -846,12 +936,14 @@ public class SearchServiceImpl implements SearchService {
                         .orderByDesc(IndustryPlateRes::getPlateCloseUp)
                         .orderByDesc(IndustryPlateRes::getPlateCloseUp)
                         .groupBy(IndustryPlateRes::getPlateId)
                         .groupBy(IndustryPlateRes::getPlateId)
                         .between(IndustryPlateRes::getPlateDate,lastFriday,friday)
                         .between(IndustryPlateRes::getPlateDate,lastFriday,friday)
+                        .eq(IndustryPlateRes::getPlateCloseUp,null)
                         .last("limit 0,10");
                         .last("limit 0,10");
             }else {
             }else {
                 queryWrapper.lambda()
                 queryWrapper.lambda()
                         .orderByDesc(IndustryPlateRes::getPlateCloseUp)
                         .orderByDesc(IndustryPlateRes::getPlateCloseUp)
                         .groupBy(IndustryPlateRes::getPlateId)
                         .groupBy(IndustryPlateRes::getPlateId)
                         .between(IndustryPlateRes::getPlateDate,friday,lastFriday)
                         .between(IndustryPlateRes::getPlateDate,friday,lastFriday)
+                        .eq(IndustryPlateRes::getPlateCloseUp,null)
                         .last("limit 0,10");
                         .last("limit 0,10");
             }
             }
         }else {
         }else {
@@ -860,12 +952,14 @@ public class SearchServiceImpl implements SearchService {
                         .orderByAsc(IndustryPlateRes::getPlateCloseUp)
                         .orderByAsc(IndustryPlateRes::getPlateCloseUp)
                         .groupBy(IndustryPlateRes::getPlateId)
                         .groupBy(IndustryPlateRes::getPlateId)
                         .between(IndustryPlateRes::getPlateDate,lastFriday,friday)
                         .between(IndustryPlateRes::getPlateDate,lastFriday,friday)
+                        .eq(IndustryPlateRes::getPlateCloseUp,null)
                         .last("limit 0,10");
                         .last("limit 0,10");
             }else {
             }else {
                 queryWrapper.lambda()
                 queryWrapper.lambda()
                         .orderByAsc(IndustryPlateRes::getPlateCloseUp)
                         .orderByAsc(IndustryPlateRes::getPlateCloseUp)
                         .groupBy(IndustryPlateRes::getPlateId)
                         .groupBy(IndustryPlateRes::getPlateId)
                         .between(IndustryPlateRes::getPlateDate,friday,lastFriday)
                         .between(IndustryPlateRes::getPlateDate,friday,lastFriday)
+                        .eq(IndustryPlateRes::getPlateCloseUp,null)
                         .last("limit 0,10");
                         .last("limit 0,10");
             }
             }
         }
         }
@@ -973,29 +1067,29 @@ public class SearchServiceImpl implements SearchService {
             // 涨幅
             // 涨幅
             if (DateUtils.checkDate(friday,lastFriday).equals(true)) {
             if (DateUtils.checkDate(friday,lastFriday).equals(true)) {
                 queryWrapper.lambda()
                 queryWrapper.lambda()
+                        .between(IndustryPlateRes::getPlateDate,lastFriday,friday)
                         .orderByDesc(IndustryPlateRes::getPlateClosePredUp)
                         .orderByDesc(IndustryPlateRes::getPlateClosePredUp)
                         .groupBy(IndustryPlateRes::getPlateId)
                         .groupBy(IndustryPlateRes::getPlateId)
-                        .between(IndustryPlateRes::getPlateDate,lastFriday,friday)
                         .last("limit 0,10");
                         .last("limit 0,10");
             }else {
             }else {
                 queryWrapper.lambda()
                 queryWrapper.lambda()
+                        .between(IndustryPlateRes::getPlateDate,friday,lastFriday)
                         .orderByDesc(IndustryPlateRes::getPlateClosePredUp)
                         .orderByDesc(IndustryPlateRes::getPlateClosePredUp)
                         .groupBy(IndustryPlateRes::getPlateId)
                         .groupBy(IndustryPlateRes::getPlateId)
-                        .between(IndustryPlateRes::getPlateDate,friday,lastFriday)
                         .last("limit 0,10");
                         .last("limit 0,10");
             }
             }
         }else {
         }else {
             if (DateUtils.checkDate(friday,lastFriday).equals(true)) {
             if (DateUtils.checkDate(friday,lastFriday).equals(true)) {
                 queryWrapper.lambda()
                 queryWrapper.lambda()
+                        .between(IndustryPlateRes::getPlateDate,lastFriday,friday)
                         .orderByAsc(IndustryPlateRes::getPlateClosePredUp)
                         .orderByAsc(IndustryPlateRes::getPlateClosePredUp)
                         .groupBy(IndustryPlateRes::getPlateId)
                         .groupBy(IndustryPlateRes::getPlateId)
-                        .between(IndustryPlateRes::getPlateDate,lastFriday,friday)
                         .last("limit 0,10");
                         .last("limit 0,10");
             }else {
             }else {
                 queryWrapper.lambda()
                 queryWrapper.lambda()
+                        .between(IndustryPlateRes::getPlateDate,friday,lastFriday)
                         .orderByAsc(IndustryPlateRes::getPlateClosePredUp)
                         .orderByAsc(IndustryPlateRes::getPlateClosePredUp)
                         .groupBy(IndustryPlateRes::getPlateId)
                         .groupBy(IndustryPlateRes::getPlateId)
-                        .between(IndustryPlateRes::getPlateDate,friday,lastFriday)
                         .last("limit 0,10");
                         .last("limit 0,10");
             }
             }
         }
         }
@@ -1140,7 +1234,13 @@ public class SearchServiceImpl implements SearchService {
         String friday = actualMap.get("friday").toString();
         String friday = actualMap.get("friday").toString();
         String lastFriday = actualMap.get("lastFriday").toString();
         String lastFriday = actualMap.get("lastFriday").toString();
         // 2、查询涨跌幅。取前十。
         // 2、查询涨跌幅。取前十。
-        List<IndustryPlateRes> plates = toSearchQuery(searchInfo,friday,lastFriday);
+        List<IndustryPlateRes> plates = new ArrayList<>();
+        if (DateUtils.checkDate(friday,lastFriday).equals(true)) {
+            plates = toSearchQuery(searchInfo,lastFriday,friday);
+        }else {
+            plates = toSearchQuery(searchInfo,friday,lastFriday);
+        }
+
         // 3、创建返回s数据。
         // 3、创建返回s数据。
         return toSearchBackIncInfos(plates);
         return toSearchBackIncInfos(plates);
 
 
@@ -1180,26 +1280,37 @@ public class SearchServiceImpl implements SearchService {
     public List<IndustryPlateRes> toSearchQuery(SearchInfo searchInfo,String friday,String lastFriday){
     public List<IndustryPlateRes> toSearchQuery(SearchInfo searchInfo,String friday,String lastFriday){
         QueryWrapper<IndustryPlateRes> queryWrapper = new QueryWrapper<>();
         QueryWrapper<IndustryPlateRes> queryWrapper = new QueryWrapper<>();
         // 涨幅
         // 涨幅
-        if (DateUtils.checkDate(friday,lastFriday).equals(true)) {
-            queryWrapper.lambda()
-                    .eq(IndustryPlateRes::getPlateId,searchInfo.getSearchParam())
-                    .orderByDesc(IndustryPlateRes::getPlateDate)
-                    .groupBy(IndustryPlateRes::getPlateId)
-                    .between(IndustryPlateRes::getPlateDate,lastFriday,friday)
-                    .last("limit 0,10")
-                    .or()
-                    .like(IndustryPlateRes::getPlateName,searchInfo.getSearchParam());
-        }else {
-            queryWrapper.lambda()
-                    .eq(IndustryPlateRes::getPlateId,searchInfo.getSearchParam())
-                    .orderByDesc(IndustryPlateRes::getPlateDate)
-                    .groupBy(IndustryPlateRes::getPlateId)
-                    .between(IndustryPlateRes::getPlateDate,friday,lastFriday)
-                    .last("limit 0,10")
-                    .or()
-                    .like(IndustryPlateRes::getPlateName,searchInfo.getSearchParam());
-        }
+        queryWrapper.lambda()
+                .orderByDesc(IndustryPlateRes::getPlateDate)
+                .groupBy(IndustryPlateRes::getPlateId)
+                .between(IndustryPlateRes::getPlateDate,friday,lastFriday)
+                .last("limit 0,10")
+                .or()
+                .like(IndustryPlateRes::getPlateId,searchInfo.getSearchParam())
+                .or()
+                .like(IndustryPlateRes::getPlateName,searchInfo.getSearchParam());
         List<IndustryPlateRes> plates = industryPlateResMapper.selectList(queryWrapper);
         List<IndustryPlateRes> plates = industryPlateResMapper.selectList(queryWrapper);
+        // List<IndustryPlateRes> plates = industryPlateResMapper.selectList(queryWrapper);
+        // List<IndustryPlateRes> plates = new ArrayList<>();
+        // if (DateUtils.checkDate(friday,lastFriday).equals(true)) {
+        //     QueryForm queryForm = QueryForm.builder()
+        //             .plateId(searchInfo.getSearchParam())
+        //             .plateName(searchInfo.getSearchParam())
+        //             .friday(lastFriday)
+        //             .lastFriday(friday)
+        //             .build();
+        //     plates = industryPlateResMapper.findPlateByIdOrName(queryForm);
+        // }else {
+        //     QueryForm queryForm = QueryForm.builder()
+        //             .plateId(searchInfo.getSearchParam())
+        //             .plateName(searchInfo.getSearchParam())
+        //             .friday(friday)
+        //             .lastFriday(lastFriday)
+        //             .build();
+        //     plates = industryPlateResMapper.findPlateByIdOrName(queryForm);
+        // }
+
+
         log.info("toSearchQuery plates:{}",JSON.toJSONString(plates));
         log.info("toSearchQuery plates:{}",JSON.toJSONString(plates));
         return plates;
         return plates;
     }
     }

+ 81 - 0
src/main/java/com/pavis/ai/app/fda/service/impl/UserServiceImpl.java

@@ -0,0 +1,81 @@
+package com.pavis.ai.app.fda.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.pavis.ai.app.fda.common.utils.GeneralUtils;
+import com.pavis.ai.app.fda.form.user.UserInfo;
+import com.pavis.ai.app.fda.mapper.UserMapper;
+import com.pavis.ai.app.fda.mapper.WechatUserMapper;
+import com.pavis.ai.app.fda.model.User;
+import com.pavis.ai.app.fda.model.WechatUser;
+import com.pavis.ai.app.fda.service.UserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author guanhuijuan
+ * @create 2020-07-22 14:00
+ * @desc
+ **/
+@Slf4j
+@Service
+public class UserServiceImpl implements UserService {
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private WechatUserMapper wechatUserMapper;
+
+    @Override
+    public int toLogin(UserInfo userInfo) {
+        // 判断该用户是否已登录过。
+        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
+        userQueryWrapper.lambda()
+                .eq(User::getUserName,userInfo.getUserName())
+                .eq(User::getNickName,userInfo.getNickName())
+                .eq(User::getAvatarUrl,userInfo.getAvatarUrl());
+        List<User> users = userMapper.selectList(userQueryWrapper);
+        if (users.size() > 0){
+            // 数据库已有该用户信息。
+            return -1;
+        }
+        User user = new User();
+        BeanUtils.copyProperties(userInfo,user);
+        return userMapper.insert(user);
+    }
+
+    @Override
+    public JSONObject toOpenId(String codeId) throws IOException {
+        JSONObject js = GeneralUtils.toOpenId(codeId);
+        // {"openid":"ocVI541TGfnTChi5DlIa7beac2YM","session_key":"tPiTL8HBSL5l/HwA8yEOZw=="}
+        if (js.containsKey("openid")){
+            QueryWrapper<WechatUser> wechatUserQueryWrapper = new QueryWrapper<>();
+            wechatUserQueryWrapper.lambda()
+                    .eq(WechatUser::getUserId,js.get("openid").toString());
+            List<WechatUser> wechatUsers = wechatUserMapper.selectList(wechatUserQueryWrapper);
+            if (wechatUsers.size() > 0){
+                // 已存在该用户。
+                return js;
+            }else {
+                // 保存用户id。
+                WechatUser wechatUser = WechatUser.builder()
+                        .userId(js.get("openid").toString())
+                        .openId(js.get("openid").toString())
+                        .sessionKey(js.get("session_key").toString())
+                        .unionId("")
+                        .phone("")
+                        .build();
+                wechatUserMapper.insert(wechatUser);
+                return js;
+            }
+        }
+        return js;
+    }
+}

+ 1 - 1
src/main/resources/application-dev.yml

@@ -29,7 +29,7 @@ logging:
   level:
   level:
     org.springframework.cloud: debug
     org.springframework.cloud: debug
     org.springframework.boot: debug
     org.springframework.boot: debug
-    com.pavis.ai.app.cr.mapper: debug
+    com.pavis.ai.app.fda.mapper: debug
 #security:
 #security:
 #  oauth2:
 #  oauth2:
 #    client:
 #    client:

+ 1 - 0
src/main/resources/mapper/IndustryPlateMapper.xml

@@ -17,4 +17,5 @@
         </where>
         </where>
         group by ip.plate_id order by ip.plate_date desc
         group by ip.plate_id order by ip.plate_date desc
     </select>
     </select>
+
 </mapper>
 </mapper>

+ 20 - 0
src/main/resources/mapper/IndustryPlateResMapper.xml

@@ -0,0 +1,20 @@
+<?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.pavis.ai.app.fda.mapper.IndustryPlateResMapper">
+    <select id="findPlateByIdOrName"  resultType="IndustryPlateRes" parameterType="map">
+        select ipr.*
+        from industry_plate_res ipr
+        <where>
+            <if test="params.lastFriday != null and '' != params.lastFriday and params.friday != null and '' != params.friday">
+                and ipr.plate_date between #{params.friday} and #{params.lastFriday}
+            </if>
+            <if test="params.plateId != null and params.plateId != ''">
+                or ipr.plate_id like CONCAT(CONCAT('%', #{params.plateId}), '%')
+            </if>
+            <if test="params.plateName != null and params.plateName != ''">
+                or ipr.plate_name like CONCAT(CONCAT('%', #{params.plateName}), '%')
+            </if>
+        </where>
+        group by ipr.plate_id order by ipr.plate_date desc
+    </select>
+</mapper>

+ 22 - 0
src/test/java/com/pavis/ai/app/fda/FdaApplicationTests.java

@@ -1,13 +1,16 @@
 package com.pavis.ai.app.fda;
 package com.pavis.ai.app.fda;
 
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
+import com.pavis.ai.app.fda.common.config.constants.Constants;
 import com.pavis.ai.app.fda.common.utils.DateUtils;
 import com.pavis.ai.app.fda.common.utils.DateUtils;
+import com.pavis.ai.app.fda.common.utils.GeneralUtils;
 import com.pavis.ai.app.fda.form.TestCommon;
 import com.pavis.ai.app.fda.form.TestCommon;
 import com.pavis.ai.app.fda.form.inc.IncInfo;
 import com.pavis.ai.app.fda.form.inc.IncInfo;
 import com.pavis.ai.app.fda.mapper.IndustryPlateMapper;
 import com.pavis.ai.app.fda.mapper.IndustryPlateMapper;
 import com.pavis.ai.app.fda.mapper.IndustryStockMapper;
 import com.pavis.ai.app.fda.mapper.IndustryStockMapper;
 import com.pavis.ai.app.fda.mapper.NewsInfoMapper;
 import com.pavis.ai.app.fda.mapper.NewsInfoMapper;
 import com.pavis.ai.app.fda.model.NewsInfo;
 import com.pavis.ai.app.fda.model.NewsInfo;
+import com.pavis.ai.app.fda.service.InternalSendService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.Test;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runner.RunWith;
@@ -15,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.context.junit4.SpringRunner;
 
 
+import java.io.IOException;
 import java.time.DayOfWeek;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
@@ -30,6 +34,24 @@ import java.util.stream.Stream;
 @Slf4j
 @Slf4j
 public class FdaApplicationTests {
 public class FdaApplicationTests {
 
 
+    @Autowired
+    private InternalSendService internalSendService;
+
+    @Test
+    public void testwx() throws IOException {
+        String codeId = "033xm5ai0ifCRt1Mu8ai0Fb4ai0xm5a8";
+        // String openid = GeneralUtils.getOpenId(codeId);
+        // System.err.println(openid);
+        // https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
+        // https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
+
+        // System.err.println(internalSendService.toLogin(Constants.APP_ID,
+        //         Constants.SECRET,codeId));
+        System.err.println(GeneralUtils.toOpenId(codeId));
+
+
+    }
+
     @Test
     @Test
     public void tesFilter(){
     public void tesFilter(){
         List<IncInfo> incInfos = new ArrayList<>();
         List<IncInfo> incInfos = new ArrayList<>();

+ 24 - 15
src/test/java/com/pavis/ai/app/fda/LocalDateTest.java

@@ -7,8 +7,10 @@ import com.pavis.ai.app.fda.form.TestCommon;
 import com.pavis.ai.app.fda.form.inc.IncInfo;
 import com.pavis.ai.app.fda.form.inc.IncInfo;
 import com.pavis.ai.app.fda.mapper.IndustryInfoMapper;
 import com.pavis.ai.app.fda.mapper.IndustryInfoMapper;
 import com.pavis.ai.app.fda.mapper.IndustryPlateMapper;
 import com.pavis.ai.app.fda.mapper.IndustryPlateMapper;
+import com.pavis.ai.app.fda.mapper.IndustryPlateResMapper;
 import com.pavis.ai.app.fda.model.IndustryInfo;
 import com.pavis.ai.app.fda.model.IndustryInfo;
 import com.pavis.ai.app.fda.model.IndustryPlate;
 import com.pavis.ai.app.fda.model.IndustryPlate;
+import com.pavis.ai.app.fda.model.IndustryPlateRes;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.Test;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runner.RunWith;
@@ -43,23 +45,30 @@ public class LocalDateTest {
     @Autowired
     @Autowired
     private IndustryInfoMapper industryInfoMapper;
     private IndustryInfoMapper industryInfoMapper;
 
 
+    @Autowired
+    private IndustryPlateResMapper industryPlateResMapper;
+
     @Test
     @Test
     public void testUpdateIPlateName(){
     public void testUpdateIPlateName(){
-        QueryWrapper<IndustryInfo> industryInfoQueryWrapper = new QueryWrapper<>();
-        industryInfoQueryWrapper.lambda()
-                .isNotNull(IndustryInfo::getId)
-                .groupBy(IndustryInfo::getPlateId);
-        List<IndustryInfo> industryInfos = industryInfoMapper.selectList(industryInfoQueryWrapper);
-
-        for (IndustryInfo industryInfo : industryInfos) {
-            QueryWrapper<IndustryPlate> industryPlateQueryWrapper = new QueryWrapper<>();
-            industryPlateQueryWrapper.lambda()
-                    .eq(IndustryPlate::getPlateId,industryInfo.getPlateId());
-            List<IndustryPlate> industryPlates = industryPlateMapper.selectList(industryPlateQueryWrapper);
-            for (IndustryPlate industryPlate : industryPlates) {
-                industryPlate.setPlateName(industryInfo.getPlateName());
-                industryPlateMapper.updateById(industryPlate);
-            }
+        // QueryWrapper<IndustryInfo> industryInfoQueryWrapper = new QueryWrapper<>();
+        // industryInfoQueryWrapper.lambda()
+        //         .isNotNull(IndustryInfo::getId)
+        //         .groupBy(IndustryInfo::getPlateId);
+        // List<IndustryInfo> industryInfos = industryInfoMapper.selectList(industryInfoQueryWrapper);
+
+        QueryWrapper<IndustryPlateRes> industryPlateQueryWrapper = new QueryWrapper<>();
+        industryPlateQueryWrapper.lambda()
+                .isNotNull(IndustryPlateRes::getId);
+        List<IndustryPlateRes> industryPlates = industryPlateResMapper.selectList(industryPlateQueryWrapper);
+
+        for (IndustryPlateRes industryPlate : industryPlates) {
+            QueryWrapper<IndustryInfo> infoQueryWrapper = new QueryWrapper<>();
+            infoQueryWrapper.lambda()
+                    .eq(IndustryInfo::getPlateId,industryPlate.getPlateId());
+            List<IndustryInfo> industryInfoList = industryInfoMapper.selectList(infoQueryWrapper);
+            industryPlate.setPlateName(industryInfoList.get(0).getPlateName());
+            industryPlateResMapper.updateById(industryPlate);
+
         }
         }
     }
     }