.gitignore
@@ -18,6 +18,7 @@ .project .settings .springBeans .claude ### IntelliJ IDEA ### .idea docs/invoice_registration_export.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,72 @@ # å¼ç¥¨ç»è®°åè¡¨å¯¼åº ## æ¶åé¡µé¢ - éå®ç®¡ç â å¼ç¥¨ç»è®°ï¼`src/views/salesManagement/invoiceRegistration/index.vue`ï¼ ## API | æ¹æ³ | è·¯å¾ | 说æ | |------|------|------| | POST | /invoiceRegistration/export | 导åºå¼ç¥¨ç»è®°å表ï¼ä¸é¡µé¢å表å£å¾ä¸è´ï¼ | **请æ±åæ°ï¼form 表åï¼ï¼** 导åºèå´è§åï¼**å¾éäºè¡åæå¾é导åºï¼ä¼ idsï¼ï¼æªå¾é导åºå ¨é¨æ°æ®ï¼ä¸ä¼ åæ°ï¼**ã | åæ° | ç±»å | å¿ å¡« | 说æ | |------|------|------|------| | ids | List<Long> | å¦ | å¾éçéå®å°è´¦ ID éåï¼form åºååå½¢å¦ `ids[0]=1&ids[1]=2`ï¼ä¼ äºåä» å¯¼åºè¿äºè¡ï¼ä¸ä¼ 导åºå ¨é¨ | **ååºï¼** Excel äºè¿å¶æµï¼blobï¼ï¼æä»¶å建议 `å¼ç¥¨ç»è®°ä¿¡æ¯.xlsx`ï¼ååºå®ä¸ºï¼ | åå | 说æ | |------|------| | éå®ååå· | sales_contract_no | | 客æ·ååå· | customer_contract_no | | 客æ·åç§° | customer_name | | ååéé¢ | sales_ledger.contract_amount | | å·²å¼ç¥¨éé¢ | å¼ç¥¨å°è´¦ invoice_ledger æ±æ»ï¼å£å¾åå表页 | | æªå¼ç¥¨éé¢ | ååéé¢ - å·²å¼ç¥¨éé¢ | ## å端修æ¹ç¹ ### 1. æç´¢åºæ°å¢å¯¼åºæé® ```html <el-form-item> <el-button type="primary" @click="handleQuery"> æç´¢ </el-button> <el-button @click="resetForm"> éç½® </el-button> <el-button @click="handleOut" type="primary">导åº</el-button> </el-form-item> ``` ### 2. å¯¼åºæ¹æ³ ```js // 导åºï¼å¾éå导åºéä¸è¡ï¼æªå¾é导åºå ¨é¨ const handleOut = () => { const exportIds = selectedRows.value.map((item) => item.id); const confirmMsg = exportIds.length ? `å·²éä¸ ${exportIds.length} æ¡æ°æ®ï¼å°å¯¼åºéä¸å å®¹ï¼æ¯å¦ç¡®è®¤ï¼` : "æªé䏿°æ®ï¼å°å¯¼åºå ¨é¨æ°æ®ï¼æ¯å¦ç¡®è®¤ï¼"; ElMessageBox.confirm(confirmMsg, "导åº", { confirmButtonText: "确认", cancelButtonText: "åæ¶", type: "warning", }) .then(() => { const params = exportIds.length ? { ids: exportIds } : {}; proxy.download("/invoiceRegistration/export", params, "å¼ç¥¨ç»è®°ä¿¡æ¯.xlsx"); }) .catch(() => { proxy.$modal.msg("已忶"); }); }; ``` ## 注æäºé¡¹ - æ¥å£ä¸º POSTï¼form 表åï¼ï¼ä½¿ç¨é¡¹ç®å ç½® `proxy.download` å³å¯ï¼ä¸è¦æ GET è°ç¨ã - 导åºä¸é¡µé¢æç´¢æ¡ä»¶æ å ³ï¼å¾é导éä¸ï¼ä¸å¾éå¯¼å ¨é¨ã - åè¡¨é¡µæ°æ®æºä¸º `/sales/ledger/listPage`ï¼å¯¼åºä¸å ¶å£å¾ä¸è´ï¼æ¥å£è·¯å¾ä¸åï¼`/invoiceRegistration/export`ï¼ï¼ä» è¿ååå 容ç±åæ¥ç"å¼ç¥¨ç»è®°+产åæç»"æ¹ä¸ºåå维度 6 åã src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java
@@ -86,10 +86,10 @@ /** * å¼ç¥¨ç»è®°å¯¼åº * @param response * @param invoiceRegistrationDto * @param salesLedgerDto */ @PostMapping("/export") public void invoiceRegistrationExport(HttpServletResponse response, InvoiceRegistrationDto invoiceRegistrationDto) { invoiceRegistrationService.invoiceRegistrationExport(response, invoiceRegistrationDto); public void invoiceRegistrationExport(HttpServletResponse response, SalesLedgerDto salesLedgerDto) { invoiceRegistrationService.invoiceRegistrationExport(response, salesLedgerDto); } } src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -54,4 +54,7 @@ @ApiModelProperty(value = "仿¬¾æ¹å¼") private String paymentMethod; @ApiModelProperty(value = "æå®å¯¼åºçéå®å°è´¦IDéå") private List<Long> ids; } src/main/java/com/ruoyi/sales/excel/InvoiceRegisAndProductExcelDto.java
ÎļþÒÑɾ³ý src/main/java/com/ruoyi/sales/excel/InvoiceRegistrationExportVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ package com.ruoyi.sales.excel; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; import java.math.BigDecimal; /** * å¼ç¥¨ç»è®°å表导åºå¯¹è±¡ */ @Data public class InvoiceRegistrationExportVo { @Excel(name = "éå®ååå·") private String salesContractNo; @Excel(name = "客æ·ååå·") private String customerContractNo; @Excel(name = "客æ·åç§°") private String customerName; @Excel(name = "ååéé¢") private BigDecimal contractAmount; @Excel(name = "å·²å¼ç¥¨éé¢") private BigDecimal invoiceTotal; @Excel(name = "æªå¼ç¥¨éé¢") private BigDecimal noInvoiceAmountTotal; } src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationMapper.java
@@ -4,11 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.sales.dto.InvoiceRegistrationDto; import com.ruoyi.sales.excel.InvoiceRegisAndProductExcelDto; import com.ruoyi.sales.pojo.InvoiceRegistration; import org.apache.ibatis.annotations.Param; import java.util.List; public interface InvoiceRegistrationMapper extends BaseMapper<InvoiceRegistration> { @@ -19,10 +16,4 @@ * @return */ IPage<InvoiceRegistrationDto> invoiceRegistrationListPage(Page page, @Param("invoiceRegistrationDto") InvoiceRegistrationDto invoiceRegistrationDto); /** * å¼ç¥¨ç»è®°å¯¼åºæ°æ®æ¥è¯¢ * @return */ List<InvoiceRegisAndProductExcelDto> invoiceRegisAndProductExcelDtoList(); } src/main/java/com/ruoyi/sales/service/InvoiceRegistrationService.java
@@ -59,7 +59,7 @@ /** * å¼ç¥¨ç»è®°å¯¼åº * @param response * @param invoiceRegistrationDto * @param salesLedgerDto */ void invoiceRegistrationExport(HttpServletResponse response, InvoiceRegistrationDto invoiceRegistrationDto); void invoiceRegistrationExport(HttpServletResponse response, SalesLedgerDto salesLedgerDto); } src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java
@@ -7,14 +7,16 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.sales.dto.InvoiceLedgerDto; import com.ruoyi.sales.dto.InvoiceRegistrationDto; import com.ruoyi.sales.dto.InvoiceRegistrationProductDto; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.excel.InvoiceRegisAndProductExcelDto; import com.ruoyi.sales.excel.InvoiceRegistrationExportVo; import com.ruoyi.sales.mapper.*; import com.ruoyi.sales.pojo.InvoiceLedger; import com.ruoyi.sales.pojo.InvoiceRegistration; import com.ruoyi.sales.pojo.InvoiceRegistrationProduct; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.InvoiceRegistrationService; import org.apache.commons.collections4.CollectionUtils; @@ -26,7 +28,10 @@ import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service @@ -43,6 +48,9 @@ @Autowired private InvoiceLedgerMapper invoiceLedgerMapper; @Autowired private SalesLedgerMapper salesLedgerMapper; /** * å¼ç¥¨ç»è®°è®°å½æ°å¢ @@ -178,13 +186,44 @@ /** * å¼ç¥¨ç»è®°å¯¼åº * 导åºåï¼éå®ååå·ã客æ·ååå·ã客æ·åç§°ãååéé¢ãå·²å¼ç¥¨éé¢ãæªå¼ç¥¨éé¢ * å·²å¼ç¥¨/æªå¼ç¥¨éé¢å£å¾ä¸ /sales/ledger/listPage 页é¢ä¸è´ * @param response * @param invoiceRegistrationDto * @param salesLedgerDto */ @Override public void invoiceRegistrationExport(HttpServletResponse response, InvoiceRegistrationDto invoiceRegistrationDto) { List<InvoiceRegisAndProductExcelDto> invoiceRegisAndProductExcelDtoList = invoiceRegistrationMapper.invoiceRegisAndProductExcelDtoList(); ExcelUtil<InvoiceRegisAndProductExcelDto> util = new ExcelUtil<InvoiceRegisAndProductExcelDto>(InvoiceRegisAndProductExcelDto.class); util.exportExcel(response, invoiceRegisAndProductExcelDtoList, "å¼ç¥¨ç»è®°ä¿¡æ¯"); public void invoiceRegistrationExport(HttpServletResponse response, SalesLedgerDto salesLedgerDto) { Page page = new Page(); page.setCurrent(-1); page.setSize(-1); IPage<SalesLedger> iPage = salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto); List<SalesLedger> records = iPage.getRecords(); // æéå®å°è´¦æ±æ»å·²å¼ç¥¨éé¢ Map<Integer, BigDecimal> invoicedMap = new HashMap<>(); List<Long> salesLedgerIds = records.stream().map(SalesLedger::getId).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(salesLedgerIds)) { List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds); for (InvoiceLedgerDto invoiceLedgerDto : invoiceLedgerDtoList) { invoicedMap.put(invoiceLedgerDto.getSalesLedgerId(), invoiceLedgerDto.getInvoiceTotal()); } } List<InvoiceRegistrationExportVo> exportList = new ArrayList<>(); for (SalesLedger record : records) { BigDecimal contractAmount = record.getContractAmount() == null ? BigDecimal.ZERO : record.getContractAmount(); BigDecimal invoiceTotal = invoicedMap.getOrDefault(record.getId().intValue(), BigDecimal.ZERO); BigDecimal noInvoiceAmountTotal = contractAmount.subtract(invoiceTotal); InvoiceRegistrationExportVo exportVo = new InvoiceRegistrationExportVo(); exportVo.setSalesContractNo(record.getSalesContractNo()); exportVo.setCustomerContractNo(record.getCustomerContractNo()); exportVo.setCustomerName(record.getCustomerName()); exportVo.setContractAmount(contractAmount); exportVo.setInvoiceTotal(invoiceTotal); exportVo.setNoInvoiceAmountTotal(noInvoiceAmountTotal); exportList.add(exportVo); } ExcelUtil<InvoiceRegistrationExportVo> util = new ExcelUtil<InvoiceRegistrationExportVo>(InvoiceRegistrationExportVo.class); util.exportExcel(response, exportList, "å¼ç¥¨ç»è®°ä¿¡æ¯"); } } src/main/resources/mapper/sales/InvoiceRegistrationMapper.xml
@@ -34,39 +34,4 @@ ) T4 ON T1.id = T4.invoice_registration_id </select> <select id="invoiceRegisAndProductExcelDtoList" resultType="com.ruoyi.sales.excel.InvoiceRegisAndProductExcelDto"> SELECT T1.id , T1.sales_ledger_id , T1.sales_contract_no , T1.customer_id , T1.salesman , T1.project_name , T1.create_time , T1.create_user , T1.update_time , T1.update_user , T1.tenant_id, T2.customer_contract_no, T3.customer_name, T2.contract_amount, T4.product_category, T4.specification_model, T4.unit, T4.quantity, T4.tax_rate, T4.tax_inclusive_unit_price, T4.tax_inclusive_total_price, T4.tax_exclusive_total_price, T4.invoice_type, T4.invoice_num, T4.invoice_amount, T4.no_invoice_num, T4.no_invoice_amount FROM invoice_registration T1 JOIN sales_ledger T2 ON T1.sales_ledger_id = T2.id JOIN customer T3 ON T1.customer_id = T3.id JOIN invoice_registration_product T4 ON T1.id = T4.invoice_registration_id ORDER BY T1.id ASC </select> </mapper> src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -81,6 +81,12 @@ <if test="salesLedgerDto.entryDateEnd != null and salesLedgerDto.entryDateEnd != '' "> AND T1.entry_date <= DATE_FORMAT(#{salesLedgerDto.entryDateEnd},'%Y-%m-%d') </if> <if test="salesLedgerDto.ids != null and salesLedgerDto.ids.size() > 0"> AND T1.id IN <foreach collection="salesLedgerDto.ids" item="item" open="(" close=")" separator=","> #{item} </foreach> </if> </where> </select> </mapper>