云
2026-10-25 d54fbc9d4f8981fa0f7f613b33a28a8cd4f764ea
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/purchase/ErpPurchaseInvoiceController.java
@@ -9,13 +9,15 @@
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoiceImportExcelVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoiceImportReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoiceImportRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoicePageReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoiceRespVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.invoice.ErpPurchaseInvoiceSaveReqVO;
import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderRespVO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInvoiceDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
import cn.iocoder.yudao.module.erp.enums.ErpPurchaseInvoiceAuditStatusEnum;
import cn.iocoder.yudao.module.erp.service.finance.ErpFinancePaymentService;
import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInvoiceService;
import cn.iocoder.yudao.module.erp.service.purchase.ErpPurchaseInvoiceServiceImpl;
@@ -38,6 +40,7 @@
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -52,7 +55,7 @@
@Tag(name = "管理后台 - ERP 采购来票")
@RestController
@RequestMapping("/erp/purchase-invoice")
@RequestMapping({"/purchase/invoice", "/erp/purchase-invoice"})
@Validated
public class ErpPurchaseInvoiceController {
@@ -131,6 +134,28 @@
                buildInvoiceDetailList(list));
    }
    @GetMapping("/get-import-template")
    @Operation(summary = "获得导入来票模板")
    public void importTemplate(HttpServletResponse response) throws IOException {
        // 手动创建导出 demo
        List<ErpPurchaseInvoiceImportExcelVO> list = Arrays.asList(
                ErpPurchaseInvoiceImportExcelVO.builder().purchaseOrderNo("")
                        .invoiceNo("").invoiceTitle("").price(null)
                        .invoiceTime(null).remark("").build()
        );
        // 输出
        ExcelUtils.write(response, "来票导入模板.xls", "来票列表", ErpPurchaseInvoiceImportExcelVO.class, list);
    }
    @PostMapping("/import")
    @Operation(summary = "导入来票")
    @PreAuthorize("@ss.hasPermission('erp:purchase-invoice:import')")
    public CommonResult<ErpPurchaseInvoiceImportRespVO> importExcel(@Valid ErpPurchaseInvoiceImportReqVO importReqVO)
            throws Exception {
        List<ErpPurchaseInvoiceImportExcelVO> list = ExcelUtils.read(importReqVO.getFile(), ErpPurchaseInvoiceImportExcelVO.class);
        return success(invoiceService.importPurchaseInvoiceList(list, importReqVO));
    }
    private List<ErpPurchaseInvoiceRespVO> buildInvoiceDetailList(List<ErpPurchaseInvoiceDO> invoiceList) {
        if (CollUtil.isEmpty(invoiceList)) {
            return Collections.emptyList();
@@ -169,24 +194,8 @@
        });
    }
    @PutMapping("/update-status")
    @Operation(summary = "更新来票的状态(审核/反审核)")
    @PreAuthorize("@ss.hasPermission('erp:purchase-invoice:update-status')")
    public CommonResult<Boolean> updatePurchaseInvoiceStatus(@RequestParam("id") Long id,
                                                             @RequestParam("status") Integer status) {
        invoiceService.updatePurchaseInvoiceStatus(id, status);
        return success(true);
    }
    @GetMapping("/audit-count")
    @Operation(summary = "获得待审核来票数量")
    @PreAuthorize("@ss.hasPermission('erp:purchase-invoice:query')")
    public CommonResult<Long> getAuditInvoiceCount() {
        return success(invoiceService.getAuditInvoiceCount());
    }
    @GetMapping("/simple-list")
    @Operation(summary = "获得来票精简列表", description = "只包含审核通过且已上传发票附件的来票,主要用于付款创建时选择关联来票")
    @Operation(summary = "获得来票精简列表", description = "只包含已上传发票附件的来票,主要用于付款创建时选择关联来票")
    @Parameter(name = "supplierId", description = "供应商编号", required = true)
    @Parameter(name = "purchaseOrderId", description = "采购订单编号(可选,用于按订单过滤)")
    @PreAuthorize("@ss.hasPermission('erp:purchase-invoice:query')")
@@ -195,11 +204,9 @@
            @RequestParam(value = "purchaseOrderId", required = false) Long purchaseOrderId) {
        List<ErpPurchaseInvoiceDO> invoices;
        if (purchaseOrderId != null) {
            invoices = invoiceService.getPurchaseInvoiceListByOrderIdAndStatus(purchaseOrderId,
                    List.of(ErpPurchaseInvoiceAuditStatusEnum.APPROVE.getStatus()));
            invoices = invoiceService.getPurchaseInvoiceListByOrderId(purchaseOrderId);
        } else {
            invoices = invoiceService.getPurchaseInvoiceListBySupplierIdAndStatus(supplierId,
                    List.of(ErpPurchaseInvoiceAuditStatusEnum.APPROVE.getStatus()));
            invoices = invoiceService.getPurchaseInvoiceListBySupplierId(supplierId);
        }
        if (CollUtil.isEmpty(invoices)) {
            return success(Collections.emptyList());
@@ -225,7 +232,7 @@
                    .setId(invoice.getId()).setNo(invoice.getNo()).setInvoiceNo(invoice.getInvoiceNo())
                    .setInvoiceTitle(invoice.getInvoiceTitle()).setPrice(invoice.getPrice())
                    .setSupplierId(invoice.getSupplierId()).setPurchaseOrderId(invoice.getPurchaseOrderId())
                    .setAuditStatus(invoice.getAuditStatus()).setHasAttachment(true)
                    .setHasAttachment(true)
                    .setRemainingInvoicePrice(remainingPrice));
        }
        return success(result);