孙永军 1 年間 前
コミット
c6cb29d605
32 ファイル変更984 行追加4 行削除
  1. 18 0
      src/main/java/com/sxtvs/open/api/chat/controller/KimiChatController.java
  2. 32 0
      src/main/java/com/sxtvs/open/api/chat/controller/KimiChatGroupController.java
  3. 24 0
      src/main/java/com/sxtvs/open/api/chat/dto/KimiRequest.java
  4. 34 0
      src/main/java/com/sxtvs/open/api/chat/dto/KimiResponse.java
  5. 41 0
      src/main/java/com/sxtvs/open/api/chat/dto/KimiStreamResponse.java
  6. 16 0
      src/main/java/com/sxtvs/open/api/chat/dto/Message.java
  7. 39 0
      src/main/java/com/sxtvs/open/api/chat/entity/KimiChat.java
  8. 34 0
      src/main/java/com/sxtvs/open/api/chat/entity/KimiChatGroup.java
  9. 16 0
      src/main/java/com/sxtvs/open/api/chat/mapper/KimiChatGroupMapper.java
  10. 16 0
      src/main/java/com/sxtvs/open/api/chat/mapper/KimiChatMapper.java
  11. 16 0
      src/main/java/com/sxtvs/open/api/chat/service/IKimiChatGroupService.java
  12. 16 0
      src/main/java/com/sxtvs/open/api/chat/service/IKimiChatService.java
  13. 35 0
      src/main/java/com/sxtvs/open/api/chat/service/impl/KimiChatGroupServiceImpl.java
  14. 150 0
      src/main/java/com/sxtvs/open/api/chat/service/impl/KimiChatServiceImpl.java
  15. 35 0
      src/main/java/com/sxtvs/open/api/odata/controller/WxgzhArticleController.java
  16. 18 0
      src/main/java/com/sxtvs/open/api/odata/controller/WxgzhDailyController.java
  17. 18 0
      src/main/java/com/sxtvs/open/api/odata/controller/WxgzhGroupController.java
  18. 13 0
      src/main/java/com/sxtvs/open/api/odata/dto/wx/HospitalDTO.java
  19. 67 0
      src/main/java/com/sxtvs/open/api/odata/entity/WxgzhArticle.java
  20. 96 0
      src/main/java/com/sxtvs/open/api/odata/entity/WxgzhDaily.java
  21. 36 0
      src/main/java/com/sxtvs/open/api/odata/entity/WxgzhGroup.java
  22. 16 0
      src/main/java/com/sxtvs/open/api/odata/mapper/WxgzhArticleMapper.java
  23. 16 0
      src/main/java/com/sxtvs/open/api/odata/mapper/WxgzhDailyMapper.java
  24. 16 0
      src/main/java/com/sxtvs/open/api/odata/mapper/WxgzhGroupMapper.java
  25. 16 0
      src/main/java/com/sxtvs/open/api/odata/service/IWxgzhArticleService.java
  26. 16 0
      src/main/java/com/sxtvs/open/api/odata/service/IWxgzhDailyService.java
  27. 16 0
      src/main/java/com/sxtvs/open/api/odata/service/IWxgzhGroupService.java
  28. 35 0
      src/main/java/com/sxtvs/open/api/odata/service/impl/WxgzhArticleServiceImpl.java
  29. 20 0
      src/main/java/com/sxtvs/open/api/odata/service/impl/WxgzhDailyServiceImpl.java
  30. 28 0
      src/main/java/com/sxtvs/open/api/odata/service/impl/WxgzhGroupServiceImpl.java
  31. 18 4
      src/main/java/com/sxtvs/open/api/review/controller/SseController.java
  32. 17 0
      src/main/java/com/sxtvs/open/api/review/service/impl/SSEService.java

+ 18 - 0
src/main/java/com/sxtvs/open/api/chat/controller/KimiChatController.java

@@ -0,0 +1,18 @@
+package com.sxtvs.open.api.chat.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-25
+ */
+@RestController
+@RequestMapping("/chat/kimiChat")
+public class KimiChatController {
+
+}

+ 32 - 0
src/main/java/com/sxtvs/open/api/chat/controller/KimiChatGroupController.java

@@ -0,0 +1,32 @@
+package com.sxtvs.open.api.chat.controller;
+
+import com.sxtvs.open.api.chat.entity.KimiChatGroup;
+import com.sxtvs.open.api.chat.service.impl.KimiChatGroupServiceImpl;
+import com.sxtvs.open.core.auth.LoginRequired;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-25
+ */
+@RestController
+@RequestMapping("/chat/group")
+public class KimiChatGroupController {
+
+    @Resource
+    private KimiChatGroupServiceImpl  kimiChatGroupService;
+
+    @PostMapping("/create")
+    @LoginRequired
+    public KimiChatGroup create(@RequestBody KimiChatGroup kimiChatGroup) {
+        return kimiChatGroupService.create(kimiChatGroup.getTitle());
+    }
+}

+ 24 - 0
src/main/java/com/sxtvs/open/api/chat/dto/KimiRequest.java

@@ -0,0 +1,24 @@
+package com.sxtvs.open.api.chat.dto;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+public class KimiRequest {
+
+    private String model;
+    private Integer max_tokens;
+    private Double temperature;
+//    private Double top_p;
+//    private Double frequency_penalty;
+//    private Double presence_penalty;
+//    private Integer n;
+//    private String stop;
+    private Boolean  stream;
+
+    private List<Message> messages;
+
+}

+ 34 - 0
src/main/java/com/sxtvs/open/api/chat/dto/KimiResponse.java

@@ -0,0 +1,34 @@
+package com.sxtvs.open.api.chat.dto;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+public class KimiResponse {
+    private String id;
+    private String object;
+    private int created;
+    private String model;
+    private Usage usage;
+    private List<Choice> choices;
+
+    @Data
+    @NoArgsConstructor
+    public static  class Usage{
+        private int prompt_tokens;
+        private int completion_tokens;
+        private int total_tokens;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class Choice{
+        private int index;
+        private Message message;
+        private String finish_reason;
+    }
+
+}

+ 41 - 0
src/main/java/com/sxtvs/open/api/chat/dto/KimiStreamResponse.java

@@ -0,0 +1,41 @@
+package com.sxtvs.open.api.chat.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class KimiStreamResponse {
+
+    @JSONField(name = "id")
+    private String id;
+    @JSONField(name = "object")
+    private String object;
+    @JSONField(name = "created")
+    private Integer created;
+    @JSONField(name = "model")
+    private String model;
+    @JSONField(name = "choices")
+    private List<ChoicesDTO> choices;
+
+    @NoArgsConstructor
+    @Data
+    public static class ChoicesDTO {
+        @JSONField(name = "index")
+        private Integer index;
+        @JSONField(name = "delta")
+        private DeltaDTO delta;
+        @JSONField(name = "finish_reason")
+        private Object finishReason;
+
+        @NoArgsConstructor
+        @Data
+        public static class DeltaDTO {
+            @JSONField(name = "content")
+            private String content;
+        }
+    }
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/chat/dto/Message.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.chat.dto;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public  class Message {
+    private String role;
+    private String content;
+
+    public Message(String role, String content) {
+        this.role = role;
+        this.content = content;
+    }
+}

+ 39 - 0
src/main/java/com/sxtvs/open/api/chat/entity/KimiChat.java

@@ -0,0 +1,39 @@
+package com.sxtvs.open.api.chat.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-25
+ */
+@Getter
+@Setter
+@TableName("kimi_chat")
+public class KimiChat implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id")
+    private String id;
+
+    private Long groupId;
+
+    private Integer index;
+
+    private String role;
+
+    private String content;
+
+    private LocalDateTime createTime;
+    private LocalDateTime updateTime;
+}

+ 34 - 0
src/main/java/com/sxtvs/open/api/chat/entity/KimiChatGroup.java

@@ -0,0 +1,34 @@
+package com.sxtvs.open.api.chat.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-25
+ */
+@Getter
+@Setter
+@TableName("kimi_chat_group")
+public class KimiChatGroup implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Long uid;
+
+    private String title;
+
+    private LocalDateTime createTime;
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/chat/mapper/KimiChatGroupMapper.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.chat.mapper;
+
+import com.sxtvs.open.api.chat.entity.KimiChatGroup;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-25
+ */
+public interface KimiChatGroupMapper extends BaseMapper<KimiChatGroup> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/chat/mapper/KimiChatMapper.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.chat.mapper;
+
+import com.sxtvs.open.api.chat.entity.KimiChat;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-25
+ */
+public interface KimiChatMapper extends BaseMapper<KimiChat> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/chat/service/IKimiChatGroupService.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.chat.service;
+
+import com.sxtvs.open.api.chat.entity.KimiChatGroup;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-25
+ */
+public interface IKimiChatGroupService extends IService<KimiChatGroup> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/chat/service/IKimiChatService.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.chat.service;
+
+import com.sxtvs.open.api.chat.entity.KimiChat;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-25
+ */
+public interface IKimiChatService extends IService<KimiChat> {
+
+}

+ 35 - 0
src/main/java/com/sxtvs/open/api/chat/service/impl/KimiChatGroupServiceImpl.java

@@ -0,0 +1,35 @@
+package com.sxtvs.open.api.chat.service.impl;
+
+import com.sxtvs.open.api.chat.entity.KimiChatGroup;
+import com.sxtvs.open.api.chat.mapper.KimiChatGroupMapper;
+import com.sxtvs.open.api.chat.service.IKimiChatGroupService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sxtvs.open.core.auth.AESUtil;
+import com.sxtvs.open.core.auth.HttpContextUtil;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Optional;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-25
+ */
+@Service
+public class KimiChatGroupServiceImpl extends ServiceImpl<KimiChatGroupMapper, KimiChatGroup> implements IKimiChatGroupService {
+
+    public KimiChatGroup create(String content){
+        KimiChatGroup kimiChatGroup = new KimiChatGroup();
+        Optional<String> token = HttpContextUtil.getToken();
+        String uid = AESUtil.decryptStr(token.get());
+        kimiChatGroup.setUid(Long.valueOf(uid));
+        kimiChatGroup.setTitle(content);
+        kimiChatGroup.setCreateTime(LocalDateTime.now());
+        save(kimiChatGroup);
+        return kimiChatGroup;
+    }
+}

+ 150 - 0
src/main/java/com/sxtvs/open/api/chat/service/impl/KimiChatServiceImpl.java

@@ -0,0 +1,150 @@
+package com.sxtvs.open.api.chat.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSON;
+import com.sxtvs.open.api.chat.dto.KimiRequest;
+import com.sxtvs.open.api.chat.dto.KimiResponse;
+import com.sxtvs.open.api.chat.dto.KimiStreamResponse;
+import com.sxtvs.open.api.chat.dto.Message;
+import com.sxtvs.open.api.chat.entity.KimiChat;
+import com.sxtvs.open.api.chat.entity.KimiChatGroup;
+import com.sxtvs.open.api.chat.mapper.KimiChatMapper;
+import com.sxtvs.open.api.chat.service.IKimiChatService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sxtvs.open.api.review.dto.AuthReq;
+import com.sxtvs.open.api.review.service.impl.SSEService;
+import com.sxtvs.open.core.auth.AESUtil;
+import com.sxtvs.open.core.auth.HttpContextUtil;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.TextUtils;
+import org.springframework.http.*;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.net.http.WebSocket;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.CompletionStage;
+import java.util.concurrent.Flow;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-25
+ */
+@Service
+@Slf4j
+public class KimiChatServiceImpl extends ServiceImpl<KimiChatMapper, KimiChat> implements IKimiChatService {
+
+    private final RestTemplate restTemplate = new RestTemplate();
+
+    private final String token = "sk-eKQV5KAqkQHINWZV9IBbsuefO21A6oTToY9pv9nyDeXPH0zu";
+
+    @Resource
+    private KimiChatGroupServiceImpl kimiChatGroupService;
+
+    @Resource
+    private SSEService sseService;
+
+    private HttpHeaders getHeader(){
+        HttpHeaders headers = new HttpHeaders();
+        //headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.set("Authorization", "Bearer " + token);
+        return headers;
+    }
+
+    public void chatCompletions(KimiRequest kimiRequest, Long dataId) {
+
+
+
+        HttpClient client = HttpClient.newBuilder().build();
+
+        URI uri = URI.create("https://api.moonshot.cn/v1/chat/completions"); // 替换为你的SSE服务器地址
+        HttpRequest request = HttpRequest.newBuilder()
+                .uri(uri)
+                .header("Accept", "text/event-stream")
+//                .header("Content-Type", "application/json")
+                .header("Authorization", "Bearer " + token)
+                .POST( HttpRequest.BodyPublishers.ofString(JSON.toJSONString(
+                    kimiRequest
+                )))
+                .build();
+
+        // 发送请求并接收响应
+        client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
+                .thenApply(HttpResponse::body)
+                .thenAccept(x -> {
+                    sseService.sendData( dataId, x );
+                    stream2db(x.substring(6), dataId);
+                    log.info("流数据 -- ",x);
+                })
+                .join();
+
+    }
+
+    private void stream2db(String resp, Long groupId){
+        KimiStreamResponse kimiResponse =  JSON.parseObject(resp, KimiStreamResponse.class);
+        if (kimiResponse == null || kimiResponse.getChoices() == null || kimiResponse.getChoices().isEmpty()){
+            return;
+        }
+        KimiChat kimiChat = lambdaQuery().eq(KimiChat::getId, kimiResponse.getId()).one();
+        if  (kimiChat == null) {
+            kimiChat = new KimiChat();
+            kimiChat.setId(kimiResponse.getId());
+            kimiChat.setGroupId(groupId);
+            kimiChat.setIndex(kimiResponse.getChoices().get(0).getIndex());
+            kimiChat.setRole("system");
+            kimiChat.setContent(kimiResponse.getChoices().stream().map(x -> x.getDelta().getContent( )).reduce((a, b) -> a + b).get());
+            kimiChat.setCreateTime(LocalDateTime.now());
+            save(kimiChat);
+        }else {
+            kimiChat.setContent(
+                    kimiChat.getContent() + kimiResponse.getChoices().stream().map(x -> x.getDelta().getContent( )).reduce((a, b) -> a + b).get()
+            );
+            kimiChat.setUpdateTime(LocalDateTime.now());
+            updateById(kimiChat);
+        }
+    }
+
+    public void create(KimiChat  kimiChat) {
+
+        kimiChat.setId("user-" + IdUtil.simpleUUID());
+        kimiChat.setRole("user");
+        kimiChat.setCreateTime(LocalDateTime.now());
+        save(kimiChat);
+
+        KimiRequest kimiRequest = new KimiRequest();
+        kimiRequest.setModel("moonshot-v1-8k");
+        kimiRequest.setTemperature(0.3D);
+        kimiRequest.setStream(true);
+        kimiRequest.setMax_tokens(4096);
+
+        List<Message> messageList = new ArrayList<>();
+
+        lambdaQuery().eq( KimiChat::getGroupId, kimiChat.getGroupId() ).list().forEach( x -> {
+            Message message = new Message();
+            message.setRole(x.getRole());
+            message.setContent(x.getContent());
+            messageList.add(message);
+        });
+
+        kimiRequest.setMessages(messageList);
+
+        chatCompletions( kimiRequest, kimiChat.getGroupId());
+
+    }
+}

+ 35 - 0
src/main/java/com/sxtvs/open/api/odata/controller/WxgzhArticleController.java

@@ -0,0 +1,35 @@
+package com.sxtvs.open.api.odata.controller;
+
+import com.sxtvs.open.api.odata.dto.wx.HospitalDTO;
+import com.sxtvs.open.api.odata.entity.WxgzhArticle;
+import com.sxtvs.open.api.odata.service.impl.WxgzhArticleServiceImpl;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+@RestController
+@RequestMapping("/wx")
+public class WxgzhArticleController {
+
+    @Resource
+    private WxgzhArticleServiceImpl wxgzhArticleService;
+
+    @PostMapping("hospital")
+    public List<WxgzhArticle> hospitalArticleList(@RequestBody HospitalDTO hospitalDTO) {
+        return wxgzhArticleService.hospitalArticleList(hospitalDTO.getStart(), hospitalDTO.getEnd().plusDays(1));
+    }
+}

+ 18 - 0
src/main/java/com/sxtvs/open/api/odata/controller/WxgzhDailyController.java

@@ -0,0 +1,18 @@
+package com.sxtvs.open.api.odata.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+@RestController
+@RequestMapping("/review/wxgzhDaily")
+public class WxgzhDailyController {
+
+}

+ 18 - 0
src/main/java/com/sxtvs/open/api/odata/controller/WxgzhGroupController.java

@@ -0,0 +1,18 @@
+package com.sxtvs.open.api.odata.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+@RestController
+@RequestMapping("/review/wxgzhGroup")
+public class WxgzhGroupController {
+
+}

+ 13 - 0
src/main/java/com/sxtvs/open/api/odata/dto/wx/HospitalDTO.java

@@ -0,0 +1,13 @@
+package com.sxtvs.open.api.odata.dto.wx;
+
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+public class HospitalDTO {
+    private LocalDate start;
+
+    private LocalDate end;
+}

+ 67 - 0
src/main/java/com/sxtvs/open/api/odata/entity/WxgzhArticle.java

@@ -0,0 +1,67 @@
+package com.sxtvs.open.api.odata.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+@Getter
+@Setter
+@TableName("wxgzh_article")
+public class WxgzhArticle implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableField("authorImgurl")
+    private String authorImgurl;
+
+    private Integer original;
+
+    @TableField("browseTime")
+    private Integer browseTime;
+
+    private String author;
+
+    private String published;
+
+    @TableField("wxSn")
+    private String wxSn;
+
+    private String title;
+
+    @TableField("commentTime")
+    private Integer commentTime;
+
+    private String url;
+
+    @TableField("coverImgUrl")
+    private String coverImgUrl;
+
+    private String biz;
+
+    @TableField("createTime")
+    private String createTime;
+
+    @TableField("serialId")
+    private Integer serialId;
+
+    @TableField("mdId")
+    private String mdId;
+
+    @TableField("authorAcount")
+    private String authorAcount;
+
+    private Integer authentication;
+
+    @TableField("lookNum")
+    private Integer lookNum;
+}

+ 96 - 0
src/main/java/com/sxtvs/open/api/odata/entity/WxgzhDaily.java

@@ -0,0 +1,96 @@
+package com.sxtvs.open.api.odata.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDate;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+@Getter
+@Setter
+@TableName("wxgzh_daily")
+public class WxgzhDaily implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Integer headlinesArticlesReads;
+
+    private Integer originalArticlesPraises;
+
+    private Integer networkGroupId;
+
+    private Integer isBar;
+
+    private String biz;
+
+    private Integer keyFlag;
+
+    private Integer dataTag;
+
+    private Integer headlinesArticlesPraises;
+
+    private Integer topPraises;
+
+    private Integer readsOverTenThArticles;
+
+    private Integer minReads;
+
+    private Integer minPraises;
+
+    private String authentication;
+
+    private Integer init;
+
+    private String authorImgurl;
+
+    private Integer fansNum;
+
+    private Integer topReads;
+
+    private String author;
+
+    private Integer reads;
+
+    private LocalDate endTime;
+
+    private Integer published;
+
+    private Integer originalArticlesReads;
+
+    private Integer releases;
+
+    private Integer commentNum;
+
+    private LocalDate startTime;
+
+    private String searchDate;
+
+    private Integer headlinesArticles;
+
+    private String pdi;
+
+    private Integer articles;
+
+    private Integer originalArticles;
+
+    private Integer praises;
+
+    private String account;
+
+    private Integer lookNum;
+
+    private String nickName;
+}

+ 36 - 0
src/main/java/com/sxtvs/open/api/odata/entity/WxgzhGroup.java

@@ -0,0 +1,36 @@
+package com.sxtvs.open.api.odata.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+@Getter
+@Setter
+@TableName("wxgzh_group")
+public class WxgzhGroup implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String nickName;
+
+    private String groupCode;
+
+    private LocalDateTime createTime;
+
+    private Integer status;
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/odata/mapper/WxgzhArticleMapper.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.odata.mapper;
+
+import com.sxtvs.open.api.odata.entity.WxgzhArticle;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+public interface WxgzhArticleMapper extends BaseMapper<WxgzhArticle> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/odata/mapper/WxgzhDailyMapper.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.odata.mapper;
+
+import com.sxtvs.open.api.odata.entity.WxgzhDaily;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+public interface WxgzhDailyMapper extends BaseMapper<WxgzhDaily> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/odata/mapper/WxgzhGroupMapper.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.odata.mapper;
+
+import com.sxtvs.open.api.odata.entity.WxgzhGroup;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+public interface WxgzhGroupMapper extends BaseMapper<WxgzhGroup> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/odata/service/IWxgzhArticleService.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.odata.service;
+
+import com.sxtvs.open.api.odata.entity.WxgzhArticle;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+public interface IWxgzhArticleService extends IService<WxgzhArticle> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/odata/service/IWxgzhDailyService.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.odata.service;
+
+import com.sxtvs.open.api.odata.entity.WxgzhDaily;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+public interface IWxgzhDailyService extends IService<WxgzhDaily> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/odata/service/IWxgzhGroupService.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.odata.service;
+
+import com.sxtvs.open.api.odata.entity.WxgzhGroup;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+public interface IWxgzhGroupService extends IService<WxgzhGroup> {
+
+}

+ 35 - 0
src/main/java/com/sxtvs/open/api/odata/service/impl/WxgzhArticleServiceImpl.java

@@ -0,0 +1,35 @@
+package com.sxtvs.open.api.odata.service.impl;
+
+import com.sxtvs.open.api.odata.entity.WxgzhArticle;
+import com.sxtvs.open.api.odata.entity.WxgzhGroup;
+import com.sxtvs.open.api.odata.mapper.WxgzhArticleMapper;
+import com.sxtvs.open.api.odata.service.IWxgzhArticleService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+@Service
+public class WxgzhArticleServiceImpl extends ServiceImpl<WxgzhArticleMapper, WxgzhArticle> implements IWxgzhArticleService {
+
+
+    @Resource
+    private WxgzhGroupServiceImpl wxgzhGroupService;
+
+    public List<WxgzhArticle> hospitalArticleList(LocalDate start, LocalDate end) {
+        return lambdaQuery().ge(WxgzhArticle::getPublished, start).le(WxgzhArticle::getPublished, end)
+                .in(WxgzhArticle::getAuthor, wxgzhGroupService.hospitalList())
+                .orderByDesc(WxgzhArticle::getBrowseTime).last("limit 20").list();
+    }
+}

+ 20 - 0
src/main/java/com/sxtvs/open/api/odata/service/impl/WxgzhDailyServiceImpl.java

@@ -0,0 +1,20 @@
+package com.sxtvs.open.api.odata.service.impl;
+
+import com.sxtvs.open.api.odata.entity.WxgzhDaily;
+import com.sxtvs.open.api.odata.mapper.WxgzhDailyMapper;
+import com.sxtvs.open.api.odata.service.IWxgzhDailyService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+@Service
+public class WxgzhDailyServiceImpl extends ServiceImpl<WxgzhDailyMapper, WxgzhDaily> implements IWxgzhDailyService {
+
+}

+ 28 - 0
src/main/java/com/sxtvs/open/api/odata/service/impl/WxgzhGroupServiceImpl.java

@@ -0,0 +1,28 @@
+package com.sxtvs.open.api.odata.service.impl;
+
+import com.sxtvs.open.api.odata.entity.WxgzhGroup;
+import com.sxtvs.open.api.odata.mapper.WxgzhGroupMapper;
+import com.sxtvs.open.api.odata.service.IWxgzhGroupService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-03-14
+ */
+@Service
+public class WxgzhGroupServiceImpl extends ServiceImpl<WxgzhGroupMapper, WxgzhGroup> implements IWxgzhGroupService {
+
+
+    public List<String> hospitalList() {
+        return lambdaQuery().eq(WxgzhGroup::getGroupCode, "HOSPITAL").eq(WxgzhGroup::getStatus, 0).list().stream()
+                .map(WxgzhGroup::getNickName).collect(Collectors.toList());
+    }
+}

+ 18 - 4
src/main/java/com/sxtvs/open/api/review/controller/SseController.java

@@ -1,5 +1,7 @@
 package com.sxtvs.open.api.review.controller;
 
+import com.sxtvs.open.api.chat.entity.KimiChat;
+import com.sxtvs.open.api.chat.service.impl.KimiChatServiceImpl;
 import com.sxtvs.open.api.review.service.impl.SSEService;
 import com.sxtvs.open.core.advice.NoAPIResponse;
 import com.sxtvs.open.core.auth.LoginRequired;
@@ -7,10 +9,7 @@ import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.GetMapping;
-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.bind.annotation.*;
 import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
 
 import java.io.IOException;
@@ -32,4 +31,19 @@ public class SseController {
 
         return sseEmitter;
     }
+
+
+    @Resource
+    private KimiChatServiceImpl kimiChatService;
+
+    @PostMapping(path = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+    @NoAPIResponse
+    public SseEmitter handleSsePost(@RequestBody KimiChat kimiChat) throws IOException {
+        SseEmitter sseEmitter = new SseEmitter(0L); // 设置超时时间
+        sseService.monitor(kimiChat.getGroupId(), sseEmitter);
+        kimiChatService.create(kimiChat);
+        sseEmitter.send(SseEmitter.event().name("data").data(" "));
+
+        return sseEmitter;
+    }
 }

+ 17 - 0
src/main/java/com/sxtvs/open/api/review/service/impl/SSEService.java

@@ -41,4 +41,21 @@ public class SSEService {
         return false;
 
     }
+
+    public void monitor(Long groupId, SseEmitter sseEmitter) {
+        sseMap.put(groupId, sseEmitter);
+    }
+
+    public Boolean sendData(Long dataId, Object data) {
+        if (sseMap.containsKey(dataId)){
+            SseEmitter sseEmitter = sseMap.get(dataId);
+            try {
+                sseEmitter.send(SseEmitter.event().name("data").data(data));
+                return true;
+            } catch (IOException e) {
+                return false;
+            }
+        }
+        return false;
+    }
 }