From d6a1114f3473f86721176bc9d17ba7f35b0bddb7 Mon Sep 17 00:00:00 2001
From: chenrui <1187576398@qq.com>
Date: 星期二, 13 五月 2025 16:53:59 +0800
Subject: [PATCH] Merge branch 'master' of http://114.132.189.42:9002/r/product-inventory-management-after

---
 src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java                         |    5 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerFileServiceImpl.java    |   22 ++
 src/main/resources/mapper/sales/SalesLedgerMapper.xml                         |    3 
 src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java          |    5 
 src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java                   |   90 +++++++++
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java  |  210 ++++++++++++++++++++
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                    |    5 
 src/main/java/com/ruoyi/other/pojo/TempFile.java                              |    4 
 src/main/java/com/ruoyi/sales/pojo/SalesLedger.java                           |    2 
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerFile.java                       |    6 
 src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java                |    2 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java |   40 ++-
 src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java           |   20 +
 src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java                   |    2 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java        |   67 +++++-
 src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java     |   34 ++
 src/main/java/com/ruoyi/sales/service/ISalesLedgerFileService.java            |    6 
 src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java                     |   18 +
 18 files changed, 496 insertions(+), 45 deletions(-)

diff --git a/src/main/java/com/ruoyi/other/pojo/TempFile.java b/src/main/java/com/ruoyi/other/pojo/TempFile.java
index 6ce652d..26ace93 100644
--- a/src/main/java/com/ruoyi/other/pojo/TempFile.java
+++ b/src/main/java/com/ruoyi/other/pojo/TempFile.java
@@ -1,5 +1,6 @@
 package com.ruoyi.other.pojo;
 
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
@@ -8,6 +9,9 @@
 @Data
 @TableName("temp_file")
 public class TempFile {
+    private static final long serialVersionUID = 1L;
+
+    @TableId
     private String tempId;         // 涓存椂鏂囦欢ID锛圲UID锛�
     private String originalName;   // 鍘熷鏂囦欢鍚�
     private String tempPath;       // 涓存椂瀛樺偍璺緞
diff --git a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
index 7f0fb01..3b902c2 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -3,8 +3,10 @@
 import javax.servlet.http.HttpServletResponse;
 
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.purchase.dto.PurchaseLedgerDto;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.purchase.service.IPurchaseLedgerService;
+import com.ruoyi.sales.service.ISalesLedgerService;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -18,19 +20,23 @@
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.page.TableDataInfo;
 
+import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 閲囪喘鍙拌处Controller
- * 
+ *
  * @author ruoyi
  * @date 2025-05-09
  */
 @RestController
-@RequestMapping("/system/ledger")
+@RequestMapping("/purchase/ledger")
 @AllArgsConstructor
 public class PurchaseLedgerController extends BaseController {
     private IPurchaseLedgerService purchaseLedgerService;
+
+    private ISalesLedgerService salesLedgerService;
 
     /**
      * 鏌ヨ閲囪喘鍙拌处鍒楄〃
@@ -57,17 +63,33 @@
      * 鏂板淇敼閲囪喘鍙拌处
      */
     @Log(title = "閲囪喘鍙拌处", businessType = BusinessType.INSERT)
-    @PostMapping ("/addOrEditPurchase")
-    public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedger purchaseLedger) {
-        return toAjax(purchaseLedgerService.addOrEditPurchase(purchaseLedger));
+    @PostMapping("/addOrEditPurchase")
+    public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedgerDto purchaseLedgerDto) throws IOException {
+        return toAjax(purchaseLedgerService.addOrEditPurchase(purchaseLedgerDto));
+    }
+
+    /**
+     * 鏌ヨ閿�鍞彴璐﹀拰浜у搧鐖跺瓙鍒楄〃
+     */
+    @GetMapping("/getPurchaseById")
+    public PurchaseLedgerDto getPurchaseById(PurchaseLedgerDto purchaseLedgerDto) {
+        return purchaseLedgerService.getPurchaseById(purchaseLedgerDto);
     }
 
     /**
      * 鍒犻櫎閲囪喘鍙拌处
      */
     @Log(title = "閲囪喘鍙拌处", businessType = BusinessType.DELETE)
-	@DeleteMapping("/delPurchase")
+    @DeleteMapping("/delPurchase")
     public AjaxResult remove(@RequestBody Long[] ids) {
         return toAjax(purchaseLedgerService.deletePurchaseLedgerByIds(ids));
     }
+
+    /**
+     * 鏌ヨ閿�鍞悎鍚屽彿
+     */
+    @GetMapping("/getSalesNo")
+    public List getSalesNo() {
+        return salesLedgerService.getSalesNo();
+    }
 }
diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
new file mode 100644
index 0000000..def3993
--- /dev/null
+++ b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -0,0 +1,90 @@
+package com.ruoyi.purchase.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.sales.pojo.SalesLedgerFile;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class PurchaseLedgerDto {
+
+    private Long id;
+
+    /**
+     * 閲囪喘鍚堝悓鍙�
+     */
+    private String purchaseContractNumber;
+
+    /**
+     * 渚涘簲鍟嗗悕绉�
+     */
+    private String supplierName;
+
+    /**
+     * 褰曞叆浜哄鍚峣d
+     */
+    private Long recorderId;
+
+
+    /**
+     * 褰曞叆浜哄鍚�
+     */
+    private String recorderName;
+
+    /**
+     * 閿�鍞悎鍚屽彿
+     */
+    private String salesContractNo;
+
+    /**
+     * 椤圭洰鍚嶇О
+     */
+    private String projectName;
+
+    /**
+     * 褰曞叆鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date entryDate;
+
+    /**
+     * 澶囨敞
+     */
+    private String remarks;
+
+    /**
+     * 闄勪欢鏉愭枡璺緞鎴栧悕绉�
+     */
+    private String attachmentMaterials;
+
+    /**
+     * 璁板綍鍒涘缓鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createdAt;
+
+    /**
+     * 璁板綍鏈�鍚庢洿鏂版椂闂�
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date updatedAt;
+
+    /**
+     * 鍏宠仈閿�鍞彴璐︿富琛ㄤ富閿�
+     */
+    private Long salesLedgerId;
+
+    private Boolean hasChildren = false;
+
+    private Integer Type;
+
+    private List<SalesLedgerProduct> productData;
+
+    private List<String> tempFileIds;
+
+    private List<SalesLedgerFile> SalesLedgerFiles;
+
+}
diff --git a/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java b/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
index 02cdab9..2e3f454 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
+++ b/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -1,11 +1,10 @@
 package com.ruoyi.purchase.pojo;
 
+import java.math.BigDecimal;
 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;
 
@@ -37,6 +36,11 @@
      */
     @Excel(name = "渚涘簲鍟嗗悕绉�")
     private String supplierName;
+
+    /**
+     * 褰曞叆浜哄鍚峣d
+     */
+    private Long recorderId;
 
     /**
      * 褰曞叆浜哄鍚�
@@ -94,4 +98,12 @@
      */
     private Long salesLedgerId;
 
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+    /**
+     * 鍚堝悓閲戦锛堜骇鍝佸惈绋庢�讳环锛�
+     */
+    private BigDecimal contractAmount;
+
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java b/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
index 120c15c..7f8f10d 100644
--- a/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
+++ b/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
@@ -2,8 +2,10 @@
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.purchase.dto.PurchaseLedgerDto;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -16,8 +18,9 @@
 
     List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger);
 
-    int addOrEditPurchase(PurchaseLedger purchaseLedger);
+    int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws IOException;
 
     int deletePurchaseLedgerByIds(Long[] ids);
 
+    PurchaseLedgerDto getPurchaseById(PurchaseLedgerDto purchaseLedgerDto);
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index a209ccb..c8ef0fc 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -1,15 +1,44 @@
 package com.ruoyi.purchase.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.other.mapper.TempFileMapper;
+import com.ruoyi.other.pojo.TempFile;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.purchase.dto.PurchaseLedgerDto;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.purchase.service.IPurchaseLedgerService;
-import lombok.AllArgsConstructor;
+import com.ruoyi.sales.mapper.SalesLedgerFileMapper;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.SalesLedger;
+import com.ruoyi.sales.pojo.SalesLedgerFile;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
 
 /**
  * 閲囪喘鍙拌处Service涓氬姟灞傚鐞�
@@ -18,10 +47,23 @@
  * @date 2025-05-09
  */
 @Service
-@AllArgsConstructor
+@RequiredArgsConstructor
+@Slf4j
 public class PurchaseLedgerServiceImpl extends ServiceImpl<PurchaseLedgerMapper, PurchaseLedger> implements IPurchaseLedgerService {
 
-    private PurchaseLedgerMapper purchaseLedgerMapper;
+    private final PurchaseLedgerMapper purchaseLedgerMapper;
+
+    private final SalesLedgerMapper salesLedgerMapper;
+    private final SalesLedgerProductMapper salesLedgerProductMapper;
+
+    private final SysUserMapper userMapper;
+
+    private final TempFileMapper tempFileMapper;
+
+    private final SalesLedgerFileMapper salesLedgerFileMapper;
+
+    @Value("${file.upload-dir}")
+    private String uploadDir;
 
     @Override
     public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) {
@@ -29,11 +71,137 @@
     }
 
     @Override
-    public int addOrEditPurchase(PurchaseLedger purchaseLedger) {
+    public int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws IOException {
+
+        SalesLedger salesLedger = salesLedgerMapper.selectById(purchaseLedgerDto.getSalesLedgerId());
+
+        if (salesLedger == null) {
+            throw new BaseException("閿�鍞彴璐︿笉瀛樺湪");
+        }
+        SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId());
+
+        // DTO杞珽ntity
+        PurchaseLedger purchaseLedger = new PurchaseLedger();
+        BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
+        purchaseLedger.setTenantId(salesLedger.getTenantId());
+        purchaseLedger.setSalesContractNo(salesLedger.getSalesContractNo());
+        purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
+        purchaseLedger.setRecorderName(sysUser.getNickName());
+
+        // 3. 鏂板鎴栨洿鏂颁富琛�
         if (purchaseLedger.getId() == null) {
-            return purchaseLedgerMapper.insert(purchaseLedger);
+            purchaseLedgerMapper.insert(purchaseLedger);
         } else {
-            return purchaseLedgerMapper.updateById(purchaseLedger);
+            purchaseLedgerMapper.updateById(purchaseLedger);
+        }
+
+        // 4. 澶勭悊瀛愯〃鏁版嵁
+        List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData();
+        if (productList != null && !productList.isEmpty()) {
+            handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType());
+
+        }
+
+        // 5. 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰�
+        if (purchaseLedgerDto.getTempFileIds() != null && !purchaseLedgerDto.getTempFileIds().isEmpty()) {
+            migrateTempFilesToFormal(purchaseLedger.getId(), purchaseLedgerDto.getTempFileIds());
+        }
+
+        return 1;
+    }
+
+    private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) {
+        // 鎸塈D鍒嗙粍锛屽尯鍒嗘柊澧炲拰鏇存柊鐨勮褰�
+        Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream()
+                .peek(p -> p.setSalesLedgerId(salesLedgerId))
+                .collect(Collectors.partitioningBy(p -> p.getId() != null));
+
+        List<SalesLedgerProduct> updateList = partitionedProducts.get(true);
+        List<SalesLedgerProduct> insertList = partitionedProducts.get(false);
+
+        // 鎵ц鏇存柊鎿嶄綔
+        if (!updateList.isEmpty()) {
+            for (SalesLedgerProduct product : updateList) {
+                product.setType(type);
+                salesLedgerProductMapper.updateById(product);
+            }
+        }
+        // 鎵ц鎻掑叆鎿嶄綔
+        if (!insertList.isEmpty()) {
+            for (SalesLedgerProduct salesLedgerProduct : insertList) {
+                salesLedgerProduct.setType(type);
+                salesLedgerProductMapper.insert(salesLedgerProduct);
+            }
+        }
+    }
+
+    /**
+     * 灏嗕复鏃舵枃浠惰縼绉诲埌姝e紡鐩綍
+     *
+     * @param businessId  涓氬姟ID锛堥攢鍞彴璐D锛�
+     * @param tempFileIds 涓存椂鏂囦欢ID鍒楄〃
+     * @throws IOException 鏂囦欢鎿嶄綔寮傚父
+     */
+    private void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds) throws IOException {
+        if (CollectionUtils.isEmpty(tempFileIds)) {
+            return;
+        }
+
+        // 鏋勫缓姝e紡鐩綍璺緞锛堟寜涓氬姟绫诲瀷鍜屾棩鏈熷垎缁勶級
+        String formalDir = uploadDir + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
+
+        Path formalDirPath = Paths.get(formalDir);
+
+        // 纭繚姝e紡鐩綍瀛樺湪锛堥�掑綊鍒涘缓锛�
+        if (!Files.exists(formalDirPath)) {
+            Files.createDirectories(formalDirPath);
+        }
+
+        for (String tempFileId : tempFileIds) {
+            // 鏌ヨ涓存椂鏂囦欢璁板綍
+            TempFile tempFile = tempFileMapper.selectById(tempFileId);
+            if (tempFile == null) {
+                log.warn("涓存椂鏂囦欢涓嶅瓨鍦紝璺宠繃澶勭悊: {}", tempFileId);
+                continue;
+            }
+
+            // 鏋勫缓姝e紡鏂囦欢鍚嶏紙鍖呭惈涓氬姟ID鍜屾椂闂存埑锛岄伩鍏嶅啿绐侊級
+            String originalFilename = tempFile.getOriginalName();
+            String fileExtension = FilenameUtils.getExtension(originalFilename);
+            String formalFilename = businessId + "_" +
+                    System.currentTimeMillis() + "_" +
+                    UUID.randomUUID().toString().substring(0, 8) +
+                    (StringUtils.hasText(fileExtension) ? "." + fileExtension : "");
+
+            Path formalFilePath = formalDirPath.resolve(formalFilename);
+
+            try {
+                // 鎵ц鏂囦欢杩佺Щ锛堜娇鐢ㄥ師瀛愭搷浣滅‘淇濆畨鍏ㄦ�э級
+                Files.move(
+                        Paths.get(tempFile.getTempPath()),
+                        formalFilePath,
+                        StandardCopyOption.REPLACE_EXISTING,
+                        StandardCopyOption.ATOMIC_MOVE
+                );
+                log.info("鏂囦欢杩佺Щ鎴愬姛: {} -> {}", tempFile.getTempPath(), formalFilePath);
+
+                // 鏇存柊鏂囦欢璁板綍锛堝叧鑱斿埌涓氬姟ID锛�
+                SalesLedgerFile fileRecord = new SalesLedgerFile();
+                fileRecord.setLedgerId(businessId);
+                fileRecord.setName(originalFilename);
+                fileRecord.setUrl(formalFilePath.toString());
+                fileRecord.setCreateTime(LocalDateTime.now());
+                salesLedgerFileMapper.insert(fileRecord);
+
+                // 鍒犻櫎涓存椂鏂囦欢璁板綍
+                tempFileMapper.deleteById(tempFile);
+
+                log.info("鏂囦欢杩佺Щ鎴愬姛: {} -> {}", tempFile.getTempPath(), formalFilePath);
+            } catch (IOException e) {
+                log.error("鏂囦欢杩佺Щ澶辫触: {}", tempFile.getTempPath(), e);
+                // 鍙�夋嫨鍥炴粴浜嬪姟鎴栬褰曞け璐ユ枃浠�
+                throw new IOException("鏂囦欢杩佺Щ寮傚父", e);
+            }
         }
     }
 
@@ -41,4 +209,34 @@
     public int deletePurchaseLedgerByIds(Long[] ids) {
         return purchaseLedgerMapper.deleteBatchIds(Arrays.asList(ids));
     }
+
+    @Override
+    public PurchaseLedgerDto getPurchaseById(PurchaseLedgerDto purchaseLedgerDto) {
+        // 1. 鏌ヨ涓昏〃
+        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(purchaseLedgerDto.getId());
+        if (purchaseLedger == null) {
+            throw new BaseException("閲囪喘鍙拌处涓嶅瓨鍦�");
+        }
+
+        // 2. 鏌ヨ瀛愯〃
+        LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
+        productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
+                .eq(SalesLedgerProduct::getType, purchaseLedgerDto.getType());
+        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
+
+        // 3.鏌ヨ涓婁紶鏂囦欢
+        LambdaQueryWrapper<SalesLedgerFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
+        salesLedgerFileWrapper.eq(SalesLedgerFile::getLedgerId, purchaseLedger.getId());
+        List<SalesLedgerFile> salesLedgerFiles = salesLedgerFileMapper.selectList(salesLedgerFileWrapper);
+
+        // 4. 杞崲 DTO
+        PurchaseLedgerDto resultDto = new PurchaseLedgerDto();
+        BeanUtils.copyProperties(purchaseLedger, resultDto);
+        if (!products.isEmpty()) {
+            resultDto.setHasChildren(true);
+            resultDto.setProductData(products);
+            resultDto.setSalesLedgerFiles(salesLedgerFiles);
+        }
+        return resultDto;
+    }
 }
diff --git a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
index 18ad04f..ace01c0 100644
--- a/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
+++ b/src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -6,8 +6,9 @@
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.sales.dto.SalesLedgerDto;
 import com.ruoyi.sales.pojo.SalesLedger;
+import com.ruoyi.sales.service.ISalesLedgerFileService;
 import com.ruoyi.sales.service.ISalesLedgerService;
-import org.springframework.beans.factory.annotation.Autowired;
+import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
@@ -23,9 +24,12 @@
  */
 @RestController
 @RequestMapping("/sales/ledger")
+@AllArgsConstructor
 public class SalesLedgerController extends BaseController {
-    @Autowired
+
     private ISalesLedgerService salesLedgerService;
+
+    private ISalesLedgerFileService salesLedgerFileService;
 
     /**
      * 鏌ヨ閿�鍞彴璐﹀垪琛�
@@ -87,4 +91,16 @@
         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("璇蜂紶鍏ヨ鍒犻櫎鐨処D");
+        }
+        return toAjax(salesLedgerFileService.deleteSalesLedgerByIds(ids));
+    }
 }
diff --git a/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java b/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
index c069104..af98858 100644
--- a/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -1,6 +1,7 @@
 package com.ruoyi.sales.dto;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.sales.pojo.SalesLedgerFile;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import lombok.Data;
 
@@ -23,6 +24,8 @@
     private String attachmentMaterials;
     private Boolean hasChildren = false;
     private List<SalesLedgerProduct> productData;
-
     private List<String> tempFileIds;
+    private List<SalesLedgerFile> SalesLedgerFiles;
+
+    private Integer Type;
 }
diff --git a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
index c188733..8656614 100644
--- a/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
+++ b/src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
@@ -19,4 +19,6 @@
      * @return 搴忓垪鍙峰垪琛�
      */
     List<Integer> selectSequencesByDate(@Param("datePart") String datePart);
+
+    List getSalesNo();
 }
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
index b6eaf67..2ebf084 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -91,7 +91,7 @@
     /**
      * 鍚堝悓閲戦锛堜骇鍝佸惈绋庢�讳环锛�
      */
-    @Excel(name = "绋庣巼")
+    @Excel(name = "鍚堝悓閲戦")
     private BigDecimal contractAmount;
 }
 
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerFile.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerFile.java
index 2ee36d7..ace387a 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerFile.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerFile.java
@@ -9,6 +9,8 @@
 @TableName("sales_ledger_file")
 public class SalesLedgerFile {
 
+    private static final long serialVersionUID = 1L;
+
     @TableId(type = IdType.AUTO)
     private Long id;
 
@@ -16,10 +18,10 @@
     private Long ledgerId;
 
     /** 鏂囦欢鍚嶇О */
-    private String fileName;
+    private String name;
 
     /** 鏂囦欢璺緞 */
-    private String filePath;
+    private String url;
 
     /** 鍒涘缓鏃堕棿 */
     @TableField(fill = FieldFill.INSERT)
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index 79c397e..c620152 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -84,4 +84,9 @@
      */
     @Excel(name = "鍙戠エ绫诲瀷")
     private String invoiceType;
+
+    /**
+     * 鍙拌处绫诲瀷 1.閿�鍞� 2锛岄噰璐�
+     */
+    private Integer type;
 }
diff --git a/src/main/java/com/ruoyi/sales/service/ISalesLedgerFileService.java b/src/main/java/com/ruoyi/sales/service/ISalesLedgerFileService.java
new file mode 100644
index 0000000..4cbbeb5
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/service/ISalesLedgerFileService.java
@@ -0,0 +1,6 @@
+package com.ruoyi.sales.service;
+
+public interface ISalesLedgerFileService {
+
+    int deleteSalesLedgerByIds(Long[] ids);
+}
diff --git a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
index 10eedf4..870db65 100644
--- a/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
+++ b/src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -21,4 +21,6 @@
     int addOrUpdateSalesLedger(SalesLedgerDto salesLedgerDto);
 
     SalesLedgerDto getSalesLedgerWithProducts(SalesLedgerDto salesLedgerDto);
+
+    List getSalesNo();
 }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerFileServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerFileServiceImpl.java
new file mode 100644
index 0000000..41b82d1
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerFileServiceImpl.java
@@ -0,0 +1,22 @@
+package com.ruoyi.sales.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.sales.mapper.SalesLedgerFileMapper;
+import com.ruoyi.sales.pojo.SalesLedgerFile;
+import com.ruoyi.sales.service.ISalesLedgerFileService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+
+@Service
+@AllArgsConstructor
+public class SalesLedgerFileServiceImpl extends ServiceImpl<SalesLedgerFileMapper, SalesLedgerFile> implements ISalesLedgerFileService {
+
+    private SalesLedgerFileMapper salesLedgerFileMapper;
+
+    @Override
+    public int deleteSalesLedgerByIds(Long[] ids) {
+        return salesLedgerFileMapper.deleteBatchIds(Arrays.asList(ids));
+    }
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
index c397b9f..b34d193 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
+import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.SalesLedger;
@@ -35,6 +37,8 @@
 
     private SalesLedgerMapper salesLedgerMapper;
 
+    private PurchaseLedgerMapper purchaseLedgerMapper;
+
     @Override
     public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
         return salesLedgerProductMapper.selectById(id);
@@ -43,7 +47,8 @@
     @Override
     public List<SalesLedgerProduct> selectSalesLedgerProductList(SalesLedgerProduct salesLedgerProduct) {
         LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId,salesLedgerProduct.getSalesLedgerId());
+        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId())
+                .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
         return salesLedgerProductMapper.selectList(queryWrapper);
     }
 
@@ -92,7 +97,6 @@
     public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) {
         int result;
         Long salesLedgerId = salesLedgerProduct.getSalesLedgerId();
-
         if (salesLedgerProduct.getId() == null) {
             result = salesLedgerProductMapper.insert(salesLedgerProduct);
         } else {
@@ -103,19 +107,29 @@
         if (result > 0 && salesLedgerId != null) {
             // 鏌ヨ璇ヤ富琛ㄤ笅鐨勬墍鏈夊瓙琛ㄦ暟鎹�
             LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>();
-            wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId);
+            wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId)
+                    .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
             List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(wrapper);
-
-            // 璋冪敤閫氱敤鏂规硶鏇存柊涓昏〃閲戦
-            updateMainContractAmount(
-                    salesLedgerId,
-                    productList,
-                    SalesLedgerProduct::getTaxInclusiveTotalPrice,
-                    salesLedgerMapper,
-                    SalesLedger.class
-            );
+            if (salesLedgerProduct.getType() == 1) {
+                // 璋冪敤閫氱敤鏂规硶鏇存柊涓昏〃閲戦
+                updateMainContractAmount(
+                        salesLedgerId,
+                        productList,
+                        SalesLedgerProduct::getTaxInclusiveTotalPrice,
+                        salesLedgerMapper,
+                        SalesLedger.class
+                );
+            } else {
+                // 璋冪敤閫氱敤鏂规硶鏇存柊涓昏〃閲戦
+                updateMainContractAmount(
+                        salesLedgerId,
+                        productList,
+                        SalesLedgerProduct::getTaxInclusiveTotalPrice,
+                        purchaseLedgerMapper,
+                        PurchaseLedger.class
+                );
+            }
         }
-
         return result;
     }
 
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 38ab1d8..777bbb4 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+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;
@@ -28,7 +29,6 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
@@ -52,11 +52,11 @@
 @Slf4j
 public class SalesLedgerServiceImpl extends ServiceImpl<SalesLedgerMapper, SalesLedger> implements ISalesLedgerService {
 
-    private final  SalesLedgerMapper salesLedgerMapper;
+    private final SalesLedgerMapper salesLedgerMapper;
 
-    private final  CustomerMapper customerMapper;
+    private final CustomerMapper customerMapper;
 
-    private final  SalesLedgerProductMapper salesLedgerProductMapper;
+    private final SalesLedgerProductMapper salesLedgerProductMapper;
 
     private final SalesLedgerFileMapper salesLedgerFileMapper;
 
@@ -92,14 +92,58 @@
         productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId());
         List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
 
-        // 3. 杞崲 DTO
+        // 3.鏌ヨ涓婁紶鏂囦欢
+        LambdaQueryWrapper<SalesLedgerFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
+        salesLedgerFileWrapper.eq(SalesLedgerFile::getLedgerId, salesLedger.getId());
+        List<SalesLedgerFile> salesLedgerFiles = salesLedgerFileMapper.selectList(salesLedgerFileWrapper);
+
+        // 4. 杞崲 DTO
         SalesLedgerDto resultDto = new SalesLedgerDto();
         BeanUtils.copyProperties(salesLedger, resultDto);
         if (!products.isEmpty()) {
             resultDto.setHasChildren(true);
             resultDto.setProductData(products);
+            resultDto.setSalesLedgerFiles(salesLedgerFiles);
         }
         return resultDto;
+    }
+
+    @Override
+    public List<Map<String, Object>> getSalesNo() {
+        LambdaQueryWrapper<SalesLedger> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.select(SalesLedger::getId, SalesLedger::getSalesContractNo);
+
+        // 鑾峰彇鍘熷鏌ヨ缁撴灉
+        List<Map<String, Object>> result = salesLedgerMapper.selectMaps(queryWrapper);
+
+        // 灏嗕笅鍒掔嚎鍛藉悕杞崲涓洪┘宄板懡鍚�
+        return result.stream().map(map -> map.entrySet().stream()
+                .collect(Collectors.toMap(
+                        entry -> underlineToCamel(entry.getKey()),
+                        Map.Entry::getValue))
+        ).collect(Collectors.toList());
+    }
+
+    /**
+     * 涓嬪垝绾垮懡鍚嶈浆椹煎嘲鍛藉悕
+     */
+    private String underlineToCamel(String param) {
+        if (param == null || "".equals(param.trim())) {
+            return "";
+        }
+        int len = param.length();
+        StringBuilder sb = new StringBuilder(len);
+        for (int i = 0; i < len; i++) {
+            char c = param.charAt(i);
+            if (c == '_') {
+                if (++i < len) {
+                    sb.append(Character.toUpperCase(param.charAt(i)));
+                }
+            } else {
+                sb.append(Character.toLowerCase(c));
+            }
+        }
+        return sb.toString();
     }
 
     @Override
@@ -148,7 +192,7 @@
             // 4. 澶勭悊瀛愯〃鏁版嵁
             List<SalesLedgerProduct> productList = salesLedgerDto.getProductData();
             if (productList != null && !productList.isEmpty()) {
-                handleSalesLedgerProducts(salesLedger.getId(), productList);
+                handleSalesLedgerProducts(salesLedger.getId(), productList,salesLedgerDto.getType());
                 updateMainContractAmount(
                         salesLedger.getId(),
                         productList,
@@ -197,7 +241,8 @@
             // 鏌ヨ涓存椂鏂囦欢璁板綍
             TempFile tempFile = tempFileMapper.selectById(tempFileId);
             if (tempFile == null) {
-                throw new FileNotFoundException("涓存椂鏂囦欢涓嶅瓨鍦�: " + tempFileId);
+                log.warn("涓存椂鏂囦欢涓嶅瓨鍦紝璺宠繃澶勭悊: {}", tempFileId);
+                continue;
             }
 
             // 鏋勫缓姝e紡鏂囦欢鍚嶏紙鍖呭惈涓氬姟ID鍜屾椂闂存埑锛岄伩鍏嶅啿绐侊級
@@ -223,8 +268,8 @@
                 // 鏇存柊鏂囦欢璁板綍锛堝叧鑱斿埌涓氬姟ID锛�
                 SalesLedgerFile fileRecord = new SalesLedgerFile();
                 fileRecord.setLedgerId(businessId);
-                fileRecord.setFileName(originalFilename);
-                fileRecord.setFilePath(formalFilePath.toString());
+                fileRecord.setName(originalFilename);
+                fileRecord.setUrl(formalFilePath.toString());
                 fileRecord.setCreateTime(LocalDateTime.now());
                 salesLedgerFileMapper.insert(fileRecord);
 
@@ -241,7 +286,7 @@
     }
 
 
-    private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products) {
+    private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products,Integer type) {
         // 鎸塈D鍒嗙粍锛屽尯鍒嗘柊澧炲拰鏇存柊鐨勮褰�
         Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream()
                 .peek(p -> p.setSalesLedgerId(salesLedgerId))
@@ -253,12 +298,14 @@
         // 鎵ц鏇存柊鎿嶄綔
         if (!updateList.isEmpty()) {
             for (SalesLedgerProduct product : updateList) {
+                product.setType(type);
                 salesLedgerProductMapper.updateById(product);
             }
         }
         // 鎵ц鎻掑叆鎿嶄綔
         if (!insertList.isEmpty()) {
             for (SalesLedgerProduct salesLedgerProduct : insertList) {
+                salesLedgerProduct.setType(type);
                 salesLedgerProductMapper.insert(salesLedgerProduct);
             }
         }
diff --git a/src/main/resources/mapper/sales/SalesLedgerMapper.xml b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
index 16ba140..add6a3f 100644
--- a/src/main/resources/mapper/sales/SalesLedgerMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -9,4 +9,7 @@
         FROM sales_ledger
         WHERE SUBSTR(sales_contract_no, 1, 8) = #{datePart}
     </select>
+    <select id="getSalesNo" resultType="com.ruoyi.sales.pojo.SalesLedger">
+        
+    </select>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.3