From 0ee46d33cc339f3fd17593e6bfe2f033afe6019a Mon Sep 17 00:00:00 2001
From: shiyunteng <shiyunteng@example.com>
Date: 星期三, 17 六月 2026 15:14:13 +0800
Subject: [PATCH] feat:合同新增时显示供应属性 出库新增根据合同出库 资金账目新增时间条件检索 新增延期出货菜单

---
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/OutBoundAddDTO.java                            |    5 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractSubjectMatterService.java          |    2 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractDelayOutMapper.java                 |    6 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractController.java                 |    8 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractDelayOutService.java               |   11 
 platformx-business-finance-biz/src/main/resources/mapper/ContractDelayOutMapper.xml                                             |   37 +++
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/OutSubjectMatterAddDTO.java                    |    2 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/OutBoundController.java                 |   12 +
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractDelayOutPageVo.java                     |   38 +++
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/PaymentConfirmController.java           |   14 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractSubjectMatterServiceImpl.java |    9 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractSubjectMatterController.java    |   10 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractDelayOutServiceImpl.java      |   22 +
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractDelayOutController.java         |  123 +++++++++++
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/PaymentConfirmQueryDTO.java                    |   28 ++
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractSubjectMatter.java                  |    8 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/OutBoundService.java                       |    2 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BipTaxEconomicMatters.java                  |   24 ++
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java              |  278 ++++++++++++++++++++++++
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractDelayOutQueryDTO.java                  |   14 +
 20 files changed, 625 insertions(+), 28 deletions(-)

diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractDelayOutQueryDTO.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractDelayOutQueryDTO.java
new file mode 100644
index 0000000..e7f7e22
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractDelayOutQueryDTO.java
@@ -0,0 +1,14 @@
+package com.by4cloud.platformx.business.dto;
+
+import lombok.Data;
+
+@Data
+public class ContractDelayOutQueryDTO {
+
+	private String partyA;
+
+	private String partyB;
+
+	private String contractName;
+
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/OutBoundAddDTO.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/OutBoundAddDTO.java
index e504be2..9a19632 100644
--- a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/OutBoundAddDTO.java
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/OutBoundAddDTO.java
@@ -17,8 +17,11 @@
 	@Schema(description = "瀹㈠晢ID")
 	private Long busGuestId;
 
+	@Schema(description = "鍚堝悓缂栧彿")
+	private String contractNo;
+
 	@Schema(description = "鍑哄簱鏃堕棿")
-	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd")
 	private Date outBoundTime;
 
 	@Schema(description = "鍗曟嵁鍚嶇О")
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/OutSubjectMatterAddDTO.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/OutSubjectMatterAddDTO.java
index b50a298..60c0b29 100644
--- a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/OutSubjectMatterAddDTO.java
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/OutSubjectMatterAddDTO.java
@@ -8,6 +8,8 @@
 @Data
 public class OutSubjectMatterAddDTO {
 
+	private Long id;
+
 	@Schema(description = "鏍囩殑鐗╁悕绉�")
 	private String subjectMatterName;
 
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/PaymentConfirmQueryDTO.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/PaymentConfirmQueryDTO.java
new file mode 100644
index 0000000..d901172
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/PaymentConfirmQueryDTO.java
@@ -0,0 +1,28 @@
+package com.by4cloud.platformx.business.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.persistence.Column;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+public class PaymentConfirmQueryDTO {
+
+	@Schema(description = "瀹㈠晢鍚嶇О")
+	private String busGuestName;
+
+	@Schema(description = "涓氬姟绫诲瀷")
+	private String businessType;
+
+	@Schema(description = "鍚堝悓鍚嶇О")
+	private String contractName;
+
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date startTime;
+
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date endTime;
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BipTaxEconomicMatters.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BipTaxEconomicMatters.java
new file mode 100644
index 0000000..fed9a33
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BipTaxEconomicMatters.java
@@ -0,0 +1,24 @@
+package com.by4cloud.platformx.business.entity;
+
+import com.by4cloud.platformx.common.data.mybatis.BaseModel;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import lombok.Data;
+import org.hibernate.annotations.Comment;
+import org.hibernate.annotations.Table;
+
+@Data
+@Entity
+@jakarta.persistence.Table(name = "bip_tax_economic_matters")
+@Table(appliesTo = "bip_tax_economic_matters")
+@Comment("bip缁忔祹浜嬮」鍏宠仈绋庢敹鍒嗙被")
+public class BipTaxEconomicMatters extends BaseModel<BipTaxEconomicMatters> {
+
+	@Comment("绋庢敹鍒嗙被缂栫爜")
+	@Column(name="taxCode",length = 64)
+	private String taxCode;
+
+	@Comment("缁忔祹浜嬮」")
+	@Column(name="economicMatters",length = 64)
+	private String economicMatters;
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractSubjectMatter.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractSubjectMatter.java
index 472b9e5..b6007cf 100644
--- a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractSubjectMatter.java
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractSubjectMatter.java
@@ -106,11 +106,11 @@
     @Column(columnDefinition = "date comment '璁″垝浜や粯鏃ユ湡'")
     private Date plannedDeliveryDate;
 
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     @Schema(description = "瀹為檯浜や粯鏃ユ湡")
-    @Column(columnDefinition = "VARCHAR(64) comment '瀹為檯浜や粯鏃ユ湡'")
-    private String actualDeliveryDate;
+    @Column(columnDefinition = "date comment '瀹為檯浜や粯鏃ユ湡'")
+    private Date actualDeliveryDate;
 
     @Schema(description = "浜や粯鐘舵�侊紙0-鏈氦浠� 1-閮ㄥ垎浜や粯 2-宸蹭氦浠橈級")
     @Column(columnDefinition = "tinyint(2) default 0 comment '浜や粯鐘舵��'")
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractDelayOutPageVo.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractDelayOutPageVo.java
new file mode 100644
index 0000000..d7708da
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractDelayOutPageVo.java
@@ -0,0 +1,38 @@
+package com.by4cloud.platformx.business.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ContractDelayOutPageVo {
+
+	@Schema(description = "鍚堝悓鍚嶇О")
+	private String contractName;
+
+	@Schema(description = "鍚堝悓鍚嶇О鐢叉柟")
+	private String partyA;
+
+	@Schema(description = "鍚堝悓鍚嶇О涔欐柟")
+	private String partyB;
+
+	@Schema(description = "寤舵湡澶╂暟")
+	private Integer delayDay;
+
+	@Schema(description = "寤舵湡鍗曟嵁鍚嶇О")
+	private String delayAttNames;
+
+	@Schema(description = "寤舵湡鍗曟嵁璺緞")
+	private String delayAttPaths;
+
+	@Schema(description = "鎻愪氦璐﹀彿")
+	private String applyName;
+
+	@Schema(description = "鎻愪氦鏃堕棿")
+	private Date applyTime;
+
+	@Schema(description = "鐘舵��")
+	private String delayStatus;
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractController.java
index 64f1152..f3447f0 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractController.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractController.java
@@ -133,6 +133,14 @@
     }
 
 	/**
+	 * list 涓嬫媺
+	 */
+	@GetMapping("/list")
+	public R list() {
+		return R.ok(contractService.list(Wrappers.<Contract>lambdaQuery().eq(Contract::getContractStatus,2).orderByDesc(Contract::getCreateTime)));
+	}
+
+	/**
 	 * 鍚姩瀹℃牳娴佺▼
 	 * @param id id
 	 * @return R
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractDelayOutController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractDelayOutController.java
new file mode 100644
index 0000000..9f16368
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractDelayOutController.java
@@ -0,0 +1,123 @@
+package com.by4cloud.platformx.business.controller;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.by4cloud.platformx.business.dto.ContractDelayOutQueryDTO;
+import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.common.log.annotation.SysLog;
+import com.by4cloud.platformx.business.entity.ContractDelayOut;
+import com.by4cloud.platformx.business.service.ContractDelayOutService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import com.by4cloud.platformx.common.excel.annotation.ResponseExcel;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import org.springdoc.core.annotations.ParameterObject;
+import org.springframework.http.HttpHeaders;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 寤舵湡鍑鸿揣
+ *
+ * @author syt
+ * @date 2026-06-17 08:44:56
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/contractDelayOut" )
+@Tag(description = "contractDelayOut" , name = "寤舵湡鍑鸿揣绠$悊" )
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class ContractDelayOutController {
+
+    private final  ContractDelayOutService contractDelayOutService;
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page 鍒嗛〉瀵硅薄
+     * @param queryDTO 寤舵湡鍑鸿揣
+     * @return
+     */
+    @Operation(summary = "鍒嗛〉鏌ヨ" , description = "鍒嗛〉鏌ヨ" )
+    @GetMapping("/page" )
+    @PreAuthorize("@pms.hasPermission('business_contractDelayOut_view')" )
+    public R getContractDelayOutPage(@ParameterObject Page page, @ParameterObject ContractDelayOutQueryDTO queryDTO) {
+        LambdaQueryWrapper<ContractDelayOut> wrapper = Wrappers.lambdaQuery();
+//		wrapper.eq(StrUtil.isNotBlank(contractDelayOut.getDelayAttNames()),ContractDelayOut::getDelayAttNames,contractDelayOut.getDelayAttNames());
+//		wrapper.eq(StrUtil.isNotBlank(contractDelayOut.getDelayStatus()),ContractDelayOut::getDelayStatus,contractDelayOut.getDelayStatus());
+        return R.ok(contractDelayOutService.pageNew(page, queryDTO));
+    }
+
+
+    /**
+     * 閫氳繃id鏌ヨ寤舵湡鍑鸿揣
+     * @param id id
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鏌ヨ" , description = "閫氳繃id鏌ヨ" )
+    @GetMapping("/{id}" )
+    @PreAuthorize("@pms.hasPermission('business_contractDelayOut_view')" )
+    public R getById(@PathVariable("id" ) Long id) {
+        return R.ok(contractDelayOutService.getById(id));
+    }
+
+    /**
+     * 鏂板寤舵湡鍑鸿揣
+     * @param contractDelayOut 寤舵湡鍑鸿揣
+     * @return R
+     */
+    @Operation(summary = "鏂板寤舵湡鍑鸿揣" , description = "鏂板寤舵湡鍑鸿揣" )
+    @SysLog("鏂板寤舵湡鍑鸿揣" )
+    @PostMapping
+    @PreAuthorize("@pms.hasPermission('business_contractDelayOut_add')" )
+    public R save(@RequestBody ContractDelayOut contractDelayOut) {
+        return R.ok(contractDelayOutService.save(contractDelayOut));
+    }
+
+    /**
+     * 淇敼寤舵湡鍑鸿揣
+     * @param contractDelayOut 寤舵湡鍑鸿揣
+     * @return R
+     */
+    @Operation(summary = "淇敼寤舵湡鍑鸿揣" , description = "淇敼寤舵湡鍑鸿揣" )
+    @SysLog("淇敼寤舵湡鍑鸿揣" )
+    @PutMapping
+    @PreAuthorize("@pms.hasPermission('business_contractDelayOut_edit')" )
+    public R updateById(@RequestBody ContractDelayOut contractDelayOut) {
+        return R.ok(contractDelayOutService.updateById(contractDelayOut));
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎寤舵湡鍑鸿揣
+     * @param ids id鍒楄〃
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鍒犻櫎寤舵湡鍑鸿揣" , description = "閫氳繃id鍒犻櫎寤舵湡鍑鸿揣" )
+    @SysLog("閫氳繃id鍒犻櫎寤舵湡鍑鸿揣" )
+    @DeleteMapping
+    @PreAuthorize("@pms.hasPermission('business_contractDelayOut_del')" )
+    public R removeById(@RequestBody Long[] ids) {
+        return R.ok(contractDelayOutService.removeBatchByIds(CollUtil.toList(ids)));
+    }
+
+
+    /**
+     * 瀵煎嚭excel 琛ㄦ牸
+     * @param contractDelayOut 鏌ヨ鏉′欢
+   	 * @param ids 瀵煎嚭鎸囧畾ID
+     * @return excel 鏂囦欢娴�
+     */
+    @ResponseExcel
+    @GetMapping("/export")
+    @PreAuthorize("@pms.hasPermission('business_contractDelayOut_export')" )
+    public List<ContractDelayOut> export(ContractDelayOut contractDelayOut,Long[] ids) {
+        return contractDelayOutService.list(Wrappers.lambdaQuery(contractDelayOut).in(ArrayUtil.isNotEmpty(ids), ContractDelayOut::getId, ids));
+    }
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractSubjectMatterController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractSubjectMatterController.java
index 29ef60c..3652f12 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractSubjectMatterController.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractSubjectMatterController.java
@@ -126,4 +126,14 @@
 	public R selectSubjectMatterProcess(@PathVariable("id" ) Long id) {
 		return contractSubjectMatterService.selectSubjectMatterProcess(id);
 	}
+
+	/**
+	 * 閫氳繃鍚堝悓id鏌ヨ鏍囩殑鐗╁饱绾﹁繘搴�
+	 * @param contractId id
+	 * @return R
+	 */
+	@GetMapping("/selectSubjectMatter/{contractId}" )
+	public R selectSubjectMatter(@PathVariable("contractId" ) Long contractId) {
+		return contractSubjectMatterService.selectSubjectMatter(contractId);
+	}
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/OutBoundController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/OutBoundController.java
index 16f9a4f..0e2103b 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/OutBoundController.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/OutBoundController.java
@@ -82,6 +82,18 @@
         return outBoundService.add(addDTO);
     }
 
+	/**
+	 * 鏂板鍚堝悓鍑哄簱璁板綍
+	 * @param addDTO 鍚堝悓鍑哄簱璁板綍
+	 * @return R
+	 */
+	@Operation(summary = "鏂板鍚堝悓鍑哄簱璁板綍" , description = "鏂板鍚堝悓鍑哄簱璁板綍" )
+	@SysLog("鏂板鍚堝悓鍑哄簱璁板綍" )
+	@PostMapping("/addContractOut")
+	public R addContractOut(@RequestBody OutBoundAddDTO addDTO) {
+		return outBoundService.addContractOut(addDTO);
+	}
+
     /**
      * 淇敼EPR鍑哄簱璁板綍
      * @param outBound EPR鍑哄簱璁板綍
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/PaymentConfirmController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/PaymentConfirmController.java
index 41db2a9..63c0af2 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/PaymentConfirmController.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/PaymentConfirmController.java
@@ -1,5 +1,6 @@
 package com.by4cloud.platformx.business.controller;
 
+import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.collection.CollUtil;
@@ -7,6 +8,7 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.by4cloud.platformx.business.dto.PaymentConfirmAddDTO;
+import com.by4cloud.platformx.business.dto.PaymentConfirmQueryDTO;
 import com.by4cloud.platformx.common.core.util.R;
 import com.by4cloud.platformx.common.log.annotation.SysLog;
 import com.by4cloud.platformx.business.entity.PaymentConfirm;
@@ -42,17 +44,19 @@
     /**
      * 鍒嗛〉鏌ヨ
      * @param page 鍒嗛〉瀵硅薄
-     * @param paymentConfirm 鏀舵纭
+     * @param queryDTO 鏀舵纭
      * @return
      */
     @Operation(summary = "鍒嗛〉鏌ヨ" , description = "鍒嗛〉鏌ヨ" )
     @GetMapping("/page" )
     @PreAuthorize("@pms.hasPermission('business_paymentConfirm_view')" )
-    public R getPaymentConfirmPage(@ParameterObject Page page, @ParameterObject PaymentConfirm paymentConfirm) {
+    public R getPaymentConfirmPage(@ParameterObject Page page, @ParameterObject PaymentConfirmQueryDTO queryDTO) {
         LambdaQueryWrapper<PaymentConfirm> wrapper = Wrappers.lambdaQuery();
-		wrapper.like(StrUtil.isNotBlank(paymentConfirm.getBusGuestName()),PaymentConfirm::getBusGuestName,paymentConfirm.getBusGuestName());
-		wrapper.like(StrUtil.isNotBlank(paymentConfirm.getContractName()),PaymentConfirm::getContractName,paymentConfirm.getContractName());
-		wrapper.like(StrUtil.isNotBlank(paymentConfirm.getBusinessType()),PaymentConfirm::getBusinessType,paymentConfirm.getBusinessType());
+		wrapper.like(StrUtil.isNotBlank(queryDTO.getBusGuestName()),PaymentConfirm::getBusGuestName,queryDTO.getBusGuestName());
+		wrapper.like(StrUtil.isNotBlank(queryDTO.getContractName()),PaymentConfirm::getContractName,queryDTO.getContractName());
+		wrapper.like(StrUtil.isNotBlank(queryDTO.getBusinessType()),PaymentConfirm::getBusinessType,queryDTO.getBusinessType());
+		wrapper.ge(ObjUtil.isNotNull(queryDTO.getStartTime()),PaymentConfirm::getConfirmTime,queryDTO.getStartTime());
+		wrapper.le(ObjUtil.isNotNull(queryDTO.getEndTime()),PaymentConfirm::getConfirmTime,queryDTO.getEndTime());
 		wrapper.orderByDesc(PaymentConfirm::getCreateTime);
         return R.ok(paymentConfirmService.pageByScope(page, wrapper));
     }
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractDelayOutMapper.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractDelayOutMapper.java
index 1698d9e..55eef09 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractDelayOutMapper.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractDelayOutMapper.java
@@ -1,11 +1,17 @@
 package com.by4cloud.platformx.business.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.by4cloud.platformx.business.dto.ContractDelayOutQueryDTO;
 import com.by4cloud.platformx.business.entity.ContractDelayOut;
+import com.by4cloud.platformx.business.vo.ContractDelayOutPageVo;
+import com.by4cloud.platformx.common.data.datascope.DataScope;
 import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 @Mapper
 public interface ContractDelayOutMapper extends PlatformxBaseMapper<ContractDelayOut> {
 
 
+	Page<ContractDelayOutPageVo> pageNew(Page page, @Param("queryDTO") ContractDelayOutQueryDTO queryDTO, DataScope comp_id);
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractDelayOutService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractDelayOutService.java
index 6d6dce6..b56fd2c 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractDelayOutService.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractDelayOutService.java
@@ -1,7 +1,14 @@
 package com.by4cloud.platformx.business.service;
 
-public interface ContractDelayOutService {
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.by4cloud.platformx.business.dto.ContractDelayOutQueryDTO;
+import com.by4cloud.platformx.business.entity.ContractDelayOut;
+import com.by4cloud.platformx.common.data.mybatis.IIService;
+
+public interface ContractDelayOutService extends IIService<ContractDelayOut> {
 	void approvalPass(Long contractId);
 
 	void refuseApproval(Long contractId);
-}
+
+	Page pageNew(Page page, ContractDelayOutQueryDTO queryDTO);
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractSubjectMatterService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractSubjectMatterService.java
index 09a4c79..5c37dfb 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractSubjectMatterService.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractSubjectMatterService.java
@@ -7,4 +7,6 @@
 public interface ContractSubjectMatterService extends IService<ContractSubjectMatter> {
 
     R selectSubjectMatterProcess(Long id);
+
+    R selectSubjectMatter(Long contractId);
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/OutBoundService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/OutBoundService.java
index b1a795b..79ede4c 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/OutBoundService.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/OutBoundService.java
@@ -8,4 +8,6 @@
 public interface OutBoundService extends IIService<OutBound> {
 
 	R add(OutBoundAddDTO addDTO);
+
+    R addContractOut(OutBoundAddDTO addDTO);
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractDelayOutServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractDelayOutServiceImpl.java
index 167d897..f5e3cce 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractDelayOutServiceImpl.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractDelayOutServiceImpl.java
@@ -1,23 +1,28 @@
 package com.by4cloud.platformx.business.service.impl;
 
-
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.by4cloud.platformx.business.dto.ContractDelayOutQueryDTO;
 import com.by4cloud.platformx.business.entity.Contract;
 import com.by4cloud.platformx.business.entity.ContractDelayOut;
 import com.by4cloud.platformx.business.mapper.ContractDelayOutMapper;
 import com.by4cloud.platformx.business.mapper.ContractMapper;
 import com.by4cloud.platformx.business.service.ContractDelayOutService;
+import com.by4cloud.platformx.common.data.datascope.DataScope;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-
-@Slf4j
+/**
+ * 寤舵湡鍑鸿揣
+ *
+ * @author syt
+ * @date 2026-06-17 08:44:56
+ */
 @Service
 @RequiredArgsConstructor
-public class ContractDelayOutServiceImpl  extends ServiceImpl<ContractDelayOutMapper, ContractDelayOut> implements ContractDelayOutService {
+public class ContractDelayOutServiceImpl extends ServiceImpl<ContractDelayOutMapper, ContractDelayOut> implements ContractDelayOutService {
 
 	private final ContractMapper contractMapper;
 
@@ -51,4 +56,9 @@
 		delayOut.setDelayStatus("2");
 		baseMapper.updateById(delayOut);
 	}
-}
+
+	@Override
+	public Page pageNew(Page page, ContractDelayOutQueryDTO queryDTO) {
+		return baseMapper.pageNew(page,queryDTO, DataScope.of("comp_id"));
+	}
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractSubjectMatterServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractSubjectMatterServiceImpl.java
index 7f133c5..05de0eb 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractSubjectMatterServiceImpl.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractSubjectMatterServiceImpl.java
@@ -1,11 +1,14 @@
 package com.by4cloud.platformx.business.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.by4cloud.platformx.business.entity.ContractSubjectMatter;
 import com.by4cloud.platformx.business.mapper.ContractSubjectMatterMapper;
 import com.by4cloud.platformx.business.service.ContractSubjectMatterService;
 import com.by4cloud.platformx.business.vo.ContractSubjectMatterVo;
 import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.common.data.datascope.DataScope;
 import com.by4cloud.platformx.common.data.mybatis.BaseModel;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.springframework.stereotype.Service;
@@ -29,4 +32,10 @@
 		List<ContractSubjectMatterVo> matterVoList = baseMapper.selectJoinList(ContractSubjectMatterVo.class,wrapper);
 		return R.ok(matterVoList);
 	}
+
+	@Override
+	public R selectSubjectMatter(Long contractId) {
+		return R.ok(baseMapper.selectListByScope(Wrappers.<ContractSubjectMatter>lambdaQuery().eq(ContractSubjectMatter::getContractId,contractId)
+				.orderByAsc(ContractSubjectMatter::getCreateTime), DataScope.of("comp_id")));
+	}
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java
index 8782f83..79dd3bc 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java
@@ -53,7 +53,7 @@
 				.in(ContractSubjectMatter::getMaterialCode, addDTO.getSubjectMatterList().stream().map(item -> item.getSubjectMatterCode()).collect(Collectors.toList()))
 				.exists(Contract.class, contractQuery ->
 						contractQuery.select(ContractSubjectMatter::getId)
-								.eq(Contract::getContractStatus,2)
+								.eq(Contract::getContractStatus, 2)
 								.eq(Contract::getId, ContractSubjectMatter::getContractId)
 								.eq(StrUtil.isNotBlank(addDTO.getBusGuestName()), Contract::getPartyA, addDTO.getBusGuestName())
 								.eq(ObjUtil.isNotNull(addDTO.getBusGuestId()), Contract::getPartyAId, addDTO.getBusGuestId())
@@ -98,7 +98,7 @@
 							BigDecimal currentOut = subjectMatter.getRemainingQuantity();
 							subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity());
 							subjectMatter.setRemainingQuantity(new BigDecimal("0"));
-							subjectMatter.setActualDeliveryDate(DateUtil.today());
+							subjectMatter.setActualDeliveryDate(addDTO.getOutBoundTime());
 							subjectMatter.setDeliveryStatus(2);
 							subjectMatter.setLastDeliveredQuantity(currentOut);
 							contractSubjectMatterMapper.updateById(subjectMatter);
@@ -109,7 +109,7 @@
 							BigDecimal currentOut = remainNum.add(subjectMatter.getRemainingQuantity());
 							subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity().add(remainNum));
 							subjectMatter.setRemainingQuantity(subjectMatter.getRemainingQuantity().subtract(currentOut));
-							subjectMatter.setActualDeliveryDate(DateUtil.today());
+							subjectMatter.setActualDeliveryDate(addDTO.getOutBoundTime());
 							subjectMatter.setDeliveryStatus(1);
 							subjectMatter.setLastDeliveredQuantity(currentOut);
 							contractSubjectMatterMapper.updateById(subjectMatter);
@@ -125,7 +125,7 @@
 						if (remainNum.compareTo(new BigDecimal("0")) > 0) {
 							subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity());
 							subjectMatter.setRemainingQuantity(new BigDecimal("0"));
-							subjectMatter.setActualDeliveryDate(DateUtil.today());
+							subjectMatter.setActualDeliveryDate(addDTO.getOutBoundTime());
 							subjectMatter.setDeliveryStatus(2);
 							subjectMatter.setLastDeliveredQuantity(subjectMatter.getQuantity());
 							contractSubjectMatterMapper.updateById(subjectMatter);
@@ -136,7 +136,7 @@
 							BigDecimal currentOut = remainNum.add(subjectMatter.getQuantity());
 							subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity().add(remainNum));
 							subjectMatter.setRemainingQuantity(remainNum.multiply(new BigDecimal("-1")));
-							subjectMatter.setActualDeliveryDate(DateUtil.today());
+							subjectMatter.setActualDeliveryDate(addDTO.getOutBoundTime());
 							subjectMatter.setDeliveryStatus(1);
 							subjectMatter.setLastDeliveredQuantity(currentOut);
 							contractSubjectMatterMapper.updateById(subjectMatter);
@@ -257,9 +257,9 @@
 									//鏇存柊褰撳墠闃舵瀹為檯鏀舵 鍜� 鏀舵鐘舵��
 									schedule.setActualAmount(inConfirm.getTransationAmount());
 									schedule.setPaymentStatus(2);
-									if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) > 0){
+									if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) > 0) {
 										inConfirm.setAdvanceAmount(inConfirm.getTotalAmount());
-									}else if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) < 0) {
+									} else if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) < 0) {
 										inConfirm.setReceivableAmount(inConfirm.getTotalAmount().multiply(new BigDecimal("-1")));
 										schedule.setActualAmount(paymentConfirm.getTotalAmount().subtract(currentInSum));
 										schedule.setPaymentStatus(1);
@@ -388,8 +388,8 @@
 		contractOutBound.setInvoiceStatus("0");
 		contractOutBound.setInvoiceNum(new BigDecimal("0"));
 		contractOutBoundMapper.insert(contractOutBound);
-		if (StrUtil.isEmpty(contract.getContractCategory())){
-			if (DateUtil.compare(addDTO.getOutBoundTime(),contract.getExpirationDate())>0){
+		if (StrUtil.isEmpty(contract.getContractCategory())) {
+			if (DateUtil.compare(addDTO.getOutBoundTime(), contract.getExpirationDate()) > 0) {
 				saveOverdueOutBound(contract, addDTO, subjectMatter);
 			}
 		}
@@ -406,7 +406,265 @@
 		overdue.setMaterialCode(subjectMatter.getMaterialCode());
 		overdue.setOverdueNum(subjectMatter.getLastDeliveredQuantity());
 		overdue.setTotalAmount(subjectMatter.getUnitPrice().multiply(subjectMatter.getLastDeliveredQuantity()));
-		overdue.setOverdueDuration(new BigDecimal(DateUtil.betweenDay(addDTO.getOutBoundTime(),contract.getExpirationDate(),true)));
+		overdue.setOverdueDuration(new BigDecimal(DateUtil.betweenDay(addDTO.getOutBoundTime(), contract.getExpirationDate(), true)));
 		deliveryOverdueMapper.insert(overdue);
 	}
+
+	@Override
+	public R addContractOut(OutBoundAddDTO addDTO) {
+		if (ArrayUtil.isEmpty(addDTO.getSubjectMatterList().toArray())) {
+			return R.failed("鍑哄簱鏍囩殑鐗╀笉鑳戒负绌�");
+		}
+		Contract contract = contractMapper.selectOne(Wrappers.<Contract>lambdaQuery().eq(Contract::getContractNo, addDTO.getContractNo()).eq(Contract::getContractStatus, 2)
+				.last("limit 1"));
+		if (ObjUtil.isNull(contract)) {
+			return R.failed("鍚堝悓淇℃伅鏌ヨ澶辫触");
+		}
+		//鍑哄簱鎵规
+		String batchNumber = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN);
+
+		addDTO.getSubjectMatterList().stream().forEach(outSubjectMatterAddDTO -> {
+			ContractSubjectMatter subjectMatter = contractSubjectMatterMapper.selectById(outSubjectMatterAddDTO.getId());
+			subjectMatter.setLastDeliveredQuantity(outSubjectMatterAddDTO.getOutBoundNum());
+			if (subjectMatter.getDeliveryStatus() == 0) {
+				subjectMatter.setDeliveredQuantity(outSubjectMatterAddDTO.getOutBoundNum());
+				subjectMatter.setRemainingQuantity(subjectMatter.getQuantity().subtract(outSubjectMatterAddDTO.getOutBoundNum()));
+			}
+			if (subjectMatter.getDeliveryStatus() == 1) {
+				subjectMatter.setDeliveredQuantity(subjectMatter.getDeliveredQuantity().add(outSubjectMatterAddDTO.getOutBoundNum()));
+				subjectMatter.setRemainingQuantity(subjectMatter.getRemainingQuantity().subtract(outSubjectMatterAddDTO.getOutBoundNum()));
+			}
+			subjectMatter.setDeliveryStatus(1);
+			if (subjectMatter.getRemainingQuantity().compareTo(new BigDecimal("0")) == 0) {
+				subjectMatter.setDeliveryStatus(2);
+			}
+			subjectMatter.setActualDeliveryDate(addDTO.getOutBoundTime());
+			contractSubjectMatterMapper.updateById(subjectMatter);
+			//
+			OutBound outBound = new OutBound();
+			outBound.setBatchNumber(batchNumber);
+			outBound.setOutBoundNum(outSubjectMatterAddDTO.getOutBoundNum());
+			outBound.setOutBoundAttNames(addDTO.getOutBoundAttNames());
+			outBound.setOutBoundAttPaths(addDTO.getOutBoundAttPaths());
+			outBound.setBusGuestName(contract.getPartyA());
+			outBound.setBusGuestId(contract.getPartyAId());
+			outBound.setOutBoundTime(addDTO.getOutBoundTime());
+			outBound.setSubjectMatterCode(outSubjectMatterAddDTO.getSubjectMatterCode());
+			outBound.setSubjectMatterName(outSubjectMatterAddDTO.getSubjectMatterName());
+			baseMapper.insert(outBound);
+			//
+			saveContractOutBound(contract, addDTO, subjectMatter, outBound.getId());
+		});
+		//褰撳墠鍑哄簱鍚堝悓鍑哄簱鏍囩殑鐗�
+		List<ContractSubjectMatter> contractSubjectMatterList = contractSubjectMatterMapper.selectList(Wrappers.<ContractSubjectMatter>lambdaQuery()
+				.eq(ContractSubjectMatter::getContractId, contract.getId()).ne(ContractSubjectMatter::getDeliveryStatus, 0));
+		//鏌ヨ鍚堝悓鏄惁鏈夊嚭搴撻樁娈�
+		ContractPaymentSchedule schedule = scheduleMapper.selectOne(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, contract.getId())
+				.eq(ContractPaymentSchedule::getStageName, "鍙戣揣鍓�"));
+		//瀛樺湪鍑哄簱闃舵
+		if (ObjUtil.isNotNull(schedule)) {
+			//褰撳墠鍑哄簱閲戦
+			BigDecimal outPirce = contractSubjectMatterList.stream()
+					.map(item -> (item.getDeliveryStatus() == 1 ? item.getDeliveredQuantity().multiply(item.getUnitPrice()) : item.getQuantity().multiply(item.getUnitPrice())))
+					.reduce(BigDecimal.ZERO, BigDecimal::add);
+			//鍑哄簱鏄惁瀹屾垚
+			if (outPirce.compareTo(contract.getAmount()) < 0) {
+				contract.setBillingStatus("1");
+				contractMapper.updateById(contract);
+			}
+			if (outPirce.compareTo(contract.getAmount()) == 0) {
+				contract.setBillingStatus("2");
+				contractMapper.updateById(contract);
+			}
+			//璁$畻鍙戣揣鍓嶅簲鏀舵洿鏂拌祫閲戞槑缁�
+			PaymentConfirm paymentConfirm = new PaymentConfirm();
+			paymentConfirm.setBusinessType("鍙戣揣鍓嶅簲鏀�");
+			paymentConfirm.setBusGuestId(contract.getPartyAId());
+			paymentConfirm.setBusGuestName(contract.getPartyA());
+			paymentConfirm.setContractId(contract.getId());
+			paymentConfirm.setContractName(contract.getContractName());
+			paymentConfirm.setContractNo(contract.getContractNo());
+			paymentConfirm.setScheduleId(schedule.getId());
+			paymentConfirm.setScheduleName(schedule.getStageName());
+			paymentConfirm.setConfirmTime(addDTO.getOutBoundTime());
+			//鎸夊嚭搴撹祫閲戞瘮渚� 璁$畻鍙戣揣鍓嶅簲鏀�
+			paymentConfirm.setTransationAmount(outPirce.divide(contract.getAmount(), 10, RoundingMode.HALF_UP).multiply(schedule.getPlannedAmount()));
+			paymentConfirm.setReceivableAmount(paymentConfirm.getTransationAmount());
+
+			//鏈�杩戝簲鏀�
+			PaymentConfirm lastConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, contract.getId())
+					.orderByDesc(PaymentConfirm::getCreateTime).last("limit 1"));
+
+			if (ObjUtil.isNotNull(lastConfirm)) {
+				//宸插瓨鍦ㄥ彂璐у簲鏀�
+				if (StrUtil.equals(lastConfirm.getBusinessType(), paymentConfirm.getBusinessType())) {
+
+					//鏌ヨ涔嬪墠鎵�鏈夊彂璐у墠搴旀敹
+					List<PaymentConfirm> fhConfirmList = paymentConfirmMapper.selectList(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, contract.getId())
+							.eq(PaymentConfirm::getScheduleId, schedule.getId()).orderByDesc(PaymentConfirm::getCreateTime));
+					BigDecimal fhTotalAmount = fhConfirmList.stream().map(item -> item.getTransationAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);
+					//鏈鍙戣揣鍓嶅簲鏀� 鍑哄簱鎬婚 - 鎵�鏈夊彂璐у墠搴旀敹
+					paymentConfirm.setTransationAmount(paymentConfirm.getTransationAmount().subtract(fhTotalAmount));
+					paymentConfirm.setReceivableAmount(paymentConfirm.getTransationAmount());
+					paymentConfirm.setTotalAmount(lastConfirm.getTotalAmount().subtract(paymentConfirm.getTransationAmount()));
+					if (schedule.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) {
+						paymentConfirmMapper.insert(paymentConfirm);
+					}
+				} else {
+					//涓嶅瓨鍦ㄥ彂璐у簲鏀� 鍑哄簱鎬婚
+					paymentConfirm.setTotalAmount(lastConfirm.getTotalAmount().subtract(paymentConfirm.getTransationAmount()));
+					if (schedule.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) {
+						paymentConfirmMapper.insert(paymentConfirm);
+					}
+				}
+			} else {
+				//鏃犱箣鍓嶉樁娈靛簲鏀�
+				paymentConfirm.setTotalAmount(paymentConfirm.getTransationAmount().multiply(new BigDecimal("-1")));
+				if (schedule.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) {
+					paymentConfirmMapper.insert(paymentConfirm);
+					//瀹㈡埛浠樻瀹屾垚鍚堝悓
+					List<Contract> customerCompleteContractList = contractMapper.selectList(Wrappers.<Contract>lambdaQuery().eq(Contract::getPartyAId, contract.getPartyAId())
+							.eq(Contract::getPartyBId, SecurityUtils.getUser().getCompId()).apply(" amount = paid_amount"));
+					if (ArrayUtil.isNotEmpty(customerCompleteContractList)) {
+						List<BigDecimal> outAmountList = new ArrayList<>();
+						for (Contract completeContract : customerCompleteContractList
+						) {
+							PaymentConfirm contractLastConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, completeContract.getId())
+									.orderByDesc(PaymentConfirm::getCreateTime).last("limit 1"));
+							//鏌ヨ瀹㈡埛浠樻瀹屾垚鍚堝悓涓渶鍚庢槑缁嗛噾棰� 鏈夐鏀惰浆鍏ュ綋鍓嶅悎鍚�
+							if (contractLastConfirm.getTotalAmount().compareTo(new BigDecimal("0")) > 0) {
+								//鏂板瀹屾垚浠樻鍚堝悓 璧勯噾杞嚭
+								PaymentConfirm outConfirm = BeanUtil.copyProperties(contractLastConfirm, PaymentConfirm.class, "id", "transationAmount",
+										"advanceAmount", "receivableAmount", "overdueAmount", "totalAmount");
+								outConfirm.setBusinessType("璧勯噾杞嚭");
+								outConfirm.setConfirmTime(new Date());
+								outConfirm.setTransationAmount(contractLastConfirm.getTotalAmount());
+								outConfirm.setTotalAmount(new BigDecimal("0"));
+								paymentConfirmMapper.insert(outConfirm);
+								outAmountList.add(outConfirm.getTransationAmount());
+							}
+						}
+						if (ArrayUtil.isNotEmpty(outAmountList.toArray())) {
+							BigDecimal currentInSum = outAmountList.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+							//鏂板褰撳墠鍚堝悓 璧勯噾杞叆
+							PaymentConfirm inConfirm = BeanUtil.copyProperties(paymentConfirm, PaymentConfirm.class, "id", "transationAmount",
+									"advanceAmount", "receivableAmount", "overdueAmount", "totalAmount");
+							inConfirm.setBusinessType("璧勯噾杞叆");
+							inConfirm.setConfirmTime(new Date());
+							inConfirm.setTransationAmount(currentInSum);
+							inConfirm.setTotalAmount(paymentConfirm.getTotalAmount().add(currentInSum));
+							//鏇存柊褰撳墠闃舵瀹為檯鏀舵 鍜� 鏀舵鐘舵��
+							schedule.setActualAmount(inConfirm.getTransationAmount());
+							schedule.setPaymentStatus(2);
+							if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) > 0) {
+								inConfirm.setAdvanceAmount(inConfirm.getTotalAmount());
+							} else if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) < 0) {
+								inConfirm.setReceivableAmount(inConfirm.getTotalAmount().multiply(new BigDecimal("-1")));
+								schedule.setActualAmount(paymentConfirm.getTotalAmount().subtract(currentInSum));
+								schedule.setPaymentStatus(1);
+							}
+							paymentConfirmMapper.insert(inConfirm);
+							//鏇存柊褰撳墠闃舵瀹為檯鏀舵 鍜� 鏀舵鐘舵��
+							scheduleMapper.updateById(schedule);
+						}
+					}
+				}
+			}
+
+			//鏇存柊鍙戣揣鍓嶆敹娆剧敓鏁堟椂闂�
+			if (ObjUtil.isNull(schedule.getEffectiveDate())) {
+				schedule.setEffectiveEndDate(DateUtil.offsetDay(addDTO.getOutBoundTime(), schedule.getAgreedDays()));
+				//鏌ヨ鏄惁鏈夊悗缁樁娈�
+//						List<ContractPaymentSchedule> afterSchedule = scheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, contractId)
+//								.gt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder()));
+//						if (ArrayUtil.isEmpty(afterSchedule.toArray())) {
+//							schedule.setEffectiveEndDate(contract.getExpirationDate());
+//						}
+				scheduleMapper.updateById(schedule);
+				//鏌ヨ鏄惁鏈変箣鍓嶉樁娈�
+//						ContractPaymentSchedule beforeSchedule = scheduleMapper.selectOne(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, schedule.getContractId())
+//								.lt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder()).orderByDesc(ContractPaymentSchedule::getCreateTime).last("limit 1"));
+//						if (ObjUtil.isNotNull(beforeSchedule)) {
+//							beforeSchedule.setEffectiveEndDate(schedule.getEffectiveDate());
+//							scheduleMapper.updateById(beforeSchedule);
+//						}
+				//鏇存柊灞ョ害
+				ContractPaymentScheduleProcess contractPaymentScheduleProcess = new ContractPaymentScheduleProcess();
+				contractPaymentScheduleProcess.setContractId(schedule.getContractId());
+				contractPaymentScheduleProcess.setContractName(schedule.getContractName());
+				contractPaymentScheduleProcess.setScheduleId(schedule.getId());
+				contractPaymentScheduleProcess.setScheduleName(schedule.getStageName());
+				contractPaymentScheduleProcess.setProcessDate(addDTO.getOutBoundTime());
+				ContractPaymentScheduleProcess lastProcess = scheduleProcessMapper.selectOne(Wrappers.<ContractPaymentScheduleProcess>lambdaQuery().eq(ContractPaymentScheduleProcess::getContractId, schedule.getContractId())
+						.eq(ContractPaymentScheduleProcess::getScheduleId, schedule.getId()).last("limit 1"));
+				if (ObjUtil.isNull(lastProcess)) {
+					scheduleProcessMapper.insert(contractPaymentScheduleProcess);
+				}
+			}
+
+			//鏌ヨ鏄惁鏈夊悗缁樁娈�
+			List<ContractPaymentSchedule> afterSchedule = scheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery()
+					.eq(ContractPaymentSchedule::getContractId, schedule.getContractId())
+					.gt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder())
+					.orderByAsc(ContractPaymentSchedule::getCreateTime));
+			if (ArrayUtil.isNotEmpty(afterSchedule.toArray()) && afterSchedule.size() == 1) {
+				//鏈�鍚庨樁娈电敓鏁堟椂闂�
+				ContractPaymentSchedule endSchedule = afterSchedule.get(0);
+				if (StrUtil.equals(endSchedule.getStageName(), "璐ㄤ繚閲�")) {
+//							endSchedule.setEffectiveEndDate(DateUtil.offsetDay(addDTO.getOutBoundTime(), endSchedule.getAgreedDays()));
+//							scheduleMapper.updateById(endSchedule);
+					//褰撳墠闃舵鐢熸晥鏃堕棿
+//							schedule.setEffectiveEndDate(DateUtil.offsetDay(addDTO.getOutBoundTime(), schedule.getAgreedDays()));
+//							scheduleMapper.updateById(schedule);
+					//鏈�鍚庨樁娈靛簲鏀�
+					PaymentConfirm newConfim = new PaymentConfirm();
+					newConfim.setBusinessType(endSchedule.getStageName() + "搴旀敹");
+					newConfim.setBusGuestId(contract.getPartyAId());
+					newConfim.setBusGuestName(contract.getPartyA());
+					newConfim.setContractId(contract.getId());
+					newConfim.setContractName(contract.getContractName());
+					newConfim.setContractNo(contract.getContractNo());
+					newConfim.setScheduleId(endSchedule.getId());
+					newConfim.setScheduleName(schedule.getStageName());
+					newConfim.setConfirmTime(addDTO.getOutBoundTime());
+					newConfim.setTransationAmount(endSchedule.getPlannedAmount());
+					newConfim.setReceivableAmount(endSchedule.getPlannedAmount());
+					PaymentConfirm lastNewConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, contract.getId())
+							.orderByDesc(PaymentConfirm::getCreateTime).last("limit 1"));
+					BigDecimal lastNewTotal = new BigDecimal("0");
+					if (ObjUtil.isNotNull(lastNewConfirm)) {
+						lastNewTotal = lastNewConfirm.getTotalAmount();
+					}
+					newConfim.setTotalAmount(lastNewTotal.subtract(newConfim.getReceivableAmount()));
+					if (endSchedule.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) {
+						paymentConfirmMapper.insert(newConfim);
+					}
+				}
+				//鏇存柊鍚堝悓涓嬩釜闃舵
+				contract.setNextScheduleName(endSchedule.getStageName());
+				contractMapper.updateById(contract);
+			}
+			if (ArrayUtil.isNotEmpty(afterSchedule.toArray()) && afterSchedule.size() > 1) {
+				//鏇存柊鍚堝悓涓嬩釜闃舵
+				contract.setNextScheduleName(afterSchedule.get(0).getStageName());
+				contractMapper.updateById(contract);
+			}
+			if (ArrayUtil.isEmpty(afterSchedule.toArray())) {
+//						schedule.setEffectiveEndDate(contract.getExpirationDate());
+//						scheduleMapper.updateById(schedule);
+				//鏇存柊鍚堝悓涓嬩釜闃舵
+				contract.setNextScheduleName("鏃�");
+				contractMapper.updateById(contract);
+				//褰撳墠涓哄悎鍚屾渶鍚庨樁娈�
+				PaymentConfirm lastNewConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, contract.getId())
+						.orderByDesc(PaymentConfirm::getCreateTime).last("limit 1"));
+				if (lastNewConfirm.getTotalAmount().compareTo(new BigDecimal("0")) >= 0) {
+					//鏈夐浠樹笖瓒呰繃搴旀敹 鍏抽棴鍚堝悓鐘舵��
+					contract.setContractStatus(3);
+					contractMapper.updateById(contract);
+				}
+			}
+		}
+		return R.ok();
+	}
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/resources/mapper/ContractDelayOutMapper.xml b/platformx-business-finance-biz/src/main/resources/mapper/ContractDelayOutMapper.xml
index 552f4e1..3edf7d6 100644
--- a/platformx-business-finance-biz/src/main/resources/mapper/ContractDelayOutMapper.xml
+++ b/platformx-business-finance-biz/src/main/resources/mapper/ContractDelayOutMapper.xml
@@ -20,4 +20,41 @@
 		<result property="updateTime" column="update_time"/>
 		<result property="delFlag" column="del_flag"/>
 	</resultMap>
+    <select id="pageNew" resultType="com.by4cloud.platformx.business.vo.ContractDelayOutPageVo">
+		SELECT
+		t.id,
+		t.contract_id,
+		t1.contract_name,
+		t.delay_day,
+		t.delay_att_names,
+		t.delay_att_paths,
+		t.apply_name,
+		t.apply_time,
+		t.delay_status,
+		t.create_by,
+		t.update_by,
+		t.create_time,
+		t.update_time,
+		t.del_flag,
+		t.comp_id,
+		t1.party_a,
+		t1.party_b
+		FROM
+		contract_delay_out t
+		LEFT JOIN contract t1 ON ( t1.id = t.contract_id AND t1.del_flag = '0' )
+		LEFT JOIN business_customer t2 ON ( t2.id = t1.party_a_id AND t2.del_flag = '0' )
+		WHERE
+		t.del_flag = '0'
+		<if test="queryDTO.partyA !=null and queryDTO.partyA !=''">
+			and t1.party_a LIKE CONCAT('%', #{queryDTO.partyA}, '%')
+		</if>
+		<if test="queryDTO.partyB !=null and queryDTO.partyB !=''">
+			and t1.party_b LIKE CONCAT('%', #{queryDTO.partyB}, '%')
+		</if>
+		<if test="queryDTO.contractName !=null and queryDTO.contractName !=''">
+			and t1.contract_name LIKE CONCAT('%', #{queryDTO.contractName}, '%')
+		</if>
+		ORDER BY
+		t.create_time DESC
+	</select>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.1