390b4243dff25a50f1d3302228e7dd16e9c2f18a..60b34f0c724917482a0308dd23c68cd38d3e82ce
2025-05-15 liding
供应商id
60b34f 对比 | 目录
2025-05-15 liding
采购合同号
7aa33e 对比 | 目录
2025-05-15 liding
采购合同号
f907ee 对比 | 目录
2025-05-15 liding
采购合同号
56d159 对比 | 目录
2025-05-15 liding
1.来票台账优化 2.上传优化
6bd1dc 对比 | 目录
已修改19个文件
已重命名1个文件
已删除3个文件
已添加4个文件
714 ■■■■ 文件已修改
src/main/java/com/ruoyi/RuoYiApplication.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/other/controller/TempFileController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/other/pojo/TempFile.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/other/service/TempFileService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/InvoicePurchaseController.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/InvoicePurchaseDto.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/pojo/InvoicePurchase.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/IInvoicePurchaseService.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/InvoicePurchaseServiceImpl.java 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/CommonFileController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/CommonFileMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/SalesLedgerFileMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/CommonFile.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/ICommonFileService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/ISalesLedgerFileService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerFileServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/RuoYiApplication.java
@@ -18,15 +18,6 @@
    {
        // System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(RuoYiApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  è‹¥ä¾å¯åŠ¨æˆåŠŸ   áƒš(´ڡ`ლ)゙  \n" +
                " .-------.       ____     __        \n" +
                " |  _ _   \\      \\   \\   /  /    \n" +
                " | ( ' )  |       \\  _. /  '       \n" +
                " |(_ o _) /        _( )_ .'         \n" +
                " | (_,_).' __  ___(_ o _)'          \n" +
                " |  |\\ \\  |  ||   |(_,_)'         \n" +
                " |  | \\ `'   /|   `-'  /           \n" +
                " |  |  \\    /  \\      /           \n" +
                " ''-'   `'-'    `-..-'              ");
        System.out.println("(♥◠‿◠)ノ゙  è‹¥ä¾å¯åŠ¨æˆåŠŸ   áƒš(´ڡ`ლ)゙");
    }
}
src/main/java/com/ruoyi/other/controller/TempFileController.java
@@ -18,10 +18,10 @@
    private TempFileService tempFileService;
    @PostMapping("/upload")
    public AjaxResult uploadFile(MultipartFile file) {
    public AjaxResult uploadFile(MultipartFile file, String type) {
        try {
            return AjaxResult.success(tempFileService.uploadFile(file));
        }catch (Exception e) {
            return AjaxResult.success(tempFileService.uploadFile(file, type));
        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }
    }
src/main/java/com/ruoyi/other/pojo/TempFile.java
@@ -16,4 +16,5 @@
    private String originalName;   // åŽŸå§‹æ–‡ä»¶å
    private String tempPath;       // ä¸´æ—¶å­˜å‚¨è·¯å¾„
    private LocalDateTime expireTime; // è¿‡æœŸæ—¶é—´
    private String type;       // å…³è”表类型
}
src/main/java/com/ruoyi/other/service/TempFileService.java
@@ -6,5 +6,5 @@
import java.io.IOException;
public interface TempFileService {
    TempFile uploadFile(MultipartFile file) throws IOException;
    TempFile uploadFile(MultipartFile file,String type) throws IOException;
}
src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
@@ -32,7 +32,7 @@
    // ä¸Šä¼ åˆ°ä¸´æ—¶ç›®å½•
    @Override
    public TempFile uploadFile(MultipartFile file) throws IOException {
    public TempFile uploadFile(MultipartFile file,String type) throws IOException {
        // 1. ç”Ÿæˆä¸´æ—¶æ–‡ä»¶ID和路径
        String tempId = UUID.randomUUID().toString();
        Path tempFilePath = Paths.get(tempDir, tempId + "_" + file.getOriginalFilename());
@@ -52,6 +52,7 @@
        tempFileRecord.setOriginalName(file.getOriginalFilename());
        tempFileRecord.setTempPath(tempFilePath.toString());
        tempFileRecord.setExpireTime(LocalDateTime.now().plusHours(2)); // 2小时后过期
        tempFileRecord.setType(type);
        tempFileMapper.insert(tempFileRecord);
        return tempFileRecord;
src/main/java/com/ruoyi/purchase/controller/InvoicePurchaseController.java
@@ -1,23 +1,22 @@
package com.ruoyi.purchase.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.purchase.pojo.InvoicePurchase;
import com.ruoyi.purchase.service.IInvoicePurchaseService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.purchase.dto.InvoicePurchaseDto;
import com.ruoyi.purchase.pojo.InvoicePurchase;
import com.ruoyi.purchase.service.IInvoicePurchaseService;
import com.ruoyi.sales.service.ICommonFileService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
 * å‘票信息Controller
@@ -32,13 +31,15 @@
    private IInvoicePurchaseService invoicePurchaseService;
    private ICommonFileService commonFileService;
    /**
     * æŸ¥è¯¢å‘票信息列表
     */
    @GetMapping("/list")
    public TableDataInfo list(InvoicePurchase invoicePurchase) {
    public TableDataInfo list(InvoicePurchaseDto invoicePurchaseDto) {
        startPage();
        List<InvoicePurchase> list = invoicePurchaseService.selectInvoicePurchaseList(invoicePurchase);
        List<InvoicePurchaseDto> list = invoicePurchaseService.selectInvoicePurchaseList(invoicePurchaseDto);
        return getDataTable(list);
    }
@@ -48,18 +49,26 @@
    @Log(title = "发票信息", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, InvoicePurchase invoicePurchase) {
        List<InvoicePurchase> list = invoicePurchaseService.selectInvoicePurchaseList(invoicePurchase);
        List<InvoicePurchase> list = invoicePurchaseService.selectInvoicePurchaseLists(invoicePurchase);
        ExcelUtil<InvoicePurchase> util = new ExcelUtil<InvoicePurchase>(InvoicePurchase.class);
        util.exportExcel(response, list, "发票信息数据");
    }
    /**
     * æŸ¥è¯¢å‘票信息
     */
    @GetMapping("/getInvoiceById")
    public InvoicePurchaseDto getInvoiceById(InvoicePurchaseDto invoicePurchaseDto) {
        return invoicePurchaseService.getInvoiceById(invoicePurchaseDto);
    }
    /**
     * æ–°å¢žä¿®æ”¹å‘票信息
     */
    @Log(title = "发票信息", businessType = BusinessType.INSERT)
    @PostMapping   ("/addOrUpdateInvoice")
    public AjaxResult addOrUpdateInvoice(@RequestBody InvoicePurchase invoicePurchase) {
        return toAjax(invoicePurchaseService.addOrUpdateInvoice(invoicePurchase));
    @PostMapping("/addOrUpdateInvoice")
    public AjaxResult addOrUpdateInvoice(@RequestBody InvoicePurchaseDto invoicePurchaseDto) throws IOException {
        return toAjax(invoicePurchaseService.addOrUpdateInvoice(invoicePurchaseDto));
    }
    /**
@@ -70,4 +79,13 @@
    public AjaxResult remove(@RequestBody Long[] ids) {
        return toAjax(invoicePurchaseService.delInvoice(ids));
    }
    @PostMapping("/upload")
    public AjaxResult uploadFile(MultipartFile file, Long id, String type) {
        try {
            return AjaxResult.success(commonFileService.uploadFile(file, id, type));
        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }
    }
}
src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -1,28 +1,21 @@
package com.ruoyi.purchase.controller;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.purchase.dto.PurchaseLedgerDto;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.service.IPurchaseLedgerService;
import com.ruoyi.sales.service.ISalesLedgerService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.purchase.dto.PurchaseLedgerDto;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.service.IPurchaseLedgerService;
import com.ruoyi.sales.service.ISalesLedgerService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
 * é‡‡è´­å°è´¦Controller
@@ -94,6 +87,14 @@
    }
    /**
     * æŸ¥è¯¢é‡‡è´­åˆåŒå·
     */
    @GetMapping("/getPurchaseNo")
    public List getPurchasesNo() {
        return purchaseLedgerService.getPurchasesNo();
    }
    /**
     * æ ¹æ®é‡‡è´­åˆåŒå·æŸ¥è¯¢äº§å“
     */
    @GetMapping("/getProduct")
src/main/java/com/ruoyi/purchase/dto/InvoicePurchaseDto.java
@@ -1,7 +1,76 @@
package com.ruoyi.purchase.dto;
import com.ruoyi.sales.pojo.CommonFile;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
@Data
public class InvoicePurchaseDto {
    private Long id;
    /**
     * é‡‡è´­å°è´¦id
     */
    private Long purchaseLedgerId;
    /**
     * é‡‡è´­åˆåŒå·
     */
    private String purchaseContractNo;
    /**
     * å…³è”销售台账主表主键
     */
    private Long salesLedgerId;
    /**
     * é”€å”®åˆåŒå·
     */
    private String salesContractNo;
    /**
     * ä¾›åº”商名称
     */
    private String supplierName;
    /**
     * å‘票号
     */
    private String invoiceNumber;
    /**
     * å‘票金额(元)
     */
    private BigDecimal invoiceAmount;
    /**
     * ç¨Žçއ
     */
    private BigDecimal taxRate;
    /**
     * å¼€ç¥¨äººID
     */
    private Long issUerId;
    /**
     * å¼€ç¥¨äºº
     */
    private String issUer;
    /**
     * å¼€ç¥¨æ—¥æœŸ
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate issueDate;
    private List<String> tempFileIds;
    private List<CommonFile> CommonFiles;
    private String fileName;
}
src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -1,7 +1,7 @@
package com.ruoyi.purchase.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.sales.pojo.SalesLedgerFile;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import lombok.Data;
@@ -17,6 +17,12 @@
     * é‡‡è´­åˆåŒå·
     */
    private String purchaseContractNumber;
    /**
     * ä¾›åº”商名称id
     */
    private Long supplierId;
    /**
     * ä¾›åº”商名称
@@ -90,7 +96,7 @@
    private List<String> tempFileIds;
    private List<SalesLedgerFile> SalesLedgerFiles;
    private List<CommonFile> SalesLedgerFiles;
    /**
     * ä¸šåŠ¡å‘˜æ‰‹æœºå·
     */
src/main/java/com/ruoyi/purchase/pojo/InvoicePurchase.java
@@ -1,12 +1,13 @@
package com.ruoyi.purchase.pojo;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
/**
 * å‘票信息对象 invoice_purchase
@@ -26,10 +27,20 @@
    private Long id;
    /**
     * é‡‡è´­å°è´¦id
     */
    private Long purchaseLedgerId;
    /**
     * é‡‡è´­åˆåŒå·
     */
    @Excel(name = "采购合同号")
    private String purchaseContractNo;
    /**
     * å…³è”销售台账主表主键
     */
    private Long salesLedgerId;
    /**
     * é”€å”®åˆåŒå·
@@ -52,32 +63,36 @@
    /**
     * å‘票金额(元)
     */
    @Excel(name = "发票金额", readConverterExp = "元=")
    @Excel(name = "发票金额(元)")
    private BigDecimal invoiceAmount;
    /**
     * ç¨Žçއ
     */
    @Excel(name = "税率")
    @Excel(name = "税率(%)")
    private BigDecimal taxRate;
    /**
     * å¼€ç¥¨äººID
     */
    private Long issUerId;
    /**
     * å¼€ç¥¨äºº
     */
    @Excel(name = "开票人")
    private String issuer;
    private String issUer;
    /**
     * å¼€ç¥¨æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd" ,timezone = "GMT+8")
    @Excel(name = "开票日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date issueDate;
    private LocalDate issueDate;
    /**
     * å‘票文件(PDF格式)
     */
    @Excel(name = "发票文件", readConverterExp = "P=DF格式")
    private String invoiceFile;
    /**
src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -1,12 +1,12 @@
package com.ruoyi.purchase.pojo;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * é‡‡è´­å°è´¦å¯¹è±¡ purchase_ledger
@@ -32,6 +32,11 @@
    private String purchaseContractNumber;
    /**
     * ä¾›åº”商名称id
     */
    private Long supplierId;
    /**
     * ä¾›åº”商名称
     */
    @Excel(name = "供应商名称")
src/main/java/com/ruoyi/purchase/service/IInvoicePurchaseService.java
@@ -2,8 +2,10 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.purchase.dto.InvoicePurchaseDto;
import com.ruoyi.purchase.pojo.InvoicePurchase;
import java.io.IOException;
import java.util.List;
/**
@@ -13,9 +15,13 @@
 * @date 2025-05-14
 */
public interface IInvoicePurchaseService extends IService<InvoicePurchase> {
    List<InvoicePurchase> selectInvoicePurchaseList(InvoicePurchase invoicePurchase);
    List<InvoicePurchaseDto> selectInvoicePurchaseList(InvoicePurchaseDto invoicePurchaseDto);
    int delInvoice(Long[] ids);
    int addOrUpdateInvoice(InvoicePurchase invoicePurchase);
    int addOrUpdateInvoice(InvoicePurchaseDto invoicePurchaseDto) throws IOException;
    InvoicePurchaseDto getInvoiceById(InvoicePurchaseDto invoicePurchaseDto);
    List<InvoicePurchase> selectInvoicePurchaseLists(InvoicePurchase invoicePurchase);
}
src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
@@ -27,4 +27,6 @@
    List getProduct(PurchaseLedgerDto purchaseLedgerDto);
    PurchaseLedgerDto getInfo(PurchaseLedgerDto purchaseLedgerDto);
    List getPurchasesNo();
}
src/main/java/com/ruoyi/purchase/service/impl/InvoicePurchaseServiceImpl.java
@@ -2,15 +2,38 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.other.mapper.TempFileMapper;
import com.ruoyi.other.pojo.TempFile;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.purchase.dto.InvoicePurchaseDto;
import com.ruoyi.purchase.mapper.InvoicePurchaseMapper;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.InvoicePurchase;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.service.IInvoicePurchaseService;
import lombok.AllArgsConstructor;
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.pojo.CommonFile;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Arrays;
import java.util.List;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
 * å‘票信息Service业务层处理
@@ -19,14 +42,80 @@
 * @date 2025-05-14
 */
@Service
@AllArgsConstructor
@RequiredArgsConstructor
@Slf4j
public class InvoicePurchaseServiceImpl extends ServiceImpl<InvoicePurchaseMapper, InvoicePurchase> implements IInvoicePurchaseService {
    private InvoicePurchaseMapper invoicePurchaseMapper;
    private final InvoicePurchaseMapper invoicePurchaseMapper;
    private final PurchaseLedgerMapper purchaseLedgerMapper;
    private final SysUserMapper userMapper;
    private final CommonFileMapper commonFileMapper;
    private final TempFileMapper tempFileMapper;
    @Value("${file.upload-dir}")
    private String uploadDir;
    @Override
    public List<InvoicePurchase> selectInvoicePurchaseList(InvoicePurchase invoicePurchase) {
        return invoicePurchaseMapper.selectList(new LambdaQueryWrapper<>());
    public List<InvoicePurchaseDto> selectInvoicePurchaseList(InvoicePurchaseDto invoicePurchaseDto) {
        // æž„建发票查询条件
        LambdaQueryWrapper<InvoicePurchase> queryWrapper = new LambdaQueryWrapper<>();
        Optional.ofNullable(invoicePurchaseDto)
                .ifPresent(dto -> {
                    if (StringUtils.hasText(dto.getPurchaseContractNo())) {
                        queryWrapper.like(InvoicePurchase::getPurchaseContractNo, dto.getPurchaseContractNo());
                    }
                    if (StringUtils.hasText(dto.getSupplierName())) {
                        queryWrapper.like(InvoicePurchase::getSupplierName, dto.getSupplierName());
                    }
                    // å¤„理日期类型字段
                    if (dto.getIssueDate() != null) {
                        queryWrapper.eq(InvoicePurchase::getIssueDate,invoicePurchaseDto.getIssueDate());
                    }
                });
        // æŸ¥è¯¢å‘票列表
        List<InvoicePurchase> invoiceList = invoicePurchaseMapper.selectList(queryWrapper);
        // å¦‚果没有查询到发票,直接返回空列表
        if (CollectionUtils.isEmpty(invoiceList)) {
            return Collections.emptyList();
        }
        // æå–所有发票ID
        List<Long> invoiceIds = invoiceList.stream()
                .map(InvoicePurchase::getId)
                .collect(Collectors.toList());
        // æ‰¹é‡æŸ¥è¯¢è¿™äº›å‘票关联的文件信息
        LambdaQueryWrapper<CommonFile> fileQueryWrapper = new LambdaQueryWrapper<>();
        fileQueryWrapper.in(CommonFile::getCommonId, invoiceIds)
                .eq(CommonFile::getType,"3");
        List<CommonFile> fileList = commonFileMapper.selectList(fileQueryWrapper);
        // å°†æ–‡ä»¶ä¿¡æ¯æ˜ å°„到对应的发票ID
        Map<Long, String> fileMap = fileList.stream()
                .collect(Collectors.toMap(
                        CommonFile::getCommonId,
                        CommonFile::getName,
                        (existing, replacement) -> existing // å¦‚果有多个文件,取第一个
                ));
        // å°†æ–‡ä»¶ä¿¡æ¯è®¾ç½®åˆ°å‘票DTO中
        List<InvoicePurchaseDto> resultList = new ArrayList<>();
        for (InvoicePurchase invoice : invoiceList) {
            InvoicePurchaseDto dto = new InvoicePurchaseDto();
            // å°†InvoicePurchase的属性复制到DTO
            BeanUtils.copyProperties(invoice, dto);
            // è®¾ç½®æ–‡ä»¶åï¼Œå¦‚果存在的话
            dto.setFileName(fileMap.getOrDefault(invoice.getId(), null));
            resultList.add(dto);
        }
        return resultList;
    }
    @Override
@@ -35,11 +124,115 @@
    }
    @Override
    public int addOrUpdateInvoice(InvoicePurchase invoicePurchase) {
        if (invoicePurchase.getId() == null) {
            return invoicePurchaseMapper.insert(invoicePurchase);
    public int addOrUpdateInvoice(InvoicePurchaseDto invoicePurchaseDto) throws IOException {
        int i;
        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(invoicePurchaseDto.getPurchaseLedgerId());
        InvoicePurchase invoicePurchase = new InvoicePurchase();
        BeanUtils.copyProperties(invoicePurchaseDto, invoicePurchase);
        invoicePurchase.setPurchaseContractNo(purchaseLedger.getPurchaseContractNumber());
        invoicePurchase.setSalesContractNo(purchaseLedger.getSalesContractNo());
        SysUser sysUser = userMapper.selectUserById(invoicePurchase.getIssUerId());
        invoicePurchase.setIssUer(sysUser.getNickName());
        invoicePurchase.setTenantId(purchaseLedger.getTenantId());
        if (invoicePurchaseDto.getId() == null) {
            i = invoicePurchaseMapper.insert(invoicePurchase);
        } else {
            return invoicePurchaseMapper.updateById(invoicePurchase);
            i = invoicePurchaseMapper.updateById(invoicePurchase);
        }
        // è¿ç§»ä¸´æ—¶æ–‡ä»¶åˆ°æ­£å¼ç›®å½•
        if (invoicePurchaseDto.getTempFileIds() != null && !invoicePurchaseDto.getTempFileIds().isEmpty()) {
            migrateTempFilesToFormal(invoicePurchase.getId(), invoicePurchaseDto.getTempFileIds());
        }
        return i;
    }
    /**
     * å°†ä¸´æ—¶æ–‡ä»¶è¿ç§»åˆ°æ­£å¼ç›®å½•
     *
     * @param businessId  ä¸šåŠ¡ID(销售台账ID)
     * @param tempFileIds ä¸´æ—¶æ–‡ä»¶ID列表
     * @throws IOException æ–‡ä»¶æ“ä½œå¼‚常
     */
    private void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds) throws IOException {
        if (CollectionUtils.isEmpty(tempFileIds)) {
            return;
        }
        // æž„建正式目录路径(按业务类型和日期分组)
        String formalDir = uploadDir + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
        Path formalDirPath = Paths.get(formalDir);
        // ç¡®ä¿æ­£å¼ç›®å½•存在(递归创建)
        if (!Files.exists(formalDirPath)) {
            Files.createDirectories(formalDirPath);
        }
        for (String tempFileId : tempFileIds) {
            // æŸ¥è¯¢ä¸´æ—¶æ–‡ä»¶è®°å½•
            TempFile tempFile = tempFileMapper.selectById(tempFileId);
            if (tempFile == null) {
                log.warn("临时文件不存在,跳过处理: {}", tempFileId);
                continue;
            }
            // æž„建正式文件名(包含业务ID和时间戳,避免冲突)
            String originalFilename = tempFile.getOriginalName();
            String fileExtension = FilenameUtils.getExtension(originalFilename);
            String formalFilename = businessId + "_" +
                    System.currentTimeMillis() + "_" +
                    UUID.randomUUID().toString().substring(0, 8) +
                    (com.ruoyi.common.utils.StringUtils.hasText(fileExtension) ? "." + fileExtension : "");
            Path formalFilePath = formalDirPath.resolve(formalFilename);
            try {
                // æ‰§è¡Œæ–‡ä»¶è¿ç§»ï¼ˆä½¿ç”¨åŽŸå­æ“ä½œç¡®ä¿å®‰å…¨æ€§ï¼‰
                Files.move(
                        Paths.get(tempFile.getTempPath()),
                        formalFilePath,
                        StandardCopyOption.REPLACE_EXISTING,
                        StandardCopyOption.ATOMIC_MOVE
                );
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
                // æ›´æ–°æ–‡ä»¶è®°å½•(关联到业务ID)
                CommonFile fileRecord = new CommonFile();
                fileRecord.setCommonId(businessId);
                fileRecord.setName(originalFilename);
                fileRecord.setUrl(formalFilePath.toString());
                fileRecord.setCreateTime(LocalDateTime.now());
                fileRecord.setType(tempFile.getType());
                commonFileMapper.insert(fileRecord);
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
            } catch (IOException e) {
                log.error("文件迁移失败: {}", tempFile.getTempPath(), e);
                // å¯é€‰æ‹©å›žæ»šäº‹åŠ¡æˆ–è®°å½•å¤±è´¥æ–‡ä»¶
                throw new IOException("文件迁移异常", e);
            }
        }
    }
    @Override
    public InvoicePurchaseDto getInvoiceById(InvoicePurchaseDto invoicePurchaseDto) {
        InvoicePurchase invoicePurchase = invoicePurchaseMapper.selectById(invoicePurchaseDto.getId());
        InvoicePurchaseDto resultDto = new InvoicePurchaseDto();
        BeanUtils.copyProperties(invoicePurchase, resultDto);
        // æŸ¥è¯¢ä¸Šä¼ æ–‡ä»¶
        LambdaQueryWrapper<CommonFile> commonFileLambdaQueryWrapper = new LambdaQueryWrapper<>();
        commonFileLambdaQueryWrapper.eq(CommonFile::getCommonId, invoicePurchaseDto.getId())
                .eq(CommonFile::getType, "3");
        List<CommonFile> commonFiles = commonFileMapper.selectList(commonFileLambdaQueryWrapper);
        resultDto.setCommonFiles(commonFiles);
        return resultDto;
    }
    @Override
    public List<InvoicePurchase> selectInvoicePurchaseLists(InvoicePurchase invoicePurchase) {
        return invoicePurchaseMapper.selectList(new LambdaQueryWrapper<>());
    }
}
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -4,6 +4,8 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.SupplierManageMapper;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.other.mapper.TempFileMapper;
@@ -14,11 +16,11 @@
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.service.IPurchaseLedgerService;
import com.ruoyi.sales.mapper.SalesLedgerFileMapper;
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerFile;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -59,7 +61,9 @@
    private final TempFileMapper tempFileMapper;
    private final SalesLedgerFileMapper salesLedgerFileMapper;
    private final CommonFileMapper commonFileMapper;
    private final SupplierManageMapper supplierManageMapper;
    @Value("${file.upload-dir}")
    private String uploadDir;
@@ -87,11 +91,14 @@
        //录入人
        SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId());
        SupplierManage supplierManage = supplierManageMapper.selectById(purchaseLedgerDto.getSupplierId());
        // DTO转Entity
        PurchaseLedger purchaseLedger = new PurchaseLedger();
        BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
        purchaseLedger.setTenantId(salesLedger.getTenantId());
        purchaseLedger.setSalesContractNo(salesLedger.getSalesContractNo());
        purchaseLedger.setSupplierName(supplierManage.getSupplierName());
        purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
        purchaseLedger.setRecorderName(sysUser.getNickName());
        purchaseLedger.setBusinessPersonId(purchaseLedgerDto.getBusinessPersonId());
@@ -207,12 +214,13 @@
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
                // æ›´æ–°æ–‡ä»¶è®°å½•(关联到业务ID)
                SalesLedgerFile fileRecord = new SalesLedgerFile();
                fileRecord.setLedgerId(businessId);
                CommonFile fileRecord = new CommonFile();
                fileRecord.setCommonId(businessId);
                fileRecord.setName(originalFilename);
                fileRecord.setUrl(formalFilePath.toString());
                fileRecord.setCreateTime(LocalDateTime.now());
                salesLedgerFileMapper.insert(fileRecord);
                fileRecord.setType("2");
                commonFileMapper.insert(fileRecord);
                // åˆ é™¤ä¸´æ—¶æ–‡ä»¶è®°å½•
                tempFileMapper.deleteById(tempFile);
@@ -246,9 +254,9 @@
        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
        // 3.查询上传文件
        LambdaQueryWrapper<SalesLedgerFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
        salesLedgerFileWrapper.eq(SalesLedgerFile::getLedgerId, purchaseLedger.getId());
        List<SalesLedgerFile> salesLedgerFiles = salesLedgerFileMapper.selectList(salesLedgerFileWrapper);
        LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
        salesLedgerFileWrapper.eq(CommonFile::getCommonId, purchaseLedger.getId());
        List<CommonFile> salesLedgerFiles = commonFileMapper.selectList(salesLedgerFileWrapper);
        // 4. è½¬æ¢ DTO
        PurchaseLedgerDto resultDto = new PurchaseLedgerDto();
@@ -301,6 +309,22 @@
        return resultDto;
    }
    @Override
    public List getPurchasesNo() {
        LambdaQueryWrapper<PurchaseLedger> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.select(PurchaseLedger::getId, PurchaseLedger::getPurchaseContractNumber,PurchaseLedger::getSupplierId);
        // èŽ·å–åŽŸå§‹æŸ¥è¯¢ç»“æžœ
        List<Map<String, Object>> result = purchaseLedgerMapper.selectMaps(queryWrapper);
        // å°†ä¸‹åˆ’线命名转换为驼峰命名
        return result.stream().map(map -> map.entrySet().stream()
                .collect(Collectors.toMap(
                        entry -> underlineToCamel(entry.getKey()),
                        Map.Entry::getValue))
        ).collect(Collectors.toList());
    }
    /**
     * ä¸‹åˆ’线命名转驼峰命名
     */
src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -38,7 +38,7 @@
    private SalesLedgerProductMapper salesLedgerProductMapper;
    private final SysUserMapper userMapper;
    private SysUserMapper userMapper;
    @Override
src/main/java/com/ruoyi/sales/controller/CommonFileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.sales.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.service.ICommonFileService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/commonFile")
@AllArgsConstructor
public class CommonFileController extends BaseController {
    private ICommonFileService commonFileService;
    /**
     * é™„件删除
     */
    @Log(title = "附件删除", businessType = BusinessType.DELETE)
    @DeleteMapping("/delCommonFile")
    public AjaxResult delCommonFile(@RequestBody Long[] ids) {
        if (ids == null || ids.length == 0) {
            return AjaxResult.error("请传入要删除的ID");
        }
        return toAjax(commonFileService.delCommonFileByIds(ids));
    }
}
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -1,20 +1,20 @@
package com.ruoyi.sales.controller;
import java.util.*;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.service.ISalesLedgerFileService;
import com.ruoyi.sales.service.ISalesLedgerService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.service.ICommonFileService;
import com.ruoyi.sales.service.ISalesLedgerService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * é”€å”®å°è´¦Controller
@@ -29,7 +29,7 @@
    private ISalesLedgerService salesLedgerService;
    private ISalesLedgerFileService salesLedgerFileService;
    private ICommonFileService commonFileService;
    /**
     * æŸ¥è¯¢é”€å”®å°è´¦åˆ—表
@@ -101,6 +101,6 @@
        if (ids == null || ids.length == 0) {
            return AjaxResult.error("请传入要删除的ID");
        }
        return toAjax(salesLedgerFileService.deleteSalesLedgerByIds(ids));
        return toAjax(commonFileService.deleteSalesLedgerByIds(ids));
    }
}
src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -1,7 +1,7 @@
package com.ruoyi.sales.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.sales.pojo.SalesLedgerFile;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import lombok.Data;
@@ -25,7 +25,7 @@
    private Boolean hasChildren = false;
    private List<SalesLedgerProduct> productData;
    private List<String> tempFileIds;
    private List<SalesLedgerFile> SalesLedgerFiles;
    private List<CommonFile> SalesLedgerFiles;
    private Integer Type;
}
src/main/java/com/ruoyi/sales/mapper/CommonFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.ruoyi.sales.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.sales.pojo.CommonFile;
public interface CommonFileMapper extends BaseMapper<CommonFile> {
}
src/main/java/com/ruoyi/sales/mapper/SalesLedgerFileMapper.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/sales/pojo/CommonFile.java
ÎļþÃû´Ó src/main/java/com/ruoyi/sales/pojo/SalesLedgerFile.java ÐÞ¸Ä
@@ -5,17 +5,21 @@
import java.time.LocalDateTime;
/**
 * é€šç”¨é™„件上传表
 */
@Data
@TableName("sales_ledger_file")
public class SalesLedgerFile {
@TableName("common_file")
public class CommonFile {
    private static final long serialVersionUID = 1L;
    @TableId(type = IdType.AUTO)
    private Long id;
    /** é”€å”®å°è´¦ID */
    private Long ledgerId;
    /** å…³è”表主键D */
    private Long commonId;
    /** æ–‡ä»¶åç§° */
    private String name;
@@ -23,6 +27,9 @@
    /** æ–‡ä»¶è·¯å¾„ */
    private String url;
    /** å…³è”表 */
    private String type;
    /** åˆ›å»ºæ—¶é—´ */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
src/main/java/com/ruoyi/sales/service/ICommonFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.sales.service;
import com.ruoyi.sales.pojo.CommonFile;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
public interface ICommonFileService {
    int deleteSalesLedgerByIds(Long[] ids);
    CommonFile uploadFile(MultipartFile file, Long id, String type) throws IOException;
    int delCommonFileByIds(Long[] ids);
}
src/main/java/com/ruoyi/sales/service/ISalesLedgerFileService.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.sales.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.service.ICommonFileService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.UUID;
@Service
@RequiredArgsConstructor
public class CommonFileServiceImpl extends ServiceImpl<CommonFileMapper, CommonFile> implements ICommonFileService {
    private final CommonFileMapper commonFileMapper;
    @Value("${file.upload-dir}")
    private String uploadDir;
    @Override
    public int deleteSalesLedgerByIds(Long[] ids) {
        return commonFileMapper.deleteBatchIds(Arrays.asList(ids));
    }
    @Override
    public CommonFile uploadFile(MultipartFile file, Long id, String type) throws IOException {
        // 1. ç”Ÿæˆæ­£å¼æ–‡ä»¶ID和路径
        String tempId = UUID.randomUUID().toString();
        Path tempFilePath = Paths.get(uploadDir, tempId + "_" + file.getOriginalFilename());
        // 2. ç¡®ä¿ç›®å½•存在
        Path parentDir = tempFilePath.getParent();
        if (parentDir != null) {
            Files.createDirectories(parentDir); // é€’归创建目录
        }
        // 3. ä¿å­˜æ–‡ä»¶åˆ°ç›®å½•
        file.transferTo(tempFilePath.toFile());
        // 4. ä¿å­˜æ–‡ä»¶è®°å½•
        CommonFile commonFile = new CommonFile();
        commonFile.setCommonId(id);
        commonFile.setName(file.getOriginalFilename());
        commonFile.setUrl(tempFilePath.toString());
        commonFile.setType(type);
        commonFileMapper.insert(commonFile);
        return commonFile;
    }
    @Override
    public int delCommonFileByIds(Long[] ids) {
        return commonFileMapper.deleteBatchIds(Arrays.asList(ids));
    }
}
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerFileServiceImpl.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -12,11 +12,11 @@
import com.ruoyi.other.mapper.TempFileMapper;
import com.ruoyi.other.pojo.TempFile;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.mapper.SalesLedgerFileMapper;
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerFile;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.service.ISalesLedgerService;
import lombok.RequiredArgsConstructor;
@@ -58,7 +58,7 @@
    private final SalesLedgerProductMapper salesLedgerProductMapper;
    private final SalesLedgerFileMapper salesLedgerFileMapper;
    private final CommonFileMapper commonFileMapper;
    private final TempFileMapper tempFileMapper;
@@ -93,9 +93,9 @@
        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
        // 3.查询上传文件
        LambdaQueryWrapper<SalesLedgerFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
        salesLedgerFileWrapper.eq(SalesLedgerFile::getLedgerId, salesLedger.getId());
        List<SalesLedgerFile> salesLedgerFiles = salesLedgerFileMapper.selectList(salesLedgerFileWrapper);
        LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
        salesLedgerFileWrapper.eq(CommonFile::getCommonId, salesLedger.getId());
        List<CommonFile> salesLedgerFiles = commonFileMapper.selectList(salesLedgerFileWrapper);
        // 4. è½¬æ¢ DTO
        SalesLedgerDto resultDto = new SalesLedgerDto();
@@ -266,12 +266,13 @@
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
                // æ›´æ–°æ–‡ä»¶è®°å½•(关联到业务ID)
                SalesLedgerFile fileRecord = new SalesLedgerFile();
                fileRecord.setLedgerId(businessId);
                CommonFile fileRecord = new CommonFile();
                fileRecord.setCommonId(businessId);
                fileRecord.setName(originalFilename);
                fileRecord.setUrl(formalFilePath.toString());
                fileRecord.setCreateTime(LocalDateTime.now());
                salesLedgerFileMapper.insert(fileRecord);
                fileRecord.setType("1");
                commonFileMapper.insert(fileRecord);
                // åˆ é™¤ä¸´æ—¶æ–‡ä»¶è®°å½•
                tempFileMapper.deleteById(tempFile);