From e7e6d39b095b6a763e54ab34631171c3de32ec9e Mon Sep 17 00:00:00 2001
From: 李白 <7387820+wjli_13439841639@user.noreply.gitee.com>
Date: 星期五, 15 五月 2026 08:33:50 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/OutBoundAddDTO.java                                     |    6 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractOutBoundMapper.java                          |   11 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Contract.java                                        |    4 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractOutBoundController.java                  |  124 +++++++
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractPaymentScheduleProcessServiceImpl.java |   70 ++-
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/OutSubjectMatterAddDTO.java                             |    6 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/TaxCodeQueryDTO.java                                    |   12 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractOutBoundService.java                        |    8 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/TaxCode.java                                         |  134 ++++++++
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/TaxCodeController.java                           |  121 +++++++
 platformx-business-finance-biz/src/main/resources/mapper/TaxCodeMapper.xml                                                               |   30 +
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java                       |   83 ++--
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/TaxCodeService.java                                 |   11 
 platformx-business-finance-biz/src/main/resources/mapper/ContractOutBoundMapper.xml                                                      |   25 +
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/TaxCodeMapper.java                                   |   11 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java                       |  105 ++++--
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractOutBound.java                                |   64 ++++
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractOutBoundServiceImpl.java               |   16 +
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/TaxCodeServiceImpl.java                        |  106 ++++++
 19 files changed, 838 insertions(+), 109 deletions(-)

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 5dd6f5d..e504be2 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
@@ -21,6 +21,12 @@
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 	private Date outBoundTime;
 
+	@Schema(description = "鍗曟嵁鍚嶇О")
+	private String outBoundAttNames;
+
+	@Schema(description = "鍗曟嵁璺緞")
+	private String outBoundAttPaths;
+
 	@Schema(description = "鍑哄簱鏍囩殑鐗�")
 	private List<OutSubjectMatterAddDTO> subjectMatterList;
 
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 baeb967..b50a298 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
@@ -17,10 +17,4 @@
 	@Schema(description = "鍑哄簱鏁伴噺")
 	private BigDecimal outBoundNum;
 
-	@Schema(description = "鍗曟嵁鍚嶇О")
-	private String outBoundAttNames;
-
-	@Schema(description = "鍗曟嵁璺緞")
-	private String outBoundAttPaths;
-
 }
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/TaxCodeQueryDTO.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/TaxCodeQueryDTO.java
new file mode 100644
index 0000000..bd5b44a
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/TaxCodeQueryDTO.java
@@ -0,0 +1,12 @@
+package com.by4cloud.platformx.business.dto;
+
+import lombok.Data;
+
+@Data
+public class TaxCodeQueryDTO {
+
+	private String mc;
+
+	private Integer childNum;
+
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Contract.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Contract.java
index 761d6ac..dbd114c 100644
--- a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Contract.java
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Contract.java
@@ -139,6 +139,10 @@
 	@Column(columnDefinition = "decimal(10,2) comment '宸插紑绁ㄩ噾棰�'")
 	private BigDecimal billingAmout;
 
+	@Schema(description = "涓嬩竴闃舵")
+	@Column(columnDefinition = "VARCHAR(128) comment '涓嬩竴闃舵'")
+	private String nextScheduleName;
+
     /**
      * 涓存椂瀛楁 - 鐢ㄤ簬鎺ユ敹瀹℃壒浜哄悕绉扮瓑鍏宠仈鏌ヨ缁撴灉
      */
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractOutBound.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractOutBound.java
new file mode 100644
index 0000000..d4d3c81
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractOutBound.java
@@ -0,0 +1,64 @@
+package com.by4cloud.platformx.business.entity;
+
+import com.by4cloud.platformx.common.data.mybatis.BaseModel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import lombok.Data;
+import org.hibernate.annotations.Table;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 2026骞�4鏈�29鏃� 10:46:07
+ * syt
+ */
+@Data
+@Entity//鍔犱簡鎵嶈兘鑷姩鐢熸垚琛�
+@Table(appliesTo="contract_out_bound",comment = "鍚堝悓鍑哄簱鍘嗗彶")//缁欒〃鍔犳敞閲�
+@jakarta.persistence.Table(name = "contract_out_bound")//鏁版嵁搴撳垱寤虹殑琛ㄦ槑
+public class ContractOutBound extends BaseModel<ContractOutBound> {
+
+	@Schema(description = "鍏宠仈鍚堝悓ID")
+	@Column(columnDefinition = "bigint not null comment '鍏宠仈鍚堝悓ID'")
+	private Long contractId;
+
+	@Schema(description = "鍚堝悓鍚嶇О")
+	@Column(columnDefinition = "VARCHAR(64) comment '鍚堝悓鍚嶇О'")
+	private String contractName;
+
+    @Schema(description = "瀹㈠晢鍚嶇О")
+    @Column(columnDefinition="VARCHAR(64) comment '瀹㈠晢鍚嶇О'")
+    private String busGuestName;
+
+    @Schema(description = "瀹㈠晢ID")
+    @Column(columnDefinition="bigint comment '瀹㈠晢ID'")
+    private Long busGuestId;
+
+	@Schema(description = "鏍囩殑鐗╁悕绉�")
+	@Column(columnDefinition="VARCHAR(64) comment '鏍囩殑鐗╁悕绉�'")
+	private String subjectMatterName;
+
+	@Schema(description = "鏍囩殑鐗╃紪鐮�")
+	@Column(columnDefinition="VARCHAR(64) comment '鏍囩殑鐗╃紪鐮�'")
+	private String subjectMatterCode;
+
+	@Schema(description = "鍑哄簱鏁伴噺")
+	@Column(columnDefinition="decimal(10,0) comment '鍑哄簱鏁伴噺'")
+	private BigDecimal outBoundNum;
+
+	@Schema(description = "鍑哄簱鏃堕棿")
+	@Column(columnDefinition="datetime comment '鍑哄簱鏃堕棿'")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date outBoundTime;
+
+	@Schema(description = "鍗曟嵁鍚嶇О")
+	@Column(columnDefinition="text comment '鍗曟嵁鍚嶇О'")
+	private String outBoundAttNames;
+
+	@Schema(description = "鍗曟嵁璺緞")
+	@Column(columnDefinition="text comment '鍗曟嵁璺緞'")
+	private String outBoundAttPaths;
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/TaxCode.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/TaxCode.java
new file mode 100644
index 0000000..f19f94c
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/TaxCode.java
@@ -0,0 +1,134 @@
+package com.by4cloud.platformx.business.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.by4cloud.platformx.common.data.mybatis.BaseModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Transient;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.Table;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 绋庡姟缂栫爜
+ *
+ * @author syt
+ * @date 2026-05-13 16:35:23
+ */
+@Data
+@Entity//鍔犱簡鎵嶈兘鑷姩鐢熸垚琛�
+@Table(appliesTo="tax_code",comment = "绋庢敹缂栫爜")//缁欒〃鍔犳敞閲�
+@jakarta.persistence.Table(name = "tax_code")//鏁版嵁搴撳垱寤虹殑琛ㄦ槑
+public class TaxCode extends BaseModel<TaxCode> {
+
+	/**
+	* 缂栫爜
+	*/
+    @Schema(description="缂栫爜")
+    private String bm;
+
+	/**
+	* 鍏抽敭瀛�
+	*/
+    @Schema(description="鍏抽敭瀛�")
+	@Column(columnDefinition = "text comment '璇存槑'")
+    private String gjz;
+
+	/**
+	* 鍥芥皯缁熻浠g爜
+	*/
+    @Schema(description="鍥芥皯缁熻浠g爜")
+    private String gmtjdm;
+
+	/**
+	* 鍚嶇О
+	*/
+    @Schema(description="鍚嶇О")
+    private String mc;
+
+	/**
+	* 涓婄骇缂栫爜
+	*/
+    @Schema(description="涓婄骇缂栫爜")
+    private String parentBm;
+
+	/**
+	* 鐪佷唤
+	*/
+    @Schema(description="鐪佷唤")
+    private String prov;
+
+	/**
+	* 绋庣巼
+	*/
+    @Schema(description="绋庣巼")
+    private String sl;
+
+	/**
+	* 璇存槑
+	*/
+    @Schema(description="璇存槑")
+	@Column(columnDefinition = "text comment '璇存槑'")
+    private String sm;
+
+	/**
+	* 鍟嗗搧璐х墿绠�绉�
+	*/
+    @Schema(description="鍟嗗搧璐х墿绠�绉�")
+    private String sphwjc;
+
+	/**
+	* 娑堣垂绋庣鐞�
+	*/
+    @Schema(description="娑堣垂绋庣鐞�")
+    private String xfsgl;
+
+	/**
+	* 娑堣垂绋庣壒娈婄鐞嗕唬鐮�
+	*/
+    @Schema(description="娑堣垂绋庣壒娈婄鐞嗕唬鐮�")
+    private String xfstsgldm;
+
+	/**
+	* 娑堣垂绋庢斂绛栦緷鎹�
+	*/
+    @Schema(description="娑堣垂绋庢斂绛栦緷鎹�")
+    private String xfszcyj;
+
+	/**
+	* 澧炲�肩◣鐗规畩绠$悊
+	*/
+    @Schema(description="澧炲�肩◣鐗规畩绠$悊")
+    private String zzstsgl;
+
+	/**
+	* 澧炲�肩◣鐗规畩绠$悊浠g爜
+	*/
+    @Schema(description="澧炲�肩◣鐗规畩绠$悊浠g爜")
+    private String zzstsgldm;
+
+	/**
+	* 澧炲�肩◣鐗规畩渚濇嵁
+	*/
+    @Schema(description="澧炲�肩◣鐗规畩渚濇嵁")
+    private String zzstsyj;
+
+	/**
+	 * 瀛愮◣鐩�
+	 */
+	@Transient
+	@TableField(exist = false)
+	private List<TaxCode> children;
+
+	/**
+	 *鏈夋棤瀛愮◣鐩�
+	 */
+	@Transient
+	@TableField(exist = false)
+	private Integer childNum;
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractOutBoundController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractOutBoundController.java
new file mode 100644
index 0000000..11a0b4f
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractOutBoundController.java
@@ -0,0 +1,124 @@
+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.common.core.util.R;
+import com.by4cloud.platformx.common.log.annotation.SysLog;
+import com.by4cloud.platformx.business.entity.ContractOutBound;
+import com.by4cloud.platformx.business.service.ContractOutBoundService;
+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-05-14 09:21:54
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/contractOutBound" )
+@Tag(description = "contractOutBound" , name = "鍚堝悓鍑哄簱绠$悊" )
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class ContractOutBoundController {
+
+    private final  ContractOutBoundService contractOutBoundService;
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page 鍒嗛〉瀵硅薄
+     * @param contractOutBound 鍚堝悓鍑哄簱
+     * @return
+     */
+    @Operation(summary = "鍒嗛〉鏌ヨ" , description = "鍒嗛〉鏌ヨ" )
+    @GetMapping("/page" )
+    @PreAuthorize("@pms.hasPermission('business_contractOutBound_view')" )
+    public R getContractOutBoundPage(@ParameterObject Page page, @ParameterObject ContractOutBound contractOutBound) {
+        LambdaQueryWrapper<ContractOutBound> wrapper = Wrappers.lambdaQuery();
+		wrapper.like(StrUtil.isNotBlank(contractOutBound.getBusGuestName()),ContractOutBound::getBusGuestName,contractOutBound.getBusGuestName());
+		wrapper.like(StrUtil.isNotBlank(contractOutBound.getContractName()),ContractOutBound::getContractName,contractOutBound.getContractName());
+		wrapper.like(StrUtil.isNotBlank(contractOutBound.getSubjectMatterName()),ContractOutBound::getSubjectMatterName,contractOutBound.getSubjectMatterName());
+        wrapper.orderByDesc(ContractOutBound::getCreateTime);
+		return R.ok(contractOutBoundService.pageByScope(page, wrapper));
+    }
+
+
+    /**
+     * 閫氳繃id鏌ヨ鍚堝悓鍑哄簱
+     * @param id id
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鏌ヨ" , description = "閫氳繃id鏌ヨ" )
+    @GetMapping("/{id}" )
+    @PreAuthorize("@pms.hasPermission('business_contractOutBound_view')" )
+    public R getById(@PathVariable("id" ) Long id) {
+        return R.ok(contractOutBoundService.getById(id));
+    }
+
+    /**
+     * 鏂板鍚堝悓鍑哄簱
+     * @param contractOutBound 鍚堝悓鍑哄簱
+     * @return R
+     */
+    @Operation(summary = "鏂板鍚堝悓鍑哄簱" , description = "鏂板鍚堝悓鍑哄簱" )
+    @SysLog("鏂板鍚堝悓鍑哄簱" )
+    @PostMapping
+    @PreAuthorize("@pms.hasPermission('business_contractOutBound_add')" )
+    public R save(@RequestBody ContractOutBound contractOutBound) {
+        return R.ok(contractOutBoundService.save(contractOutBound));
+    }
+
+    /**
+     * 淇敼鍚堝悓鍑哄簱
+     * @param contractOutBound 鍚堝悓鍑哄簱
+     * @return R
+     */
+    @Operation(summary = "淇敼鍚堝悓鍑哄簱" , description = "淇敼鍚堝悓鍑哄簱" )
+    @SysLog("淇敼鍚堝悓鍑哄簱" )
+    @PutMapping
+    @PreAuthorize("@pms.hasPermission('business_contractOutBound_edit')" )
+    public R updateById(@RequestBody ContractOutBound contractOutBound) {
+        return R.ok(contractOutBoundService.updateById(contractOutBound));
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎鍚堝悓鍑哄簱
+     * @param ids id鍒楄〃
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鍒犻櫎鍚堝悓鍑哄簱" , description = "閫氳繃id鍒犻櫎鍚堝悓鍑哄簱" )
+    @SysLog("閫氳繃id鍒犻櫎鍚堝悓鍑哄簱" )
+    @DeleteMapping
+    @PreAuthorize("@pms.hasPermission('business_contractOutBound_del')" )
+    public R removeById(@RequestBody Long[] ids) {
+        return R.ok(contractOutBoundService.removeBatchByIds(CollUtil.toList(ids)));
+    }
+
+
+    /**
+     * 瀵煎嚭excel 琛ㄦ牸
+     * @param contractOutBound 鏌ヨ鏉′欢
+   	 * @param ids 瀵煎嚭鎸囧畾ID
+     * @return excel 鏂囦欢娴�
+     */
+    @ResponseExcel
+    @GetMapping("/export")
+    @PreAuthorize("@pms.hasPermission('business_contractOutBound_export')" )
+    public List<ContractOutBound> export(ContractOutBound contractOutBound,Long[] ids) {
+        return contractOutBoundService.list(Wrappers.lambdaQuery(contractOutBound).in(ArrayUtil.isNotEmpty(ids), ContractOutBound::getId, ids));
+    }
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/TaxCodeController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/TaxCodeController.java
new file mode 100644
index 0000000..a7b8442
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/TaxCodeController.java
@@ -0,0 +1,121 @@
+package com.by4cloud.platformx.business.controller;
+
+import cn.hutool.core.util.PageUtil;
+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.TaxCodeQueryDTO;
+import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.common.log.annotation.SysLog;
+import com.by4cloud.platformx.business.entity.TaxCode;
+import com.by4cloud.platformx.business.service.TaxCodeService;
+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-05-13 16:35:23
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/taxCode" )
+@Tag(description = "taxCode" , name = "绋庡姟缂栫爜绠$悊" )
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class TaxCodeController {
+
+    private final  TaxCodeService taxCodeService;
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page 鍒嗛〉瀵硅薄
+     * @param queryDTO 绋庡姟缂栫爜
+     * @return
+     */
+    @Operation(summary = "鍒嗛〉鏌ヨ" , description = "鍒嗛〉鏌ヨ" )
+    @GetMapping("/page" )
+    @PreAuthorize("@pms.hasPermission('business_taxCode_view')" )
+    public R getTaxCodePage(@ParameterObject Page page, @ParameterObject TaxCodeQueryDTO queryDTO) {
+        return R.ok(taxCodeService.pageNew(page, queryDTO));
+    }
+
+
+    /**
+     * 閫氳繃id鏌ヨ绋庡姟缂栫爜
+     * @param id id
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鏌ヨ" , description = "閫氳繃id鏌ヨ" )
+    @GetMapping("/{id}" )
+    @PreAuthorize("@pms.hasPermission('business_taxCode_view')" )
+    public R getById(@PathVariable("id" ) Integer id) {
+        return R.ok(taxCodeService.getById(id));
+    }
+
+    /**
+     * 鏂板绋庡姟缂栫爜
+     * @param taxCode 绋庡姟缂栫爜
+     * @return R
+     */
+    @Operation(summary = "鏂板绋庡姟缂栫爜" , description = "鏂板绋庡姟缂栫爜" )
+    @SysLog("鏂板绋庡姟缂栫爜" )
+    @PostMapping
+    @PreAuthorize("@pms.hasPermission('business_taxCode_add')" )
+    public R save(@RequestBody TaxCode taxCode) {
+        return R.ok(taxCodeService.save(taxCode));
+    }
+
+    /**
+     * 淇敼绋庡姟缂栫爜
+     * @param taxCode 绋庡姟缂栫爜
+     * @return R
+     */
+    @Operation(summary = "淇敼绋庡姟缂栫爜" , description = "淇敼绋庡姟缂栫爜" )
+    @SysLog("淇敼绋庡姟缂栫爜" )
+    @PutMapping
+    @PreAuthorize("@pms.hasPermission('business_taxCode_edit')" )
+    public R updateById(@RequestBody TaxCode taxCode) {
+        return R.ok(taxCodeService.updateById(taxCode));
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎绋庡姟缂栫爜
+     * @param ids id鍒楄〃
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鍒犻櫎绋庡姟缂栫爜" , description = "閫氳繃id鍒犻櫎绋庡姟缂栫爜" )
+    @SysLog("閫氳繃id鍒犻櫎绋庡姟缂栫爜" )
+    @DeleteMapping
+    @PreAuthorize("@pms.hasPermission('business_taxCode_del')" )
+    public R removeById(@RequestBody Integer[] ids) {
+        return R.ok(taxCodeService.removeBatchByIds(CollUtil.toList(ids)));
+    }
+
+
+    /**
+     * 瀵煎嚭excel 琛ㄦ牸
+     * @param taxCode 鏌ヨ鏉′欢
+   	 * @param ids 瀵煎嚭鎸囧畾ID
+     * @return excel 鏂囦欢娴�
+     */
+    @ResponseExcel
+    @GetMapping("/export")
+    @PreAuthorize("@pms.hasPermission('business_taxCode_export')" )
+    public List<TaxCode> export(TaxCode taxCode,Integer[] ids) {
+        return taxCodeService.list(Wrappers.lambdaQuery(taxCode).in(ArrayUtil.isNotEmpty(ids), TaxCode::getId, ids));
+    }
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractOutBoundMapper.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractOutBoundMapper.java
new file mode 100644
index 0000000..37ea42f
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractOutBoundMapper.java
@@ -0,0 +1,11 @@
+package com.by4cloud.platformx.business.mapper;
+
+import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
+import com.by4cloud.platformx.business.entity.ContractOutBound;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ContractOutBoundMapper extends PlatformxBaseMapper<ContractOutBound> {
+
+
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/TaxCodeMapper.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/TaxCodeMapper.java
new file mode 100644
index 0000000..5b7a834
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/TaxCodeMapper.java
@@ -0,0 +1,11 @@
+package com.by4cloud.platformx.business.mapper;
+
+import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
+import com.by4cloud.platformx.business.entity.TaxCode;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface TaxCodeMapper extends PlatformxBaseMapper<TaxCode> {
+
+
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractOutBoundService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractOutBoundService.java
new file mode 100644
index 0000000..2e91cc5
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractOutBoundService.java
@@ -0,0 +1,8 @@
+package com.by4cloud.platformx.business.service;
+
+import com.by4cloud.platformx.business.entity.ContractOutBound;
+import com.by4cloud.platformx.common.data.mybatis.IIService;
+
+public interface ContractOutBoundService extends IIService<ContractOutBound> {
+
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/TaxCodeService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/TaxCodeService.java
new file mode 100644
index 0000000..877bc89
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/TaxCodeService.java
@@ -0,0 +1,11 @@
+package com.by4cloud.platformx.business.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.by4cloud.platformx.business.dto.TaxCodeQueryDTO;
+import com.by4cloud.platformx.business.entity.TaxCode;
+
+public interface TaxCodeService extends IService<TaxCode> {
+
+	Page pageNew(Page page, TaxCodeQueryDTO queryDTO);
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractOutBoundServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractOutBoundServiceImpl.java
new file mode 100644
index 0000000..f4132a6
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractOutBoundServiceImpl.java
@@ -0,0 +1,16 @@
+package com.by4cloud.platformx.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.by4cloud.platformx.business.entity.ContractOutBound;
+import com.by4cloud.platformx.business.mapper.ContractOutBoundMapper;
+import com.by4cloud.platformx.business.service.ContractOutBoundService;
+import org.springframework.stereotype.Service;
+/**
+ * 鍚堝悓鍑哄簱
+ *
+ * @author syt
+ * @date 2026-05-14 09:21:54
+ */
+@Service
+public class ContractOutBoundServiceImpl extends ServiceImpl<ContractOutBoundMapper, ContractOutBound> implements ContractOutBoundService {
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractPaymentScheduleProcessServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractPaymentScheduleProcessServiceImpl.java
index 4e6bf29..dcc0047 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractPaymentScheduleProcessServiceImpl.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractPaymentScheduleProcessServiceImpl.java
@@ -121,37 +121,51 @@
 		if (ArrayUtil.isNotEmpty(afterSchedule.toArray())&&afterSchedule.size()==1){
 			//鏈�鍚庨樁娈电敓鏁堟椂闂�
 			ContractPaymentSchedule endSchedule = afterSchedule.get(0);
-			endSchedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getProcessDate(),endSchedule.getAgreedDays()));
-			endSchedule.setEffectiveEndDate(contract.getExpirationDate());
-			contractPaymentScheduleMapper.updateById(endSchedule);
-			//褰撳墠闃舵鐢熸晥鏃堕棿
-			schedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getProcessDate(),schedule.getAgreedDays()));
-			schedule.setEffectiveEndDate(endSchedule.getEffectiveDate());
-			contractPaymentScheduleMapper.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.getProcessDate());
-			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();
+			if (StrUtil.equals(endSchedule.getStageName(),"璐ㄤ繚閲�")) {
+				endSchedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getProcessDate(), endSchedule.getAgreedDays()));
+				endSchedule.setEffectiveEndDate(contract.getExpirationDate());
+				contractPaymentScheduleMapper.updateById(endSchedule);
+				//褰撳墠闃舵鐢熸晥鏃堕棿
+				schedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getProcessDate(), schedule.getAgreedDays()));
+				schedule.setEffectiveEndDate(endSchedule.getEffectiveDate());
+				contractPaymentScheduleMapper.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.getProcessDate());
+				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()));
+				paymentConfirmMapper.insert(newConfim);
 			}
-			newConfim.setTotalAmount(lastNewTotal.subtract(newConfim.getReceivableAmount()));
-			paymentConfirmMapper.insert(newConfim);
-		}else {
+			//鏇存柊鍚堝悓涓嬩釜闃舵
+			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());
 			contractPaymentScheduleMapper.updateById(schedule);
+			//鏇存柊鍚堝悓涓嬩釜闃舵
+			contract.setNextScheduleName("鏃�");
+			contractMapper.updateById(contract);
 		}
 		return R.ok();
 	}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java
index 629e3cb..9f9e4bb 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java
@@ -166,19 +166,6 @@
 		baseMapper.updateById(contract);
 		ContractPaymentSchedule fitstSchedule = contractPaymentScheduleMapper.selectOne(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId,contract.getId())
 				.orderByAsc(ContractPaymentSchedule::getCreateTime).last("limit 1"));
-//		PaymentConfirm entity = new PaymentConfirm();
-//		entity.setContractId(contract.getId());
-//		entity.setContractName(contract.getContractName());
-//		entity.setContractNo(contract.getContractNo());
-//		entity.setBusGuestId(contract.getPartyAId());
-//		entity.setBusGuestName(contract.getPartyA());
-//		entity.setBusinessType(fitstSchedule.getStageName()+"搴旀敹");
-//		entity.setTransationAmount(new BigDecimal(fitstSchedule.getPlannedAmount()));
-//		entity.setReceivableAmount(new BigDecimal(fitstSchedule.getPlannedAmount()));
-//		entity.setTotalAmount(new BigDecimal("0").subtract(new BigDecimal(fitstSchedule.getPlannedAmount())));
-//		entity.setConfirmTime(new Date());
-//		paymentConfirmMapper.insert(entity);
-
 		if (fitstSchedule.getStageName().equals("鍚堝悓绛捐")){
 			//鏂板搴旀敹
 			PaymentConfirm paymentConfirm = new PaymentConfirm();
@@ -207,43 +194,57 @@
 		//鏌ヨ鏄惁鏈夊悗缁樁娈�
 		List<ContractPaymentSchedule> afterSchedule = contractPaymentScheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery()
 				.eq(ContractPaymentSchedule::getContractId, fitstSchedule.getContractId())
-				.gt(ContractPaymentSchedule::getStageOrder, fitstSchedule.getStageOrder()));
+				.gt(ContractPaymentSchedule::getStageOrder, fitstSchedule.getStageOrder())
+				.orderByAsc(ContractPaymentSchedule::getCreateTime));
 		if (ArrayUtil.isNotEmpty(afterSchedule.toArray())&&afterSchedule.size()==1){
 			//鏈�鍚庨樁娈电敓鏁堟椂闂�
 			ContractPaymentSchedule endSchedule = afterSchedule.get(0);
-			endSchedule.setEffectiveDate(DateUtil.offsetDay(new Date(),endSchedule.getAgreedDays()));
-			endSchedule.setEffectiveEndDate(contract.getExpirationDate());
-			contractPaymentScheduleMapper.updateById(endSchedule);
-			//绗竴闃舵鐢熸晥鏃堕棿
-			fitstSchedule.setEffectiveDate(DateUtil.offsetDay(new Date(),fitstSchedule.getAgreedDays()));
-			fitstSchedule.setEffectiveEndDate(endSchedule.getEffectiveDate());
-			contractPaymentScheduleMapper.updateById(fitstSchedule);
+			if (StrUtil.equals(endSchedule.getStageName(),"璐ㄤ繚閲�")){
+				endSchedule.setEffectiveDate(DateUtil.offsetDay(new Date(),endSchedule.getAgreedDays()));
+				endSchedule.setEffectiveEndDate(contract.getExpirationDate());
+				contractPaymentScheduleMapper.updateById(endSchedule);
+				//绗竴闃舵鐢熸晥鏃堕棿
+				fitstSchedule.setEffectiveDate(DateUtil.offsetDay(new Date(),fitstSchedule.getAgreedDays()));
+				fitstSchedule.setEffectiveEndDate(endSchedule.getEffectiveDate());
+				contractPaymentScheduleMapper.updateById(fitstSchedule);
 
-			//鏈�鍚庨樁娈靛簲鏀�
-			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(endSchedule.getStageName());
-			newConfim.setConfirmTime(new Date());
-			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();
+				//鏈�鍚庨樁娈靛簲鏀�
+				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(endSchedule.getStageName());
+				newConfim.setConfirmTime(new Date());
+				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()));
+				paymentConfirmMapper.insert(newConfim);
 			}
-			newConfim.setTotalAmount(lastNewTotal.subtract(newConfim.getReceivableAmount()));
-			paymentConfirmMapper.insert(newConfim);
+			//鏇存柊鍚堝悓涓嬩釜闃舵
+			contract.setNextScheduleName(endSchedule.getStageName());
+			baseMapper.updateById(contract);
+		}
+		if(ArrayUtil.isNotEmpty(afterSchedule.toArray())&&afterSchedule.size()>1){
+			//鏇存柊鍚堝悓涓嬩釜闃舵
+			contract.setNextScheduleName(afterSchedule.get(0).getStageName());
+			baseMapper.updateById(contract);
 		}
 		if(ArrayUtil.isEmpty(afterSchedule.toArray())){
 			fitstSchedule.setEffectiveEndDate(contract.getExpirationDate());
 			contractPaymentScheduleMapper.updateById(fitstSchedule);
+			//鏇存柊鍚堝悓涓嬩釜闃舵
+			contract.setNextScheduleName("鏃�");
+			baseMapper.updateById(contract);
 		}
 		return Boolean.TRUE;
 	}
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 ab084f0..98b4924 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
@@ -40,6 +40,7 @@
 	private final PaymentConfirmMapper paymentConfirmMapper;
 	private final ContractMapper contractMapper;
 	private final ContractPaymentScheduleProcessMapper scheduleProcessMapper;
+	private final ContractOutBoundMapper contractOutBoundMapper;
 
 	@Override
 	public R add(OutBoundAddDTO addDTO) {
@@ -49,6 +50,7 @@
 		MPJLambdaWrapper<ContractSubjectMatter> wrapper = new MPJLambdaWrapper<ContractSubjectMatter>()
 				.selectAll(ContractSubjectMatter.class)
 				.ne(ContractSubjectMatter::getDeliveryStatus, 2)
+				.in(ContractSubjectMatter::getMaterialCode,addDTO.getSubjectMatterList().stream().map(item->item.getSubjectMatterCode()).collect(Collectors.toList()))
 				.exists(Contract.class, contractQuery ->
 						contractQuery.select(ContractSubjectMatter::getId)
 								.eq(Contract::getId, ContractSubjectMatter::getContractId)
@@ -80,7 +82,7 @@
 		addDTO.getSubjectMatterList().stream().forEach(outSubjectMatterAddDTO -> {
 			BigDecimal remainNum = outSubjectMatterAddDTO.getOutBoundNum();
 			for (ContractSubjectMatter subjectMatter : subjectMatterList) {
-
+				Contract contract = contractMapper.selectById(subjectMatter.getContractId());
 				if (subjectMatter.getDeliveredQuantity().compareTo(new BigDecimal("0")) > 0) {
 					remainNum = remainNum.subtract(subjectMatter.getRemainingQuantity());
 					//閮ㄥ垎浜や粯鐘舵�佷笅 鍏ㄩ儴鍑哄簱
@@ -93,15 +95,19 @@
 						subjectMatter.setLastDeliveredQuantity(currentOut);
 						contractSubjectMatterMapper.updateById(subjectMatter);
 						currentOutList.add(subjectMatter);
+						//鏂板鍚堝悓鍑哄簱鍘嗗彶
+						saveContractOutBound(contract,addDTO,subjectMatter);
 					} else {
 						BigDecimal currentOut = remainNum.add(subjectMatter.getRemainingQuantity());
 						subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity().add(remainNum));
-						subjectMatter.setRemainingQuantity(remainNum.multiply(new BigDecimal("-1")));
+						subjectMatter.setRemainingQuantity(subjectMatter.getRemainingQuantity().subtract(currentOut));
 						subjectMatter.setActualDeliveryDate(DateUtil.today());
 						subjectMatter.setDeliveryStatus(1);
 						subjectMatter.setLastDeliveredQuantity(currentOut);
 						contractSubjectMatterMapper.updateById(subjectMatter);
 						currentOutList.add(subjectMatter);
+						//鏂板鍚堝悓鍑哄簱鍘嗗彶
+						saveContractOutBound(contract,addDTO,subjectMatter);
 						break;
 					}
 
@@ -113,9 +119,11 @@
 						subjectMatter.setRemainingQuantity(new BigDecimal("0"));
 						subjectMatter.setActualDeliveryDate(DateUtil.today());
 						subjectMatter.setDeliveryStatus(2);
-						contractSubjectMatterMapper.updateById(subjectMatter);
 						subjectMatter.setLastDeliveredQuantity(subjectMatter.getQuantity());
+						contractSubjectMatterMapper.updateById(subjectMatter);
 						currentOutList.add(subjectMatter);
+						//鏂板鍚堝悓鍑哄簱鍘嗗彶
+						saveContractOutBound(contract,addDTO,subjectMatter);
 					} else {
 						BigDecimal currentOut = remainNum.add(subjectMatter.getQuantity());
 						subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity().add(remainNum));
@@ -125,6 +133,8 @@
 						subjectMatter.setLastDeliveredQuantity(currentOut);
 						contractSubjectMatterMapper.updateById(subjectMatter);
 						currentOutList.add(subjectMatter);
+						//鏂板鍚堝悓鍑哄簱鍘嗗彶
+						saveContractOutBound(contract,addDTO,subjectMatter);
 						break;
 					}
 				}
@@ -148,7 +158,7 @@
 				//褰撳墠鍑哄簱閲戦
 				BigDecimal outPirce = value.stream()
 						.filter(item -> item.getLastDeliveredQuantity() != null && item.getUnitPrice() != null)
-						.map(item -> item.getLastDeliveredQuantity().multiply(item.getUnitPrice()))
+						.map(item ->(item.getDeliveryStatus()==1?item.getDeliveredQuantity():item.getQuantity()).multiply(item.getUnitPrice()))
 						.reduce(BigDecimal.ZERO, BigDecimal::add);
 				//鍚堝悓閲戦
 				Contract contract = contractMapper.selectById(key);
@@ -162,7 +172,6 @@
 					contractMapper.updateById(contract);
 				}
 				if (ObjUtil.isNotNull(schedule)) {
-
 					//鎸夊嚭搴撹祫閲戞瘮渚� 璁$畻鍙戣揣鍓嶅簲鏀舵洿鏂拌祫閲戞槑缁�
 					PaymentConfirm paymentConfirm = new PaymentConfirm();
 					paymentConfirm.setBusinessType("鍙戣揣鍓嶅簲鏀�");
@@ -215,43 +224,56 @@
 					//鏌ヨ鏄惁鏈夊悗缁樁娈�
 					List<ContractPaymentSchedule> afterSchedule = scheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery()
 							.eq(ContractPaymentSchedule::getContractId, schedule.getContractId())
-							.gt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder()));
+							.gt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder())
+							.orderByAsc(ContractPaymentSchedule::getCreateTime));
 					if (ArrayUtil.isNotEmpty(afterSchedule.toArray())&&afterSchedule.size()==1){
-
 						//鏈�鍚庨樁娈电敓鏁堟椂闂�
 						ContractPaymentSchedule endSchedule = afterSchedule.get(0);
-						endSchedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getOutBoundTime(),endSchedule.getAgreedDays()));
-						endSchedule.setEffectiveEndDate(contract.getExpirationDate());
-						scheduleMapper.updateById(endSchedule);
-						//褰撳墠闃舵鐢熸晥鏃堕棿
-						schedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getOutBoundTime(),schedule.getAgreedDays()));
-						schedule.setEffectiveEndDate(endSchedule.getEffectiveDate());
-						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();
+						if (StrUtil.equals(endSchedule.getStageName(),"璐ㄤ繚閲�")) {
+							endSchedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getOutBoundTime(), endSchedule.getAgreedDays()));
+							endSchedule.setEffectiveEndDate(contract.getExpirationDate());
+							scheduleMapper.updateById(endSchedule);
+							//褰撳墠闃舵鐢熸晥鏃堕棿
+							schedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getOutBoundTime(), schedule.getAgreedDays()));
+							schedule.setEffectiveEndDate(endSchedule.getEffectiveDate());
+							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()));
+							paymentConfirmMapper.insert(newConfim);
 						}
-						newConfim.setTotalAmount(lastNewTotal.subtract(newConfim.getReceivableAmount()));
-						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);
 					}
 				}
 			});
@@ -259,4 +281,19 @@
 
 		return R.ok();
 	}
+
+	private void saveContractOutBound(Contract contract, OutBoundAddDTO addDTO, ContractSubjectMatter subjectMatter) {
+		ContractOutBound contractOutBound = new ContractOutBound();
+		contractOutBound.setContractId(contract.getId());
+		contractOutBound.setContractName(contract.getContractName());
+		contractOutBound.setBusGuestId(contract.getPartyAId());
+		contractOutBound.setBusGuestName(contract.getPartyA());
+		contractOutBound.setSubjectMatterCode(subjectMatter.getMaterialCode());
+		contractOutBound.setSubjectMatterName(subjectMatter.getMaterialInternalName());
+		contractOutBound.setOutBoundTime(addDTO.getOutBoundTime());
+		contractOutBound.setOutBoundNum(subjectMatter.getLastDeliveredQuantity());
+		contractOutBound.setOutBoundAttNames(addDTO.getOutBoundAttNames());
+		contractOutBound.setOutBoundAttPaths(addDTO.getOutBoundAttPaths());
+		contractOutBoundMapper.insert(contractOutBound);
+	}
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/TaxCodeServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/TaxCodeServiceImpl.java
new file mode 100644
index 0000000..1318846
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/TaxCodeServiceImpl.java
@@ -0,0 +1,106 @@
+package com.by4cloud.platformx.business.service.impl;
+
+import cn.hutool.core.lang.tree.Tree;
+import cn.hutool.core.lang.tree.TreeNode;
+import cn.hutool.core.lang.tree.TreeUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.by4cloud.platformx.admin.api.entity.SysDept;
+import com.by4cloud.platformx.business.dto.TaxCodeQueryDTO;
+import com.by4cloud.platformx.business.entity.TaxCode;
+import com.by4cloud.platformx.business.mapper.TaxCodeMapper;
+import com.by4cloud.platformx.business.service.TaxCodeService;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 绋庡姟缂栫爜
+ *
+ * @author syt
+ * @date 2026-05-13 16:35:23
+ */
+@Service
+public class TaxCodeServiceImpl extends ServiceImpl<TaxCodeMapper, TaxCode> implements TaxCodeService {
+
+	@Override
+	public Page pageNew(Page page, TaxCodeQueryDTO queryDTO) {
+		MPJLambdaWrapper<TaxCode> wrapper = new MPJLambdaWrapper<TaxCode>()
+				.selectAll(TaxCode.class)
+				.selectAs("(select count(1) from tax_code t1 where t1.parent_bm = t.bm)",TaxCode::getChildNum)
+				.like(StrUtil.isNotBlank(queryDTO.getMc()),TaxCode::getMc,queryDTO.getMc());
+		if (ObjUtil.isNotNull(queryDTO.getChildNum())){
+			if (queryDTO.getChildNum()==0){
+				wrapper.eq("(select count(1) from tax_code t1 where t1.parent_bm = t.bm)",0);
+			}else {
+				wrapper.gt("(select count(1) from tax_code t1 where t1.parent_bm = t.bm)",0);
+			}
+		}
+//		List<TaxCode> taxCodeList = baseMapper.selectPage(wrapper);
+//		List<TaxCode> treeList=buildTreeByStream(taxCodeList, "1");
+		return baseMapper.selectPage(page,wrapper);
+	}
+
+	/**
+	 * 浣跨敤 Stream 閫掑綊鏋勫缓鏍�
+	 * @param allNodes 鎵�鏈夎妭鐐�
+	 * @param parentId 褰撳墠灞傜骇鐨勭埗ID
+	 * @return 鏍戝舰鍒楄〃
+	 */
+	public static List<TaxCode> buildTreeByStream(List<TaxCode> allNodes, String parentId) {
+		return allNodes.stream()
+				.filter(node -> {
+					// 杩囨护鍑虹埗缂栫爜绛変簬褰撳墠 parentId 鐨勮妭鐐�
+					if (parentId == null) {
+						return node.getParentBm() == null || node.getParentBm().isEmpty();
+					}
+					return parentId.equals(node.getParentBm());
+				})
+				.peek(node -> {
+					// 閫掑綊璁剧疆瀛愯妭鐐�
+					node.setChildren(buildTreeByStream(allNodes, node.getBm()));
+				})
+				.collect(Collectors.toList());
+	}
+
+	public <T> Page<T> convert(List<T> dataList, Page<T> pageParam) {
+		if (dataList == null) {
+			dataList = java.util.Collections.emptyList();
+		}
+
+		long total = dataList.size();
+		long current = pageParam.getCurrent();
+		long size = pageParam.getSize();
+
+		// 璁$畻鎬婚〉鏁�
+		long pages = (total + size - 1) / size;
+
+		// 璁$畻鎴彇鑼冨洿
+		long startIndex = (current - 1) * size;
+		long endIndex = Math.min(startIndex + size, total);
+
+		List<T> records;
+		if (startIndex >= total) {
+			records = java.util.Collections.emptyList();
+		} else {
+			records = dataList.subList((int) startIndex, (int) endIndex);
+		}
+
+		// 璁剧疆缁撴灉
+		pageParam.setRecords(records);
+		pageParam.setTotal(total);
+		pageParam.setPages(pages);
+
+		return pageParam;
+	}
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/resources/mapper/ContractOutBoundMapper.xml b/platformx-business-finance-biz/src/main/resources/mapper/ContractOutBoundMapper.xml
new file mode 100644
index 0000000..ddb7f2b
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/resources/mapper/ContractOutBoundMapper.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.by4cloud.platformx.business.mapper.ContractOutBoundMapper">
+
+  <resultMap id="contractOutBoundMap" type="com.by4cloud.platformx.business.entity.ContractOutBound">
+        <id property="id" column="id"/>
+        <result property="compId" column="comp_id"/>
+        <result property="busGuestId" column="bus_guest_id"/>
+        <result property="busGuestName" column="bus_guest_name"/>
+        <result property="contractId" column="contract_id"/>
+        <result property="contractName" column="contract_name"/>
+        <result property="outBoundAttNames" column="out_bound_att_names"/>
+        <result property="outBoundAttPaths" column="out_bound_att_paths"/>
+        <result property="outBoundNum" column="out_bound_num"/>
+        <result property="outBoundTime" column="out_bound_time"/>
+        <result property="subjectMatterCode" column="subject_matter_code"/>
+        <result property="subjectMatterName" column="subject_matter_name"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="delFlag" column="del_flag"/>
+  </resultMap>
+</mapper>
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/resources/mapper/TaxCodeMapper.xml b/platformx-business-finance-biz/src/main/resources/mapper/TaxCodeMapper.xml
new file mode 100644
index 0000000..eed0baf
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/resources/mapper/TaxCodeMapper.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.by4cloud.platformx.business.mapper.TaxCodeMapper">
+
+  <resultMap id="taxCodeMap" type="com.by4cloud.platformx.business.entity.TaxCode">
+        <id property="id" column="id"/>
+        <result property="compId" column="comp_id"/>
+        <result property="bm" column="bm"/>
+        <result property="gjz" column="gjz"/>
+        <result property="gmtjdm" column="gmtjdm"/>
+        <result property="mc" column="mc"/>
+        <result property="parentBm" column="parent_bm"/>
+        <result property="prov" column="prov"/>
+        <result property="sl" column="sl"/>
+        <result property="sm" column="sm"/>
+        <result property="sphwjc" column="sphwjc"/>
+        <result property="xfsgl" column="xfsgl"/>
+        <result property="xfstsgldm" column="xfstsgldm"/>
+        <result property="xfszcyj" column="xfszcyj"/>
+        <result property="zzstsgl" column="zzstsgl"/>
+        <result property="zzstsgldm" column="zzstsgldm"/>
+        <result property="zzstsyj" column="zzstsyj"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="delFlag" column="del_flag"/>
+  </resultMap>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1