孙永军 1 gadu atpakaļ
vecāks
revīzija
31ae490912

+ 50 - 0
src/main/java/com/sxtvs/open/api/bid/controller/BidFilesController.java

@@ -0,0 +1,50 @@
+package com.sxtvs.open.api.bid.controller;
+
+import com.sxtvs.open.api.bid.dto.FileImportDTO;
+import com.sxtvs.open.api.bid.service.impl.BidFilesServiceImpl;
+import com.sxtvs.open.api.bid.service.impl.BidProjectServiceImpl;
+import com.sxtvs.open.api.h5template.service.impl.OSSService;
+import com.sxtvs.open.api.review.entity.ReviewImgRecord;
+import com.sxtvs.open.core.auth.LoginRequired;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 标书文件 前端控制器
+ * </p>
+ *
+ * @author syj
+ * @since 2024-04-23
+ */
+@RestController
+@RequestMapping("/bid/files")
+public class BidFilesController {
+
+    @Resource
+    private BidProjectServiceImpl bidProjectService;
+
+    private OSSService ossService;
+
+    @PostMapping("create")
+    @LoginRequired
+    public void create(@RequestBody FileImportDTO fileImportDTO){
+        bidProjectService.fileImport(fileImportDTO);
+    }
+
+    @PostMapping("uploads")
+    @LoginRequired
+    public List<String> upload(@RequestParam(value = "id") Long id, @RequestParam("files") MultipartFile[] file){
+        List<String> urls = new ArrayList<>();
+        for( MultipartFile multipartFile : file){
+            String s = ossService.bidPut(multipartFile, id);
+            urls.add(s);
+        }
+        return urls;
+    }
+
+}

+ 49 - 0
src/main/java/com/sxtvs/open/api/bid/controller/BidProjectController.java

@@ -0,0 +1,49 @@
+package com.sxtvs.open.api.bid.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sxtvs.open.api.bid.entity.BidProject;
+import com.sxtvs.open.api.bid.service.impl.BidProjectServiceImpl;
+import com.sxtvs.open.core.auth.LoginRequired;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 标书项目 前端控制器
+ * </p>
+ *
+ * @author syj
+ * @since 2024-04-23
+ */
+@RestController
+@RequestMapping("/bid/project")
+public class BidProjectController {
+
+    @Resource
+    private BidProjectServiceImpl bidProjectService;
+
+    @PostMapping("create")
+    @LoginRequired
+    public void create(@RequestBody BidProject bidProject) {
+        bidProjectService.create(bidProject);
+    }
+
+    @PostMapping("update")
+    @LoginRequired
+    public void update(@RequestBody BidProject bidProject) {
+        bidProjectService.update(bidProject);
+    }
+
+    @GetMapping("delete/{id}")
+    @LoginRequired
+    public void delete(@PathVariable Long id) {
+        bidProjectService.delete(id);
+    }
+
+    @PostMapping("list")
+    @LoginRequired
+    public Page<BidProject> page(@RequestBody com.sxtvs.open.api.bid.dto.PageKeywordDTO pageKeywordDTO) {
+        return bidProjectService.bidProjectPage(pageKeywordDTO);
+    }
+
+}

+ 15 - 0
src/main/java/com/sxtvs/open/api/bid/dto/FileImportDTO.java

@@ -0,0 +1,15 @@
+package com.sxtvs.open.api.bid.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FileImportDTO {
+
+    private Long projectId;
+
+    private String baseFile;
+
+    private List<String> compareFiles;
+}

+ 12 - 0
src/main/java/com/sxtvs/open/api/bid/dto/PageKeywordDTO.java

@@ -0,0 +1,12 @@
+package com.sxtvs.open.api.bid.dto;
+
+import lombok.Data;
+
+@Data
+public class PageKeywordDTO {
+    private Integer page;
+
+    private Integer pageSize;
+
+    private String keyword;
+}

+ 38 - 0
src/main/java/com/sxtvs/open/api/bid/entity/BidFiles.java

@@ -0,0 +1,38 @@
+package com.sxtvs.open.api.bid.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 标书文件
+ * </p>
+ *
+ * @author syj
+ * @since 2024-04-23
+ */
+@Getter
+@Setter
+@TableName("bid_files")
+public class BidFiles implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private Long projectId;
+
+    private String file;
+
+    private Integer fileType;
+
+    private Object similarity;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+}

+ 44 - 0
src/main/java/com/sxtvs/open/api/bid/entity/BidProject.java

@@ -0,0 +1,44 @@
+package com.sxtvs.open.api.bid.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 标书项目
+ * </p>
+ *
+ * @author syj
+ * @since 2024-04-23
+ */
+@Getter
+@Setter
+@TableName("bid_project")
+public class BidProject implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Long uid;
+
+    private String projectName;
+
+    private Integer status;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @TableField(exist = false)
+    private List<BidFiles> bidFiles;
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/bid/mapper/BidFilesMapper.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.bid.mapper;
+
+import com.sxtvs.open.api.bid.entity.BidFiles;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 标书文件 Mapper 接口
+ * </p>
+ *
+ * @author syj
+ * @since 2024-04-23
+ */
+public interface BidFilesMapper extends BaseMapper<BidFiles> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/bid/mapper/BidProjectMapper.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.bid.mapper;
+
+import com.sxtvs.open.api.bid.entity.BidProject;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 标书项目 Mapper 接口
+ * </p>
+ *
+ * @author syj
+ * @since 2024-04-23
+ */
+public interface BidProjectMapper extends BaseMapper<BidProject> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/bid/service/IBidFilesService.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.bid.service;
+
+import com.sxtvs.open.api.bid.entity.BidFiles;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 标书文件 服务类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-04-23
+ */
+public interface IBidFilesService extends IService<BidFiles> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/bid/service/IBidProjectService.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.bid.service;
+
+import com.sxtvs.open.api.bid.entity.BidProject;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 标书项目 服务类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-04-23
+ */
+public interface IBidProjectService extends IService<BidProject> {
+
+}

+ 61 - 0
src/main/java/com/sxtvs/open/api/bid/service/impl/BidFilesServiceImpl.java

@@ -0,0 +1,61 @@
+package com.sxtvs.open.api.bid.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.sxtvs.open.api.bid.dto.FileImportDTO;
+import com.sxtvs.open.api.bid.entity.BidFiles;
+import com.sxtvs.open.api.bid.mapper.BidFilesMapper;
+import com.sxtvs.open.api.bid.service.IBidFilesService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import jakarta.annotation.Resource;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 标书文件 服务实现类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-04-23
+ */
+@Service
+public class BidFilesServiceImpl extends ServiceImpl<BidFilesMapper, BidFiles> implements IBidFilesService {
+
+    public List<BidFiles> byProject(Long id){
+        return lambdaQuery().eq(BidFiles::getProjectId, id).list();
+    }
+
+    @Transactional
+    public void create(FileImportDTO fileImportDTO){
+        List<BidFiles> bidFiles = new ArrayList<>();
+        BidFiles base = new BidFiles();
+
+        base.setProjectId(fileImportDTO.getProjectId());
+        base.setFile(fileImportDTO.getBaseFile());
+        base.setFileType(1);
+
+        base.setCreateTime(LocalDateTime.now());
+        bidFiles.add(base);
+
+        for(String file : fileImportDTO.getCompareFiles()){
+            BidFiles bf = new BidFiles();
+            bf.setProjectId(fileImportDTO.getProjectId());
+            bf.setFile(file);
+            bf.setFileType(2);
+            bf.setCreateTime(LocalDateTime.now());
+            bidFiles.add(bf);
+        }
+        saveBatch(bidFiles);
+
+    }
+
+    public void deleteByProjectId(Long id){
+        lambdaUpdate().eq(BidFiles::getProjectId, id).remove();
+    }
+}

+ 98 - 0
src/main/java/com/sxtvs/open/api/bid/service/impl/BidProjectServiceImpl.java

@@ -0,0 +1,98 @@
+package com.sxtvs.open.api.bid.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sxtvs.open.api.bid.dto.FileImportDTO;
+import com.sxtvs.open.api.bid.dto.PageKeywordDTO;
+import com.sxtvs.open.api.bid.entity.BidProject;
+import com.sxtvs.open.api.bid.mapper.BidProjectMapper;
+import com.sxtvs.open.api.bid.service.IBidProjectService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sxtvs.open.core.advice.BizException;
+import com.sxtvs.open.core.auth.AESUtil;
+import com.sxtvs.open.core.auth.HttpContextUtil;
+import jakarta.annotation.Resource;
+import org.apache.http.util.TextUtils;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 标书项目 服务实现类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-04-23
+ */
+@Service
+public class BidProjectServiceImpl extends ServiceImpl<BidProjectMapper, BidProject> implements IBidProjectService {
+
+
+    @Resource
+    private BidFilesServiceImpl bidFilesService;
+
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
+
+    public void create(BidProject bidProject)
+    {
+        Optional<String> token = HttpContextUtil.getToken();
+        Long uid = Long.valueOf(AESUtil.decryptStr(token.get()));
+        bidProject.setUid(uid);
+        bidProject.setCreateTime(LocalDateTime.now());
+        this.save(bidProject);
+    }
+
+    public void update(BidProject bidProject)
+    {
+        BidProject bp = getById(bidProject.getId());
+        bp.setProjectName(bidProject.getProjectName());
+        this.updateById(bidProject);
+    }
+
+    @Transactional
+    public void delete(Long id)
+    {
+        bidFilesService.deleteByProjectId(id);
+        this.removeById(id);
+    }
+
+    public Page<BidProject> bidProjectPage(PageKeywordDTO pageKeywordDTO){
+        Optional<String> token = HttpContextUtil.getToken();
+        Long uid = Long.valueOf(AESUtil.decryptStr(token.get()));
+        Page<BidProject> objectPage = new Page<>(pageKeywordDTO.getPage(), pageKeywordDTO.getPageSize());
+        LambdaQueryWrapper<BidProject> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(BidProject::getUid, uid);
+        if(!TextUtils.isEmpty(pageKeywordDTO.getKeyword())){
+            wrapper.like(BidProject::getProjectName, pageKeywordDTO.getKeyword());
+        }
+        Page<BidProject> page = this.page(objectPage, wrapper);
+        page.setRecords(page.getRecords().stream()
+                .peek(bidProject -> bidProject.setBidFiles(bidFilesService.byProject(bidProject.getId())))
+                .collect(Collectors.toList()));
+        return page;
+    }
+
+    @Transactional
+    public void fileImport(FileImportDTO fileImportDTO){
+
+        BidProject bidProject = getById(fileImportDTO.getProjectId());
+
+        if (bidProject.getStatus() > 0){
+            throw new BizException("请勿重复上传");
+        }
+
+        bidProject.setStatus(1);
+        updateById(bidProject);
+
+        bidFilesService.create(fileImportDTO);
+        stringRedisTemplate.convertAndSend("bid_compare", String.valueOf(fileImportDTO.getProjectId()));
+    }
+}

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

@@ -3,10 +3,14 @@ package com.sxtvs.open.api.chat.controller;
 import com.sxtvs.open.api.chat.entity.KimiChat;
 import com.sxtvs.open.api.chat.service.impl.KimiChatServiceImpl;
 import jakarta.annotation.Resource;
+import org.apache.hc.core5.http.ParseException;
 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 org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
 
 /**
  * <p>
@@ -27,4 +31,11 @@ public class KimiChatController {
     public KimiChat send(@RequestBody KimiChat kimiChat) {
         return kimiChatService.create(kimiChat);
     }
+
+    @PostMapping("upload")
+    public void upload(MultipartFile file) throws IOException, InterruptedException, ParseException {
+        kimiChatService.upload(file);
+    }
+
+
 }

+ 64 - 10
src/main/java/com/sxtvs/open/api/chat/service/impl/KimiChatServiceImpl.java

@@ -2,37 +2,47 @@ package com.sxtvs.open.api.chat.service.impl;
 
 import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sxtvs.open.api.chat.dto.KimiRequest;
 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.mapper.KimiChatMapper;
 import com.sxtvs.open.api.chat.service.IKimiChatService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sxtvs.open.api.review.service.impl.SSEService;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.hc.core5.http.io.HttpClientResponseHandler;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.entity.mime.ContentBody;
+import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
+import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.core5.http.ContentType;
+import org.apache.hc.core5.http.ParseException;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
 import org.apache.http.util.TextUtils;
-import org.apache.logging.log4j.util.Strings;
-import org.springframework.http.*;
+import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.io.OutputStream;
 import java.net.URI;
 import java.net.http.HttpClient;
 import java.net.http.HttpRequest;
 import java.net.http.HttpResponse;
+import java.nio.channels.Channels;
+import java.nio.channels.Pipe;
+import java.nio.file.Paths;
 import java.time.LocalDateTime;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
 import java.util.stream.Collectors;
 
 /**
@@ -182,4 +192,48 @@ public class KimiChatServiceImpl extends ServiceImpl<KimiChatMapper, KimiChat> i
         chatCompletions( kimiRequest, kimiChat.getGroupId());
         return kimiChat;
     }
+
+    public  void upload(MultipartFile file) throws IOException, InterruptedException, ParseException {
+        String boun = "----WebKitFormBoundary7MA4YWxkTrZu0gW";
+        org.apache.hc.core5.http.HttpEntity httpEntity = MultipartEntityBuilder
+                .create()
+                .addBinaryBody("file", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, file.getOriginalFilename())
+                .addTextBody("purpose", "file-extract")
+                .setBoundary( boun )
+                .build();
+
+        HttpPost httpPost = new HttpPost("https://api.moonshot.cn/v1/files");
+        httpPost.setHeader("Authorization", "Bearer " + token.get(random.nextInt(token.size())));
+//        httpPost.setHeader("Content-Type", "multipart/form-data; boundary=" + boun);
+        httpPost.setEntity(httpEntity);
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = httpClient.execute(httpPost);
+        String s = EntityUtils.toString(response.getEntity());
+        log.info("上传文件 -- {}", s);
+
+
+        /*Pipe pipe = Pipe.open();
+        new Thread(() -> {
+            try (OutputStream outputStream = Channels.newOutputStream(pipe.sink())) {
+                httpEntity.writeTo(outputStream);
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }).start();
+
+        HttpRequest.BodyPublisher bodyPublisher = HttpRequest.BodyPublishers.ofInputStream(() -> Channels.newInputStream(pipe.source()));
+
+        HttpClient client = HttpClient.newBuilder().build();
+
+        HttpRequest request = HttpRequest.newBuilder()
+                .uri(URI.create("https://api.moonshot.cn/v1/files"))
+                .method("POST", bodyPublisher)
+                .header(HttpHeaders.CONTENT_TYPE, "multipart/form-data;  boundary=" + boun)
+                .headers("Authorization", "Bearer " + token.get(random.nextInt(token.size())))
+                .build();
+
+        HttpResponse<String> send = client.send(request, HttpResponse.BodyHandlers.ofString());
+        log.info("上传文件响应 {}", send.body());*/
+    }
+
 }

+ 13 - 0
src/main/java/com/sxtvs/open/api/h5template/service/impl/OSSService.java

@@ -82,6 +82,19 @@ public class OSSService {
         return "https://cxzx.smcic.net/" + fileUrl;
     }
 
+    @SneakyThrows
+    public String bidPut(MultipartFile file, Long id) {
+
+        String dir = "/open/bid/" + id + "/";
+
+        ByteArrayInputStream inputStream = new ByteArrayInputStream(IoUtil.readBytes(file.getInputStream()));
+        String fileUrl = dir + file.getOriginalFilename();
+        ossClient.putObject(bucket, fileUrl , inputStream);
+        inputStream.reset();
+
+        return "https://cxzx.smcic.net/" + fileUrl;
+    }
+
 
 }