From 4b6ed9aec826d49abc239f8d768bfecb91eceabc Mon Sep 17 00:00:00 2001
From: chenrui <1187576398@qq.com>
Date: 星期一, 26 五月 2025 10:36:01 +0800
Subject: [PATCH] Merge branch 'master' of http://114.132.189.42:9002/r/product-inventory-management-after

---
 src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java                   |    9 
 src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java       |   39 +++
 src/main/java/com/ruoyi/purchase/pojo/ProductRecord.java                          |  124 +++++++++++
 src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java              |    2 
 src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java                  |    5 
 src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java                       |   18 +
 src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java                    |   13 +
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java      |  103 ++++++++-
 src/main/java/com/ruoyi/purchase/mapper/ProductRecordMapper.java                  |   14 +
 src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java     |   35 ++
 src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java                     |    6 
 src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java |  101 +++++---
 src/main/java/com/ruoyi/purchase/service/IProductRecordService.java               |   18 +
 src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java  |  115 +++++++++-
 src/main/java/com/ruoyi/purchase/service/ITicketRegistrationService.java          |    2 
 src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java         |   14 +
 src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml                  |   16 
 17 files changed, 545 insertions(+), 89 deletions(-)

diff --git a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
index 33926e8..9d8f992 100644
--- a/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -95,10 +95,18 @@
     }
 
     /**
+     * 鏍规嵁id鏌ヨ閲囪喘鍚堝悓鍙�
+     */
+    @GetMapping("/getPurchaseNoById")
+    public AjaxResult getPurchaseNoById(Long id) {
+        return AjaxResult.success(purchaseLedgerService.getPurchaseNoById(id));
+    }
+
+    /**
      * 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇骇鍝�
      */
     @GetMapping("/getProduct")
-    public List getProduct(PurchaseLedgerDto purchaseLedgerDto){
+    public List getProduct(PurchaseLedgerDto purchaseLedgerDto) {
         return purchaseLedgerService.getProduct(purchaseLedgerDto);
     }
 
@@ -106,7 +114,7 @@
      * 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇骇鍝�
      */
     @GetMapping("/getInfo")
-    public PurchaseLedgerDto getInfo(PurchaseLedgerDto purchaseLedgerDto){
-        return purchaseLedgerService.getInfo(purchaseLedgerDto);
+    public AjaxResult getInfo(PurchaseLedgerDto purchaseLedgerDto) {
+        return AjaxResult.success(purchaseLedgerService.getInfo(purchaseLedgerDto));
     }
 }
diff --git a/src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java b/src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java
index 0607f3b..afb3ee2 100644
--- a/src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java
+++ b/src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java
@@ -7,7 +7,9 @@
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.page.TableDataInfo;
 import com.ruoyi.purchase.dto.TicketRegistrationDto;
+import com.ruoyi.purchase.pojo.ProductRecord;
 import com.ruoyi.purchase.pojo.TicketRegistration;
+import com.ruoyi.purchase.service.IProductRecordService;
 import com.ruoyi.purchase.service.ITicketRegistrationService;
 import com.ruoyi.sales.service.ICommonFileService;
 import lombok.AllArgsConstructor;
@@ -20,7 +22,7 @@
 
 /**
  * 鏉ョエ鐧昏Controller
- * 
+ *
  * @author ruoyi
  * @date 2025-05-13
  */
@@ -33,12 +35,13 @@
 
     private ICommonFileService commonFileService;
 
+    private IProductRecordService productRecordService;
+
     /**
      * 鏌ヨ鏉ョエ鐧昏鍒楄〃
      */
     @GetMapping("/list")
-    public TableDataInfo list(TicketRegistration ticketRegistration)
-    {
+    public TableDataInfo list(TicketRegistration ticketRegistration) {
         startPage();
         List<TicketRegistration> list = ticketRegistrationService.selectTicketRegistrationList(ticketRegistration);
         return getDataTable(list);
@@ -49,8 +52,7 @@
      */
     @Log(title = "鏉ョエ鐧昏", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(HttpServletResponse response, TicketRegistration ticketRegistration)
-    {
+    public void export(HttpServletResponse response, TicketRegistration ticketRegistration) {
         List<TicketRegistration> list = ticketRegistrationService.selectTicketRegistrationList(ticketRegistration);
         ExcelUtil<TicketRegistration> util = new ExcelUtil<TicketRegistration>(TicketRegistration.class);
         util.exportExcel(response, list, "鏉ョエ鐧昏鏁版嵁");
@@ -68,7 +70,7 @@
      * 鏂板淇敼鏉ョエ鐧昏
      */
     @Log(title = "鏉ョエ鐧昏", businessType = BusinessType.INSERT)
-    @PostMapping  ("/addOrUpdateRegistration")
+    @PostMapping("/addOrUpdateRegistration")
     public AjaxResult addOrUpdateRegistration(@RequestBody TicketRegistrationDto ticketRegistrationDto) throws IOException {
         return toAjax(ticketRegistrationService.addOrUpdateRegistration(ticketRegistrationDto));
     }
@@ -77,9 +79,8 @@
      * 鍒犻櫎鏉ョエ鐧昏
      */
     @Log(title = "鏉ョエ鐧昏", businessType = BusinessType.DELETE)
-	@DeleteMapping("/delRegistration")
-    public AjaxResult delRegistration(@RequestBody Long[] ids)
-    {
+    @DeleteMapping("/delRegistration")
+    public AjaxResult delRegistration(@RequestBody Long[] ids) {
         return toAjax(ticketRegistrationService.delRegistration(ids));
     }
 
@@ -92,4 +93,20 @@
         }
     }
 
+    /**
+     * 鏌ヨ浜у搧淇℃伅寮�绁ㄨ褰曞垪琛�
+     */
+    @GetMapping("/productRecordList")
+    public List<ProductRecord> productRecordList(TicketRegistrationDto ticketRegistrationDto) {
+        List<ProductRecord> list = productRecordService.selectProductRecordList(ticketRegistrationDto);
+        return list;
+    }
+
+    /**
+     * 鏌ヨ鍙戠エ鍙�
+     */
+    @GetMapping("/getTicketNo")
+    public AjaxResult getTicketNo(TicketRegistrationDto ticketRegistrationDto) {
+        return AjaxResult.success(ticketRegistrationService.getTicketNo(ticketRegistrationDto));
+    }
 }
diff --git a/src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java b/src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java
index b2db4f4..e7acb12 100644
--- a/src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java
+++ b/src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java
@@ -30,5 +30,8 @@
     private BigDecimal unPaymentAmount;
 
     // 绋庣巼
-    private BigDecimal taxRate;
+    private String taxRate;
+
+    // 鐧昏浜�
+    private String registrant;
 }
diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
index dcc8b06..71c56e2 100644
--- a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
+++ b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -5,6 +5,7 @@
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -116,4 +117,21 @@
      * 浜у搧瑙勬牸id
      */
     private Long productModelId;
+
+    /**
+     * 鍙戠エ鍙�
+     */
+    private String invoiceNumber;
+
+    /**
+     * 鍙戠エ閲戦锛堝厓锛�
+     */
+    private BigDecimal invoiceAmount;
+
+    /**
+     * 鏉ョエ鐧昏id
+     */
+    private Long ticketRegistrationId;
+
+
 }
diff --git a/src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java b/src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java
index 3676003..1f5bf55 100644
--- a/src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java
+++ b/src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java
@@ -1,13 +1,20 @@
 package com.ruoyi.purchase.dto;
 
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.purchase.pojo.TicketRegistration;
 import com.ruoyi.sales.pojo.CommonFile;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import lombok.Data;
 
 import java.util.List;
 
+/**
+ * 鏉ョエ鐧昏琛�
+ */
+
 @Data
-public class TicketRegistrationDto {
+@TableName("ticket_registration")
+public class TicketRegistrationDto extends TicketRegistration {
 
     /**
      * 涓婚敭ID
diff --git a/src/main/java/com/ruoyi/purchase/mapper/ProductRecordMapper.java b/src/main/java/com/ruoyi/purchase/mapper/ProductRecordMapper.java
new file mode 100644
index 0000000..d4570fb
--- /dev/null
+++ b/src/main/java/com/ruoyi/purchase/mapper/ProductRecordMapper.java
@@ -0,0 +1,14 @@
+package com.ruoyi.purchase.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.purchase.pojo.ProductRecord;
+
+/**
+ * 閲囪喘鍙拌处浜у搧寮�绁ㄨ褰昅apper鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2025-05-23
+ */
+public interface ProductRecordMapper extends BaseMapper<ProductRecord> {
+
+}
diff --git a/src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java b/src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java
index 403c424..d117038 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java
+++ b/src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java
@@ -43,7 +43,7 @@
     /**
      * 鍙戠エid
      */
-    private Long invoicePurchaseId;
+    private Long ticketRegistrationId;
 
     /**
      * 鏈浠樻閲戦
@@ -54,6 +54,11 @@
      * 浠樻褰㈠紡
      */
     private String paymentMethod;
+
+    /**
+     * 绋庣巼
+     */
+    private String taxRate;
 
     /**
      * 鐧昏浜�
@@ -70,6 +75,12 @@
     private Date paymentDate;
 
     /**
+     * 鐧昏鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date registrationtDate;
+
+    /**
      * 鍒涘缓鏃ユ湡
      */
     @TableField(fill = FieldFill.INSERT)
diff --git a/src/main/java/com/ruoyi/purchase/pojo/ProductRecord.java b/src/main/java/com/ruoyi/purchase/pojo/ProductRecord.java
new file mode 100644
index 0000000..bc0a5e6
--- /dev/null
+++ b/src/main/java/com/ruoyi/purchase/pojo/ProductRecord.java
@@ -0,0 +1,124 @@
+package com.ruoyi.purchase.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 閲囪喘鍙拌处浜у搧寮�绁ㄨ褰曞璞� product_record
+ *
+ * @author ruoyi
+ * @date 2025-05-23
+ */
+@Data
+@TableName("product_record")
+public class ProductRecord {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鏉ョエ鐧昏id
+     */
+    private Long ticketRegistrationId;
+
+    /**
+     * 閲囪喘鍙拌处id
+     */
+    private Long purchaseLedgerId;
+
+    /**
+     * 浜у搧澶х被
+     */
+    private String productCategory;
+
+    /**
+     * 瑙勬牸鍨嬪彿
+     */
+    private String specificationModel;
+
+    /**
+     * 鍗曚綅
+     */
+    private String unit;
+
+    /**
+     * 鏁伴噺
+     */
+    private BigDecimal quantity;
+
+    /**
+     * 绋庣巼
+     */
+    private BigDecimal taxRate;
+
+    /**
+     * 鍚◣鍗曚环
+     */
+    private BigDecimal taxInclusiveUnitPrice;
+
+    /**
+     * 鍚◣鎬讳环
+     */
+    private BigDecimal taxInclusiveTotalPrice;
+
+    /**
+     * 涓嶅惈绋庢�讳环
+     */
+    private BigDecimal taxExclusiveTotalPrice;
+
+    /**
+     * 鍙戠エ绫诲瀷
+     */
+    private String invoiceType;
+
+    /**
+     * 1.閿�鍞彴璐︼紝2.閲囪喘鍙拌处
+     */
+    private String type;
+
+    /**
+     * 鏈鏉ョエ鏁�
+     */
+    private Long ticketsNum;
+
+    /**
+     * 鏈鏉ョエ閲戦(鍏�)
+     */
+    private BigDecimal ticketsAmount;
+
+    /**
+     * 鏈潵绁ㄦ暟
+     */
+    private Long futureTickets;
+
+    /**
+     * 鏈潵绁ㄩ噾棰�(鍏�)
+     */
+    private BigDecimal futureTicketsAmount;
+
+    /**
+     * 浜у搧id
+     */
+    private Long productId;
+
+    /**
+     * 鍨嬪彿id
+     */
+    private Long productModelId;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createdAt;
+}
diff --git a/src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java b/src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java
index 41d6171..a297f3f 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java
+++ b/src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java
@@ -78,6 +78,12 @@
     private BigDecimal invoiceAmount;
 
     /**
+     * 寮�绁ㄤ汉ID
+     */
+    @Excel(name = "寮�绁ㄤ汉")
+    private String issUerId;
+
+    /**
      * 寮�绁ㄤ汉
      */
     @Excel(name = "寮�绁ㄤ汉")
diff --git a/src/main/java/com/ruoyi/purchase/service/IProductRecordService.java b/src/main/java/com/ruoyi/purchase/service/IProductRecordService.java
new file mode 100644
index 0000000..0eee184
--- /dev/null
+++ b/src/main/java/com/ruoyi/purchase/service/IProductRecordService.java
@@ -0,0 +1,18 @@
+package com.ruoyi.purchase.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.purchase.dto.TicketRegistrationDto;
+import com.ruoyi.purchase.pojo.ProductRecord;
+
+import java.util.List;
+
+/**
+ * 閲囪喘鍙拌处浜у搧寮�绁ㄨ褰昐ervice鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2025-05-23
+ */
+public interface IProductRecordService extends IService<ProductRecord> {
+
+    List<ProductRecord> selectProductRecordList(TicketRegistrationDto ticketRegistrationDto);
+}
diff --git a/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java b/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
index 1607cb6..428ec82 100644
--- a/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
+++ b/src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
@@ -29,4 +29,6 @@
     PurchaseLedgerDto getInfo(PurchaseLedgerDto purchaseLedgerDto);
 
     List getPurchasesNo();
+
+    PurchaseLedgerDto getPurchaseNoById(Long id);
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/ITicketRegistrationService.java b/src/main/java/com/ruoyi/purchase/service/ITicketRegistrationService.java
index ceb5b9b..502f659 100644
--- a/src/main/java/com/ruoyi/purchase/service/ITicketRegistrationService.java
+++ b/src/main/java/com/ruoyi/purchase/service/ITicketRegistrationService.java
@@ -22,4 +22,6 @@
     int delRegistration(Long[] ids);
 
     TicketRegistrationDto getRegistrationById(TicketRegistrationDto ticketRegistrationDto);
+
+    List getTicketNo(TicketRegistrationDto ticketRegistrationDto);
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
index e858038..2d78a62 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.mapper.SupplierManageMapper;
 import com.ruoyi.basic.pojo.SupplierManage;
@@ -10,18 +11,17 @@
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.purchase.dto.PaymentLedgerDto;
 import com.ruoyi.purchase.dto.PaymentRegistrationDto;
-import com.ruoyi.purchase.mapper.InvoicePurchaseMapper;
-import com.ruoyi.purchase.mapper.PaymentRegistrationMapper;
-import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
-import com.ruoyi.purchase.pojo.InvoicePurchase;
+import com.ruoyi.purchase.mapper.*;
 import com.ruoyi.purchase.pojo.PaymentRegistration;
+import com.ruoyi.purchase.pojo.ProductRecord;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
+import com.ruoyi.purchase.pojo.TicketRegistration;
 import com.ruoyi.purchase.service.IPaymentRegistrationService;
 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 org.springframework.beans.factory.annotation.Autowired;
+import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
@@ -37,24 +37,23 @@
  * @date 2025-05-15
  */
 @Service
+@AllArgsConstructor
 public class PaymentRegistrationServiceImpl extends ServiceImpl<PaymentRegistrationMapper, PaymentRegistration> implements IPaymentRegistrationService {
-    @Autowired
     private PaymentRegistrationMapper paymentRegistrationMapper;
 
-    @Autowired
     private PurchaseLedgerMapper purchaseLedgerMapper;
 
-    @Autowired
     private InvoicePurchaseMapper invoicePurchaseMapper;
 
-    @Autowired
     private SalesLedgerMapper salesLedgerMapper;
 
-    @Autowired
     private SupplierManageMapper supplierManageMapper;
 
-    @Autowired
     private SalesLedgerProductMapper salesLedgerProductMapper;
+
+    private TicketRegistrationMapper ticketRegistrationMapper;
+
+    private ProductRecordMapper productRecordMapper;
 
     /**
      * 鏌ヨ浠樻鐧昏
@@ -78,7 +77,7 @@
         List<PaymentRegistrationDto> list = paymentRegistrationMapper.selectPaymentRegistrationList(paymentRegistrationDto);
         for (PaymentRegistrationDto registrationDto : list) {
             List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>()
-                    .eq("invoice_purchase_id", registrationDto.getInvoicePurchaseId()));
+                    .eq("ticket_registration_id", registrationDto.getTicketRegistrationId()));
             BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
             registrationDto.setUnPaymentAmount(registrationDto.getInvoiceAmount().subtract(total));
         }
@@ -103,25 +102,24 @@
         paymentRegistration.setSaleLedgerId(salesLedger.getId());
         paymentRegistration.setSupplierId(purchaseLedger.getSupplierId());
 
-        List<InvoicePurchase> invoicePurchases = invoicePurchaseMapper.selectList(new QueryWrapper<InvoicePurchase>().
-                eq("purchase_contract_no", purchaseLedger.getPurchaseContractNumber()));
-        if (invoicePurchases == null || invoicePurchases.size() == 0) {
+        TicketRegistration tr = ticketRegistrationMapper.selectOne(new LambdaQueryWrapper<TicketRegistration>().eq(TicketRegistration::getId, paymentRegistration.getTicketRegistrationId()));
+
+        if (tr == null) {
             throw new RuntimeException("鍏宠仈鍙戠エ涓嶅瓨鍦�");
         }
-        paymentRegistration.setInvoicePurchaseId(invoicePurchases.get(0).getId());
 
         List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>()
-                .eq("invoice_purchase_id", invoicePurchases.get(0).getId()));
+                .eq("ticket_registration_id", tr.getId()));
         BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 
-        if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(invoicePurchases.get(0).getInvoiceAmount()) > 0) {
+        if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(tr.getInvoiceAmount()) > 0) {
             throw new RuntimeException("浠樻閲戦瓒呭嚭鍙戠エ閲戦");
         }
-
 
         LoginUser loginUser = SecurityUtils.getLoginUser();
         Integer tenantId = loginUser.getTenantId();
         paymentRegistration.setTenantId(tenantId.longValue());
+        paymentRegistration.setRegistrantId(loginUser.getUserId());
         paymentRegistration.setCreateTime(DateUtils.getNowDate());
         paymentRegistration.setUpdateTime(DateUtils.getNowDate());
         return paymentRegistrationMapper.insert(paymentRegistration);
@@ -135,13 +133,13 @@
      */
     @Override
     public int updatePaymentRegistration(PaymentRegistration paymentRegistration) {
-        InvoicePurchase invoicePurchase = invoicePurchaseMapper.selectById(paymentRegistration.getInvoicePurchaseId());
+        TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(paymentRegistration.getTicketRegistrationId());
 
         List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>()
-                .eq("invoice_purchase_id", paymentRegistration.getInvoicePurchaseId()).ne("id", paymentRegistration.getId()));
+                .eq("ticket_registration_id", paymentRegistration.getTicketRegistrationId()).ne("id", paymentRegistration.getId()));
         BigDecimal total = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 
-        if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(invoicePurchase.getInvoiceAmount()) > 0) {
+        if (total.add(paymentRegistration.getCurrentPaymentAmount()).compareTo(ticketRegistration.getInvoiceAmount()) > 0) {
             throw new RuntimeException("浠樻閲戦瓒呭嚭鍙戠エ閲戦");
         }
 
@@ -168,12 +166,11 @@
         paymentRegistrationDto.setSupplierName(purchaseLedger.getSupplierName());
         paymentRegistrationDto.setSupplierId(purchaseLedger.getSupplierId());
 
-        List<InvoicePurchase> invoicePurchaseList = invoicePurchaseMapper.selectList(new QueryWrapper<InvoicePurchase>()
-                .eq("purchase_contract_no", purchaseLedger.getPurchaseContractNumber()));
-        if (invoicePurchaseList != null && invoicePurchaseList.size() > 0) {
-            paymentRegistrationDto.setInvoiceNumber(invoicePurchaseList.get(0).getInvoiceNumber());
-            paymentRegistrationDto.setInvoiceAmount(invoicePurchaseList.get(0).getInvoiceAmount());
-            paymentRegistrationDto.setTaxRate(invoicePurchaseList.get(0).getTaxRate());
+        List<TicketRegistration> ticketRegistrations = ticketRegistrationMapper.selectList(new QueryWrapper<TicketRegistration>()
+                .eq("purchase_contract_number", purchaseLedger.getPurchaseContractNumber()));
+        if (ticketRegistrations != null && ticketRegistrations.size() > 0) {
+            paymentRegistrationDto.setInvoiceNumber(ticketRegistrations.get(0).getInvoiceNumber());
+            paymentRegistrationDto.setInvoiceAmount(ticketRegistrations.get(0).getInvoiceAmount());
         }
         return paymentRegistrationDto;
     }
@@ -197,18 +194,36 @@
 
             // 搴斾粯閲戦
             BigDecimal payableAmount = BigDecimal.ZERO;
-            List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(new QueryWrapper<SalesLedger>().eq("customer_id", supplierManage.getId()));
-            if (salesLedgers != null && salesLedgers.size() > 0) {
+            List<PurchaseLedger> purchaseLedgers = purchaseLedgerMapper.selectList(new QueryWrapper<PurchaseLedger>().eq("supplier_id", supplierManage.getId()));
+            if (purchaseLedgers != null && purchaseLedgers.size() > 0) {
                 List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>()
-                        .in("sales_ledger_id", salesLedgers.stream().map(SalesLedger::getId).collect(Collectors.toList())));
+                        .in("sales_ledger_id", purchaseLedgers.stream().map(PurchaseLedger::getId).collect(Collectors.toList())));
                 // 搴斾粯閲戦
                 payableAmount = salesLedgerProducts.stream().map(SalesLedgerProduct::getTaxInclusiveTotalPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
 
             }
 
-            // 寮�绁ㄩ噾棰�
-            BigDecimal invoiceAmount = salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal invoiceAmount = BigDecimal.ZERO;
+            List<TicketRegistration> ticketRegistrations = Collections.emptyList();
 
+            // 澧炲姞绌哄�兼鏌ワ紝閬垮厤NullPointerException
+            if (CollectionUtils.isNotEmpty(purchaseLedgers)) {
+                Long[] ids = purchaseLedgers.stream()
+                        .map(PurchaseLedger::getId)
+                        .toArray(Long[]::new);
+
+                // 妫�鏌ユ暟缁勬槸鍚︽湁鍏冪礌
+                if (ids.length > 0) {
+                    ticketRegistrations = ticketRegistrationMapper.selectList(
+                            new LambdaQueryWrapper<TicketRegistration>()
+                                    .in(TicketRegistration::getPurchaseLedgerId, ids)
+                    );
+                }
+            }
+            if (ticketRegistrations != null && ticketRegistrations.size() > 0) {
+                // 鏉ョエ閲戦
+                invoiceAmount = ticketRegistrations.stream().map(TicketRegistration::getInvoiceAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+            }
             // 浠樻閲戦
             List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new QueryWrapper<PaymentRegistration>()
                     .eq("supplier_id", supplierManage.getId()));
@@ -226,21 +241,25 @@
             List<Map<String, Object>> details = new ArrayList<>();
             for (PaymentRegistration paymentRegistration : paymentRegistrations) {
                 Map<String, Object> detail = new HashMap<>();
-                detail.put("voteCount", 1); // 绁ㄦ暟锛屾湭鐭ユ暟鎹簮锛屾殏鏃剁敤1
                 detail.put("paymentAmount", paymentRegistration.getCurrentPaymentAmount()); // 浠樻閲戦
-                InvoicePurchase  invoicePurchase = invoicePurchaseMapper.selectById(paymentRegistration.getInvoicePurchaseId());
-                detail.put("payableAmount", invoicePurchase.getInvoiceAmount()); // 搴斾粯閲戦
+                TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(paymentRegistration.getTicketRegistrationId());
+                detail.put("payableAmount", ticketRegistration.getInvoiceAmount()); // 搴斾粯閲戦
+                BigDecimal voteCount = productRecordMapper.selectList(
+                                new LambdaQueryWrapper<ProductRecord>()
+                                        .eq(ProductRecord::getTicketRegistrationId, ticketRegistration.getId()))
+                        .stream()
+                        .map(ProductRecord::getTicketsNum)
+                        .map(BigDecimal::new)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+                detail.put("voteCount", voteCount); // 绁ㄦ暟
                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                 String formattedDate = sdf.format(paymentRegistration.getPaymentDate());
-                detail.put("createTime", formattedDate); // 鍙戠敓鏃堕棿
+                detail.put("paymentDate", formattedDate); // 鍙戠敓鏃堕棿
                 details.add(detail);
             }
-
-            res.put("details", paymentRegistrations);
-
+            res.put("details", details);
             result.add(res);
         }
-
         return result;
     }
 }
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java
new file mode 100644
index 0000000..96f2ff0
--- /dev/null
+++ b/src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java
@@ -0,0 +1,39 @@
+package com.ruoyi.purchase.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.purchase.dto.TicketRegistrationDto;
+import com.ruoyi.purchase.mapper.ProductRecordMapper;
+import com.ruoyi.purchase.pojo.ProductRecord;
+import com.ruoyi.purchase.service.IProductRecordService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 閲囪喘鍙拌处浜у搧寮�绁ㄨ褰昐ervice涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2025-05-23
+ */
+@Service
+@AllArgsConstructor
+public class ProductRecordServiceImpl extends ServiceImpl<ProductRecordMapper, ProductRecord> implements IProductRecordService {
+
+    private ProductRecordMapper productRecordMapper;
+
+
+    /**
+     * 鏌ヨ閲囪喘鍙拌处浜у搧寮�绁ㄨ褰�
+     *
+     * @param ticketRegistrationDto 閲囪喘鍙拌处浜у搧寮�绁ㄨ褰曚富閿�
+     * @return 閲囪喘鍙拌处浜у搧寮�绁ㄨ褰�
+     */
+    @Override
+    public List<ProductRecord> selectProductRecordList(TicketRegistrationDto ticketRegistrationDto) {
+        return productRecordMapper.selectList(new LambdaQueryWrapper<ProductRecord>().eq(ProductRecord::getTicketRegistrationId, ticketRegistrationDto.getId())
+                .eq(ProductRecord::getType, "2"));
+    }
+
+}
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 af2171e..3be1a26 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -17,8 +17,12 @@
 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.ProductRecordMapper;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
+import com.ruoyi.purchase.mapper.TicketRegistrationMapper;
+import com.ruoyi.purchase.pojo.ProductRecord;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
+import com.ruoyi.purchase.pojo.TicketRegistration;
 import com.ruoyi.purchase.service.IPurchaseLedgerService;
 import com.ruoyi.sales.mapper.CommonFileMapper;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
@@ -73,6 +77,10 @@
 
     private final ProductModelMapper productModelMapper;
 
+    private final TicketRegistrationMapper ticketRegistrationMapper;
+
+    private final ProductRecordMapper productRecordMapper;
+
     @Value("${file.upload-dir}")
     private String uploadDir;
 
@@ -118,7 +126,7 @@
         // 4. 澶勭悊瀛愯〃鏁版嵁
         List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData();
         if (productList != null && !productList.isEmpty()) {
-            handleSalesLedgerProducts(purchaseLedger.getId(), purchaseLedgerDto.getProductId(), purchaseLedgerDto.getProductModelId(), productList, purchaseLedgerDto.getType());
+            handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType());
         }
 
         // 5. 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰�
@@ -129,19 +137,52 @@
         return 1;
     }
 
-    private void handleSalesLedgerProducts(Long salesLedgerId, Long productId, Long productModelId, List<SalesLedgerProduct> products, Integer type) {
-        Product pro = productMapper.selectById(productId);
-        ProductModel productModel = productModelMapper.selectById(productModelId);
+    private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) {
+        if (products == null || products.isEmpty()) {
+            throw new BaseException("浜у搧淇℃伅涓嶅瓨鍦�");
+        }
 
-        // 鎸塈D鍒嗙粍锛屽尯鍒嗘柊澧炲拰鏇存柊鐨勮褰�
+        // 鎻愬墠鏀堕泦鎵�鏈夐渶瑕佹煡璇㈢殑ID
+        Set<Long> productIds = products.stream()
+                .map(SalesLedgerProduct::getProductId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+        Set<Long> modelIds = products.stream()
+                .map(SalesLedgerProduct::getProductModelId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+        // 涓�娆℃�ф煡璇骇鍝佸拰鍨嬪彿淇℃伅
+        Map<Long, String> productMap = new HashMap<>();
+        if (!productIds.isEmpty()) {
+            List<Product> productList = productMapper.selectBatchIds(productIds);
+            productList.forEach(p -> productMap.put(p.getId(), p.getProductName()));
+        }
+
+        Map<Long, String> modelMap = new HashMap<>();
+        if (!modelIds.isEmpty()) {
+            List<ProductModel> modelList = productModelMapper.selectBatchIds(modelIds);
+            modelList.forEach(m -> modelMap.put(m.getId(), m.getModel()));
+        }
+
+        // 璁剧疆瀛楁
+        for (SalesLedgerProduct product : products) {
+            product.setSalesLedgerId(salesLedgerId);
+
+            Long productId = product.getProductId();
+            if (productId != null && productMap.containsKey(productId)) {
+                product.setProductCategory(productMap.get(productId));
+            }
+
+            Long productModelId = product.getProductModelId();
+            if (productModelId != null && modelMap.containsKey(productModelId)) {
+                product.setSpecificationModel(modelMap.get(productModelId));
+            }
+        }
+
+        // 鍒嗙粍澶勭悊
         Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream()
-                .peek(p -> {
-                    p.setSalesLedgerId(salesLedgerId);
-                    p.setProductId(productId);
-                    p.setProductCategory(pro.getProductName());
-                    p.setProductModelId(productModelId);
-                    p.setSpecificationModel(productModel.getModel());
-                })
                 .collect(Collectors.partitioningBy(p -> p.getId() != null));
 
         List<SalesLedgerProduct> updateList = partitionedProducts.get(true);
@@ -248,6 +289,23 @@
 
     @Override
     public int deletePurchaseLedgerByIds(Long[] ids) {
+        if (ids == null || ids.length == 0) {
+           throw new BaseException("璇烽�変腑鑷冲皯涓�鏉℃暟鎹�");
+        }
+        // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐彴璐︿骇鍝�
+        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(SalesLedgerProduct::getSalesLedgerId, ids)
+                .eq(SalesLedgerProduct::getType, "2");
+        salesLedgerProductMapper.delete(queryWrapper);
+        // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐彴璐︾殑鏉ョエ鐧昏
+        LambdaQueryWrapper<TicketRegistration> ticketRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getSalesLedgerId,ids);
+        ticketRegistrationMapper.delete(ticketRegistrationLambdaQueryWrapper);
+        // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐彴璐︾殑鏉ョエ鐧昏璁板綍
+        LambdaQueryWrapper<ProductRecord> productRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        productRecordLambdaQueryWrapper.in(ProductRecord::getPurchaseLedgerId,ids);
+        productRecordMapper.delete(productRecordLambdaQueryWrapper);
+        // 鎵归噺鍒犻櫎閲囪喘鍙拌处
         return purchaseLedgerMapper.deleteBatchIds(Arrays.asList(ids));
     }
 
@@ -315,8 +373,13 @@
         queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
                 .eq(SalesLedgerProduct::getType, 2);
         List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(queryWrapper);
+        productList.forEach(product -> {
+            product.setFutureTickets(product.getFutureTickets() != null ? product.getFutureTickets() : product.getQuantity().longValue());
+            product.setFutureTicketsAmount(product.getFutureTicketsAmount() != null ? product.getFutureTicketsAmount() : product.getTaxInclusiveTotalPrice());
+            product.setTicketsNum(null);
+            product.setTicketsAmount(null);
+        });
         resultDto.setProductData(productList);
-
         return resultDto;
     }
 
@@ -336,6 +399,20 @@
         ).collect(Collectors.toList());
     }
 
+    @Override
+    public PurchaseLedgerDto getPurchaseNoById(Long id) {
+        PurchaseLedgerDto purchaseLedgerDto = new PurchaseLedgerDto();
+        PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(id);
+        BeanUtils.copyProperties(purchaseLedger, purchaseLedgerDto);
+//        TicketRegistration ticketRegistration = ticketRegistrationMapper.selectOne(new LambdaQueryWrapper<TicketRegistration>().eq(TicketRegistration::getPurchaseLedgerId, id));
+//        if (ticketRegistration != null) {
+//            purchaseLedgerDto.setInvoiceNumber(ticketRegistration.getInvoiceNumber());
+//            purchaseLedgerDto.setInvoiceAmount(ticketRegistration.getInvoiceAmount());
+//            purchaseLedgerDto.setTicketRegistrationId(ticketRegistration.getId());
+//        }
+        return purchaseLedgerDto;
+    }
+
     /**
      * 涓嬪垝绾垮懡鍚嶈浆椹煎嘲鍛藉悕
      */
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
index ef4d278..c9d189f 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -4,13 +4,16 @@
 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.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.other.mapper.TempFileMapper;
 import com.ruoyi.other.pojo.TempFile;
 import com.ruoyi.purchase.dto.TicketRegistrationDto;
+import com.ruoyi.purchase.mapper.ProductRecordMapper;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.mapper.TicketRegistrationMapper;
+import com.ruoyi.purchase.pojo.ProductRecord;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.purchase.pojo.TicketRegistration;
 import com.ruoyi.purchase.service.ITicketRegistrationService;
@@ -23,6 +26,7 @@
 import org.apache.commons.io.FilenameUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -35,6 +39,7 @@
 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;
 
@@ -59,6 +64,8 @@
 
     private final TempFileMapper tempFileMapper;
 
+    private final ProductRecordMapper productRecordMapper;
+
     @Value("${file.upload-dir}")
     private String uploadDir;
 
@@ -67,38 +74,59 @@
     public List<TicketRegistration> selectTicketRegistrationList(TicketRegistration ticketRegistration) {
         LambdaQueryWrapper<TicketRegistration> queryWrapper = new LambdaQueryWrapper<>();
         if (StringUtils.isNotBlank(ticketRegistration.getPurchaseContractNumber())) {
-            queryWrapper.like(TicketRegistration::getPurchaseContractNumber, ticketRegistration.getPurchaseContractNumber());
+            queryWrapper.like(TicketRegistration::getPurchaseContractNumber, ticketRegistration.getPurchaseContractNumber())
+                    .like(TicketRegistration::getSupplierName, ticketRegistration.getSupplierName())
+                    .eq(TicketRegistration::getIssueDate, ticketRegistration.getIssueDate());
         }
         return ticketRegistrationMapper.selectList(queryWrapper);
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int addOrUpdateRegistration(TicketRegistrationDto ticketRegistrationDto) throws IOException {
+        // 1. 鏌ヨ閲囪喘鍙拌处璁板綍
         PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(ticketRegistrationDto.getPurchaseLedgerId());
+        if (purchaseLedger == null) {
+            // 澶勭悊閲囪喘鍙拌处涓嶅瓨鍦ㄧ殑鎯呭喌锛屼緥濡傛姏鍑哄紓甯告垨杩斿洖閿欒
+            throw new IllegalArgumentException("閲囪喘鍙拌处璁板綍涓嶅瓨鍦紝ID: " + ticketRegistrationDto.getPurchaseLedgerId());
+        }
+
+        // 3. 鍒涘缓鎴栨洿鏂扮エ鎹櫥璁板疄浣�
         TicketRegistration ticketRegistration = new TicketRegistration();
         BeanUtils.copyProperties(ticketRegistrationDto, ticketRegistration);
         ticketRegistration.setPurchaseContractNumber(purchaseLedger.getPurchaseContractNumber());
         ticketRegistration.setTenantId(purchaseLedger.getTenantId());
         ticketRegistration.setContractAmount(purchaseLedger.getContractAmount());
-        // 澶勭悊瀛愯〃鏁版嵁
+        ticketRegistration.setSalesLedgerId(purchaseLedger.getSalesLedgerId());
+
+        // 4. 澶勭悊瀛愯〃鏁版嵁
         List<SalesLedgerProduct> productData = ticketRegistrationDto.getProductData();
-        if (productData != null && !productData.isEmpty()) {
+        if (CollectionUtils.isNotEmpty(productData)) {
             handleSalesLedgerProducts(purchaseLedger.getId(), productData, 2);
         }
 
-        // 鎵ц鎻掑叆鎴栨洿鏂版搷浣�
-        int i;
-        if (ticketRegistrationDto.getId() == null) {
-            i = ticketRegistrationMapper.insert(ticketRegistration);
-        } else {
-            i = ticketRegistrationMapper.updateById(ticketRegistration);
-        }
+        // 5. 鎵ц鎻掑叆鎴栨洿鏂版搷浣�
+        int rowsAffected = ticketRegistrationMapper.insert(ticketRegistration);
 
+        // 6. 澧炲姞閲囪喘鍙拌处浜у搧寮�绁ㄨ褰�
+        List<SalesLedgerProduct> salesLedgerProducts = ticketRegistrationDto.getProductData();
+        if (CollectionUtils.isNotEmpty(salesLedgerProducts)){
+            for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) {
+                ProductRecord productRecord = new ProductRecord();
+                productRecord.setTicketRegistrationId(ticketRegistration.getId());
+                productRecord.setPurchaseLedgerId(ticketRegistrationDto.getPurchaseLedgerId());
+                productRecord.setCreatedAt(DateUtils.getNowDate());
+                BeanUtils.copyProperties(salesLedgerProduct,productRecord);
+                productRecord.setId(null);
+                productRecord.setType("2");
+                productRecordMapper.insert(productRecord);
+            }
+        }
         // 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰�
         if (ticketRegistrationDto.getTempFileIds() != null && !ticketRegistrationDto.getTempFileIds().isEmpty()) {
             migrateTempFilesToFormal(ticketRegistration.getId(), ticketRegistrationDto.getTempFileIds());
         }
-        return i;
+        return rowsAffected;
     }
 
 
@@ -195,8 +223,21 @@
                 .eq(SalesLedgerProduct::getType, 2);
         List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(queryWrapper);
         resultDto.setProductData(productList);
-
         return resultDto;
+    }
+
+    @Override
+    public List getTicketNo(TicketRegistrationDto ticketRegistrationDto) {
+        LambdaQueryWrapper<TicketRegistration> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(TicketRegistration::getId,TicketRegistration::getInvoiceNumber,TicketRegistration::getInvoiceAmount)
+                .eq(TicketRegistration::getPurchaseLedgerId,ticketRegistrationDto.getId());
+        List<Map<String, Object>> result = ticketRegistrationMapper.selectMaps(queryWrapper);
+        // 灏嗕笅鍒掔嚎鍛藉悕杞崲涓洪┘宄板懡鍚�
+        return result.stream().map(map -> map.entrySet().stream()
+                .collect(Collectors.toMap(
+                        entry -> underlineToCamel(entry.getKey()),
+                        Map.Entry::getValue))
+        ).collect(Collectors.toList());
     }
 
     private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) {
@@ -216,11 +257,57 @@
         // 鎵归噺鏇存柊锛堥渶瑕� MyBatis 鎻愪緵鎵归噺鏇存柊鏂规硶锛�
         if (!updateList.isEmpty()) {
             updateList.forEach(product -> {
-                product.setFutureTickets(product.getQuantity().subtract(new BigDecimal(product.getTicketsNum())).longValue());
-                product.setFutureTicketsAmount(product.getTaxExclusiveTotalPrice().subtract(product.getTicketsAmount()));
+                // 闈炵┖鏍¢獙锛屼换涓�瀛楁涓虹┖鍒欐姏鍑哄紓甯�
+                if (product.getQuantity() == null) {
+                    throw new BaseException("鏁伴噺涓嶈兘涓虹┖");
+                }
+                if (product.getTicketsNum() == null) {
+                    throw new BaseException("宸插紑绁ㄦ暟閲忎笉鑳戒负绌�");
+                }
+                if (product.getTaxInclusiveTotalPrice() == null) {
+                    throw new BaseException("鍚◣鎬讳环涓嶈兘涓虹┖");
+                }
+                if (product.getTicketsAmount() == null) {
+                    throw new BaseException("鏈鏉ョエ閲戦(鍏�)涓嶈兘涓虹┖");
+                }
+
+                // 璁$畻 futureTickets锛堢洿鎺ヤ娇鐢� BigDecimal 璁$畻锛岄伩鍏嶇簿搴︿涪澶憋級
+                product.setFutureTickets(
+                        product.getQuantity()
+                                .subtract(BigDecimal.valueOf(product.getTicketsNum()))
+                                .longValueExact() // 浣跨敤 exact 鏂规硶纭繚鏃犲皬鏁伴儴鍒�
+                );
+
+                // 璁$畻 futureTicketsAmount
+                product.setFutureTicketsAmount(
+                        product.getTaxInclusiveTotalPrice()
+                                .subtract(product.getTicketsAmount())
+                );
                 product.setType(type);
                 salesLedgerProductMapper.updateById(product);
             });
         }
     }
+
+    /**
+     * 涓嬪垝绾垮懡鍚嶈浆椹煎嘲鍛藉悕
+     */
+    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();
+    }
 }
diff --git a/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml b/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
index 9f21eff..c4636e5 100644
--- a/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
+++ b/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
@@ -9,7 +9,7 @@
         <result property="saleLedgerId" column="sale_ledger_id"/>
         <result property="purchaseLedgerId" column="purchase_ledger_id"/>
         <result property="supplierId" column="supplier_id"/>
-        <result property="invoicePurchaseId" column="invoice_purchase_id"/>
+        <result property="ticketRegistrationId" column="ticket_registration_id"/>
         <result property="currentPaymentAmount" column="current_payment_amount"/>
         <result property="paymentMethod" column="payment_method"/>
         <result property="registrantId" column="registrant_id"/>
@@ -17,6 +17,7 @@
         <result property="createTime" column="create_time"/>
         <result property="updateTime" column="update_time"/>
         <result property="tenantId" column="tenant_id"/>
+        <result property="registrationtDate" column="registrationt_date"/>
     </resultMap>
 
     <resultMap type="com.ruoyi.purchase.dto.PaymentRegistrationDto" id="PaymentRegistrationDtoResult">
@@ -24,7 +25,7 @@
         <result property="saleLedgerId" column="sale_ledger_id"/>
         <result property="purchaseLedgerId" column="purchase_ledger_id"/>
         <result property="supplierId" column="supplier_id"/>
-        <result property="invoicePurchaseId" column="invoice_purchase_id"/>
+        <result property="ticketRegistrationId" column="ticket_registration_id"/>
         <result property="currentPaymentAmount" column="current_payment_amount"/>
         <result property="paymentMethod" column="payment_method"/>
         <result property="registrantId" column="registrant_id"/>
@@ -38,6 +39,7 @@
         <result property="taxRate" column="tax_rate"/>
         <result property="invoiceAmount" column="invoice_amount"/>
         <result property="tenantId" column="tenant_id"/>
+        <result property="registrationtDate" column="registrationt_date"/>
     </resultMap>
 
     <sql id="selectPaymentRegistrationVo">
@@ -45,7 +47,7 @@
                pr.sale_ledger_id,
                pr.purchase_ledger_id,
                pr.supplier_id,
-               pr.invoice_purchase_id,
+               pr.ticket_registration_id,
                pr.current_payment_amount,
                pr.payment_method,
                pr.registrant_id,
@@ -57,13 +59,15 @@
                pl.purchase_contract_number as purchase_contract_number,
                sm.supplier_name as supplier_name,
                ip.invoice_number as invoice_number,
-               ip.tax_rate as tax_rate,
-               ip.invoice_amount as invoice_amount
+               ip.invoice_amount as invoice_amount,
+               pr.tax_rate,
+               pr.registrationt_date,
+               su.nick_name as registrant
         from payment_registration pr
                  left join sales_ledger sl on pr.sale_ledger_id = sl.id
                  left join purchase_ledger pl on pr.purchase_ledger_id = pl.id
                  left join supplier_manage sm on pr.supplier_id = sm.id
-                 left join invoice_purchase ip on pr.invoice_purchase_id = ip.id
+                 left join ticket_registration ip on pr.ticket_registration_id = ip.id
                  left join sys_user su on pr.registrant_id = su.user_id
     </sql>
 

--
Gitblit v1.9.3