From 3cf0c68bfa834ccb78633b0c172bbe2e7e121559 Mon Sep 17 00:00:00 2001 From: sunflower2014 Date: Tue, 6 Jan 2026 17:38:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reference/admin/AdminApplication.java | 1 + .../admin/controller/AdminUserController.java | 35 +++ .../admin/controller/ApiController.java | 12 + .../controller/JiangnanBankController.java | 184 ++++++++++++++ .../admin/controller/NewsController.java | 70 +++++- .../admin/mapper/AdminUserMapper.java | 13 +- .../reference/admin/mapper/H5UserMapper.java | 114 +++++++++ .../admin/model/vo/admin/user/H5UserDTO.java | 47 ++++ .../model/vo/admin/user/H5UserQueryParam.java | 75 ++++++ .../model/vo/admin/user/H5UserUploadData.java | 31 +++ .../admin/user/H5UserUploadDataListener.java | 36 +++ .../admin/model/vo/admin/user/H5UserVO.java | 60 +++++ .../admin/service/AdminUserService.java | 15 +- .../admin/service/H5UserService.java | 158 ++++++++++++ core/pom.xml | 6 + .../reference/core/mapper/NewsMapper.java | 111 ++++++++- .../reference/core/model/entity/News.java | 25 ++ .../core/model/vo/news/NewsApi2VO.java | 231 ++++++++++++++++++ .../reference/core/model/vo/news/NewsVO.java | 30 +++ .../reference/core/service/NewsService.java | 190 +++++++++++--- 20 files changed, 1394 insertions(+), 50 deletions(-) create mode 100644 admin/src/main/java/com/jinrui/reference/admin/controller/JiangnanBankController.java create mode 100644 admin/src/main/java/com/jinrui/reference/admin/mapper/H5UserMapper.java create mode 100644 admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserDTO.java create mode 100644 admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserQueryParam.java create mode 100644 admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserUploadData.java create mode 100644 admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserUploadDataListener.java create mode 100644 admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserVO.java create mode 100644 admin/src/main/java/com/jinrui/reference/admin/service/H5UserService.java create mode 100644 core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsApi2VO.java diff --git a/admin/src/main/java/com/jinrui/reference/admin/AdminApplication.java b/admin/src/main/java/com/jinrui/reference/admin/AdminApplication.java index 6a734ae..11b9b6d 100644 --- a/admin/src/main/java/com/jinrui/reference/admin/AdminApplication.java +++ b/admin/src/main/java/com/jinrui/reference/admin/AdminApplication.java @@ -17,6 +17,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @EnableScheduling @EnableAspectJAutoProxy(proxyTargetClass = true) public class AdminApplication { + public static void main(String[] args) { SpringApplication.run(AdminApplication.class, args); } diff --git a/admin/src/main/java/com/jinrui/reference/admin/controller/AdminUserController.java b/admin/src/main/java/com/jinrui/reference/admin/controller/AdminUserController.java index 8642f42..b924ec7 100644 --- a/admin/src/main/java/com/jinrui/reference/admin/controller/AdminUserController.java +++ b/admin/src/main/java/com/jinrui/reference/admin/controller/AdminUserController.java @@ -21,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.Map; import java.util.Objects; @RestController @@ -257,4 +258,38 @@ public class AdminUserController { return adminUserService.createH5User(phone); } + + @PostMapping("/password/reset") + public ResultObject resetPasswrod(@RequestHeader("auth-token") String token, + @RequestBody Map params) { + if (!StringUtils.hasText(token)) { + return ResultObject.failed("登陆Token为空!"); + } + + try { + AdminUser adminUser = AdminJwtService.parseToken(token); + if (adminUser == null) { + log.warn("解析token {}拿不到AdminUser对象!", token); + return ResultObject.failed("登陆Token有误,请联系系统管理员!"); + } + + if (!adminUser.isActive()) { + log.warn("当前用户已被封禁! id = {}", adminUser.getId()); + return ResultObject.failed("当前用户已被封禁!请联系系统管理员!"); + } + + log.info("path: /admin/user/password/reset, method: POST, request user id: {}, name: {}", + adminUser.getId(), adminUser.getName()); + + Object password = params.get("password"); + if (password == null) { + return ResultObject.failed("修改密码接口缺少相关参数!"); + } + return adminUserService.resetPassword(adminUser.getId(), (String)password); + } catch (Exception e) { + log.error("解析登陆Token出错!", e); + return ResultObject.failed(500, "服务端错误,请联系系统管理员!"); + } + + } } diff --git a/admin/src/main/java/com/jinrui/reference/admin/controller/ApiController.java b/admin/src/main/java/com/jinrui/reference/admin/controller/ApiController.java index f8e3b8c..7c71592 100644 --- a/admin/src/main/java/com/jinrui/reference/admin/controller/ApiController.java +++ b/admin/src/main/java/com/jinrui/reference/admin/controller/ApiController.java @@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RestController; import com.jinrui.reference.admin.model.entity.AdminUser; import com.jinrui.reference.admin.service.AdminJwtService; import com.jinrui.reference.core.model.vo.ResultObject; +import com.jinrui.reference.core.model.vo.news.NewsApi2VO; import com.jinrui.reference.core.model.vo.news.NewsApiVO; import com.jinrui.reference.core.service.ApiKeyService; import com.jinrui.reference.core.service.NewsService; @@ -44,6 +45,7 @@ public class ApiController { } return newsService.requestNewsByApi(num, last, clientType); } + @PostMapping("/news") public ResultObject> queryNews(@RequestParam(name = "num", required = true, defaultValue = "10") Integer num, @RequestParam(name = "last", required = false) Long last, HttpServletRequest request) { @@ -65,6 +67,16 @@ public class ApiController { return newsService.requestNewsByApi(num, last, clientType); } + @GetMapping("/news/v2") + public ResultObject> getNewsV2(HttpServletRequest request) { + String accessKey = request.getHeader("X-Api-Key"); + Integer clientType = apiKeyService.getClientType(accessKey); + if (clientType == null||clientType == 0) { + return ResultObject.failed("非法操作!"); + } + return newsService.requestNewsByApi2(); + } + @PostMapping("/key") public ResultObject> generateApiKey(@RequestHeader("auth-token") String token, @RequestParam(name = "clientName", required = true) String clientName, diff --git a/admin/src/main/java/com/jinrui/reference/admin/controller/JiangnanBankController.java b/admin/src/main/java/com/jinrui/reference/admin/controller/JiangnanBankController.java new file mode 100644 index 0000000..7a999ad --- /dev/null +++ b/admin/src/main/java/com/jinrui/reference/admin/controller/JiangnanBankController.java @@ -0,0 +1,184 @@ +package com.jinrui.reference.admin.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.jinrui.reference.admin.model.entity.AdminUser; +import com.jinrui.reference.admin.model.vo.admin.user.H5UserDTO; +import com.jinrui.reference.admin.model.vo.admin.user.H5UserQueryParam; +import com.jinrui.reference.admin.model.vo.admin.user.H5UserVO; +import com.jinrui.reference.admin.service.AdminJwtService; +import com.jinrui.reference.admin.service.H5UserService; +import com.jinrui.reference.core.model.vo.PageObject; +import com.jinrui.reference.core.model.vo.ResultObject; + +import redis.clients.jedis.JedisPool; + +@RestController +@RequestMapping("/jnh") +public class JiangnanBankController { + private static final Logger log = LoggerFactory.getLogger(JiangnanBankController.class); + + + private final H5UserService h5UserService; + private final ObjectMapper objectMapper; + private final JedisPool jedisPool; + + public JiangnanBankController(H5UserService h5UserService, + ObjectMapper objectMapper, + JedisPool jedisPool) { + this.h5UserService = h5UserService; + this.objectMapper = objectMapper; + this.jedisPool = jedisPool; + } + + @PostMapping("/accounts/page") + public PageObject queryNews(@RequestHeader("auth-token") String token,@RequestBody H5UserQueryParam h5UserQueryParam) { + if (!StringUtils.hasText(token)) { + return PageObject.failedPage("登陆Token为空!"); + } + + try { + AdminUser adminUser = AdminJwtService.parseToken(token); + if (adminUser == null) { + log.warn("解析token {}拿不到AdminUser对象!", token); + return PageObject.failedPage("登陆Token有误,请联系系统管理员!"); + } + + if (!adminUser.isActive()) { + log.warn("当前用户已被封禁! id = {}", adminUser.getId()); + return PageObject.failedPage("当前用户已被封禁!请联系系统管理员!"); + } + + log.info("path: /accounts/page, method: POST, request user id: {}, request params: {}", + adminUser.getId(), objectMapper.writeValueAsString(h5UserQueryParam)); + + h5UserQueryParam.setCreateBy(adminUser.getName()); + return h5UserService.queryH5User(h5UserQueryParam); + } catch (Exception e) { + log.error("解析登陆Token出错!", e); + return PageObject.failedPage(500, "服务端错误,请联系系统管理员!"); + } + } + + @PostMapping("/accounts/addOrUpdate") + public ResultObject addOrUpdate(@RequestHeader("auth-token") String token, @RequestBody H5UserDTO h5UserDTO) { + if (!StringUtils.hasText(token)) { + return ResultObject.failed("登陆Token为空!"); + } + + try { + AdminUser adminUser = AdminJwtService.parseToken(token); + if (adminUser == null) { + log.warn("解析token {}拿不到AdminUser对象!", token); + return ResultObject.failed("登陆Token有误,请联系系统管理员!"); + } + + if (!adminUser.isActive()) { + log.warn("当前用户已被封禁! id = {}", adminUser.getId()); + return ResultObject.failed("当前用户已被封禁!请联系系统管理员!"); + } + + log.info("path: /accounts/addOrUpdate, method: POST, request user id: {}, request params: {}", + adminUser.getId(), objectMapper.writeValueAsString(h5UserDTO)); + + h5UserDTO.setCreateBy(adminUser.getName()); + return h5UserService.addOrUpdate(h5UserDTO); + } catch (Exception e) { + log.error("解析登陆Token出错!", e); + return ResultObject.failed(500, "服务端错误,请联系系统管理员!"); + } + } + + @PostMapping("/accounts/remove") + public ResultObject remove(@RequestHeader("auth-token") String token, @RequestBody H5UserDTO h5UserDTO) { + if (!StringUtils.hasText(token)) { + return ResultObject.failed("登陆Token为空!"); + } + + try { + AdminUser adminUser = AdminJwtService.parseToken(token); + if (adminUser == null) { + log.warn("解析token {}拿不到AdminUser对象!", token); + return ResultObject.failed("登陆Token有误,请联系系统管理员!"); + } + + if (!adminUser.isActive()) { + log.warn("当前用户已被封禁! id = {}", adminUser.getId()); + return ResultObject.failed("当前用户已被封禁!请联系系统管理员!"); + } + + log.info("path: /accounts/addOrUpdate, method: POST, request user id: {}, request params: {}", + adminUser.getId(), objectMapper.writeValueAsString(h5UserDTO)); + return h5UserService.remove(h5UserDTO.getId()); + } catch (Exception e) { + log.error("解析登陆Token出错!", e); + return ResultObject.failed(500, "服务端错误,请联系系统管理员!"); + } + } + + @PostMapping("/accounts/status") + public ResultObject resetStatus(@RequestHeader("auth-token") String token, @RequestBody H5UserDTO h5UserDTO) { + if (!StringUtils.hasText(token)) { + return ResultObject.failed("登陆Token为空!"); + } + + try { + AdminUser adminUser = AdminJwtService.parseToken(token); + if (adminUser == null) { + log.warn("解析token {}拿不到AdminUser对象!", token); + return ResultObject.failed("登陆Token有误,请联系系统管理员!"); + } + + if (!adminUser.isActive()) { + log.warn("当前用户已被封禁! id = {}", adminUser.getId()); + return ResultObject.failed("当前用户已被封禁!请联系系统管理员!"); + } + + log.info("path: /accounts/addOrUpdate, method: POST, request user id: {}, request params: {}", + adminUser.getId(), objectMapper.writeValueAsString(h5UserDTO)); + return h5UserService.resetStatus(h5UserDTO); + } catch (Exception e) { + log.error("解析登陆Token出错!", e); + return ResultObject.failed(500, "服务端错误,请联系系统管理员!"); + } + } + + @PostMapping("/accounts/import") + public ResultObject importAccounts(@RequestHeader("auth-token") String token, @RequestParam("file") MultipartFile file) { + if (!StringUtils.hasText(token)) { + return ResultObject.failed("登陆Token为空!"); + } + + try { + AdminUser adminUser = AdminJwtService.parseToken(token); + if (adminUser == null) { + log.warn("解析token {}拿不到AdminUser对象!", token); + return ResultObject.failed("登陆Token有误,请联系系统管理员!"); + } + + if (!adminUser.isActive()) { + log.warn("当前用户已被封禁! id = {}", adminUser.getId()); + return ResultObject.failed("当前用户已被封禁!请联系系统管理员!"); + } + + log.info("path: /accounts/import, method: POST, request user id: {}", adminUser.getId()); + if (file.isEmpty()) { + return ResultObject.failed("上传的批量导入文件为空!"); + } + return h5UserService.importAccounts(file, adminUser.getName()); + } catch (Exception e) { + log.error("解析登陆Token出错!", e); + return ResultObject.failed(500, "服务端错误,请联系系统管理员!"); + } + } +} diff --git a/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java b/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java index a1f68bc..f566cde 100644 --- a/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java +++ b/admin/src/main/java/com/jinrui/reference/admin/controller/NewsController.java @@ -331,7 +331,8 @@ public class NewsController { @RequestParam(value = "includeRuleIds", required = false) String includeRuleIds, @RequestParam(value = "excludeRuleIds", required = false) String excludeRuleIds, @RequestParam(value = "companyName", required = false) String companyName, - @RequestParam(value = "range", required = false, defaultValue = "all") String range + @RequestParam(value = "range", required = false, defaultValue = "all") String range, + @RequestParam(value = "clusterSwitch", defaultValue = "false") Boolean clusterSwitch ) { if (!StringUtils.hasText(token)) { return PageObject.failedPage("登陆Token为空!"); @@ -366,7 +367,7 @@ public class NewsController { } isSecondReviewRange = true; } - return newsService.queryNews(keyword, columnList, status, page, size, last, current, orderBy, minScore, maxScore, tag, industry, mediaId, datelineFrom, datelineTo, deleted, rating, exclusive, isReviewRange, isSecondReviewRange, includeRuleIds, excludeRuleIds, companyName); + return newsService.queryNews(keyword, columnList, status, page, size, last, current, orderBy, minScore, maxScore, tag, industry, mediaId, datelineFrom, datelineTo, deleted, rating, exclusive, isReviewRange, isSecondReviewRange, includeRuleIds, excludeRuleIds, companyName, clusterSwitch); } catch (Exception e) { log.error("解析登陆Token出错!", e); return PageObject.failedPage(500, "服务端错误,请联系系统管理员!"); @@ -551,6 +552,71 @@ public class NewsController { return ResultObject.success(listedCompanyList); } + @GetMapping("/getRealTotal") + public ResultObject getRealTotal(@RequestHeader("auth-token") String token, + @RequestParam(value = "keyword", required = false) String keyword, + @RequestParam(value = "tag", required = false) String tag, + @RequestParam(value = "industry", required = false) String industry, + @RequestParam(value = "minScore", required = false) Double minScore, + @RequestParam(value = "maxScore", required = false) Double maxScore, + @RequestParam(value = "column", required = false) String columnList, + @RequestParam(value = "status", required = false) Integer status, + @RequestParam(value = "page", required = false, defaultValue = "1") int page, + @RequestParam(value = "size", required = false, defaultValue = "10") int size, + @RequestParam(value = "last", required = false) Integer last, + @RequestParam(value = "current", required = false) Integer current, + @RequestParam(value = "orderBy", required = false) String orderBy, + @RequestParam(value = "mediaId", required = false) Long mediaId, + @RequestParam(value = "dateline_from", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date datelineFrom, + @RequestParam(value = "dateline_to", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date datelineTo, + @RequestParam(value = "deleted", required = false) Integer deleted, + @RequestParam(value = "rating", required = false) Byte rating, + @RequestParam(value = "exclusive", required = false) Integer exclusive, + @RequestParam(value = "includeRuleIds", required = false) String includeRuleIds, + @RequestParam(value = "excludeRuleIds", required = false) String excludeRuleIds, + @RequestParam(value = "companyName", required = false) String companyName, + @RequestParam(value = "range", required = false, defaultValue = "all") String range + ) { + if (!StringUtils.hasText(token)) { + return ResultObject.failed("登陆Token为空!"); + } + + try { + AdminUser adminUser = AdminJwtService.parseToken(token); + if (adminUser == null) { + log.warn("解析token {}拿不到AdminUser对象!", token); + return ResultObject.failed("登陆Token有误,请联系系统管理员!"); + } + + if (!adminUser.isActive()) { + log.warn("当前用户已被封禁! id = {}", adminUser.getId()); + return ResultObject.failed("当前用户已被封禁!请联系系统管理员!"); + } + + log.info("path: /news, method: GET, request user id: {}, keyword: {}, column: {}, status: {}, " + + "page: {}, size: {}, last: {}, current: {}, orderBy: {}, tag: {}, industry: {}", + adminUser.getId(), keyword, columnList, status, page, size, last, current, orderBy, tag, industry); + + boolean isReviewRange = false; + boolean isSecondReviewRange = false; + if ("review".equals(range)) { + if (!adminUser.isReviewer()) { + return ResultObject.failed(500, "非审核员用户查看范围权限!"); + } + isReviewRange = true; + } else if ("secondReview".equals(range)) { + if (!adminUser.isSecondReviewer()) { + return ResultObject.failed(500, "非二审用户无查看此范围权限!"); + } + isSecondReviewRange = true; + } + return newsService.getRealTotal(keyword, columnList, status, page, size, last, current, orderBy, minScore, maxScore, tag, industry, mediaId, datelineFrom, datelineTo, deleted, rating, exclusive, isReviewRange, isSecondReviewRange, includeRuleIds, excludeRuleIds, companyName); + } catch (Exception e) { + log.error("解析登陆Token出错!", e); + return ResultObject.failed(500, "服务端错误,请联系系统管理员!"); + } + } + /** * * @param newsId diff --git a/admin/src/main/java/com/jinrui/reference/admin/mapper/AdminUserMapper.java b/admin/src/main/java/com/jinrui/reference/admin/mapper/AdminUserMapper.java index b6de13e..321687c 100644 --- a/admin/src/main/java/com/jinrui/reference/admin/mapper/AdminUserMapper.java +++ b/admin/src/main/java/com/jinrui/reference/admin/mapper/AdminUserMapper.java @@ -1,6 +1,8 @@ package com.jinrui.reference.admin.mapper; import com.jinrui.reference.admin.model.entity.AdminUser; +import com.jinrui.reference.admin.model.vo.admin.user.H5UserVO; + import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; @@ -54,6 +56,9 @@ public interface AdminUserMapper { @Update("update admin_user set active = 0, update_time = now() where id = #{id}") void ban(@Param("id") long id); + + @Update("update admin_user set password = #{password}, update_time = now() where id = #{id}") + void resetPassword(@Param("id") long id, @Param("password") String password); @Delete("delete from admin_user where id = #{id}") void delete(@Param("id") long id); @@ -71,10 +76,6 @@ public interface AdminUserMapper { "") void create(@Param("name") String name, @Param("phone") String phone, @Param("password") String password, @Param("userType") String userType); - @Insert("") - void createH5User(@Param("phone") String phone); + + } diff --git a/admin/src/main/java/com/jinrui/reference/admin/mapper/H5UserMapper.java b/admin/src/main/java/com/jinrui/reference/admin/mapper/H5UserMapper.java new file mode 100644 index 0000000..2ffc6cd --- /dev/null +++ b/admin/src/main/java/com/jinrui/reference/admin/mapper/H5UserMapper.java @@ -0,0 +1,114 @@ +package com.jinrui.reference.admin.mapper; + +import java.util.Date; +import java.util.List; + +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.ResultMap; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; +import org.apache.ibatis.type.JdbcType; + +import com.jinrui.reference.admin.model.vo.admin.user.H5UserDTO; +import com.jinrui.reference.admin.model.vo.admin.user.H5UserQueryParam; +import com.jinrui.reference.admin.model.vo.admin.user.H5UserVO; + +public interface H5UserMapper { + @Insert("") + void createH5UserByPhone(@Param("phone") String phone); + + @Insert("") + void createH5User(H5UserDTO h5UserDTO); + + @Results(id="h5UserMap", value = { + @Result(column = "id", property = "id", id = true), + @Result(column = "mobile", property = "mobile"), + @Result(column = "name", property = "name"), + @Result(column = "department", property = "department"), + @Result(column = "status", property = "status"), + @Result(column = "create_time", property = "createTime", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP), + @Result(column = "update_time", property = "updateTime", javaType = Date.class, jdbcType = JdbcType.TIMESTAMP) + }) + @Select("select * from allowlist_detail where mobile = #{mobile}") + H5UserVO selectByMobile(@Param("mobile") String mobile); + + @Update("" ) + void updateH5User(H5UserDTO h5UserDTO); + + + @ResultMap("h5UserMap") + @Select("") + List queryH5User(H5UserQueryParam h5UserQueryParam); + + @Select("") + int queryTotal(H5UserQueryParam h5UserQueryParam); + + @Delete("delete from allowlist_detail where id = #{id}") + void deleteById(@Param("id") Long id); +} diff --git a/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserDTO.java b/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserDTO.java new file mode 100644 index 0000000..515b51b --- /dev/null +++ b/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserDTO.java @@ -0,0 +1,47 @@ +package com.jinrui.reference.admin.model.vo.admin.user; + +public class H5UserDTO { + private Long id; + private String mobile; + private String name; + private String department; + private Integer status; + private String createBy; + + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getMobile() { + return mobile; + } + public void setMobile(String mobile) { + this.mobile = mobile; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getDepartment() { + return department; + } + public void setDepartment(String department) { + this.department = department; + } + public Integer getStatus() { + return status; + } + public void setStatus(Integer status) { + this.status = status; + } + public String getCreateBy() { + return createBy; + } + public void setCreateBy(String createBy) { + this.createBy = createBy; + } +} diff --git a/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserQueryParam.java b/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserQueryParam.java new file mode 100644 index 0000000..0c4bf57 --- /dev/null +++ b/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserQueryParam.java @@ -0,0 +1,75 @@ +package com.jinrui.reference.admin.model.vo.admin.user; + +public class H5UserQueryParam { + private int page; + private int size; + private int offset; + private Integer last; + private Integer current; + private String orderBy; + private String mobile; + private String department; + private Integer status; + private String createBy; + + public int getPage() { + return page; + } + public void setPage(int page) { + this.page = page; + } + public int getSize() { + return size; + } + public void setSize(int size) { + this.size = size; + } + public Integer getLast() { + return last; + } + public void setLast(Integer last) { + this.last = last; + } + public Integer getCurrent() { + return current; + } + public void setCurrent(Integer current) { + this.current = current; + } + public String getOrderBy() { + return orderBy; + } + public void setOrderBy(String orderBy) { + this.orderBy = orderBy; + } + public String getMobile() { + return mobile; + } + public void setMobile(String mobile) { + this.mobile = mobile; + } + public String getDepartment() { + return department; + } + public void setDepartment(String department) { + this.department = department; + } + public Integer getStatus() { + return status; + } + public void setStatus(Integer status) { + this.status = status; + } + public int getOffset() { + return offset; + } + public void setOffset(int offset) { + this.offset = offset; + } + public String getCreateBy() { + return createBy; + } + public void setCreateBy(String createBy) { + this.createBy = createBy; + } +} diff --git a/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserUploadData.java b/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserUploadData.java new file mode 100644 index 0000000..a8ec999 --- /dev/null +++ b/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserUploadData.java @@ -0,0 +1,31 @@ +package com.jinrui.reference.admin.model.vo.admin.user; + +import cn.idev.excel.annotation.ExcelProperty; + +public class H5UserUploadData { + @ExcelProperty(index = 0) + private String name; + @ExcelProperty(index = 1) + private String mobile; + @ExcelProperty(index = 2) + private String department; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getMobile() { + return mobile; + } + public void setMobile(String mobile) { + this.mobile = mobile; + } + public String getDepartment() { + return department; + } + public void setDepartment(String department) { + this.department = department; + } +} diff --git a/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserUploadDataListener.java b/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserUploadDataListener.java new file mode 100644 index 0000000..c7d5c7c --- /dev/null +++ b/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserUploadDataListener.java @@ -0,0 +1,36 @@ +package com.jinrui.reference.admin.model.vo.admin.user; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import cn.idev.excel.context.AnalysisContext; +import cn.idev.excel.event.AnalysisEventListener; + +public class H5UserUploadDataListener extends AnalysisEventListener { + private static final Logger log = LoggerFactory.getLogger(H5UserUploadDataListener.class); + + + private final List list = new ArrayList<>(); + + @Override + public void invoke(H5UserUploadData data, AnalysisContext context) { +// log.info("读取到一条数据: {}", JSON.toJSONString(data)); + list.add(data); + + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // TODO Auto-generated method stub + + } + + public List getExcelData() { + return this.list; + } + + +} diff --git a/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserVO.java b/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserVO.java new file mode 100644 index 0000000..7eda3c9 --- /dev/null +++ b/admin/src/main/java/com/jinrui/reference/admin/model/vo/admin/user/H5UserVO.java @@ -0,0 +1,60 @@ +package com.jinrui.reference.admin.model.vo.admin.user; + +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; + +public class H5UserVO { + private Long id; + private String mobile; + private String name; + private String department; + private Integer status; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date createTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date updateTime; + + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getMobile() { + return mobile; + } + public void setMobile(String mobile) { + this.mobile = mobile; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getDepartment() { + return department; + } + public void setDepartment(String department) { + this.department = department; + } + public Integer getStatus() { + return status; + } + public void setStatus(Integer status) { + this.status = status; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } +} diff --git a/admin/src/main/java/com/jinrui/reference/admin/service/AdminUserService.java b/admin/src/main/java/com/jinrui/reference/admin/service/AdminUserService.java index 42512cf..7934922 100644 --- a/admin/src/main/java/com/jinrui/reference/admin/service/AdminUserService.java +++ b/admin/src/main/java/com/jinrui/reference/admin/service/AdminUserService.java @@ -5,6 +5,7 @@ import java.util.Objects; import java.util.Random; import java.util.stream.Collectors; +import org.apache.commons.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -15,6 +16,7 @@ import org.springframework.util.StringUtils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.jinrui.reference.admin.mapper.AdminUserMapper; +import com.jinrui.reference.admin.mapper.H5UserMapper; import com.jinrui.reference.admin.model.dto.login.LoginDTO; import com.jinrui.reference.admin.model.entity.AdminUser; import com.jinrui.reference.admin.model.vo.admin.user.AdminUserVO; @@ -35,14 +37,17 @@ public class AdminUserService { private final JedisPool jedisPool; private final AdminUserMapper adminUserMapper; + private final H5UserMapper h5UserMapper; private final ObjectMapper objectMapper; public AdminUserService(JedisPool jedisPool, AdminUserMapper adminUserMapper, - ObjectMapper objectMapper) { + ObjectMapper objectMapper, + H5UserMapper h5UserMapper) { this.jedisPool = jedisPool; this.adminUserMapper = adminUserMapper; this.objectMapper = objectMapper; + this.h5UserMapper = h5UserMapper; } /** @@ -299,11 +304,17 @@ public class AdminUserService { public ResultObject createH5User(String phone) { try { - adminUserMapper.createH5User(phone); + h5UserMapper.createH5UserByPhone(phone); } catch (Exception e) { log.error("注册用户报错!", e); return ResultObject.failed(500, "服务端错误!请联系系统管理员!"); } return ResultObject.success(); } + + public ResultObject resetPassword(Long id, String password) { + String newPassword = new String(Base64.decodeBase64(password)); + adminUserMapper.resetPassword(id, newPassword); + return ResultObject.success(); + } } diff --git a/admin/src/main/java/com/jinrui/reference/admin/service/H5UserService.java b/admin/src/main/java/com/jinrui/reference/admin/service/H5UserService.java new file mode 100644 index 0000000..8c5b657 --- /dev/null +++ b/admin/src/main/java/com/jinrui/reference/admin/service/H5UserService.java @@ -0,0 +1,158 @@ +package com.jinrui.reference.admin.service; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.jinrui.reference.admin.mapper.H5UserMapper; +import com.jinrui.reference.admin.model.vo.admin.user.H5UserDTO; +import com.jinrui.reference.admin.model.vo.admin.user.H5UserQueryParam; +import com.jinrui.reference.admin.model.vo.admin.user.H5UserUploadData; +import com.jinrui.reference.admin.model.vo.admin.user.H5UserUploadDataListener; +import com.jinrui.reference.admin.model.vo.admin.user.H5UserVO; +import com.jinrui.reference.core.model.vo.PageObject; +import com.jinrui.reference.core.model.vo.ResultObject; + +import cn.idev.excel.FastExcel; +import cn.idev.excel.read.listener.PageReadListener; +import redis.clients.jedis.JedisPool; + +@Service +public class H5UserService { + private static final Logger log = LoggerFactory.getLogger(H5UserService.class); + + private final JedisPool jedisPool; + private final H5UserMapper h5UserMapper; + private final ObjectMapper objectMapper; + + public H5UserService(JedisPool jedisPool, + H5UserMapper h5UserMapper, + ObjectMapper objectMapper) { + this.jedisPool = jedisPool; + this.h5UserMapper = h5UserMapper; + this.objectMapper = objectMapper; + } + + + public PageObject queryH5User(H5UserQueryParam h5UserQueryParam) { + int offset = 0; + Integer current = h5UserQueryParam.getCurrent(); + int size = h5UserQueryParam.getSize(); + if (current != null) { + offset = (Math.max(0, current - 1)) * size; + } + int page = h5UserQueryParam.getPage(); + h5UserQueryParam.setOffset(offset); + + List h5UserList; + try { + h5UserList = h5UserMapper.queryH5User(h5UserQueryParam); + } catch (Exception e) { + log.error("搜索新闻异常!", e); + return PageObject.failedPage(500, "服务器错误,请联系系统管理员!"); + } + + PageObject pageObject = new PageObject<>(); + if (page == 1) { + try { + int total = h5UserMapper.queryTotal(h5UserQueryParam); + pageObject.setTotal(total); + } catch (Exception e) { + log.error("获取新闻总数异常!", e); + return PageObject.failedPage(500, "服务器错误,请联系系统管理员!"); + } + } + + pageObject.setCode(200); + pageObject.setCurrent(page); + size = Math.min(h5UserList.size(), size); + pageObject.setSize(size); + if (CollectionUtils.isEmpty(h5UserList)) { + log.info("搜索结果为空!"); + pageObject.setData(Collections.emptyList()); + return pageObject; + } + pageObject.setData(h5UserList); + return pageObject; + } + + + public ResultObject addOrUpdate(H5UserDTO h5UserDTO) { + if (h5UserDTO.getId() == null) { + h5UserMapper.createH5User(h5UserDTO); + } else { + h5UserMapper.updateH5User(h5UserDTO); + } + return ResultObject.success(); + } + + public ResultObject remove(Long id) { + h5UserMapper.deleteById(id); + return ResultObject.success(); + } + + + public ResultObject resetStatus(H5UserDTO h5UserDTO) { + h5UserMapper.updateH5User(h5UserDTO); + return ResultObject.success(); + } + + + public ResultObject importAccounts(MultipartFile file, String createBy) { + try { + H5UserUploadDataListener h5UserUploadDataListener = new H5UserUploadDataListener(); + FastExcel.read(file.getInputStream(), H5UserUploadData.class, h5UserUploadDataListener) + .sheet() + .doRead(); + List h5Users = h5UserUploadDataListener.getExcelData(); + int size = h5Users.size(); + if (size == 0) { + return ResultObject.failed("上传的数据为空!"); + } + String msg = ""; + Map h5UserMobileMap = new HashMap<>(); + for (int i = 0; i < h5Users.size(); i++) { + H5UserUploadData h5User = h5Users.get(i); + if (!(StringUtils.hasText(h5User.getName()) && StringUtils.hasText(h5User.getMobile()))) { + msg += "第" + (i+2) + "行数据缺少必填内容!\n"; + continue; + } + if (h5UserMobileMap.containsKey(h5User.getMobile())) { + msg += "手机号" + h5User.getMobile() + "的数据重复!\n"; + h5UserMobileMap.remove(h5User.getMobile()); + continue; + } + h5UserMobileMap.put(h5User.getMobile(), h5User); + } + if (h5UserMobileMap.size() > 0) { + for (H5UserUploadData h5UserUploadData:h5UserMobileMap.values()) { + H5UserVO h5UserVO = h5UserMapper.selectByMobile(h5UserUploadData.getMobile()); + if (h5UserVO == null) { + H5UserDTO h5UserDTO = new H5UserDTO(); + BeanUtils.copyProperties(h5UserUploadData, h5UserDTO); + h5UserDTO.setCreateBy(createBy); + h5UserMapper.createH5User(h5UserDTO); + continue; + } + msg += "手机号为" + h5UserUploadData.getMobile() + "的用户之前已经添加过!\n"; + } + } + return ResultObject.success(msg); + } catch (IOException e) { + log.error("文件处理失败", e); + return ResultObject.failed("文件处理失败!"); + } + } +} diff --git a/core/pom.xml b/core/pom.xml index f155b1f..2bc0de0 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -19,6 +19,7 @@ 4.4.0 8.12.2 2.0.1 + 1.3.0 @@ -95,6 +96,11 @@ jedis ${jedis.version} + + cn.idev.excel + fastexcel + 1.3.0 + diff --git a/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java b/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java index b02421c..5448752 100644 --- a/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java +++ b/core/src/main/java/com/jinrui/reference/core/mapper/NewsMapper.java @@ -15,6 +15,7 @@ import org.apache.ibatis.type.JdbcType; import com.jinrui.reference.core.model.entity.News; import com.jinrui.reference.core.model.entity.NewsDraft; +import com.jinrui.reference.core.model.vo.news.NewsApi2VO; import com.jinrui.reference.core.model.vo.news.NewsApiVO; import com.jinrui.reference.core.typehandler.JsonArrayTypeHandler; @@ -94,13 +95,18 @@ public interface NewsMapper { "news.exclusive, " + "news.company_name as companyName," + "news_tags.news_score as score, " + - "news_tags.source as sourceName " + + "news_tags.source as sourceName, " + + "news.has_center as hasCenter, " + + "news.center_id as centerId " + "from news " + "" + "inner join news_column_rel on news.id = news_column_rel.news_id " + "" + " left join news_tags on news.newsinfo_id = news_tags.newsinfo_id " + "" + + "" + + " and not (news.has_center = 1 and news.newsinfo_id != news.center_id) " + + "" + "" + " and 1 = 2 " + "" + @@ -203,7 +209,8 @@ public interface NewsMapper { @Param("isSecondReviewRange") boolean isSecondReviewRange, @Param("includeRuleIds") List includeRuleIds, @Param("excludeRuleIds") List excludeRuleIds, - @Param("companyName") String companyName); + @Param("companyName") String companyName, + @Param("clusterSwitch") Boolean clusterSwitch); @Select("") + List queryNewsByApi2(); + + @Results({ + @Result(column = "id", property = "id", id = true), + @Result(column = "llm_title", property = "title"), + @Result(column = "llm_content", property = "content"), + @Result(column = "summary", property = "summary"), + @Result(column = "publish_time", property = "publishTime"), + @Result(column = "published", property = "published"), + @Result(column = "stock_codes", property = "stockCodes", typeHandler = JsonArrayTypeHandler.class), + @Result(column = "stock_names", property = "stockNames", typeHandler = JsonArrayTypeHandler.class), + @Result(column = "tdx_industry", property = "tdxIndustry", typeHandler = JsonArrayTypeHandler.class), + @Result(column = "tdx_industry_confidence", property = "tdxIndustryConfidence", typeHandler = JsonArrayTypeHandler.class), + @Result(column = "company_name", property = "companyName"), + @Result(column = "news_score", property = "newsScore"), + }) + @Select("") + List queryNewsByApi3(@Param("limit") int limit); } diff --git a/core/src/main/java/com/jinrui/reference/core/model/entity/News.java b/core/src/main/java/com/jinrui/reference/core/model/entity/News.java index e2adc56..7b21973 100644 --- a/core/src/main/java/com/jinrui/reference/core/model/entity/News.java +++ b/core/src/main/java/com/jinrui/reference/core/model/entity/News.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.jinrui.reference.core.model.dto.news.SaveNewsDTO; import java.util.Date; +import java.util.Objects; /** * 新闻 @@ -107,6 +108,10 @@ public class News { private String sourceName; + private Integer hasCenter; + + private String centerId; + public News() {} public News(SaveNewsDTO saveNewsDTO) { @@ -359,4 +364,24 @@ public class News { public void setSourceName(String sourceName) { this.sourceName = sourceName; } + + public Integer getHasCenter() { + return hasCenter; + } + + public void setHasCenter(Integer hasCenter) { + this.hasCenter = hasCenter; + } + + public String getCenterId() { + return centerId; + } + + public void setCenterId(String centerId) { + this.centerId = centerId; + } + + public boolean isCenter() { + return Objects.equals(hasCenter, 1) && Objects.equals(newsinfoId, centerId); + } } diff --git a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsApi2VO.java b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsApi2VO.java new file mode 100644 index 0000000..c30bf2f --- /dev/null +++ b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsApi2VO.java @@ -0,0 +1,231 @@ +package com.jinrui.reference.core.model.vo.news; + +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; + +public class NewsApi2VO { + /** + * 资讯ID + */ + private Long id; + + /** + * 资讯标题 + */ + private String title; + + /** + * 资讯内容 + */ + private String content; + + /** + * 报道时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private Date publishTime; + + /** + * 资讯摘要 + */ + private String summary; + + /** + * 资讯评分 + */ + private Double newsScore; + + /** + * 资讯来源 + */ + private String source; + + /** + * + */ + private Integer exclusive; + +// /** +// * 行业分类标签 +// */ +// private List industryLabel; +// +// /** +// * 行业分类置信度 +// */ +// private List industryConfidence; +// +// /** +// * 行业分类评分 +// */ +// private List industryScore; + + +// /** +// * 概念标签 +// * @return +// */ +// private List conceptLabel; +// +// /** +// * 概念标签置信度 +// */ +// private List conceptConfidence; +// +// /** +// * 概念标签评分 +// */ +// private List conceptScore; + +// /** +// * 媒体影响力 +// */ +// private Integer sourceImpact; +// +// /** +// * 中国股市相关性 +// */ +// private Double chinaFactor; +// +// /** +// * 资讯质量 +// */ +// private Integer publicOpinionScore; + + private List stockCodes; + + private List stockNames; + + private List tdxIndustry; + + private List tdxIndustryConfidence; + + private Boolean published; + + private String companyName; + + private String signalRule; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Date getPublishTime() { + return publishTime; + } + + public void setPublishTime(Date publishTime) { + this.publishTime = publishTime; + } + + public String getSummary() { + return summary; + } + + public void setSummary(String summary) { + this.summary = summary; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + + public Double getNewsScore() { + return newsScore; + } + + public void setNewsScore(Double newsScore) { + this.newsScore = newsScore; + } + + public Integer getExclusive() { + return exclusive; + } + + public void setExclusive(Integer exclusive) { + this.exclusive = exclusive; + } + + public List getStockCodes() { + return stockCodes; + } + + public void setStockCodes(List stockCodes) { + this.stockCodes = stockCodes; + } + + public List getStockNames() { + return stockNames; + } + + public void setStockNames(List stockNames) { + this.stockNames = stockNames; + } + + public List getTdxIndustry() { + return tdxIndustry; + } + + public void setTdxIndustry(List tdxIndustry) { + this.tdxIndustry = tdxIndustry; + } + + public List getTdxIndustryConfidence() { + return tdxIndustryConfidence; + } + + public void setTdxIndustryConfidence(List tdxIndustryConfidence) { + this.tdxIndustryConfidence = tdxIndustryConfidence; + } + + public Boolean getPublished() { + return published; + } + + public void setPublished(Boolean published) { + this.published = published; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getSignalRule() { + return signalRule; + } + + public void setSignalRule(String signalRule) { + this.signalRule = signalRule; + } +} diff --git a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsVO.java b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsVO.java index 7b51d0b..c2e25ea 100644 --- a/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsVO.java +++ b/core/src/main/java/com/jinrui/reference/core/model/vo/news/NewsVO.java @@ -73,6 +73,12 @@ public class NewsVO { private Byte rating; // 打分 private List ruleName; + + private List clusterNews; + + private Integer index; + + private Boolean isChild; public NewsVO(News news) { this.id = news.getId(); @@ -228,5 +234,29 @@ public class NewsVO { public void setRuleName(List ruleName) { this.ruleName = ruleName; } + + public List getClusterNews() { + return clusterNews; + } + + public void setClusterNews(List clusterNews) { + this.clusterNews = clusterNews; + } + + public Boolean getIsChild() { + return isChild; + } + + public void setIsChild(Boolean isChild) { + this.isChild = isChild; + } + + public Integer getIndex() { + return index; + } + + public void setIndex(Integer index) { + this.index = index; + } } diff --git a/core/src/main/java/com/jinrui/reference/core/service/NewsService.java b/core/src/main/java/com/jinrui/reference/core/service/NewsService.java index 557a8ae..cda08fa 100644 --- a/core/src/main/java/com/jinrui/reference/core/service/NewsService.java +++ b/core/src/main/java/com/jinrui/reference/core/service/NewsService.java @@ -6,7 +6,6 @@ import java.net.URLDecoder; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -63,6 +62,7 @@ import com.jinrui.reference.core.model.entity.Tag; import com.jinrui.reference.core.model.entity.UserOperationLog; import com.jinrui.reference.core.model.vo.PageObject; import com.jinrui.reference.core.model.vo.ResultObject; +import com.jinrui.reference.core.model.vo.news.NewsApi2VO; import com.jinrui.reference.core.model.vo.news.NewsApiVO; import com.jinrui.reference.core.model.vo.news.NewsDetailColumn; import com.jinrui.reference.core.model.vo.news.NewsDetailColumnVip; @@ -852,7 +852,8 @@ public class NewsService { boolean isSecondReviewRange, String includeRuleIds, String excludeRuleIds, - String companyName) { + String companyName, + Boolean clusterSwitch) { String orderByClause = null; if (StringUtils.hasText(orderBy)) { String orderByStr = orderBy; @@ -927,7 +928,7 @@ public class NewsService { List newsList; try { - newsList = newsMapper.queryNews(keywords, minScore, maxScore, columnParam, status, last, orderByClause, size, offset, tags, industries, datelineFrom, datelineTo, deleted, rating,exclusive, isReviewer, isSecondReviewRange, includeSignalRules, excludeSignalRules, companyName); + newsList = newsMapper.queryNews(keywords, minScore, maxScore, columnParam, status, last, orderByClause, size, offset, tags, industries, datelineFrom, datelineTo, deleted, rating,exclusive, isReviewer, isSecondReviewRange, includeSignalRules, excludeSignalRules, companyName, clusterSwitch); } catch (Exception e) { log.error("搜索新闻异常!", e); return PageObject.failedPage(500, "服务器错误,请联系系统管理员!"); @@ -936,7 +937,7 @@ public class NewsService { PageObject pageObject = new PageObject<>(); if (page == 1) { try { - int total = newsMapper.queryTotal(keywords,minScore, maxScore, columnParam, status, tags, industries, datelineFrom, datelineTo, deleted, rating,exclusive, isReviewer, isSecondReviewRange, includeSignalRules, excludeSignalRules, companyName); + int total = newsMapper.queryTotal(keywords,minScore, maxScore, columnParam, status, tags, industries, datelineFrom, datelineTo, deleted, rating,exclusive, isReviewer, isSecondReviewRange, includeSignalRules, excludeSignalRules, companyName, clusterSwitch); pageObject.setTotal(total); } catch (Exception e) { log.error("获取新闻总数异常!", e); @@ -954,37 +955,25 @@ public class NewsService { return pageObject; } - Map newsMap = new HashMap<>(); - Map draftMap = new HashMap<>(); List resultList = new ArrayList<>(); for (News news : newsList) { - NewsVO newsVO = new NewsVO(news); - Long draftId = news.getDraftId(); - if (draftId != null) { - draftMap.put(draftId, newsVO); - } else { - newsMap.put(newsVO.getId(), newsVO); + NewsVO newsVO = toNewsVO(news, isReviewer); + if (clusterSwitch != null && clusterSwitch == true) { + if (news.isCenter()) { + List clusterNewsList = newsMapper.getClusterNews(news.getPublishTime(), news.getCenterId()); + if (!CollectionUtils.isEmpty(clusterNewsList)) { + List clusterNews = new ArrayList<>(); + for (int i = 0; i < clusterNewsList.size(); i++) { + NewsVO clusterNewsVO = toNewsVO(clusterNewsList.get(i), isReviewer); + clusterNewsVO.setIsChild(true); + clusterNewsVO.setIndex(i); + clusterNews.add(clusterNewsVO); + } + newsVO.setClusterNews(clusterNews); + } + } } resultList.add(newsVO); - newsVO.setSubmitter(this.getNewsLastEditor(news.getId())); - if (isReviewer) { - newsVO.setSubmitterSecond(this.getNewsLastReviewer(news.getId())); - } - - List newsTagList = tagMapper.getNewsTagRelList(news.getId()); - if (!CollectionUtils.isEmpty(newsTagList)) { - List newsConceptLabels = tagMapper.getByIds(newsTagList.stream().map(NewsTagRel::getTagId).collect(Collectors.toList())); - newsVO.setConceptLabels(newsConceptLabels.stream().filter(e -> !Objects.equals(e.getParentId(), 1L)).map(Tag::getDisplayName).collect(Collectors.toList())); - } - - List newsIndustryList = industryMapper.getNewsIndustryRelList(news.getId()); - if (!CollectionUtils.isEmpty(newsIndustryList)) { - List newsIndustryLabels = industryMapper.getByIds(newsIndustryList.stream().map(NewsIndustryRel::getIndustryId).collect(Collectors.toList())); - newsVO.setIndustryLabels(newsIndustryLabels.stream().map(Industry::getDisplayName).collect(Collectors.toList())); - } - - List newsSignalRuleNames = newsSignalRuleRelMapper.getNewsSignalRuleNames(news.getId()); - newsVO.setRuleName(newsSignalRuleNames); } pageObject.setData(resultList); @@ -997,6 +986,31 @@ public class NewsService { return pageObject; } + private NewsVO toNewsVO(News news, boolean isReviewer) { + NewsVO newsVO = new NewsVO(news); + + newsVO.setSubmitter(this.getNewsLastEditor(news.getId())); + if (isReviewer) { + newsVO.setSubmitterSecond(this.getNewsLastReviewer(news.getId())); + } + + List newsTagList = tagMapper.getNewsTagRelList(news.getId()); + if (!CollectionUtils.isEmpty(newsTagList)) { + List newsConceptLabels = tagMapper.getByIds(newsTagList.stream().map(NewsTagRel::getTagId).collect(Collectors.toList())); + newsVO.setConceptLabels(newsConceptLabels.stream().filter(e -> !Objects.equals(e.getParentId(), 1L)).map(Tag::getDisplayName).collect(Collectors.toList())); + } + + List newsIndustryList = industryMapper.getNewsIndustryRelList(news.getId()); + if (!CollectionUtils.isEmpty(newsIndustryList)) { + List newsIndustryLabels = industryMapper.getByIds(newsIndustryList.stream().map(NewsIndustryRel::getIndustryId).collect(Collectors.toList())); + newsVO.setIndustryLabels(newsIndustryLabels.stream().map(Industry::getDisplayName).collect(Collectors.toList())); + } + + List newsSignalRuleNames = newsSignalRuleRelMapper.getNewsSignalRuleNames(news.getId()); + newsVO.setRuleName(newsSignalRuleNames); + return newsVO; + } + private String getNewsLastEditor(Long newsId) { return getNewsLastOperator(newsId, "送审", "00"); } @@ -1273,6 +1287,116 @@ public class NewsService { } public List getAllListedCompany(String companyName) { - return listedCompanyMapper.queryAll(companyName); - } + return listedCompanyMapper.queryAll(companyName); + } + + public ResultObject getRealTotal(String keyword, String columnParam, Integer status, int page, int size, + Integer last, Integer current, String orderBy, Double minScore, Double maxScore, + String tag, String industry, Long mediaId, + Date datelineFrom, Date datelineTo, Integer deleted, Byte rating, + Integer exclusive, + boolean isReviewer, + boolean isSecondReviewRange, + String includeRuleIds, + String excludeRuleIds, + String companyName) { + + String orderByClause = null; + if (StringUtils.hasText(orderBy)) { + String orderByStr = orderBy; + try { + orderByStr = URLDecoder.decode(orderByStr, "UTF-8"); + } catch(UnsupportedEncodingException e) { + return ResultObject.failed(400, "排序参数异常! orderBy = " + orderBy); + } + orderByStr = orderByStr.replace("publishTime", "publish_time").replace("updateTime", "update_time").replace("createTime", "create_time"); + orderByClause = Stream.of(orderByStr.split(";")).map(e -> { + String[] params = e.split("\\$"); + return "news." + params[0] + " " + params[1]; + }).collect(Collectors.joining(",")); + // 处理空值排在最后面的情况 + if (orderByStr.contains("score")) { + orderByClause = orderByClause.replace("news.score", "news_tags.news_score"); + orderByClause = " IF(ISNULL(news_tags.news_score), 1, 0) asc, " + orderByClause; + } + } else { + orderByClause = (deleted != null && (deleted.intValue() == 1))? "news.update_time desc":"news.publish_time desc"; + } + int offset = 0; + if (current != null) { +// offset = (Math.max(0, page - current)) * size; + offset = (Math.max(0, current - 1)) * size; + } + + if (StringUtils.hasText(columnParam)) { + String[] split = columnParam.split(","); + for (String item : split) { + try { + Integer.parseInt(item); + } catch (NumberFormatException e) { + return ResultObject.failed(400, "栏目列表ID异常! column = " + columnParam); + } + } + } + + List tags = this.getMatchTags(tag); + if (mediaId != null) { + if (ObjectUtils.isEmpty(tags)) { + tags = new ArrayList<>(); + } + tags.add(mediaId); + } + List industries = null; + if (!ObjectUtils.isEmpty(industry)) { + try { + String industryStr = URLDecoder.decode(industry, "UTF-8"); + ObjectMapper objectMapper = new ObjectMapper(); + industries = objectMapper.readValue(industryStr, new TypeReference>() {}); + } catch (UnsupportedEncodingException|JsonProcessingException e) { + log.error("资讯精选列表页面的行业分类参数异常!", e); + return ResultObject.failed(500, "服务器错误,请联系系统管理员!"); + } + } + + List keywords = new ArrayList<>(); + if (StringUtils.hasText(keyword)) { + keywords.addAll(Arrays.asList(keyword.trim().split("\\s+"))); + } + + List includeSignalRules = null; + if (StringUtils.hasText(includeRuleIds)) { + includeSignalRules = Arrays.stream(includeRuleIds.split(",")).map(Long::parseLong).collect(Collectors.toList()); + } + List excludeSignalRules = null; + if (StringUtils.hasText(excludeRuleIds)) { + excludeSignalRules = Arrays.stream(excludeRuleIds.split(",")).map(Long::parseLong).collect(Collectors.toList()); + } + + try { + int total = newsMapper.queryTotal(keywords,minScore, maxScore, columnParam, status, tags, industries, datelineFrom, datelineTo, deleted, rating,exclusive, null, null, includeSignalRules, excludeSignalRules, companyName, false); + return ResultObject.success(total); + } catch (Exception e) { + log.error("获取新闻总数异常!", e); + return ResultObject.failed(500, "服务器错误,请联系系统管理员!"); + } + } + + public ResultObject> requestNewsByApi2() { + List result = newsMapper.queryNewsByApi2(); + if (result.size() < 200) { + int limit = 200 - result.size(); + result.addAll(newsMapper.queryNewsByApi3(limit)); + } + + for(NewsApi2VO newsApi2VO: result) { + if (newsApi2VO.getPublished()) { + newsApi2VO.setSource("中国证券报"); + } + List newsSignalRuleNames = newsSignalRuleRelMapper.getNewsSignalRuleNames(newsApi2VO.getId()); + if (!CollectionUtils.isEmpty(newsSignalRuleNames) && newsSignalRuleNames.contains("海外宏观")) { + newsApi2VO.setSignalRule("海外宏观"); + } + } + return ResultObject.success(result); + } }