From 602a2d4fd650ded48e8f4cd1a48f0e6de3b98053 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期四, 08 五月 2025 17:42:09 +0800
Subject: [PATCH] 1.销售台账 2.关联产品

---
 src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java                         |   22 ++
 src/main/java/com/ruoyi/basic/pojo/Customer.java                              |    3 
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                    |   87 ++++++++++
 src/main/java/com/ruoyi/basic/service/ICustomerService.java                   |    7 
 src/main/java/com/ruoyi/sales/pojo/SalesLedger.java                           |   12 +
 src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java                |    5 
 src/main/java/com/ruoyi/sales/dto/SalesLedgerProductDTO.java                  |    4 
 src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java           |   20 ++
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java |   50 ++++++
 src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java           |   37 ++--
 src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java         |   23 ++
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java        |   60 ++++++-
 src/main/java/com/ruoyi/basic/controller/CustomerController.java              |   16 +
 src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java    |   91 +++++++++++
 src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java            |   13 +
 15 files changed, 415 insertions(+), 35 deletions(-)

diff --git a/src/main/java/com/ruoyi/basic/controller/CustomerController.java b/src/main/java/com/ruoyi/basic/controller/CustomerController.java
index 33e229c..cc94893 100644
--- a/src/main/java/com/ruoyi/basic/controller/CustomerController.java
+++ b/src/main/java/com/ruoyi/basic/controller/CustomerController.java
@@ -8,7 +8,6 @@
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -91,8 +90,19 @@
      * 鍒犻櫎瀹㈡埛妗f
      */
     @Log(title = "瀹㈡埛妗f", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids) {
+    @DeleteMapping("/delCustomer")
+    public AjaxResult remove(@RequestBody Long[] ids) {
+        if (ids == null || ids.length == 0) {
+            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        }
         return toAjax(customerService.deleteCustomerByIds(ids));
     }
+
+    /**
+     * 鏌ヨ瀹㈡埛
+     */
+    @GetMapping("/customerList")
+    public List customerList(Customer customer) {
+       return  customerService.customerList(customer);
+    }
 }
diff --git a/src/main/java/com/ruoyi/basic/pojo/Customer.java b/src/main/java/com/ruoyi/basic/pojo/Customer.java
index ebfd63f..47901ec 100644
--- a/src/main/java/com/ruoyi/basic/pojo/Customer.java
+++ b/src/main/java/com/ruoyi/basic/pojo/Customer.java
@@ -79,4 +79,7 @@
 
     @TableField(exist = false)
     private Long[] ids;
+
+    @TableField(exist = false)
+    private String addressPhone;
 }
diff --git a/src/main/java/com/ruoyi/basic/service/ICustomerService.java b/src/main/java/com/ruoyi/basic/service/ICustomerService.java
index b1c7ec5..790c975 100644
--- a/src/main/java/com/ruoyi/basic/service/ICustomerService.java
+++ b/src/main/java/com/ruoyi/basic/service/ICustomerService.java
@@ -53,4 +53,11 @@
     int deleteCustomerByIds(Long[] ids);
 
     List<Customer> selectCustomerListByIds(Long[] ids);
+
+    /**
+     * 鏌ヨ瀹㈡埛淇℃伅
+     *
+     * @return 缁撴灉
+     */
+    List customerList(Customer customer);
 }
diff --git a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
index f522929..3dd42a9 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/CustomerServiceImpl.java
@@ -2,12 +2,14 @@
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
 import com.ruoyi.basic.mapper.CustomerMapper;
 import com.ruoyi.basic.pojo.Customer;
 import com.ruoyi.basic.service.ICustomerService;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.framework.security.LoginUser;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -15,6 +17,7 @@
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 
 /**
@@ -49,11 +52,17 @@
     @Override
     public List<Customer> selectCustomerList(Customer customer) {
         LambdaQueryWrapper<Customer> queryWrapper = new LambdaQueryWrapper<>();
-        if (customer.getCustomerName() != null && !customer.getCustomerName().isEmpty()) {
+
+        if (StringUtils.isNotBlank(customer.getCustomerName())) {
             queryWrapper.eq(Customer::getCustomerName, customer.getCustomerName());
         }
+
         List<Customer> customerList = customerMapper.selectList(queryWrapper);
-        return customerList;
+
+        // 浣跨敤 Stream 淇敼姣忎釜 Customer 鐨� addressPhone 瀛楁
+        return customerList.stream().peek(c ->
+                c.setAddressPhone(c.getCompanyAddress() + "( " + c.getCompanyPhone() + " )")
+        ).collect(Collectors.toList());
     }
 
     /**
@@ -102,4 +111,11 @@
         queryWrapper.in(Customer::getId, Arrays.asList(ids));
         return customerMapper.selectList(queryWrapper);
     }
+
+    @Override
+    public List customerList(Customer customer) {
+        LambdaQueryWrapper<Customer> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.select(Customer::getId, Customer::getCustomerName);
+        return customerMapper.selectMaps(queryWrapper);
+    }
 }
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index 1f871d6..3c93788 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -4,13 +4,12 @@
 import javax.servlet.http.HttpServletResponse;
 
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.sales.dto.SalesLedgerDto;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.service.ISalesLedgerService;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -47,6 +46,17 @@
     }
 
     /**
+     * 鏌ヨ閿�鍞彴璐﹀拰浜у搧鐖跺瓙鍒楄〃
+     */
+    @GetMapping("/getSalesLedgerWithProducts")
+    public TableDataInfo getSalesLedgerWithProducts()
+    {
+        startPage();
+        List<SalesLedgerDto> list = salesLedgerService.getSalesLedgerWithProducts();
+        return getDataTable(list);
+    }
+
+    /**
      * 瀵煎嚭閿�鍞彴璐﹀垪琛�
      */
     @Log(title = "閿�鍞彴璐�", businessType = BusinessType.EXPORT)
@@ -68,32 +78,25 @@
     }
 
     /**
-     * 鏂板閿�鍞彴璐�
+     * 鏂板淇敼閿�鍞彴璐�
      */
     @Log(title = "閿�鍞彴璐�", businessType = BusinessType.INSERT)
-    @PostMapping ("/insertSalesLedger")
+    @PostMapping ("/addOrUpdateSalesLedger")
     public AjaxResult add(@RequestBody SalesLedger salesLedger)
     {
-        return toAjax(salesLedgerService.insertSalesLedger(salesLedger));
-    }
-
-    /**
-     * 淇敼閿�鍞彴璐�
-     */
-    @Log(title = "閿�鍞彴璐�", businessType = BusinessType.UPDATE)
-    @PostMapping ("/updateSalesLedger")
-    public AjaxResult edit(@RequestBody SalesLedger salesLedger)
-    {
-        return toAjax(salesLedgerService.updateSalesLedger(salesLedger));
+        return toAjax(salesLedgerService.addOrUpdateSalesLedger(salesLedger));
     }
 
     /**
      * 鍒犻櫎閿�鍞彴璐�
      */
     @Log(title = "閿�鍞彴璐�", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids)
+	@DeleteMapping("/delLedger")
+    public AjaxResult remove(@RequestBody Long[] ids)
     {
+        if (ids == null || ids.length == 0) {
+            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        }
         return toAjax(salesLedgerService.deleteSalesLedgerByIds(ids));
     }
 }
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
new file mode 100644
index 0000000..a42f2b4
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -0,0 +1,91 @@
+package com.ruoyi.sales.controller;
+
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.service.ISalesLedgerProductService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+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 java.util.List;
+
+/**
+ * 浜у搧淇℃伅Controller
+ * 
+ * @author ruoyi
+ * @date 2025-05-08
+ */
+@RestController
+@RequestMapping("/sales/product")
+public class SalesLedgerProductController extends BaseController
+{
+    @Autowired
+    private ISalesLedgerProductService salesLedgerProductService;
+
+    /**
+     * 鏌ヨ浜у搧淇℃伅鍒楄〃
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(SalesLedgerProduct salesLedgerProduct)
+    {
+        startPage();
+        List<SalesLedgerProduct> list = salesLedgerProductService.selectSalesLedgerProductList(salesLedgerProduct);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭浜у搧淇℃伅鍒楄〃
+     */
+    @Log(title = "浜у搧淇℃伅", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, SalesLedgerProduct salesLedgerProduct)
+    {
+        List<SalesLedgerProduct> list = salesLedgerProductService.selectSalesLedgerProductList(salesLedgerProduct);
+        ExcelUtil<SalesLedgerProduct> util = new ExcelUtil<SalesLedgerProduct>(SalesLedgerProduct.class);
+        util.exportExcel(response, list, "浜у搧淇℃伅鏁版嵁");
+    }
+
+    /**
+     * 鑾峰彇浜у搧淇℃伅璇︾粏淇℃伅
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(salesLedgerProductService.selectSalesLedgerProductById(id));
+    }
+
+    /**
+     * 鏂板淇敼浜у搧淇℃伅
+     */
+    @Log(title = "浜у搧淇℃伅", businessType = BusinessType.INSERT)
+    @PostMapping  ("/addOrUpdateSalesLedgerProduct")
+    public AjaxResult add(@RequestBody SalesLedgerProduct salesLedgerProduct)
+    {
+        return toAjax(salesLedgerProductService.addOrUpdateSalesLedgerProduct(salesLedgerProduct));
+    }
+
+    /**
+     * 鍒犻櫎浜у搧淇℃伅
+     */
+    @Log(title = "浜у搧淇℃伅", businessType = BusinessType.DELETE)
+	@DeleteMapping("/delProduct")
+    public AjaxResult remove(@RequestBody Long[] ids)
+    {
+        if (ids == null || ids.length == 0) {
+            return AjaxResult.error("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        }
+        return toAjax(salesLedgerProductService.deleteSalesLedgerProductByIds(ids));
+    }
+}
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
index 49fda54..cc2bcf4 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -1,4 +1,26 @@
 package com.ruoyi.sales.dto;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
 public class SalesLedgerDto {
+    private Long id;
+    private String salesContractNo;
+    private String customerContractNo;
+    private String projectName;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date entryDate;
+    private String salesman;
+    private Long customerId;
+    private String customerName;
+    private String entryPerson;
+    private String remarks;
+    private String attachmentMaterials;
+    private Boolean hasChildren = false;
+    private List<SalesLedgerProduct> children;
 }
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductDTO.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductDTO.java
new file mode 100644
index 0000000..bf920e9
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerProductDTO.java
@@ -0,0 +1,4 @@
+package com.ruoyi.sales.dto;
+
+public class SalesLedgerProductDTO {
+}
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
new file mode 100644
index 0000000..145bf38
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductMapper.java
@@ -0,0 +1,13 @@
+package com.ruoyi.sales.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+
+/**
+ * 浜у搧淇℃伅Mapper鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2025-05-08
+ */
+public interface SalesLedgerProductMapper extends BaseMapper<SalesLedgerProduct> {
+}
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
index 5f35293..bb4f237 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -2,10 +2,8 @@
 
 import java.util.Date;
 
+import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import lombok.Data;
 
@@ -60,6 +58,11 @@
     /**
      * 瀹㈡埛鍚嶇О
      */
+    private Long customerId;
+
+    /**
+     * 瀹㈡埛鍚嶇О
+     */
     @Excel(name = "瀹㈡埛鍚嶇О")
     private String customerName;
 
@@ -81,5 +84,8 @@
     @Excel(name = "闄勪欢鏉愭枡锛屽瓨鍌ㄦ枃浠跺悕绛夌浉鍏充俊鎭�")
     private String attachmentMaterials;
 
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
 }
 
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
new file mode 100644
index 0000000..79c397e
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -0,0 +1,87 @@
+package com.ruoyi.sales.pojo;
+
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+
+/**
+ * 浜у搧淇℃伅瀵硅薄 sales_ledger_product
+ *
+ * @author ruoyi
+ * @date 2025-05-08
+ */
+@TableName("sales_ledger_product")
+@Data
+public class SalesLedgerProduct {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 浜у搧淇℃伅涓婚敭
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鍏宠仈閿�鍞彴璐︿富琛ㄤ富閿�
+     */
+    @Excel(name = "鍏宠仈閿�鍞彴璐︿富琛ㄤ富閿�")
+    private Long salesLedgerId;
+
+    /**
+     * 浜у搧澶х被
+     */
+    @Excel(name = "浜у搧澶х被")
+    private String productCategory;
+
+    /**
+     * 瑙勬牸鍨嬪彿
+     */
+    @Excel(name = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    /**
+     * 鍗曚綅
+     */
+    @Excel(name = "鍗曚綅")
+    private String unit;
+
+    /**
+     * 鏁伴噺
+     */
+    @Excel(name = "鏁伴噺")
+    private BigDecimal quantity;
+
+    /**
+     * 绋庣巼
+     */
+    @Excel(name = "绋庣巼")
+    private BigDecimal taxRate;
+
+    /**
+     * 鍚◣鍗曚环
+     */
+    @Excel(name = "鍚◣鍗曚环")
+    private BigDecimal taxInclusiveUnitPrice;
+
+    /**
+     * 鍚◣鎬讳环
+     */
+    @Excel(name = "鍚◣鎬讳环")
+    private BigDecimal taxInclusiveTotalPrice;
+
+    /**
+     * 涓嶅惈绋庢�讳环
+     */
+    @Excel(name = "涓嶅惈绋庢�讳环")
+    private BigDecimal taxExclusiveTotalPrice;
+
+    /**
+     * 鍙戠エ绫诲瀷
+     */
+    @Excel(name = "鍙戠エ绫诲瀷")
+    private String invoiceType;
+}
diff --git a/src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java b/src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java
new file mode 100644
index 0000000..ccc28a7
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java
@@ -0,0 +1,23 @@
+package com.ruoyi.sales.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+
+import java.util.List;
+
+/**
+ * 浜у搧淇℃伅Service鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2025-05-08
+ */
+public interface ISalesLedgerProductService extends IService<SalesLedgerProduct> {
+
+    SalesLedgerProduct selectSalesLedgerProductById(Long id);
+
+    List<SalesLedgerProduct> selectSalesLedgerProductList(SalesLedgerProduct salesLedgerProduct);
+
+    int deleteSalesLedgerProductByIds(Long[] ids);
+
+    int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct);
+}
diff --git a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
index 7e28e93..7ee8c1f 100644
--- a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
+++ b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -3,6 +3,7 @@
 import java.util.List;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.sales.dto.SalesLedgerDto;
 import com.ruoyi.sales.pojo.SalesLedger;
 
 /**
@@ -19,7 +20,7 @@
 
     int deleteSalesLedgerByIds(Long[] ids);
 
-    int insertSalesLedger(SalesLedger salesLedger);
+    int addOrUpdateSalesLedger(SalesLedger salesLedger);
 
-    int updateSalesLedger(SalesLedger salesLedger);
+    List<SalesLedgerDto> getSalesLedgerWithProducts();
 }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
new file mode 100644
index 0000000..793722e
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -0,0 +1,50 @@
+package com.ruoyi.sales.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.service.ISalesLedgerProductService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 浜у搧淇℃伅Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2025-05-08
+ */
+@Service
+public class SalesLedgerProductServiceImpl extends ServiceImpl<SalesLedgerProductMapper, SalesLedgerProduct> implements ISalesLedgerProductService {
+    @Autowired
+    private SalesLedgerProductMapper salesLedgerProductMapper;
+
+    @Override
+    public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
+        return salesLedgerProductMapper.selectById(id);
+    }
+
+    @Override
+    public List<SalesLedgerProduct> selectSalesLedgerProductList(SalesLedgerProduct salesLedgerProduct) {
+        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId,salesLedgerProduct.getSalesLedgerId());
+        return salesLedgerProductMapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public int deleteSalesLedgerProductByIds(Long[] ids) {
+        return salesLedgerProductMapper.deleteBatchIds(Arrays.asList(ids));
+    }
+
+    @Override
+    public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) {
+        if (salesLedgerProduct.getId() == null){
+            return salesLedgerProductMapper.insert(salesLedgerProduct);
+        }else {
+            return  salesLedgerProductMapper.updateById(salesLedgerProduct);
+        }
+    }
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index 769cfe9..5048386 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -2,14 +2,23 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.mapper.CustomerMapper;
+import com.ruoyi.basic.pojo.Customer;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.sales.dto.SalesLedgerDto;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.SalesLedger;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.service.ISalesLedgerService;
-import org.springframework.beans.factory.annotation.Autowired;
+import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 閿�鍞彴璐ervice涓氬姟灞傚鐞�
@@ -18,13 +27,38 @@
  * @date 2025-05-08
  */
 @Service
+@AllArgsConstructor
 public class SalesLedgerServiceImpl extends ServiceImpl<SalesLedgerMapper, SalesLedger> implements ISalesLedgerService {
-    @Autowired
+
     private SalesLedgerMapper salesLedgerMapper;
+
+    private CustomerMapper customerMapper;
+
+    private SalesLedgerProductMapper salesLedgerProductMapper;
 
     @Override
     public List<SalesLedger> selectSalesLedgerList(SalesLedger salesLedger) {
         return salesLedgerMapper.selectList(new LambdaQueryWrapper<>());
+    }
+
+    public List<SalesLedgerDto> getSalesLedgerWithProducts() {
+        List<SalesLedger> ledgers = salesLedgerMapper.selectList(new LambdaQueryWrapper<>());
+        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<>());
+
+        Map<Long, List<SalesLedgerProduct>> productMap = products.stream()
+                .collect(Collectors.groupingBy(SalesLedgerProduct::getSalesLedgerId));
+
+        return ledgers.stream().map(ledger -> {
+            SalesLedgerDto dto = new SalesLedgerDto();
+            org.springframework.beans.BeanUtils.copyProperties(ledger, dto);
+
+            List<SalesLedgerProduct> ledgerProducts = productMap.getOrDefault(ledger.getId(), Collections.emptyList());
+            if (!ledgerProducts.isEmpty()) {
+                dto.setHasChildren(true);
+                dto.setChildren(ledgerProducts);
+            }
+            return dto;
+        }).collect(Collectors.toList());
     }
 
     @Override
@@ -37,13 +71,23 @@
         return salesLedgerMapper.deleteBatchIds(Arrays.asList(ids));
     }
 
-    @Override
-    public int insertSalesLedger(SalesLedger salesLedger) {
-        return salesLedgerMapper.insert(salesLedger);
+    public int addOrUpdateSalesLedger(SalesLedger salesLedger) {
+        LambdaQueryWrapper<Customer> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Customer::getId, salesLedger.getCustomerId());
+        Customer customer = customerMapper.selectOne(queryWrapper);
+        if (customer == null) {
+            throw new BaseException("鏈煡璇㈠埌瀵瑰簲鐨� Customer 淇℃伅");
+        }
+        salesLedger.setCustomerName(customer.getCustomerName());
+        salesLedger.setTenantId(customer.getTenantId());
+        return saveOrUpdates(salesLedger);
     }
 
-    @Override
-    public int updateSalesLedger(SalesLedger salesLedger) {
-        return salesLedgerMapper.updateById(salesLedger);
+    private int saveOrUpdates(SalesLedger salesLedger) {
+        if (salesLedger.getId() == null) {
+            return salesLedgerMapper.insert(salesLedger);
+        } else {
+            return salesLedgerMapper.updateById(salesLedger);
+        }
     }
 }

--
Gitblit v1.9.3