From 3ac318e2f614e8c57a0a9a6d175d2909ba1dbc21 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期四, 21 五月 2026 14:20:45 +0800
Subject: [PATCH] feat(purchase): 新增供应商往来及往来明细接口功能
---
src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsVo.java | 30 ++++++
src/main/resources/mapper/account/purchase/AccountPurchasePaymentMapper.xml | 2
src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java | 12 ++
src/main/resources/mapper/account/sales/AccountSalesCollectionMapper.xml | 2
src/main/resources/mapper/basic/SupplierManageMapper.xml | 92 ++++++++++++++++++
src/main/java/com/ruoyi/basic/mapper/SupplierManageMapper.java | 6 +
src/main/java/com/ruoyi/basic/service/ISupplierService.java | 21 +++
src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java | 18 +++
src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java | 33 ++++++
src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml | 53 ++++++++++
10 files changed, 264 insertions(+), 5 deletions(-)
diff --git a/src/main/java/com/ruoyi/basic/mapper/SupplierManageMapper.java b/src/main/java/com/ruoyi/basic/mapper/SupplierManageMapper.java
index 1ba05a6..beea9c3 100644
--- a/src/main/java/com/ruoyi/basic/mapper/SupplierManageMapper.java
+++ b/src/main/java/com/ruoyi/basic/mapper/SupplierManageMapper.java
@@ -6,6 +6,8 @@
import com.ruoyi.basic.dto.SupplierManageDto;
import com.ruoyi.basic.excel.SupplierManageExcelDto;
import com.ruoyi.basic.pojo.SupplierManage;
+import com.ruoyi.purchase.vo.SupplierTransactionsDetailsVo;
+import com.ruoyi.purchase.vo.SupplierTransactionsVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -17,4 +19,8 @@
IPage<SupplierManage> supplierListPage(Page page, @Param("supplierManageDto") SupplierManageDto supplierManageDto);
List<SupplierManageExcelDto> supplierExportList(@Param("supplierManageDto") SupplierManageDto supplierManageDto);
+
+ IPage<SupplierTransactionsVo> supplierTransactions(Page page, @Param("supplierName") String supplierName);
+
+ IPage<SupplierTransactionsDetailsVo> supplierTransactionsDetails(Page page, @Param("supplierId") Long supplierId);
}
diff --git a/src/main/java/com/ruoyi/basic/service/ISupplierService.java b/src/main/java/com/ruoyi/basic/service/ISupplierService.java
index b54c2ad..ce6d832 100644
--- a/src/main/java/com/ruoyi/basic/service/ISupplierService.java
+++ b/src/main/java/com/ruoyi/basic/service/ISupplierService.java
@@ -5,10 +5,11 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.dto.SupplierManageDto;
import com.ruoyi.basic.pojo.SupplierManage;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.purchase.vo.SupplierTransactionsDetailsVo;
+import com.ruoyi.purchase.vo.SupplierTransactionsVo;
+import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
-import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
public interface ISupplierService extends IService<SupplierManage> {
@@ -57,4 +58,20 @@
void supplierExport(HttpServletResponse response, SupplierManageDto supplierManageDto);
Boolean importData(MultipartFile file);
+
+ /**
+ * 渚涘簲鍟嗗線鏉�
+ * @param page
+ * @param supplierName
+ * @return
+ */
+ IPage<SupplierTransactionsVo> supplierTransactions(Page page, String supplierName);
+
+ /**
+ * 渚涘簲鍟嗗線鏉ヨ鎯�
+ * @param page
+ * @param supplierId
+ * @return
+ */
+ IPage<SupplierTransactionsDetailsVo> supplierTransactionsDetails(Page page, Long supplierId);
}
diff --git a/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
index 6adaf2a..613bde2 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/SupplierServiceImpl.java
@@ -14,6 +14,8 @@
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
+import com.ruoyi.purchase.vo.SupplierTransactionsDetailsVo;
+import com.ruoyi.purchase.vo.SupplierTransactionsVo;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
@@ -130,4 +132,14 @@
}
return false;
}
+
+ @Override
+ public IPage<SupplierTransactionsVo> supplierTransactions(Page page, String supplierName) {
+ return supplierMapper.supplierTransactions(page,supplierName);
+ }
+
+ @Override
+ public IPage<SupplierTransactionsDetailsVo> supplierTransactionsDetails(Page page, Long supplierId) {
+ return supplierMapper.supplierTransactionsDetails(page,supplierId);
+ }
}
diff --git a/src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java b/src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java
index ee31a4b..f265ab0 100644
--- a/src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java
@@ -1,9 +1,11 @@
package com.ruoyi.purchase.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.service.ISupplierService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.framework.web.domain.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
@@ -18,6 +20,8 @@
@RequestMapping("/purchase/report")
@AllArgsConstructor
public class AccountingReportController {
+
+ private final ISupplierService supplierService;
@GetMapping("/list")
@@ -44,4 +48,18 @@
@Operation(summary = "閲囪喘鎶ヨ〃-澧炲�肩◣姣斿")
public void exportTwo(HttpServletResponse response) {
}
+
+ @GetMapping("/supplierTransactions")
+ @Log(title = "渚涘簲鍟嗗線鏉�", businessType = BusinessType.OTHER)
+ @Operation(summary = "渚涘簲鍟嗗線鏉�")
+ public R supplierTransactions(Page page, String supplierName) {
+ return R.ok(supplierService.supplierTransactions(page,supplierName));
+ }
+
+ @GetMapping("/supplierTransactionsDetails")
+ @Log(title = "渚涘簲鍟嗗線鏉ユ槑缁�", businessType = BusinessType.OTHER)
+ @Operation(summary = "渚涘簲鍟嗗線鏉ユ槑缁�")
+ public R supplierTransactionsDetails(Page page, Long supplierId) {
+ return R.ok(supplierService.supplierTransactionsDetails(page,supplierId));
+ }
}
diff --git a/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java b/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java
new file mode 100644
index 0000000..3533e6e
--- /dev/null
+++ b/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java
@@ -0,0 +1,33 @@
+package com.ruoyi.purchase.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@Schema(name = "SupplierTransactionsDetailsVo", description = "閲囪喘绠$悊--渚涘簲鍟嗗線鏉ユ槑缁�(杩斿洖)")
+public class SupplierTransactionsDetailsVo {
+
+ @Schema(description = "閲囪喘鍗旾D")
+ private Long purchaseLedgerId;
+
+ @Schema(description = "閲囪喘鍚堝悓鍙�")
+ private String purchaseContractNumber;
+
+ @Schema(description = "閲囪喘鍚堝悓绛捐鏃ユ湡")
+ @JsonFormat(pattern = "yyyy-MM-dd")
+ private Date executionDate;
+
+ @Schema(description = "鍚堝悓閲戦")
+ private BigDecimal contractAmount;
+
+ @Schema(description = "浠樻閲戦")
+ private BigDecimal paymentAmount;
+
+ @Schema(description = "搴斾粯閲戦")
+ private BigDecimal payableAmount;
+
+}
diff --git a/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsVo.java b/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsVo.java
new file mode 100644
index 0000000..35cefc0
--- /dev/null
+++ b/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsVo.java
@@ -0,0 +1,30 @@
+package com.ruoyi.purchase.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Schema(name = "SupplierTransactionsVo", description = "閲囪喘绠$悊--渚涘簲鍟嗗線鏉�(杩斿洖)")
+public class SupplierTransactionsVo {
+
+ @Schema(description = "渚涘簲鍟咺D")
+ private Long supplierId;
+
+ @Schema(description = "渚涘簲鍟嗗悕绉�")
+ private String supplierName;
+
+ @Schema(description = "鍚堝悓鎬婚噾棰�")
+ //璇ヤ緵搴斿晢閲囪喘鍚堝悓绱閲戦
+ private BigDecimal contractAmounts;
+
+ @Schema(description = "浠樻閲戦")
+ //璇ヤ緵搴斿晢閲囪喘浠樻绱閲戦
+ private BigDecimal paymentAmount;
+
+ @Schema(description = "搴斾粯閲戦")
+ //璇ヤ緵搴斿晢閲囪喘搴斾粯绱閲戦=璐㈠姟(鍏ュ簱-閫�璐�)
+ private BigDecimal payableAmount;
+
+}
diff --git a/src/main/resources/mapper/account/purchase/AccountPurchasePaymentMapper.xml b/src/main/resources/mapper/account/purchase/AccountPurchasePaymentMapper.xml
index 3571783..380548e 100644
--- a/src/main/resources/mapper/account/purchase/AccountPurchasePaymentMapper.xml
+++ b/src/main/resources/mapper/account/purchase/AccountPurchasePaymentMapper.xml
@@ -47,7 +47,7 @@
SELECT DATE_FORMAT(payment_date, #{dateFormat}) AS dateStr,
IFNULL(SUM(payment_amount), 0) AS amount
FROM account_purchase_payment
- WHERE payment_date BETWEEN #{startDate} AND #{endDate}
+ WHERE payment_date BETWEEN #{startStr} AND #{endStr}
GROUP BY dateStr
ORDER BY dateStr
</select>
diff --git a/src/main/resources/mapper/account/sales/AccountSalesCollectionMapper.xml b/src/main/resources/mapper/account/sales/AccountSalesCollectionMapper.xml
index f029331..c3d6b00 100644
--- a/src/main/resources/mapper/account/sales/AccountSalesCollectionMapper.xml
+++ b/src/main/resources/mapper/account/sales/AccountSalesCollectionMapper.xml
@@ -89,7 +89,7 @@
SELECT DATE_FORMAT(collection_date, #{dateFormat}) AS dateStr,
IFNULL(SUM(collection_amount), 0) AS amount
FROM account_sales_collection
- WHERE collection_date BETWEEN #{startDate} AND #{endDate}
+ WHERE collection_date BETWEEN #{startStr} AND #{endStr}
GROUP BY dateStr
ORDER BY dateStr
</select>
diff --git a/src/main/resources/mapper/basic/SupplierManageMapper.xml b/src/main/resources/mapper/basic/SupplierManageMapper.xml
index 87688e1..5c5af54 100644
--- a/src/main/resources/mapper/basic/SupplierManageMapper.xml
+++ b/src/main/resources/mapper/basic/SupplierManageMapper.xml
@@ -68,5 +68,95 @@
</if>
</where>
</select>
+ <select id="supplierTransactions" resultType="com.ruoyi.purchase.vo.SupplierTransactionsVo">
+ select T1.supplier_id,
+ sm.supplier_name,
+ T1.contractAmounts,
+ IFNULL(T2.paymentAmount, 0) AS paymentAmount,
+ IFNULL(T3.InboundAmount, 0) - IFNULL(T4.returnAmount, 0) AS payableAmount
+ from (select supplier_id, sum(contract_amount) as contractAmounts from purchase_ledger group by supplier_id) T1
+ left join (select supplier_id, sum(payment_amount) as paymentAmount from account_purchase_payment group by supplier_id) T2 on T1.supplier_id = T2.supplier_id
+ left join (
+ SELECT
+ pl.supplier_id,
+ sum(sir.stock_in_num * slp.tax_inclusive_unit_price) AS InboundAmount
+ FROM stock_in_record sir
+ -- 10 绫诲瀷鎵嶅叧鑱旇川妫�琛�
+ LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
+ -- 鍔ㄦ�佸叧鑱旈噰璐紙鑷姩閫傞厤 7 鍜� 10锛�
+ LEFT JOIN purchase_ledger pl
+ ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
+ -- 浜у搧鍏宠仈涓嶅姩
+ LEFT JOIN sales_ledger_product slp ON pl.id = slp.sales_ledger_id
+ -- 鏉′欢
+ WHERE sir.approval_status = 1 AND slp.type = 2
+ AND sir.record_type IN ('7','10')
+ group by pl.supplier_id
+ ) T3 on T3.supplier_id=T1.supplier_id
+ left join (
+ select
+ supplier_id,
+ sum(total_amount) as returnAmount
+ from purchase_return_orders pro
+ group by supplier_id
+ ) T4 on T4.supplier_id=T1.supplier_id
+ left join supplier_manage sm on T1.supplier_id = sm.id
+ <where>
+ <if test="supplierName!=null and supplierName!=''">
+ AND sm.supplier_name LIKE CONCAT('%',#{supplierName},'%')
+ </if>
+ </where>
+ </select>
+ <select id="supplierTransactionsDetails"
+ resultType="com.ruoyi.purchase.vo.SupplierTransactionsDetailsVo">
+ select pl.id purchaseLedgerId,
+ pl.purchase_contract_number,
+ pl.execution_date,
+ pl.contract_amount,
+ IFNULL(T1.paymentAmount, 0) AS paymentAmount,
+ IFNULL(T2.InboundAmount, 0) - IFNULL(T3.returnAmount, 0) AS payableAmount
+ from purchase_ledger pl
+ left join (
+ select
+ pl.id,
+ sum(app.payment_amount) as paymentAmount
+ from account_purchase_payment app
+ left join account_payment_application apa on app.account_payment_application_id = apa.id
+ left join stock_in_record sir on FIND_IN_SET(sir.id, apa.stock_in_record_ids) > 0
+ -- 10 绫诲瀷鎵嶅叧鑱旇川妫�琛�
+ LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
+ -- 鍔ㄦ�佸叧鑱旈噰璐紙鑷姩閫傞厤 7 鍜� 10锛�
+ LEFT JOIN purchase_ledger pl
+ ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
+ WHERE sir.approval_status = 1
+ AND sir.record_type IN ('7','10')
+ group by pl.id
+ )T1 on T1.id = pl.id
+ left join (
+ SELECT
+ pl.id,
+ sum(sir.stock_in_num * slp.tax_inclusive_unit_price) AS InboundAmount
+ FROM stock_in_record sir
+ -- 10 绫诲瀷鎵嶅叧鑱旇川妫�琛�
+ LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
+ -- 鍔ㄦ�佸叧鑱旈噰璐紙鑷姩閫傞厤 7 鍜� 10锛�
+ LEFT JOIN purchase_ledger pl
+ ON pl.id = IF(sir.record_type = 7, sir.record_id, qi.purchase_ledger_id)
+ -- 浜у搧鍏宠仈涓嶅姩
+ LEFT JOIN sales_ledger_product slp ON pl.id = slp.sales_ledger_id
+ -- 鏉′欢
+ WHERE sir.approval_status = 1 AND slp.type = 2
+ AND sir.record_type IN ('7','10')
+ group by pl.id
+ )T2 on T2.id = pl.id
+ left join (
+ select pl.id,
+ sum(pro.total_amount) as returnAmount
+ from purchase_return_orders pro
+ left join purchase_ledger pl on pro.purchase_ledger_id = pl.id
+ group by pl.id
+ )T3 on T3.id = pl.id
+ where pl.supplier_id = #{supplierId}
+ </select>
-</mapper>
\ No newline at end of file
+</mapper>
diff --git a/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml b/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
index a99d356..ecdd1f3 100644
--- a/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
+++ b/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -16,6 +16,59 @@
GROUP BY dateStr
</select>
+ <select id="selectPurchaseLedgerListPage" resultType="com.ruoyi.purchase.dto.PurchaseLedgerDto">
+ SELECT
+ pl.id,
+ pl.purchase_contract_number,
+ pl.sales_contract_no,
+ pl.supplier_id,
+ pl.supplier_name,
+ pl.project_name,
+ pl.contract_amount,
+ pl.entry_date,
+ pl.execution_date,
+ pl.recorder_id,
+ pl.recorder_name,
+ pl.template_name,
+ pl.approve_user_ids,
+ sm.is_white,
+ pl.approval_status,
+ pl.payment_method,
+ pl.remarks
+ FROM purchase_ledger pl
+ LEFT JOIN supplier_manage sm ON pl.supplier_id = sm.id
+ <where>
+ <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''">
+ AND pl.purchase_contract_number LIKE CONCAT('%', #{c.purchaseContractNumber}, '%')
+ </if>
+ <if test="c.approvalStatus != null and c.approvalStatus != ''">
+ AND pl.approval_status = #{c.approvalStatus}
+ </if>
+ <if test="c.supplierName != null and c.supplierName != ''">
+ AND pl.supplier_name LIKE CONCAT('%', #{c.supplierName}, '%')
+ </if>
+ <if test="c.salesContractNo != null and c.salesContractNo != ''">
+ AND pl.sales_contract_no LIKE CONCAT('%', #{c.salesContractNo}, '%')
+ </if>
+ <if test="c.projectName != null and c.projectName != ''">
+ AND pl.project_name LIKE CONCAT('%', #{c.projectName}, '%')
+ </if>
+ <if test="c.entryDateStart != null and c.entryDateStart != ''">
+ AND pl.entry_date >= #{c.entryDateStart}
+ </if>
+ <if test="c.entryDateEnd != null and c.entryDateEnd != ''">
+ AND pl.entry_date <= #{c.entryDateEnd}
+ </if>
+ <if test="c.supplierId != null">
+ AND pl.supplier_id = #{c.supplierId}
+ </if>
+ <if test="c.approvalStatus != null">
+ AND pl.approval_status = #{c.approvalStatus}
+ </if>
+ </where>
+ ORDER BY pl.entry_date DESC
+ </select>
+
<select id="selectTotalPurchaseAmount" resultType="java.math.BigDecimal">
SELECT IFNULL(SUM(contract_amount), 0)
FROM purchase_ledger
--
Gitblit v1.9.3