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.common.utils.poi.ExcelUtil; 
 | 
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.InvoiceLedgerDto; 
 | 
import com.ruoyi.sales.dto.SalesLedgerDto; 
 | 
import com.ruoyi.sales.mapper.InvoiceLedgerMapper; 
 | 
import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper; 
 | 
import com.ruoyi.sales.mapper.ReceiptPaymentMapper; 
 | 
import com.ruoyi.sales.pojo.InvoiceLedger; 
 | 
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct; 
 | 
import com.ruoyi.sales.pojo.ReceiptPayment; 
 | 
import com.ruoyi.sales.pojo.SalesLedger; 
 | 
import com.ruoyi.sales.service.ICommonFileService; 
 | 
import com.ruoyi.sales.service.ISalesLedgerService; 
 | 
import lombok.AllArgsConstructor; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.util.CollectionUtils; 
 | 
import org.springframework.web.bind.annotation.*; 
 | 
  
 | 
import javax.servlet.http.HttpServletResponse; 
 | 
import java.math.BigDecimal; 
 | 
import java.util.ArrayList; 
 | 
import java.util.List; 
 | 
import java.util.Objects; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
/** 
 | 
 * 销售台账Controller 
 | 
 * 
 | 
 * @author ruoyi 
 | 
 * @date 2025-05-08 
 | 
 */ 
 | 
@RestController 
 | 
@RequestMapping("/sales/ledger") 
 | 
@AllArgsConstructor 
 | 
public class SalesLedgerController extends BaseController { 
 | 
  
 | 
    private ISalesLedgerService salesLedgerService; 
 | 
  
 | 
    private ICommonFileService commonFileService; 
 | 
  
 | 
    @Autowired 
 | 
    private InvoiceLedgerMapper invoiceLedgerMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private ReceiptPaymentMapper receiptPaymentMapper; 
 | 
  
 | 
    /** 
 | 
     * 查询销售台账列表 
 | 
     */ 
 | 
    @GetMapping("/list") 
 | 
    public TableDataInfo list(Page page, SalesLedgerDto salesLedgerDto) { 
 | 
        startPage(); 
 | 
        List<SalesLedger> list = salesLedgerService.selectSalesLedgerList(salesLedgerDto); 
 | 
        // 计算已开票金额/未开票金额(已填写发票金额为准) 
 | 
        if(CollectionUtils.isEmpty(list)){ 
 | 
            return getDataTable(list); 
 | 
        } 
 | 
        List<Long> salesLedgerIds = list.stream().map(SalesLedger::getId).collect(Collectors.toList()); 
 | 
        List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds); 
 | 
        if(CollectionUtils.isEmpty(invoiceLedgerDtoList)){ 
 | 
            return getDataTable(list); 
 | 
        } 
 | 
        for (SalesLedger salesLedger : list) { 
 | 
            for (InvoiceLedgerDto invoiceLedgerDto : invoiceLedgerDtoList) { 
 | 
                if (salesLedger.getId().intValue() == invoiceLedgerDto.getSalesLedgerId()) { 
 | 
                    BigDecimal noInvoiceAmountTotal = salesLedger.getContractAmount().subtract(invoiceLedgerDto.getInvoiceTotal()); 
 | 
                    salesLedger.setNoInvoiceAmountTotal(noInvoiceAmountTotal); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        return getDataTable(list); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 查询销售台账和产品父子列表 
 | 
     */ 
 | 
    @GetMapping("/getSalesLedgerWithProducts") 
 | 
    public SalesLedgerDto getSalesLedgerWithProducts(SalesLedgerDto salesLedgerDto) { 
 | 
        return salesLedgerService.getSalesLedgerWithProducts(salesLedgerDto); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 导出销售台账列表 
 | 
     */ 
 | 
    @Log(title = "销售台账", businessType = BusinessType.EXPORT) 
 | 
    @PostMapping("/export") 
 | 
    public void export(HttpServletResponse response, SalesLedgerDto salesLedgerDto) { 
 | 
        List<SalesLedger> list = salesLedgerService.selectSalesLedgerList(salesLedgerDto); 
 | 
        ExcelUtil<SalesLedger> util = new ExcelUtil<SalesLedger>(SalesLedger.class); 
 | 
        util.exportExcel(response, list, "销售台账数据"); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 新增修改销售台账 
 | 
     */ 
 | 
    @Log(title = "销售台账", businessType = BusinessType.INSERT) 
 | 
    @PostMapping("/addOrUpdateSalesLedger") 
 | 
    public AjaxResult add(@RequestBody SalesLedgerDto salesLedgerDto) { 
 | 
        return toAjax(salesLedgerService.addOrUpdateSalesLedger(salesLedgerDto)); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 删除销售台账 
 | 
     */ 
 | 
    @Log(title = "销售台账", businessType = BusinessType.DELETE) 
 | 
    @DeleteMapping("/delLedger") 
 | 
    public AjaxResult remove(@RequestBody Long[] ids) { 
 | 
        if (ids == null || ids.length == 0) { 
 | 
            return AjaxResult.error("请传入要删除的ID"); 
 | 
        } 
 | 
        return toAjax(salesLedgerService.deleteSalesLedgerByIds(ids)); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 查询销售台账不分页 
 | 
     * 
 | 
     * @param salesLedgerDto 
 | 
     * @return 
 | 
     */ 
 | 
    @GetMapping("/listNoPage") 
 | 
    public AjaxResult listNoPage(SalesLedgerDto salesLedgerDto) { 
 | 
        List<SalesLedger> list = salesLedgerService.selectSalesLedgerList(salesLedgerDto); 
 | 
        return AjaxResult.success(list); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 销售台账附件删除 
 | 
     */ 
 | 
    @Log(title = "销售台账附件删除", businessType = BusinessType.DELETE) 
 | 
    @DeleteMapping("/delLedgerFile") 
 | 
    public AjaxResult delLedgerFile(@RequestBody Long[] ids) { 
 | 
        if (ids == null || ids.length == 0) { 
 | 
            return AjaxResult.error("请传入要删除的ID"); 
 | 
        } 
 | 
        return toAjax(commonFileService.deleteSalesLedgerByIds(ids)); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 本月销售合同金额 
 | 
     */ 
 | 
    @GetMapping("/getContractAmount") 
 | 
    public AjaxResult getContractAmount() { 
 | 
        try { 
 | 
            BigDecimal contractAmount = salesLedgerService.getContractAmount(); 
 | 
            return AjaxResult.success(contractAmount != null ? contractAmount : BigDecimal.ZERO); 
 | 
        } catch (Exception e) { 
 | 
            return AjaxResult.error("获取合同金额失败:" + e.getMessage()); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 客户合同金额TOP5统计 
 | 
     */ 
 | 
    @GetMapping("/getTopFiveList") 
 | 
    public AjaxResult getTopFiveList() { 
 | 
        return AjaxResult.success(salesLedgerService.getTopFiveList()); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 近半年开票,回款金额 
 | 
     */ 
 | 
    @GetMapping("/getAmountHalfYear") 
 | 
    public AjaxResult getAmountHalfYear(@RequestParam(value = "type",defaultValue = "1") Integer type) { 
 | 
        return AjaxResult.success(salesLedgerService.getAmountHalfYear(type)); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 查询销售台账列表 
 | 
     */ 
 | 
    @GetMapping("/listPage") 
 | 
    public IPage<SalesLedger> listPage(Page page, SalesLedgerDto salesLedgerDto) { 
 | 
        IPage<SalesLedger> iPage = salesLedgerService.selectSalesLedgerListPage(page,salesLedgerDto); 
 | 
        // 计算已开票金额/未开票金额(已填写发票金额为准) 
 | 
        if(CollectionUtils.isEmpty(iPage.getRecords())){ 
 | 
            return iPage; 
 | 
        } 
 | 
        List<Long> salesLedgerIds = iPage.getRecords().stream().map(SalesLedger::getId).collect(Collectors.toList()); 
 | 
        List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds); 
 | 
        if(CollectionUtils.isEmpty(invoiceLedgerDtoList)){ 
 | 
            iPage.setTotal(iPage.getRecords().size()); 
 | 
            return iPage; 
 | 
        } 
 | 
        // 计算回款金额,待回款金额 
 | 
        List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(new LambdaQueryWrapper<InvoiceRegistrationProduct>() 
 | 
                .in(InvoiceRegistrationProduct::getSalesLedgerId, salesLedgerIds)); 
 | 
  
 | 
        List<InvoiceLedger> invoiceLedgers = invoiceLedgerMapper.selectList(new LambdaQueryWrapper<InvoiceLedger>() 
 | 
                .in(InvoiceLedger::getInvoiceRegistrationProductId, invoiceRegistrationProducts.stream().map(InvoiceRegistrationProduct::getId).collect(Collectors.toList()))); 
 | 
        List<ReceiptPayment> receiptPayments = new ArrayList<>(); 
 | 
        if(!CollectionUtils.isEmpty(invoiceLedgers)){ 
 | 
            receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>() 
 | 
                    .in(ReceiptPayment::getInvoiceLedgerId, invoiceLedgers.stream().map(InvoiceLedger::getId).collect(Collectors.toList()))); 
 | 
        } 
 | 
        for (SalesLedger salesLedger : iPage.getRecords()) { 
 | 
            boolean existFlag = false; 
 | 
            BigDecimal noInvoiceAmountTotal = BigDecimal.ZERO; 
 | 
            BigDecimal invoiceTotal = BigDecimal.ZERO; 
 | 
            for (InvoiceLedgerDto invoiceLedgerDto : invoiceLedgerDtoList) { 
 | 
                if (salesLedger.getId().intValue() == invoiceLedgerDto.getSalesLedgerId()) { 
 | 
                    noInvoiceAmountTotal = salesLedger.getContractAmount().subtract(invoiceLedgerDto.getInvoiceTotal()); 
 | 
                    invoiceTotal = invoiceLedgerDto.getInvoiceTotal(); 
 | 
                    existFlag = true; 
 | 
                    if(!CollectionUtils.isEmpty(receiptPayments)){ 
 | 
                        List<InvoiceRegistrationProduct> collect = invoiceRegistrationProducts.stream() 
 | 
                                .filter(item -> salesLedger.getId().equals(Long.parseLong(item.getSalesLedgerId().toString()))) 
 | 
                                .collect(Collectors.toList()); 
 | 
                        List<Integer> collect1 = collect.stream() 
 | 
                                .map(InvoiceRegistrationProduct::getId).collect(Collectors.toList()); 
 | 
                        List<InvoiceLedger> collect2 = invoiceLedgers.stream() 
 | 
                                .filter(item -> collect1.contains(item.getInvoiceRegistrationProductId())) 
 | 
                                .collect(Collectors.toList()); 
 | 
                        // 获取已回款金额 
 | 
                        List<ReceiptPayment> collect3 = receiptPayments.stream() 
 | 
                                .filter(item -> collect2.stream().anyMatch(item1 -> item1.getId().equals(item.getInvoiceLedgerId()))) 
 | 
                                .collect(Collectors.toList()); 
 | 
                        BigDecimal receiptPaymentAmountTotal = collect3.stream().map(ReceiptPayment::getReceiptPaymentAmount) 
 | 
                                .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); 
 | 
                        // 获取待回款金额 
 | 
                        BigDecimal noReceiptPaymentAmountTotal = invoiceLedgerDto.getInvoiceTotal().subtract(receiptPaymentAmountTotal); 
 | 
                        salesLedger.setReceiptPaymentAmountTotal(receiptPaymentAmountTotal); 
 | 
                        salesLedger.setNoReceiptAmount(noReceiptPaymentAmountTotal); 
 | 
                    } 
 | 
                    break; 
 | 
                } 
 | 
            } 
 | 
            if(existFlag){ 
 | 
                salesLedger.setNoInvoiceAmountTotal(noInvoiceAmountTotal); 
 | 
            }else { 
 | 
                salesLedger.setNoInvoiceAmountTotal(salesLedger.getContractAmount()); 
 | 
            } 
 | 
            salesLedger.setInvoiceTotal(invoiceTotal); 
 | 
        } 
 | 
        if (ObjectUtils.isNotEmpty(salesLedgerDto.getStatus())) { 
 | 
            if (salesLedgerDto.getStatus()) { 
 | 
                iPage.getRecords().removeIf(salesLedger -> Objects.equals(salesLedger.getNoInvoiceAmountTotal(), new BigDecimal("0.00"))); 
 | 
            } 
 | 
        } 
 | 
        iPage.setTotal(iPage.getRecords().size()); 
 | 
        return iPage; 
 | 
    } 
 | 
} 
 |