| src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/dto/SalesLedgerProductTotalsDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/pojo/SalesLedger.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/sales/SalesLedgerMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/sales/SalesLedgerProductMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -1,8 +1,6 @@ package com.ruoyi.sales.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.common.utils.poi.ExcelUtil; @@ -14,8 +12,6 @@ import com.ruoyi.framework.web.page.TableDataInfo; import com.ruoyi.sales.dto.*; import com.ruoyi.sales.mapper.InvoiceLedgerMapper; import com.ruoyi.sales.mapper.ReceiptPaymentMapper; import com.ruoyi.sales.pojo.ReceiptPayment; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProcessRoute; import com.ruoyi.sales.service.ICommonFileService; @@ -59,9 +55,6 @@ @Autowired private InvoiceLedgerMapper invoiceLedgerMapper; @Autowired private ReceiptPaymentMapper receiptPaymentMapper; /** * å¯¼å ¥éå®å°è´¦ @@ -118,7 +111,7 @@ * æ¥è¯¢éå®å°è´¦å表 */ @GetMapping("/list") public TableDataInfo list(Page page, SalesLedgerDto salesLedgerDto) { public TableDataInfo list(Page<?> page, SalesLedgerDto salesLedgerDto) { startPage(); List<SalesLedger> list = salesLedgerService.selectSalesLedgerList(salesLedgerDto); // 计ç®å·²å¼ç¥¨éé¢/æªå¼ç¥¨éé¢(已填åå票éé¢ä¸ºå) @@ -156,7 +149,7 @@ @Log(title = "éå®å°è´¦", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, SalesLedgerDto salesLedgerDto) { Page page = new Page(-1, -1); Page<?> page = new Page<>(-1, -1); IPage<SalesLedger> salesLedgerIPage = listPage(page, salesLedgerDto); ExcelUtil<SalesLedger> util = new ExcelUtil<SalesLedger>(SalesLedger.class); if (salesLedgerIPage == null) { @@ -173,7 +166,7 @@ @Log(title = "导åºå¼ç¥¨ç»è®°å表", businessType = BusinessType.EXPORT) @PostMapping("/exportOne") public void exportOne(HttpServletResponse response, SalesLedgerDto salesLedgerDto) { Page page = new Page(); Page<?> page = new Page<>(); page.setCurrent(-1); page.setSize(-1); IPage<SalesLedger> salesLedgerIPage = listPage(page, salesLedgerDto); @@ -269,91 +262,8 @@ * æ¥è¯¢éå®å°è´¦å表 */ @GetMapping("/listPage") public IPage<SalesLedger> listPage(Page page, SalesLedgerDto salesLedgerDto) { IPage<SalesLedger> iPage = salesLedgerService.selectSalesLedgerListPage(page, salesLedgerDto); // æ¥è¯¢ç»æä¸ºç©º,ç´æ¥è¿å if (CollectionUtils.isEmpty(iPage.getRecords())) { return iPage; } // è·åå½å页ææå°è´¦è®°å½ç ID éå List<Long> salesLedgerIds = iPage.getRecords().stream().map(SalesLedger::getId).collect(Collectors.toList()); // æ¥è¯¢å票信æ¯çå·²å¼ç¥¨éé¢ List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds); if (CollectionUtils.isEmpty(invoiceLedgerDtoList)) { invoiceLedgerDtoList = Collections.emptyList(); } // 转æ¢åç¥¨æ°æ®, key 为å°è´¦ID, value 为该å°è´¦çæ»å¼ç¥¨éé¢ Map<Long, BigDecimal> invoiceTotals = invoiceLedgerDtoList.stream() .filter(dto -> dto.getSalesLedgerId() != null && dto.getInvoiceTotal() != null) .collect(Collectors.toMap( dto -> dto.getSalesLedgerId().longValue(), InvoiceLedgerDto::getInvoiceTotal, BigDecimal::add // åå¨éå¤IDæ§è¡ç´¯å )); // æ¥è¯¢å款/仿¬¾è®°å½ List<ReceiptPayment> receiptPayments = Collections.emptyList(); if (!CollectionUtils.isEmpty(salesLedgerIds)) { receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>() .in(ReceiptPayment::getSalesLedgerId, salesLedgerIds)); } // 转æ¢åæ¬¾æ°æ®, key 为å°è´¦ID, value 为该å°è´¦çæ»å款éé¢ Map<Long, BigDecimal> receiptTotals = new HashMap<>(); if (!CollectionUtils.isEmpty(receiptPayments)) { for (ReceiptPayment receiptPayment : receiptPayments) { if (receiptPayment.getSalesLedgerId() != null && receiptPayment.getReceiptPaymentAmount() != null) { // 妿 key åå¨åç¸å ,ä¸åå¨åæ¾å ¥ receiptTotals.merge(receiptPayment.getSalesLedgerId(), receiptPayment.getReceiptPaymentAmount(), BigDecimal::add); } } } for (SalesLedger salesLedger : iPage.getRecords()) { Long ledgerId = salesLedger.getId(); // ååæ»éé¢ BigDecimal contractAmount = salesLedger.getContractAmount() == null ? BigDecimal.ZERO : salesLedger.getContractAmount(); // å¼ç¥¨æ»é¢å忬¾æ»é¢ BigDecimal invoiceTotal = invoiceTotals.getOrDefault(ledgerId, BigDecimal.ZERO); BigDecimal receiptPaymentAmountTotal = receiptTotals.getOrDefault(ledgerId, BigDecimal.ZERO); // æªå¼ç¥¨éé¢ = ååéé¢ - å·²å¼ç¥¨éé¢ BigDecimal noInvoiceAmountTotal = contractAmount.subtract(invoiceTotal); if (noInvoiceAmountTotal.compareTo(BigDecimal.ZERO) < 0) { noInvoiceAmountTotal = BigDecimal.ZERO; } // å¾ åæ¬¾éé¢ = å·²å¼ç¥¨éé¢ - 已忬¾éé¢ BigDecimal noReceiptPaymentAmountTotal = invoiceTotal.subtract(receiptPaymentAmountTotal); if (noReceiptPaymentAmountTotal.compareTo(BigDecimal.ZERO) < 0) { noReceiptPaymentAmountTotal = BigDecimal.ZERO; } salesLedger.setNoInvoiceAmountTotal(noInvoiceAmountTotal); salesLedger.setInvoiceTotal(invoiceTotal); salesLedger.setReceiptPaymentAmountTotal(receiptPaymentAmountTotal); salesLedger.setNoReceiptAmount(noReceiptPaymentAmountTotal); // å¦æå·²ç»æè¿å¼ç¥¨æå款æä½,åä¸å 许ç¼è¾ boolean hasInvoiceOperation = invoiceTotal.compareTo(BigDecimal.ZERO) > 0; boolean hasReceiptOperation = receiptPaymentAmountTotal.compareTo(BigDecimal.ZERO) > 0; salesLedger.setIsEdit(!(hasInvoiceOperation || hasReceiptOperation)); } if (ObjectUtils.isNotEmpty(salesLedgerDto.getStatus())) { if (salesLedgerDto.getStatus()) { // æ¸ é¤ææâæªå¼ç¥¨éé¢â为 0 çè®°å½ iPage.getRecords().removeIf(salesLedger -> Objects.equals(salesLedger.getNoInvoiceAmountTotal(), new BigDecimal("0.00"))); iPage.setTotal(iPage.getRecords().size()); } } return iPage; public IPage<SalesLedger> listPage(Page<?> page, SalesLedgerDto salesLedgerDto) { return salesLedgerService.selectSalesLedgerListPage(page, salesLedgerDto); } @ApiOperation("æ¥è¯¢éå®å°è´¦æ¶èç©æä¿¡æ¯") src/main/java/com/ruoyi/sales/dto/SalesInvoicesDto.java
@@ -65,6 +65,9 @@ @ApiModelProperty("产ååç§°") private String productName; @ApiModelProperty("è§æ ¼åå·") private String specificationModel; @ApiModelProperty("æç»å表") private List<InvoiceItemDto> items; src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -8,6 +8,7 @@ import lombok.Data; import java.time.LocalDate; import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -65,4 +66,10 @@ @ApiModelProperty(value = "å ¥åºç¶æ") private Integer stockStatus; @ApiModelProperty(value = "产å宽") private BigDecimal width; @ApiModelProperty(value = "产åé«") private BigDecimal height; } src/main/java/com/ruoyi/sales/dto/SalesLedgerProductTotalsDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.ruoyi.sales.dto; import lombok.Data; import java.math.BigDecimal; @Data public class SalesLedgerProductTotalsDto { private Long salesLedgerId; private BigDecimal totalQuantity; private BigDecimal totalArea; } src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
@@ -5,6 +5,7 @@ import com.ruoyi.common.config.MyBaseMapper; import com.ruoyi.purchase.dto.ProcurementBusinessSummaryDto; import com.ruoyi.purchase.dto.ProcurementBusinessSummaryStatisticsDto; import com.ruoyi.sales.dto.SalesLedgerProductTotalsDto; import com.ruoyi.sales.dto.LossProductModelDto; import com.ruoyi.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.pojo.SalesLedgerProduct; @@ -36,6 +37,8 @@ ProcurementBusinessSummaryStatisticsDto procurementBusinessSummaryStatistics(@Param("req") ProcurementBusinessSummaryDto procurementBusinessSummaryDto); List<SalesLedgerProductTotalsDto> selectSalesLedgerProductTotals(@Param("salesLedgerIds") List<Long> salesLedgerIds, @Param("type") Integer type); List<LossProductModelDto> selectProductBomStructure(@Param("salesLedegerId") Long salesLedegerId); List<Map<String, Object>> selectProductSalesAnalysis(); src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -10,6 +10,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.util.List; /** * éå®å°è´¦å¯¹è±¡ sales_ledger @@ -165,5 +166,17 @@ @TableField(exist = false) //æ¯å¦å¯ç¼è¾ private Boolean isEdit; @TableField(exist = false) @ApiModelProperty("订åäº§åæ»æ°é") private BigDecimal productTotalQuantity = BigDecimal.ZERO; @TableField(exist = false) @ApiModelProperty("订åäº§åæ»é¢ç§¯(ã¡)") private BigDecimal productTotalArea = BigDecimal.ZERO; @TableField(exist = false) @ApiModelProperty("å½ä¸çéå®äº§åå表") private List<SalesLedgerProduct> matchedProducts; } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -418,7 +418,112 @@ @Override public IPage<SalesLedger> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto) { return salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto); IPage<SalesLedger> iPage = salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto); if (CollectionUtils.isEmpty(iPage.getRecords())) { return iPage; } List<Long> salesLedgerIds = iPage.getRecords().stream().map(SalesLedger::getId).collect(Collectors.toList()); boolean hasWidthHeightFilter = salesLedgerDto.getWidth() != null || salesLedgerDto.getHeight() != null; Map<Long, List<SalesLedgerProduct>> matchedProductsMap = Collections.emptyMap(); if (hasWidthHeightFilter) { LambdaQueryWrapper<SalesLedgerProduct> productQueryWrapper = new LambdaQueryWrapper<SalesLedgerProduct>() .in(SalesLedgerProduct::getSalesLedgerId, salesLedgerIds) .eq(SalesLedgerProduct::getType, 1); if (salesLedgerDto.getWidth() != null) { productQueryWrapper.eq(SalesLedgerProduct::getWidth, salesLedgerDto.getWidth()); } if (salesLedgerDto.getHeight() != null) { productQueryWrapper.eq(SalesLedgerProduct::getHeight, salesLedgerDto.getHeight()); } List<SalesLedgerProduct> matchedProducts = salesLedgerProductMapper.selectList(productQueryWrapper); matchedProductsMap = CollectionUtils.isEmpty(matchedProducts) ? Collections.emptyMap() : matchedProducts.stream().collect(Collectors.groupingBy(SalesLedgerProduct::getSalesLedgerId)); } List<SalesLedgerProductTotalsDto> productTotals = salesLedgerProductMapper.selectSalesLedgerProductTotals(salesLedgerIds, 1); Map<Long, SalesLedgerProductTotalsDto> productTotalsMap = CollectionUtils.isEmpty(productTotals) ? Collections.emptyMap() : productTotals.stream() .filter(t -> t.getSalesLedgerId() != null) .collect(Collectors.toMap(SalesLedgerProductTotalsDto::getSalesLedgerId, Function.identity(), (a, b) -> a)); List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds); if (CollectionUtils.isEmpty(invoiceLedgerDtoList)) { invoiceLedgerDtoList = Collections.emptyList(); } Map<Long, BigDecimal> invoiceTotals = invoiceLedgerDtoList.stream() .filter(dto -> dto.getSalesLedgerId() != null && dto.getInvoiceTotal() != null) .collect(Collectors.toMap( dto -> dto.getSalesLedgerId().longValue(), InvoiceLedgerDto::getInvoiceTotal, BigDecimal::add )); List<ReceiptPayment> receiptPayments = Collections.emptyList(); if (!CollectionUtils.isEmpty(salesLedgerIds)) { receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>() .in(ReceiptPayment::getSalesLedgerId, salesLedgerIds)); } Map<Long, BigDecimal> receiptTotals = new HashMap<>(); if (!CollectionUtils.isEmpty(receiptPayments)) { for (ReceiptPayment receiptPayment : receiptPayments) { if (receiptPayment.getSalesLedgerId() != null && receiptPayment.getReceiptPaymentAmount() != null) { receiptTotals.merge(receiptPayment.getSalesLedgerId(), receiptPayment.getReceiptPaymentAmount(), BigDecimal::add); } } } for (SalesLedger salesLedger : iPage.getRecords()) { Long ledgerId = salesLedger.getId(); SalesLedgerProductTotalsDto totals = productTotalsMap.get(ledgerId); if (totals != null) { salesLedger.setProductTotalQuantity(totals.getTotalQuantity() != null ? totals.getTotalQuantity() : BigDecimal.ZERO); salesLedger.setProductTotalArea(totals.getTotalArea() != null ? totals.getTotalArea() : BigDecimal.ZERO); } else { salesLedger.setProductTotalQuantity(BigDecimal.ZERO); salesLedger.setProductTotalArea(BigDecimal.ZERO); } if (hasWidthHeightFilter) { salesLedger.setMatchedProducts(matchedProductsMap.getOrDefault(ledgerId, Collections.emptyList())); } BigDecimal contractAmount = salesLedger.getContractAmount() == null ? BigDecimal.ZERO : salesLedger.getContractAmount(); BigDecimal invoiceTotal = invoiceTotals.getOrDefault(ledgerId, BigDecimal.ZERO); BigDecimal receiptPaymentAmountTotal = receiptTotals.getOrDefault(ledgerId, BigDecimal.ZERO); BigDecimal noInvoiceAmountTotal = contractAmount.subtract(invoiceTotal); if (noInvoiceAmountTotal.compareTo(BigDecimal.ZERO) < 0) { noInvoiceAmountTotal = BigDecimal.ZERO; } BigDecimal noReceiptPaymentAmountTotal = invoiceTotal.subtract(receiptPaymentAmountTotal); if (noReceiptPaymentAmountTotal.compareTo(BigDecimal.ZERO) < 0) { noReceiptPaymentAmountTotal = BigDecimal.ZERO; } salesLedger.setNoInvoiceAmountTotal(noInvoiceAmountTotal); salesLedger.setInvoiceTotal(invoiceTotal); salesLedger.setReceiptPaymentAmountTotal(receiptPaymentAmountTotal); salesLedger.setNoReceiptAmount(noReceiptPaymentAmountTotal); boolean hasInvoiceOperation = invoiceTotal.compareTo(BigDecimal.ZERO) > 0; boolean hasReceiptOperation = receiptPaymentAmountTotal.compareTo(BigDecimal.ZERO) > 0; salesLedger.setIsEdit(!(hasInvoiceOperation || hasReceiptOperation)); } if (salesLedgerDto.getStatus() != null && salesLedgerDto.getStatus()) { iPage.getRecords().removeIf(salesLedger -> Objects.equals(salesLedger.getNoInvoiceAmountTotal(), new BigDecimal("0.00"))); iPage.setTotal(iPage.getRecords().size()); } return iPage; } @Override @@ -1536,6 +1641,7 @@ Set<String> orderNos = groupOrderNos.getOrDefault(key, Collections.emptySet()); group.setSalesContractNo(String.join(",", orderNos)); group.setProductName(productName); group.setSpecificationModel(specificationModel); Map<String, SalesInvoicesDto.InvoiceItemDto> mergedItems = new LinkedHashMap<>(); BigDecimal groupQty = BigDecimal.ZERO; src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -95,6 +95,20 @@ <if test="salesLedgerDto.stockStatus != null"> AND T1.stock_status = #{salesLedgerDto.stockStatus} </if> <if test="salesLedgerDto.width != null or salesLedgerDto.height != null"> AND EXISTS ( SELECT 1 FROM sales_ledger_product SLP WHERE SLP.sales_ledger_id = T1.id AND SLP.type = 1 <if test="salesLedgerDto.width != null"> AND SLP.width = #{salesLedgerDto.width} </if> <if test="salesLedgerDto.height != null"> AND SLP.height = #{salesLedgerDto.height} </if> ) </if> </where> ORDER BY T1.entry_date DESC,T1.id DESC </select> src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -278,4 +278,20 @@ FROM product_tree); </select> <select id="selectSalesLedgerProductTotals" resultType="com.ruoyi.sales.dto.SalesLedgerProductTotalsDto"> SELECT slp.sales_ledger_id AS salesLedgerId, COALESCE(SUM(slp.quantity), 0) AS totalQuantity, COALESCE(SUM(COALESCE(slp.settle_total_area, slp.actual_total_area, 0)), 0) AS totalArea FROM sales_ledger_product slp WHERE slp.sales_ledger_id IN <foreach collection="salesLedgerIds" item="id" open="(" separator="," close=")"> #{id} </foreach> <if test="type != null"> AND slp.type = #{type} </if> GROUP BY slp.sales_ledger_id </select> </mapper>