From 3a102b246b592e5e1dd34d6de07a8191de90a8e1 Mon Sep 17 00:00:00 2001
From: 李白 <7387820+wjli_13439841639@user.noreply.gitee.com>
Date: 星期五, 29 五月 2026 11:15:17 +0800
Subject: [PATCH] 开票前基础数据设置

---
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/SaleCreditService.java              |    8 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/SaleCreditServiceImpl.java     |   18 +
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/SaleCredit.java                      |  160 ++++++++++++++
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/SaleCreditController.java        |  269 ++++++++++++++++++++++++
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ProductionPlanServiceImpl.java |   32 ++
 platformx-business-finance-biz/src/main/resources/mapper/SaleCreditMapper.xml                                            |   31 ++
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ProductionPlan.java                  |    4 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundVo.java                  |   36 +++
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ProductionPlanService.java          |    3 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BusinessCustomer.java                |    9 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/SaleCreditMapper.java                |   11 +
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Product.java                         |    4 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ProductionPlanController.java    |   11 +
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/PlanSubjectMatter.java               |    4 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractOutBound.java                |   56 ++++
 15 files changed, 651 insertions(+), 5 deletions(-)

diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BusinessCustomer.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BusinessCustomer.java
index 8706068..ff4f49e 100644
--- a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BusinessCustomer.java
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BusinessCustomer.java
@@ -117,4 +117,13 @@
     @Column(columnDefinition = "bigint comment '甯傚満绫诲瀷'")
     private Long className;
 
+    @Schema(description = "鍑哄彛鏈嶅姟灞炴��")
+    @Column(columnDefinition = "bigint comment '鍑哄彛鏈嶅姟灞炴��'")
+    private Long exportServiceAttr;
+
+    @Schema(description = "閿�鍞ā寮�")
+    @Column(columnDefinition = "bigint comment '閿�鍞ā寮�'")
+    private Long salesModel;
+
+
 }
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
index 02286f9..2d6769d 100644
--- 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
@@ -21,6 +21,10 @@
 @jakarta.persistence.Table(name = "contract_out_bound")//鏁版嵁搴撳垱寤虹殑琛ㄦ槑
 public class ContractOutBound extends BaseModel<ContractOutBound> {
 
+	@Schema(description = "Erp鍑哄簱Id")
+	@Column(columnDefinition = "bigint not null comment 'Erp鍑哄簱Id'")
+	private Long OutBoundId;
+
 	@Schema(description = "鍏宠仈鍚堝悓ID")
 	@Column(columnDefinition = "bigint not null comment '鍏宠仈鍚堝悓ID'")
 	private Long contractId;
@@ -75,8 +79,54 @@
 	@Column(columnDefinition="text comment '鍒拌揣鍗曟嵁璺緞'")
 	private String arrivalAttPaths;
 
-	@Schema(description = "erp鍑哄簱ID")
-	@Column(columnDefinition="bigint comment 'erp鍑哄簱ID'")
-	private Long outBoundId;
 
+	//浠ヤ笅寮�绁ㄧ浉鍏�
+
+	@Schema(description = "閿�鍞寕璐d")
+	@Column(columnDefinition = "bigint default null comment '閿�鍞寕璐d'")
+	private Long saleCreditId;
+
+	@Schema(description = "寮�绁ㄧ姸鎬侊紙0-鏈紑绁� 1-寮�绁ㄤ腑 2-宸插紑绁級")
+	@Column(columnDefinition = "tinyint(2) default 0 comment '寮�绁ㄧ姸鎬侊紙0-鏈紑绁� 1-寮�绁ㄤ腑 2-宸插紑绁級'")
+	private Integer invoiceSatus;
+
+	@Schema(description = "鎬诲崟浠�")
+	@Column(columnDefinition = "decimal(10,0) comment '鍑哄簱鏁伴噺'")
+	private BigDecimal totalPrice;
+
+	@Schema(description = "鎬荤◣棰�")
+	@Column(columnDefinition = "decimal(10,0) comment '鎬荤◣棰�'")
+	private BigDecimal totalTax;
+
+	//浜у搧淇℃伅
+
+	@Schema(description = "浜у搧id")
+	@Column(columnDefinition = "bigint not null comment '浜у搧id'")
+	private Long productId;
+
+	@Schema(description = "绋庣巼锛堢櫨鍒嗘瘮锛屽13琛ㄧず13%锛�")
+	@Column(columnDefinition = "double default 0.00 comment '绋庣巼'")
+	private Double taxRate;
+
+	@Schema(description = "绋庢敹鍒嗙被")
+	@Column(columnDefinition = "VARCHAR(50) comment '绋庢敹鍒嗙被'")
+	private String taxClass;
+
+	@Schema(description = "绋庢敹缂栫爜")
+	@Column(columnDefinition = "VARCHAR(80) comment '绋庢敹缂栫爜'")
+	private String taxCode;
+
+	//鍚堝悓鏍囩殑鐗╀腑淇℃伅
+
+	@Schema(description = "鏍囩殑鐗╄鏍�/鍨嬪彿")
+	@Column(columnDefinition = "VARCHAR(200) comment '鏍囩殑鐗╄鏍�/鍨嬪彿'")
+	private String specification;
+
+	@Schema(description = "璁¢噺鍗曚綅锛堜釜/鍙�/鍚�/椤�/濂楃瓑锛�")
+	@Column(columnDefinition = "VARCHAR(20) comment '璁¢噺鍗曚綅'")
+	private String unit;
+
+	@Schema(description = "鍗曚环")
+	@Column(columnDefinition = "decimal(10,2) comment '鍗曚环'")
+	private BigDecimal unitPrice;
 }
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/PlanSubjectMatter.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/PlanSubjectMatter.java
index 5c9b4a9..fae3bd3 100644
--- a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/PlanSubjectMatter.java
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/PlanSubjectMatter.java
@@ -31,6 +31,10 @@
     @Column(columnDefinition = "VARCHAR(50) comment '浜у搧鍚嶇О'")
     private String productName;
 
+    @Schema(description = "浜у搧鍨嬪彿")
+    @Column(columnDefinition = "VARCHAR(50) comment '浜у搧鍨嬪彿'")
+    private String productType;
+
     @Schema(description = "浜у搧Erp缂栫爜")
     @Column(columnDefinition = "VARCHAR(50) comment '浜у搧Erp缂栫爜'")
     private String erpCode;
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Product.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Product.java
index 8de5aac..a5a0e74 100644
--- a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Product.java
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Product.java
@@ -51,6 +51,10 @@
     @Column(columnDefinition = "VARCHAR(50) comment '绋庢敹鍒嗙被'")
     private String taxClass;
 
+    @Schema(description = "绋庢敹缂栫爜")
+    @Column(columnDefinition = "VARCHAR(80) comment '绋庢敹缂栫爜'")
+    private String taxCode;
+
     @Schema(description = "鐖禝D")
     @Column(columnDefinition = "bigint default 0 comment '鐖禝D'")
     private Long parentId;
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ProductionPlan.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ProductionPlan.java
index 083b595..44ff6af 100644
--- a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ProductionPlan.java
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ProductionPlan.java
@@ -77,8 +77,8 @@
     @Column(columnDefinition = "tinyint(2) default 0 comment '渚涘簲灞炴�� 0-鎴愬搧 1-澶囦欢 2-澶т慨 3-鍏朵粬'")
     private Integer supplyAttribute;*/
 
-    @Schema(description = "璁″垝鐘舵�侊紙0-鑽夌 1-宸茬敓鏁� 2-宸茬粓姝� 3-宸茶繃鏈燂級")
-    @Column(columnDefinition = "tinyint(2) default 0 comment '璁″垝鐘舵��'")
+    @Schema(description = "璁″垝鐘舵�侊紙0-宸插け鏁� 1-宸茬敓鏁堬級")
+    @Column(columnDefinition = "tinyint(2) default 1 comment '璁″垝鐘舵��'")
     private Integer status;
 
     @Schema(description = "鏄惁鎺ㄩ�乪rp锛�0-娌℃湁 1-鎺ㄩ�侊級")
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/SaleCredit.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/SaleCredit.java
new file mode 100644
index 0000000..48ba3de
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/SaleCredit.java
@@ -0,0 +1,160 @@
+package com.by4cloud.platformx.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.by4cloud.platformx.business.vo.ContractOutBoundVo;
+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.Table;
+import jakarta.persistence.Transient;
+import lombok.Data;
+import org.hibernate.annotations.Comment;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author wjli
+ * @description
+ * @date 2026/4/29 10:51
+ **/
+@Data
+@Entity
+@Table(name = "sale_credit")
+@Comment("閿�鍞寕璐�")
+public class SaleCredit  extends BaseModel<SaleCredit> {
+
+    @Schema(description = "閿�鍞紪鍙�")
+    @Column(columnDefinition = "VARCHAR(64) comment '閿�鍞紪鍙�'")
+    private String entrustCode;
+
+    @Schema(description = "鍏宠仈鍚堝悓ID")
+    @Column(columnDefinition = "bigint not null comment '鍏宠仈鍚堝悓ID'")
+    private Long contractId;
+
+    @Schema(description = "鍚堝悓缂栧彿")
+    @Column(columnDefinition = "VARCHAR(64) comment '鍚堝悓缂栧彿'")
+    private String contractNo;
+
+    @Schema(description = "鍚堝悓鍚嶇О")
+    @Column(columnDefinition = "VARCHAR(64) comment '鍚堝悓鍚嶇О'")
+    private String contractName;
+
+    @Schema(description = "鐢叉柟id")
+    @Column(name = "party_a_id",columnDefinition = "bigint comment '鐢叉柟id'")
+    private Long partyAId;
+
+    @Schema(description = "鐢叉柟鍚嶇О")
+    @Column(name = "party_a",columnDefinition = "VARCHAR(100) comment '鐢叉柟鍚嶇О'")
+    private String partyA;
+
+    @Schema(description = "鐢叉柟缁熶竴绀句細淇$敤浠g爜")
+    @Column(name = "credit_code_a",columnDefinition = "VARCHAR(30) comment '鐢叉柟缁熶竴绀句細淇$敤浠g爜'")
+    private String creditCodeA;
+
+    @Schema(description = "鐢叉柟寮�鎴烽摱琛�")
+    @Column(name = "bank_name_a",columnDefinition = "VARCHAR(20) comment '鐢叉柟寮�鎴烽摱琛�'")
+    private String bankNameA;
+
+    @Schema(description = "鐢叉柟閾惰璐﹀彿")
+    @Column(name = "bank_account_a",columnDefinition = "VARCHAR(50) comment '鐢叉柟閾惰璐﹀彿'")
+    private String bankAccountA;
+
+    @Schema(description = "鐢叉柟鑱旂郴鐢佃瘽")
+    @Column(name = "contact_phone_a",columnDefinition = "VARCHAR(50) comment '鐢叉柟鑱旂郴鐢佃瘽'")
+    private String contactPhoneA;
+
+    @Schema(description = "涔欐柟id")
+    @Column(name = "party_b_id",columnDefinition = "bigint comment '涔欐柟id'")
+    private Long partyBId;
+
+    @Schema(description = "涔欐柟鍚嶇О")
+    @Column(name = "party_b",columnDefinition = "VARCHAR(100) comment '涔欐柟鍚嶇О'")
+    private String partyB;
+
+    @Schema(description = "涔欐柟缁熶竴绀句細淇$敤浠g爜")
+    @Column(name = "credit_code_b",columnDefinition = "VARCHAR(30) comment '涔欐柟缁熶竴绀句細淇$敤浠g爜'")
+    private String creditCodeB;
+
+    @Schema(description = "涔欐柟寮�鎴烽摱琛�")
+    @Column(name = "bank_name_b",columnDefinition = "VARCHAR(20) comment '涔欐柟寮�鎴烽摱琛�'")
+    private String bankNameB;
+
+    @Schema(description = "涔欐柟閾惰璐﹀彿")
+    @Column(name = "bank_account_b",columnDefinition = "VARCHAR(50) comment '涔欐柟閾惰璐﹀彿'")
+    private String bankAccountB;
+
+    @Schema(description = "涔欐柟鑱旂郴鐢佃瘽")
+    @Column(name = "contact_phone_b",columnDefinition = "VARCHAR(50) comment '涔欐柟鑱旂郴鐢佃瘽'")
+    private String contactPhoneB;
+
+    @Schema(description = "鎸傝处閲戦")
+    @Column(columnDefinition = "decimal(10,2) comment '鎸傝处閲戦'")
+    private BigDecimal totalAmount;
+
+    @Schema(description = "鎸傝处閲戦鎬荤◣棰�")
+    @Column(columnDefinition = "decimal(10,2) comment '鎸傝处閲戦鎬荤◣棰�'")
+    private BigDecimal totalTax;
+
+    @Schema(description = "鏍囩殑鐗╄鎯�")
+    @Column(columnDefinition = "TEXT comment '鏍囩殑鐗╄鎯�'")
+    private String matterStr;
+
+    @Schema(description = "瀵瑰簲鍑鸿揣鍗�")
+    @Column(columnDefinition = "varchar(300) comment '瀵瑰簲鍑鸿揣鍗�'")
+    private String outBoundIds;
+
+    @Schema(description = "鐘舵�侊紙0-鐢熸晥 1-澶辨晥锛�")
+    @Column(columnDefinition = "tinyint(2) default 0 comment '鐘舵�侊紙0-鐢熸晥 1-澶辨晥锛�'")
+    private Integer status;
+
+    @Schema(description = "鐘舵�侊紙200锛�")
+    @Column(columnDefinition = "tinyint(2) default 0 comment '鐘舵�侊紙200锛�'")
+    private Integer bipStatus;
+
+    @Schema(description = "寮�绁ㄧ粨鏋滅姸鎬� 0鏈彁浜ら粯璁� 1澶勭悊涓� 2閫氳繃 3椹冲洖 4寮�绁ㄥけ璐�")
+    @javax.persistence.Column(columnDefinition="int(1) comment '鎺掑簭'")
+    private Integer blueResultStatus;
+
+    @Schema(description = "寮�绾㈢エ缁撴灉鐘舵�� 0鏈彁浜ら粯璁� 1澶勭悊涓� 2閫氳繃 3椹冲洖 4寮�绁ㄥけ璐�")
+    @javax.persistence.Column(columnDefinition="int(1) comment '鎺掑簭'")
+    private Integer redResultStatus;
+
+    @Schema(description = "钃濈エid")
+    @Column(columnDefinition = "bigint default null comment '钃濈エid'")
+    private Long blueInvoiceResultId;
+
+    @Schema(description = "绾㈢エid")
+    @Column(columnDefinition = "bigint default null comment '绾㈢エid'")
+    private Long redInvoiceResultId;
+
+    @Schema(description = "寮�绁ㄨ鎯�")
+    @Column(columnDefinition = "TEXT comment '寮�绁ㄨ鎯�'")
+    private String invoiceRemark;
+
+    @Schema(description = "钃濈エ鍦板潃")
+    @Column(columnDefinition = "varchar(300) comment '钃濈エ鍦板潃'")
+    private String invoicPath;
+
+    @Schema(description = "绾㈢エ鍦板潃")
+    @Column(columnDefinition = "varchar(300) comment '绾㈢エ鍦板潃'")
+    private String invoicRedPath;
+
+    @Schema(description = "鍙戠エurl")
+    @javax.persistence.Column(columnDefinition="VARCHAR(50) comment '鍙戠エurl'")
+    private String invoicUrl;
+
+    @Schema(description = "绾㈠啿鍙戠エurl")
+    @javax.persistence.Column(columnDefinition="VARCHAR(50) comment '绾㈠啿鍙戠エurl'")
+    private String invoicRedUrl;
+
+    /**
+     * 鍑鸿揣鍗曞垪琛�
+     */
+    @Transient
+    @TableField(exist = false)
+    private List<ContractOutBoundVo> contractOutBoundList;
+
+
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundVo.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundVo.java
new file mode 100644
index 0000000..ac2f458
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundVo.java
@@ -0,0 +1,36 @@
+package com.by4cloud.platformx.business.vo;
+
+import com.by4cloud.platformx.business.entity.ContractOutBound;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class ContractOutBoundVo extends ContractOutBound {
+    //浜у搧涓俊鎭�
+
+    @Schema(description = "浜у搧id")
+    private Long productId;
+
+    @Schema(description = "绋庣巼锛堢櫨鍒嗘瘮锛屽13琛ㄧず13%锛�")
+    private Double taxRate;
+
+    @Schema(description = "绋庢敹鍒嗙被")
+    private String taxClass;
+
+    @Schema(description = "绋庢敹缂栫爜")
+    private String taxCode;
+
+    //鍚堝悓鏍囩殑鐗╀腑淇℃伅
+
+    @Schema(description = "鏍囩殑鐗╄鏍�/鍨嬪彿")
+    private String specification;
+
+    @Schema(description = "璁¢噺鍗曚綅锛堜釜/鍙�/鍚�/椤�/濂楃瓑锛�")
+    private String unit;
+
+    @Schema(description = "鍗曚环")
+    private BigDecimal unitPrice;
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ProductionPlanController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ProductionPlanController.java
index 0530d36..662ad16 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ProductionPlanController.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ProductionPlanController.java
@@ -205,4 +205,15 @@
     public List<ProductionPlan> export(ProductionPlan productionPlan,Long[] ids) {
         return productionPlanService.list(Wrappers.lambdaQuery(productionPlan).in(ArrayUtil.isNotEmpty(ids), ProductionPlan::getId, ids));
     }
+
+    /**
+     * 鍚姩瀹℃牳娴佺▼
+     * @param id id
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鍚姩瀹℃牳娴佺▼" , description = "閫氳繃id鍚堝悓鐢熸晥" )
+    @GetMapping("/startApproval/{id}" )
+    public R startApproval(@PathVariable("id" ) Long id) {
+        return productionPlanService.startApproval(id);
+    }
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/SaleCreditController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/SaleCreditController.java
new file mode 100644
index 0000000..2959929
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/SaleCreditController.java
@@ -0,0 +1,269 @@
+package com.by4cloud.platformx.business.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ArrayUtil;
+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.by4cloud.platformx.admin.api.entity.SysDept;
+import com.by4cloud.platformx.admin.api.feign.RemoteDeptService;
+import com.by4cloud.platformx.business.entity.*;
+import com.by4cloud.platformx.business.service.*;
+import com.by4cloud.platformx.business.vo.ContractOutBoundVo;
+import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.common.excel.annotation.ResponseExcel;
+import com.by4cloud.platformx.common.log.annotation.SysLog;
+import com.by4cloud.platformx.common.security.annotation.Inner;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springdoc.core.annotations.ParameterObject;
+import org.springframework.http.HttpHeaders;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 閿�鍞寕璐�
+ *
+ * @author wjli
+ * @date 2026-05-21 16:16:31
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/saleCredit" )
+@Tag(description = "saleCredit" , name = "閿�鍞寕璐︾鐞�" )
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class SaleCreditController {
+
+    private final  SaleCreditService saleCreditService;
+    private final ContractService contractService;
+    private final BusinessCustomerService businessCustomerService;
+    private final ContractOutBoundService contractOutBoundService;
+    private final ProductService productService;
+    private final ContractSubjectMatterService contractSubjectMatterService;
+    private final RemoteDeptService remoteDeptService;
+
+
+
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page 鍒嗛〉瀵硅薄
+     * @param saleCredit 閿�鍞寕璐�
+     * @return
+     */
+    @Operation(summary = "鍒嗛〉鏌ヨ" , description = "鍒嗛〉鏌ヨ" )
+    @GetMapping("/page" )
+    @PreAuthorize("@pms.hasPermission('business_saleCredit_view')" )
+    public R getSaleCreditPage(@ParameterObject Page page, @ParameterObject SaleCredit saleCredit) {
+        LambdaQueryWrapper<SaleCredit> wrapper = Wrappers.lambdaQuery();
+        return R.ok(saleCreditService.page(page, wrapper));
+    }
+
+
+    /**
+     * 閫氳繃id鏌ヨ閿�鍞寕璐�
+     * @param id id
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鏌ヨ" , description = "閫氳繃id鏌ヨ" )
+    @GetMapping("/{id}" )
+    @PreAuthorize("@pms.hasPermission('business_saleCredit_view')" )
+    public R getById(@PathVariable("id" ) Long id) {
+        return R.ok(saleCreditService.getById(id));
+    }
+
+    /**
+     * 鏂板閿�鍞寕璐�
+     * @param saleCredit 閿�鍞寕璐�
+     * @return R
+     */
+    @Operation(summary = "鏂板閿�鍞寕璐�" , description = "鏂板閿�鍞寕璐�" )
+    @SysLog("鏂板閿�鍞寕璐�" )
+    @PostMapping
+    @PreAuthorize("@pms.hasPermission('business_saleCredit_add')" )
+    public R save(@RequestBody SaleCredit saleCredit) {
+        return R.ok(saleCreditService.save(saleCredit));
+    }
+
+
+    /**
+     * 鏂板閿�鍞寕璐�
+     * @param saleCredit 閿�鍞寕璐�
+     * @return R
+     */
+    @Operation(summary = "閿�鍞寕璐︾敓鎴�" , description = "閿�鍞寕璐︾敓鎴�" )
+    @SysLog("閿�鍞寕璐︾敓鎴�" )
+    @PostMapping("/saveSaleCredit")
+    @PreAuthorize("@pms.hasPermission('business_saleCredit_add')" )
+    public R saveInvoice(@RequestBody SaleCredit saleCredit) {
+        //寮�绁ㄤ腑
+        saleCredit.setStatus(1);
+        saleCreditService.save(saleCredit);
+        //鏍囪鍑哄簱鍗曡鏍囪瘑
+        List<ContractOutBoundVo> contractOutBoundList = saleCredit.getContractOutBoundList();
+        if(contractOutBoundList==null){
+            return R.failed("璇烽�夋嫨鍑哄簱鍗曪紒");
+        }
+        if(contractOutBoundList.size()==0){
+            return R.failed("璇烽�夋嫨鍑哄簱鍗曪紒");
+        }
+        String outBoundIds = "";
+        for(ContractOutBoundVo vo : contractOutBoundList){
+            if(StrUtil.isEmpty(outBoundIds)){
+                outBoundIds = "" + vo.getId();
+            }else{
+                outBoundIds += "," + vo.getId();
+            }
+            ContractOutBound outBound = contractOutBoundService.getById(vo.getId());
+            outBound.setSaleCreditId(saleCredit.getId());
+            outBound.setTotalPrice(vo.getTotalPrice());
+            outBound.setTotalTax(vo.getTotalTax());
+            outBound.setProductId(vo.getProductId());
+            outBound.setTaxRate(vo.getTaxRate());
+            outBound.setTaxClass(vo.getTaxClass());
+            outBound.setTaxCode(vo.getTaxCode());
+            outBound.setSpecification(vo.getSpecification());
+            outBound.setUnit(vo.getUnit());
+            outBound.setUnitPrice(vo.getUnitPrice());
+            outBound.setInvoiceSatus(1);
+            contractOutBoundService.updateById(outBound);
+        }
+        saleCredit.setOutBoundIds(outBoundIds);
+        saleCreditService.save(saleCredit);
+
+       return R.ok("閿�鍞寕璐︾敓鎴愶紒");
+    }
+
+
+
+
+
+    /**
+     * 鎷兼帴閿�鍞寕璐�
+     * @param saleCredit 閿�鍞寕璐�
+     * @return R
+     */
+    @Operation(summary = "鎷兼帴閿�鍞寕璐�" , description = "鎷兼帴閿�鍞寕璐�" )
+    @SysLog("鎷兼帴閿�鍞寕璐�" )
+    @GetMapping("/generatorInvoice")
+    @PreAuthorize("@pms.hasPermission('business_saleCredit_view')" )
+    @Inner(value = false)
+    public R generatorInvoice(@ParameterObject SaleCredit saleCredit) {
+        if(saleCredit.getContractId()==null){
+            return R.failed("鍚堝悓id涓嶈兘涓虹┖");
+        }
+        Contract contract = contractService.getById(saleCredit.getContractId());
+        if(contract==null){
+            return R.failed("鍚堝悓id閿欒");
+        }
+        saleCredit.setContractName(contract.getContractName());
+        saleCredit.setContractNo(contract.getContractNo());
+
+        BusinessCustomer partA = businessCustomerService.getById(contract.getPartyAId());
+        if(partA!=null){
+            saleCredit.setPartyA(partA.getCompanyName());
+            saleCredit.setCreditCodeA(partA.getCreditCode());
+            saleCredit.setBankAccountA(partA.getBankAccount());
+            saleCredit.setBankNameA(partA.getBankName());
+        }
+        R<SysDept> r = remoteDeptService.getById(contract.getPartyBId());
+
+        SysDept dept = r.getData();
+        if(dept!=null){
+            saleCredit.setPartyB(dept.getOrgName());
+            saleCredit.setCreditCodeB(dept.getOrgCode());
+            saleCredit.setBankAccountB(dept.getOrgBankAccount());
+            saleCredit.setBankNameB(dept.getOrgBank());
+        }
+
+        List<ContractOutBound> outBoundList = contractOutBoundService.list(new LambdaQueryWrapper<ContractOutBound>()
+                .eq(ContractOutBound::getContractId,contract.getId())
+                .eq(ContractOutBound::getInvoiceSatus,0)
+                .orderByAsc(ContractOutBound::getOutBoundTime)
+        );
+
+        if(outBoundList!=null){
+            if(!outBoundList.isEmpty()){
+                List<ContractOutBoundVo> list = new ArrayList<>();
+                for(ContractOutBound outBound : outBoundList){
+                    ContractOutBoundVo vo = new ContractOutBoundVo();
+                    BeanUtil.copyProperties(outBound,vo);
+                    Product product = productService.getOne(new LambdaQueryWrapper<Product>().eq(Product::getErpCode,outBound.getSubjectMatterCode()).last("limit 1"));
+
+                    if(product!=null){
+                        vo.setProductId(product.getId());
+                        vo.setTaxClass(product.getTaxClass());
+                        vo.setTaxCode(product.getTaxCode());
+                        vo.setTaxRate(product.getTaxRate());
+                    }
+                    ContractSubjectMatter matter = contractSubjectMatterService.getOne(new LambdaQueryWrapper<ContractSubjectMatter>()
+                            .eq(ContractSubjectMatter::getContractId,contract.getId())
+                            .eq(ContractSubjectMatter::getMaterialCode,outBound.getSubjectMatterCode())
+                            .last("limit 1")
+                    );
+                    if(matter!=null){
+                        vo.setSpecification(matter.getSpecification());
+                        vo.setUnit(matter.getUnit());
+                        vo.setUnitPrice(matter.getUnitPrice());
+                    }
+                    list.add(vo);
+                }
+                saleCredit.setContractOutBoundList(list);
+            }
+        }
+        return R.ok(saleCredit);
+    }
+
+
+
+    /**
+     * 淇敼閿�鍞寕璐�
+     * @param saleCredit 閿�鍞寕璐�
+     * @return R
+     */
+    @Operation(summary = "淇敼閿�鍞寕璐�" , description = "淇敼閿�鍞寕璐�" )
+    @SysLog("淇敼閿�鍞寕璐�" )
+    @PutMapping
+    @PreAuthorize("@pms.hasPermission('business_saleCredit_edit')" )
+    public R updateById(@RequestBody SaleCredit saleCredit) {
+        return R.ok(saleCreditService.updateById(saleCredit));
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎閿�鍞寕璐�
+     * @param ids id鍒楄〃
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鍒犻櫎閿�鍞寕璐�" , description = "閫氳繃id鍒犻櫎閿�鍞寕璐�" )
+    @SysLog("閫氳繃id鍒犻櫎閿�鍞寕璐�" )
+    @DeleteMapping
+    @PreAuthorize("@pms.hasPermission('business_saleCredit_del')" )
+    public R removeById(@RequestBody Long[] ids) {
+        return R.ok(saleCreditService.removeBatchByIds(CollUtil.toList(ids)));
+    }
+
+
+    /**
+     * 瀵煎嚭excel 琛ㄦ牸
+     * @param saleCredit 鏌ヨ鏉′欢
+   	 * @param ids 瀵煎嚭鎸囧畾ID
+     * @return excel 鏂囦欢娴�
+     */
+    @ResponseExcel
+    @GetMapping("/export")
+    @PreAuthorize("@pms.hasPermission('business_saleCredit_export')" )
+    public List<SaleCredit> export(SaleCredit saleCredit,Long[] ids) {
+        return saleCreditService.list(Wrappers.lambdaQuery(saleCredit).in(ArrayUtil.isNotEmpty(ids), SaleCredit::getId, ids));
+    }
+
+
+
+
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/SaleCreditMapper.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/SaleCreditMapper.java
new file mode 100644
index 0000000..437929c
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/SaleCreditMapper.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.SaleCredit;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SaleCreditMapper extends PlatformxBaseMapper<SaleCredit> {
+
+
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ProductionPlanService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ProductionPlanService.java
index 1396680..3f82344 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ProductionPlanService.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ProductionPlanService.java
@@ -2,7 +2,10 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.by4cloud.platformx.business.entity.ProductionPlan;
+import com.by4cloud.platformx.common.core.util.R;
 
 public interface ProductionPlanService extends IService<ProductionPlan> {
 
+    R startApproval(Long id);
+
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/SaleCreditService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/SaleCreditService.java
new file mode 100644
index 0000000..fe3e291
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/SaleCreditService.java
@@ -0,0 +1,8 @@
+package com.by4cloud.platformx.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.by4cloud.platformx.business.entity.SaleCredit;
+
+public interface SaleCreditService extends IService<SaleCredit> {
+
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ProductionPlanServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ProductionPlanServiceImpl.java
index 72f27f6..0b39122 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ProductionPlanServiceImpl.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ProductionPlanServiceImpl.java
@@ -1,10 +1,20 @@
 package com.by4cloud.platformx.business.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.by4cloud.platformx.business.api.feign.RemoteFlowProcessService;
+import com.by4cloud.platformx.business.constant.FlowNameEnum;
+import com.by4cloud.platformx.business.entity.Contract;
 import com.by4cloud.platformx.business.entity.ProductionPlan;
 import com.by4cloud.platformx.business.mapper.ProductionPlanMapper;
 import com.by4cloud.platformx.business.service.ProductionPlanService;
+import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.flow.task.dto.ProcessInstanceParamDto;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
 /**
  * 鎺掍骇璁″垝
  *
@@ -12,5 +22,27 @@
  * @date 2026-05-07 10:27:42
  */
 @Service
+@RequiredArgsConstructor
 public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper, ProductionPlan> implements ProductionPlanService {
+
+    private final RemoteFlowProcessService remoteFlowProcessService;
+
+    @Override
+    public R startApproval(Long id) {
+        ProductionPlan plan = baseMapper.selectById(id);
+        //鍚姩娴佺▼
+        ProcessInstanceParamDto dto = new ProcessInstanceParamDto();
+        Map<String, Object> map = BeanUtil.beanToMap(plan);
+        dto.setParamMap(map);
+        dto.setFlowName(FlowNameEnum.鎺掍骇璁″垝瀹℃壒.name());
+
+        R r1 = remoteFlowProcessService.startProcessInstance(dto);
+        if (r1.getCode() == 1) {
+            return R.failed("娴佺▼鍚姩澶辫触");
+        }
+        plan.setStatus(1);
+        baseMapper.updateById(plan);
+        return R.ok();
+    }
+
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/SaleCreditServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/SaleCreditServiceImpl.java
new file mode 100644
index 0000000..7b7fa90
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/SaleCreditServiceImpl.java
@@ -0,0 +1,18 @@
+package com.by4cloud.platformx.business.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.by4cloud.platformx.business.entity.SaleCredit;
+import com.by4cloud.platformx.business.mapper.SaleCreditMapper;
+import com.by4cloud.platformx.business.service.SaleCreditService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 閿�鍞寕璐�
+ *
+ * @author wjli
+ * @date 2026-05-21 16:16:31
+ */
+@Service
+public class SaleCreditServiceImpl extends ServiceImpl<SaleCreditMapper, SaleCredit> implements SaleCreditService {
+
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/resources/mapper/SaleCreditMapper.xml b/platformx-business-finance-biz/src/main/resources/mapper/SaleCreditMapper.xml
new file mode 100644
index 0000000..7acfe9e
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/resources/mapper/SaleCreditMapper.xml
@@ -0,0 +1,31 @@
+<?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.SaleCreditMapper">
+
+  <resultMap id="saleCreditMap" type="com.by4cloud.platformx.business.entity.SaleCredit">
+        <id property="id" column="id"/>
+        <result property="contractId" column="contract_id"/>
+        <result property="contractNo" column="contract_no"/>
+        <result property="contractName" column="contract_name"/>
+        <result property="partyAId" column="party_a_id"/>
+        <result property="partyA" column="party_a"/>
+        <result property="creditCodeA" column="credit_code_a"/>
+        <result property="bankNameA" column="bank_name_a"/>
+        <result property="bankAccountA" column="bank_account_a"/>
+        <result property="partyBId" column="party_b_id"/>
+        <result property="partyB" column="party_b"/>
+        <result property="creditCodeB" column="credit_code_b"/>
+        <result property="bankNameB" column="bank_name_b"/>
+        <result property="bankAccountB" column="bank_account_b"/>
+        <result property="totalAmount" column="total_amount"/>
+        <result property="matterStr" column="matter_str"/>
+        <result property="outBoundIds" column="out_bound_ids"/>
+        <result property="compId" column="comp_id"/>
+        <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