From 6d8e5278b57952092e420347ace8704b71d7f70c Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期四, 09 四月 2026 11:55:37 +0800
Subject: [PATCH] 报价添加附件

---
 src/main/java/com/ruoyi/sales/service/SalesQuotationFileService.java          |   19 +++
 src/main/java/com/ruoyi/sales/mapper/SalesQuotationFileMapper.java            |   21 ++++
 src/main/java/com/ruoyi/sales/service/impl/SalesQuotationFileServiceImpl.java |   29 +++++
 src/main/java/com/ruoyi/sales/pojo/SalesQuotationFile.java                    |   65 +++++++++++++
 src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java     |   17 +++
 src/main/resources/mapper/sales/SalesQuotationFileMapper.xml                  |   31 ++++++
 src/main/resources/mapper/approve/KnowledgeBaseFileMapper.xml                 |    2 
 src/main/java/com/ruoyi/sales/controller/SalesQuotationFileController.java    |   70 ++++++++++++++
 src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java                      |    3 
 9 files changed, 256 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/ruoyi/sales/controller/SalesQuotationFileController.java b/src/main/java/com/ruoyi/sales/controller/SalesQuotationFileController.java
new file mode 100644
index 0000000..a6b40e5
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/controller/SalesQuotationFileController.java
@@ -0,0 +1,70 @@
+package com.ruoyi.sales.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.approve.pojo.KnowledgeBaseFile;
+import com.ruoyi.approve.service.KnowledgeBaseFileService;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.sales.pojo.SalesQuotationFile;
+import com.ruoyi.sales.service.SalesQuotationFileService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ * 閿�鍞姤浠�--闄勪欢 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-04-09 11:19:20
+ */
+@RestController
+@RequestMapping("/salesQuotationFile")
+public class SalesQuotationFileController {
+
+    @Resource
+    private SalesQuotationFileService salesQuotationFileService;
+
+
+    /**
+     * 鏂板
+     * @param accountFile
+     * @return
+     */
+    @PostMapping("/add")
+    @ApiOperation("鏂板")
+    public AjaxResult add(@RequestBody SalesQuotationFile accountFile) {
+        return AjaxResult.success(salesQuotationFileService.save(accountFile));
+    }
+
+    /**
+     * 鍒犻櫎
+     * @param ids
+     * @return
+     */
+    @DeleteMapping("/del")
+    @ApiOperation("鍒犻櫎")
+    public AjaxResult delAccountFile(@RequestBody List<Integer> ids) {
+        if(CollectionUtils.isEmpty(ids)){
+            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        }
+        //鍒犻櫎妫�楠岄檮浠�
+        return AjaxResult.success(salesQuotationFileService.removeBatchByIds(ids));
+    }
+
+    /**
+     *鍒嗛〉鏌ヨ
+     * @param page
+     * @param accountFile
+     * @return
+     */
+    @GetMapping("/listPage")
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    public AjaxResult accountFileListPage(Page page, SalesQuotationFile accountFile) {
+        return AjaxResult.success(salesQuotationFileService.knowledgeBaseFileListPage(page, accountFile));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java b/src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java
index 2f40bdd..f892fc7 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java
@@ -1,6 +1,7 @@
 package com.ruoyi.sales.dto;
 
 import com.ruoyi.sales.pojo.SalesQuotation;
+import com.ruoyi.sales.pojo.SalesQuotationFile;
 import com.ruoyi.sales.pojo.SalesQuotationProduct;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -17,4 +18,6 @@
      */
     // 瀹℃壒浜�
     private String approveUserIds;
+
+    private List<SalesQuotationFile> files;
 }
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalesQuotationFileMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalesQuotationFileMapper.java
new file mode 100644
index 0000000..f156734
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/mapper/SalesQuotationFileMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.sales.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.sales.pojo.SalesQuotationFile;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 閿�鍞姤浠�--闄勪欢 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-04-09 11:19:20
+ */
+@Mapper
+public interface SalesQuotationFileMapper extends BaseMapper<SalesQuotationFile> {
+
+    IPage<SalesQuotationFile> salesQuotationFilePage(Page page, SalesQuotationFile accountFile);
+}
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesQuotationFile.java b/src/main/java/com/ruoyi/sales/pojo/SalesQuotationFile.java
new file mode 100644
index 0000000..d2a9f0e
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesQuotationFile.java
@@ -0,0 +1,65 @@
+package com.ruoyi.sales.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+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 io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 閿�鍞姤浠�--闄勪欢
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-04-09 11:19:20
+ */
+@Getter
+@Setter
+@TableName("sales_quotation_file")
+@ApiModel(value = "SalesQuotationFile瀵硅薄", description = "閿�鍞姤浠�--闄勪欢")
+public class SalesQuotationFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("鏂囦欢鍚嶇О")
+    private String name;
+
+    @ApiModelProperty("鏂囦欢璺緞")
+    private String url;
+
+    @ApiModelProperty("鏂囦欢澶у皬")
+    private Integer fileSize;
+
+    @ApiModelProperty("閿�鍞姤浠穒d")
+    private Long salesQuotationId;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鍒涘缓鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("淇敼鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Long updateUser;
+
+    @ApiModelProperty("绉熸埛ID")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+}
diff --git a/src/main/java/com/ruoyi/sales/service/SalesQuotationFileService.java b/src/main/java/com/ruoyi/sales/service/SalesQuotationFileService.java
new file mode 100644
index 0000000..3a5b508
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/service/SalesQuotationFileService.java
@@ -0,0 +1,19 @@
+package com.ruoyi.sales.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.sales.pojo.SalesQuotationFile;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 閿�鍞姤浠�--闄勪欢 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-04-09 11:19:20
+ */
+public interface SalesQuotationFileService extends IService<SalesQuotationFile> {
+
+    IPage<SalesQuotationFile> knowledgeBaseFileListPage(Page page, SalesQuotationFile accountFile);
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationFileServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationFileServiceImpl.java
new file mode 100644
index 0000000..0cdd0c7
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationFileServiceImpl.java
@@ -0,0 +1,29 @@
+package com.ruoyi.sales.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.sales.pojo.SalesQuotationFile;
+import com.ruoyi.sales.mapper.SalesQuotationFileMapper;
+import com.ruoyi.sales.service.SalesQuotationFileService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 閿�鍞姤浠�--闄勪欢 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-04-09 11:19:20
+ */
+@Service
+public class SalesQuotationFileServiceImpl extends ServiceImpl<SalesQuotationFileMapper, SalesQuotationFile> implements SalesQuotationFileService {
+
+    @Autowired
+    private  SalesQuotationFileMapper salesQuotationFileMapper;
+    @Override
+    public IPage<SalesQuotationFile> knowledgeBaseFileListPage(Page page, SalesQuotationFile accountFile) {
+        return salesQuotationFileMapper.salesQuotationFilePage(page,accountFile);
+    }
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
index 8e18058..74fa7a4 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
@@ -2,6 +2,7 @@
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -17,9 +18,11 @@
 import com.ruoyi.common.utils.uuid.UUID;
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.sales.dto.SalesQuotationDto;
+import com.ruoyi.sales.mapper.SalesQuotationFileMapper;
 import com.ruoyi.sales.mapper.SalesQuotationMapper;
 import com.ruoyi.sales.mapper.SalesQuotationProductMapper;
 import com.ruoyi.sales.pojo.SalesQuotation;
+import com.ruoyi.sales.pojo.SalesQuotationFile;
 import com.ruoyi.sales.pojo.SalesQuotationProduct;
 import com.ruoyi.sales.service.SalesQuotationProductService;
 import com.ruoyi.sales.service.SalesQuotationService;
@@ -45,6 +48,9 @@
 
     @Autowired
     private ApproveProcessServiceImpl approveProcessService;
+    @Autowired
+    private SalesQuotationFileMapper salesQuotationFileMapper;
+
     @Override
     public IPage<SalesQuotationDto> listPage(Page page, SalesQuotationDto salesQuotationDto) {
         IPage<SalesQuotationDto> salesQuotationDtoIPage = salesQuotationMapper.listPage(page, salesQuotationDto);
@@ -54,6 +60,7 @@
         salesQuotationDtoIPage.getRecords().forEach(record -> {
             List<SalesQuotationProduct> products = salesQuotationProductMapper.selectBySalesQuotationId(record.getId());
             record.setProducts(products);
+            record.setFiles(salesQuotationFileMapper.selectList(new QueryWrapper<SalesQuotationFile>().lambda().eq(SalesQuotationFile::getSalesQuotationId, record.getId())));
         });
         return salesQuotationDtoIPage;
     }
@@ -92,6 +99,10 @@
             log.error("SalesQuotationServiceImpl error:{}", e);
             throw new RuntimeException("瀹℃壒澶辫触");
         }
+        for (SalesQuotationFile file : salesQuotationDto.getFiles()) {
+            file.setSalesQuotationId(salesQuotation.getId());
+            salesQuotationFileMapper.insert(file);
+        }
         return true;
     }
     @Override
@@ -123,6 +134,12 @@
         vo.setApproveType(6);
         vo.setApproveReason(salesQuotationDto.getQuotationNo());
         approveProcessService.updateApproveUser(vo);
+        for (SalesQuotationFile file : salesQuotationDto.getFiles()) {
+            if (file.getId() == null) {
+                file.setSalesQuotationId(salesQuotation.getId());
+                salesQuotationFileMapper.insert(file);
+            }
+        }
         return true;
     }
     @Override
diff --git a/src/main/resources/mapper/approve/KnowledgeBaseFileMapper.xml b/src/main/resources/mapper/approve/KnowledgeBaseFileMapper.xml
index e5d4b02..e591ef5 100644
--- a/src/main/resources/mapper/approve/KnowledgeBaseFileMapper.xml
+++ b/src/main/resources/mapper/approve/KnowledgeBaseFileMapper.xml
@@ -18,7 +18,7 @@
     <select id="knowledgeBaseFileListPage" resultType="com.ruoyi.approve.pojo.KnowledgeBaseFile">
         SELECT
         *
-        FROM account_file
+        FROM knowledge_base_file
         where
         <if test="accountFile.knowledgeBaseId != null and accountFile.knowledgeBaseId != ''">
             AND knowledge_base_id = #{accountFile.knowledgeBaseId}
diff --git a/src/main/resources/mapper/sales/SalesQuotationFileMapper.xml b/src/main/resources/mapper/sales/SalesQuotationFileMapper.xml
new file mode 100644
index 0000000..bdaef49
--- /dev/null
+++ b/src/main/resources/mapper/sales/SalesQuotationFileMapper.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.sales.mapper.SalesQuotationFileMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.sales.pojo.SalesQuotationFile">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="url" property="url" />
+        <result column="file_size" property="fileSize" />
+        <result column="sales_quotation_id" property="salesQuotationId" />
+        <result column="create_time" property="createTime" />
+        <result column="create_user" property="createUser" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+    <select id="salesQuotationFilePage" resultType="com.ruoyi.sales.pojo.SalesQuotationFile">
+        SELECT
+        *
+        FROM sales_quotation_file
+        where
+        <if test="accountFile.knowledgeBaseId != null and accountFile.knowledgeBaseId != ''">
+            AND knowledge_base_id = #{accountFile.knowledgeBaseId}
+        </if>
+        <if test="accountFile.name != null and accountFile.name != '' ">
+            AND name = #{accountFile.name}
+        </if>
+    </select>
+
+</mapper>

--
Gitblit v1.9.3