From c865989f10e5a1ae4bb78831a879210fcdca2f83 Mon Sep 17 00:00:00 2001
From: 李白 <7387820+wjli_13439841639@user.noreply.gitee.com>
Date: 星期五, 29 五月 2026 11:30:28 +0800
Subject: [PATCH] 开票(开蓝票,红票,上传bip)

---
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/controller/FpInvoiceResultController.java        |  117 +
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/BipInvoiceService.java                   |   16 
 platformx-business-finance-biz/src/main/resources/mapper/BipInvoiceMapper.xml                                                         |   39 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/InvoiceServiceImpl.java                     | 1458 ++++++++++++++++++++
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoicingVo.java                          |  291 ++++
 platformx-business-finance-biz/src/main/resources/mapper/FileBipMapper.xml                                                            |   50 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResultItem.java                    |  110 +
 platformx-business-finance-biz/src/main/resources/mapper/FpInvoiceResultMapper.xml                                                    |   47 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FpInvoiceResultService.java              |   20 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FileBipServiceImpl.java             |   19 
 platformx-business-finance-biz/src/main/resources/mapper/FpInvoiceResultItemMapper.xml                                                |   50 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/BipInvoiceServiceImpl.java          |   24 
 platformx-business-finance-biz/pom.xml                                                                                                |   17 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FpInvoiceResultItemServiceImpl.java |   20 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FpInvoiceResultServiceImpl.java     |   22 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResult.java                        |  218 +++
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/BipHttpUtil.java                           |  308 ++++
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/RedConfirmVo.java                         |   64 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipTokenVo.java                           |    9 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/NumUtils.java                              |  305 ++++
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipResVo.java                             |   10 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/FileBip.java                              |   94 +
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FpInvoiceResultItemMapper.java            |   19 
 platformx-boot/src/main/resources/application-dev.yml                                                                                 |   27 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/InvoiceResultController.java                  |  353 ++++
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FileBipService.java                      |   17 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipInvoice.java                           |  232 +++
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FpInvoiceResultMapper.java                |   18 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FileBipMapper.java                        |   17 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/BipInvoiceMapper.java                     |   17 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FileUploadService.java                   |   31 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/BipApiEnum.java                            |   32 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/constant/FlowNameEnum.java                               |    5 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FpInvoiceResultItemService.java          |   17 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FileUploadServiceImpl.java          |  138 +
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/InvoiceService.java                              |   24 
 36 files changed, 4,248 insertions(+), 7 deletions(-)

diff --git a/platformx-boot/src/main/resources/application-dev.yml b/platformx-boot/src/main/resources/application-dev.yml
index 47ca879..6a99c07 100644
--- a/platformx-boot/src/main/resources/application-dev.yml
+++ b/platformx-boot/src/main/resources/application-dev.yml
@@ -38,18 +38,33 @@
 swagger:
   token-url: ${swagger.gateway}/admin/oauth2/token
 
-#bip 閰嶇疆
-bip:
-  url:
-  codes: 111111111111111111111111,222222222222222222
-  appKey:
-  appSecret:
+
 
 # 鏂囦欢涓婁紶閰嶇疆
 file:
   local:
     base-path: D:\\Users\\platformx\\Downloads\\img
 
+#bip 閰嶇疆
+bip:
+  url: ''
+  codes: 111111111111111111111111,222222222222222222
+  ip: https://bip01.res.jzeg.cn/
+  filePath: D:\test\
+  fontPath: /Users/kongdeqiang/Desktop/SIMSUN.TTC
+  appKey: 800b2805c5584f0abb8705acbe487dc5
+  appSecret: 59ba72c62a6a27203d7e517787a738be89ba55cb
+
+BWInvoice:
+  ip: https://einv01.res.jzeg.cn/post
+  kaipiao: ?method=baiwang.output.invoice.issue&version=1.0&requestId=
+  chaxun: ?method=baiwang.output.format.query&version=1.0&request_id=
+  redConfirmAdd: ?method=baiwang.output.redinvoice.add&version=1.0&requestId=
+  redConfirmSearch: ?method=baiwang.output.redinvoice.formlist&version=1.0&requestId=
+  search: ?method=baiwang.input.invoice.queryinvoicepool&version=1.0&requestId=
+  bind: ?method=baiwang.image.invoices.invoicemanageadd&version=1.0&requestId=
+  ocr: ?baiwang.image.invoices.recogcollect&version=1.0&requestId=
+
 # 5瀹跺崟浣峣d
 dept:
   smj: 2056555602756063234
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/constant/FlowNameEnum.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/constant/FlowNameEnum.java
index 5d82fae..78d88ee 100644
--- a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/constant/FlowNameEnum.java
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/constant/FlowNameEnum.java
@@ -11,6 +11,9 @@
 @Getter
 @AllArgsConstructor
 public enum FlowNameEnum {
-	鍚堝悓瀹℃壒("鍚堝悓瀹℃壒");
+	鍚堝悓瀹℃壒("鍚堝悓瀹℃壒"),
+	鎺掍骇璁″垝瀹℃壒("鎺掍骇璁″垝瀹℃壒");
 	private String name;
+
+
 }
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipInvoice.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipInvoice.java
new file mode 100644
index 0000000..f4928c1
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipInvoice.java
@@ -0,0 +1,232 @@
+package com.by4cloud.platformx.business.entity.invoice;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import com.by4cloud.platformx.common.data.mybatis.BaseModel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import jakarta.persistence.Table;
+import lombok.Data;
+import org.hibernate.annotations.Comment;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.util.Date;
+
+/**
+ * @author wjli
+ * @description
+ * @date 2026/4/29 10:51
+ **/
+@Data
+@Entity
+@org.hibernate.annotations.Table(appliesTo="bip_invoice",comment = "bip瀵瑰簲鍗曟嵁琛�")//bip瀵瑰簲鍗曟嵁琛�
+@jakarta.persistence.Table(name = "bip瀵瑰簲鍗曟嵁琛�")//bip瀵瑰簲鍗曟嵁琛�
+@Comment("bip瀵瑰簲鍗曟嵁琛�")
+public class BipInvoice extends BaseModel<BipInvoice> {
+
+	@Schema(description = "浼犲叆鍗曟嵁淇℃伅")
+	@Column(columnDefinition = "text comment '浼犲叆鍗曟嵁淇℃伅'")
+	private String invoice;
+
+	@Schema(description = "瀵瑰簲BIP绯荤粺缂栧彿")
+	@Column(columnDefinition = "varchar(128) comment '瀵瑰簲BIP绯荤粺缂栧彿'")
+	private String bipNumber;
+
+	@Schema(description = "涓婁紶鏃ユ湡")
+	@Column(columnDefinition="date comment '涓婁紶鏃ユ湡'")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date day;
+
+	@Schema(description = "鏆備及鏈堜唤")
+	@Column(columnDefinition="date comment '鏆備及鏈堜唤'")
+	@DateTimeFormat(pattern = "yyyy-MM")
+	@JsonFormat(pattern = "yyyy-MM")
+	private Date month;
+
+	@Schema(description = "鍟嗗搧ID")
+	@Column(columnDefinition = "int comment '鍟嗗搧ID'")
+	private Integer coalId;
+
+	@Schema(description = "缁撶畻瀹㈡埛ID")
+	@Column(columnDefinition = "int comment '缁撶畻瀹㈡埛ID'")
+	private Integer customerId;
+
+	@Schema(description = "鏀惰揣瀹㈡埛ID")
+	@Column(columnDefinition = "int comment '鏀惰揣瀹㈡埛ID'")
+	private Integer customerAddressId;
+//
+	@Schema(description = "鍗曚环")
+	@Column(columnDefinition = "double comment '鍗曚环'")
+	private Double price;
+
+	@Schema(description = "鏃犵◣鍗曚环")
+	@Column(columnDefinition = "double comment '鏃犵◣鍗曚环'")
+	private Double noTaxPrice;
+
+	@Schema(description = "鏁伴噺")
+	@Column(columnDefinition = "double comment '鏁伴噺'")
+	private Double tonnage;
+
+	@Schema(description = "鍚◣閲戦")
+	@Column(columnDefinition = "double comment '鍚◣閲戦'")
+	private Double money;
+//
+//
+
+	@Schema(description = "浼犲洖鍗曟嵁淇℃伅")
+	@Column(columnDefinition = "text comment '浼犲洖鍗曟嵁淇℃伅'")
+	private String resInvoice;
+
+	@Schema(description = "淇敼鍙戦�佸崟鎹俊鎭�")
+	@Column(columnDefinition = "text comment '淇敼鍙戦�佸崟鎹俊鎭�'")
+	private String updInvoice;
+
+	@Schema(description = "澶辫触淇℃伅")
+	@Column(columnDefinition = "VARCHAR(512) comment '澶辫触淇℃伅'")
+	private String message;
+
+	@Schema(description = "鍚堝悓缂栧彿")
+	@Column(columnDefinition = "VARCHAR(50) comment '鍚堝悓缂栧彿'")
+	private String contractNum;
+
+	@Schema(description = "淇敼鍙戦�佸崟鎹俊鎭�")
+	@Column(columnDefinition = "VARCHAR(512) comment '淇敼鍙戦�佸崟鎹俊鎭�'")
+	private String updMessage;
+
+	@Schema(description = "bip缂栧彿")
+	@Column(columnDefinition = "VARCHAR(32) comment 'bip缂栧彿'")
+	private String code;
+
+
+	@Schema(description = "bip鍐呴儴瀹㈠晢缂栧彿")
+	@Column(columnDefinition="VARCHAR(32) comment 'bip鍐呴儴瀹㈠晢缂栧彿'")
+	private String bipCompNumber;
+
+	@Schema(description = "杩愯緭鏂瑰紡 1鍦伴攢/2璺繍/3鑸硅繍")
+	@Column(columnDefinition = "char(1) comment '杩愯緭鏂瑰紡 1鍦伴攢/2璺繍/3鑸硅繍'")
+	private Integer trainType;
+
+	@Schema(description = "bip杩斿洖鐘舵�佷俊鎭�")
+	@Column(columnDefinition = "int comment 'bip杩斿洖鐘舵�佷俊鎭�'")
+	private Integer returnCode;
+
+	@Schema(description = "鍗曟嵁绫诲瀷 0缁撶畻鍗�1鏆備及")
+	@Column(columnDefinition = "char(1) comment '鍗曟嵁绫诲瀷 0缁撶畻鍗�1鏆備及'")
+	private Integer type;
+
+	@Schema(description = "鍗曟嵁绫诲瀷 0搴旀敹 1搴斾粯")
+	@Column(columnDefinition = "char(1) comment '鍗曟嵁绫诲瀷  0搴旀敹 1搴斾粯'")
+	private Integer invoiceType;
+
+	@Schema(description = "鍗曟嵁鏂瑰悜 1钃� -1绾�")
+	@Column(columnDefinition = "char(10) comment '鍗曟嵁鏂瑰悜 1钃� -1绾�'")
+	private Integer direction;
+
+	@Schema(description = "绾㈠啿鍗曟嵁ID")
+	@Column(columnDefinition = "int comment '绾㈠啿鍗曟嵁ID'")
+	private Long redInvoiceId;
+
+	@Schema(description = "绾㈠啿鎺夌殑鍗曟嵁鐘舵��")
+	@Column(columnDefinition = "VARCHAR(20) comment '绾㈠啿鎺夌殑鍗曟嵁鐘舵��'")
+	private String redInvoiceStatus;
+
+	@Schema(description = "绾㈠啿鎺夌殑鍗曟嵁杩斿洖淇℃伅")
+	@Column(columnDefinition = "VARCHAR(500) comment '绾㈠啿鎺夌殑鍗曟嵁杩斿洖淇℃伅'")
+	private String redInvoiceMessage;
+
+	@Schema(description = "涓荤粨绠楀崟ID")
+	@Column(columnDefinition = "int comment '涓荤粨绠楀崟ID'")
+	private Long allId;
+
+	@Schema(description = "瀵瑰簲姣忎釜缁撶畻鍗旾D")
+	@Column(columnDefinition = "int comment '瀵瑰簲姣忎釜缁撶畻鍗旾D'")
+	private Long railwayEntrustId;
+
+	@Schema(description = "bip鐘舵��0:寮�绔嬨��1:瀹℃壒涓��2:宸插鎵广��3:缁堟銆�4:宸查┏鍥�")
+	@Column(columnDefinition = "int comment 'bip鐘舵��0:寮�绔嬨��1:瀹℃壒涓��2:宸插鎵广��3:缁堟銆�4:宸查┏鍥�'")
+	private Integer verifyState;
+
+
+	@Schema(description = "鐘舵��0:寮�绔嬨��1:瀹℃壒涓��2:宸插鎵广��3:缁堟銆�4:宸查┏鍥�-1:宸插垹闄�")
+	@Column(columnDefinition = "int comment 'bip鐘舵��0:寮�绔嬨��1:瀹℃壒涓��2:宸插鎵广��3:缁堟銆�4:宸查┏鍥�-1:宸插垹闄�'")
+	private Integer status;
+
+	@Schema(description = "bip杩斿洖鐘舵�佺爜")
+	@Column(columnDefinition = "VARCHAR(20) comment 'bip杩斿洖鐘舵�佺爜'")
+	private String resStatus;
+
+	@Schema(description = "鍒犻櫎杩斿洖淇℃伅")
+	@Column(columnDefinition = "VARCHAR(200) comment '鍒犻櫎杩斿洖淇℃伅'")
+	private String delMessage;
+
+	@Transient
+	@TableField(exist = false)
+	private Integer isTs;//0宸叉帹閫�1鏈帹閫�
+
+	@Transient
+	@TableField(exist = false)
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date startDate;
+
+	@Transient
+	@TableField(exist = false)
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date endDate;
+
+
+	/**
+	 * 瀹㈡埛鍚嶇О
+	 */
+	@Transient
+	@TableField(exist = false)
+	private String customerName;
+
+	public String getCustomerName(){
+		/*if (customerId != null){
+			Customer customer = RedisCacheYunXiaoHelper.getInstance().getCustomerById(customerId);
+			if (customer != null){
+				this.customerName = customer.getCustomerName();
+			}
+		}*/
+		return this.customerName;
+	}
+
+	/**
+	 * 瀹㈡埛鍚嶇О
+	 */
+	@Transient
+	@TableField(exist = false)
+	private String coalName;
+
+	public String getCoalName() {
+		/*if (coalId != null) {
+			Coal c = RedisCacheYunXiaoHelper.getInstance().getCoalById(coalId);
+			coalName = c.getCoalName();
+		}*/
+		return coalName;
+	}
+	/**
+	 * 鏀惰揣瀹㈡埛鍚嶇О
+	 */
+	@Transient
+	@TableField(exist = false)
+	private String customerAddressName;
+
+	public String getCustomerAddressName() {
+		/*if (customerAddressId != null) {
+			Customer customer = RedisCacheYunXiaoHelper.getInstance().getCustomerById(customerAddressId);
+			if (customer != null) {
+				this.customerAddressName = customer.getCustomerName();
+			}
+		}*/
+		return this.customerAddressName;
+	}
+
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipResVo.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipResVo.java
new file mode 100644
index 0000000..881c83f
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipResVo.java
@@ -0,0 +1,10 @@
+package com.by4cloud.platformx.business.entity.invoice;
+
+import lombok.Data;
+
+@Data
+public class BipResVo<T> {
+    private String code;
+    private String message;
+    private T data;
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipTokenVo.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipTokenVo.java
new file mode 100644
index 0000000..6863f09
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipTokenVo.java
@@ -0,0 +1,9 @@
+package com.by4cloud.platformx.business.entity.invoice;
+
+import lombok.Data;
+
+@Data
+public class BipTokenVo {
+    private String access_token;
+    private long expire;
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/FileBip.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/FileBip.java
new file mode 100644
index 0000000..e096e25
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/FileBip.java
@@ -0,0 +1,94 @@
+package com.by4cloud.platformx.business.entity.invoice;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.by4cloud.platformx.common.data.mybatis.BaseModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.hibernate.annotations.Comment;
+import jakarta.persistence.Table;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+/**
+ * @author kdq
+ * @version 1.0.0
+ * @ClassName FileBip.java
+ * @Description TODO
+ * @createTime 2024骞�09鏈�06鏃� 07:55:00
+ */
+@Data
+//@TableName("file_bip")
+@Entity
+//@Table(name = "file_bip")
+@Comment("bip鐢靛瓙褰卞儚琛�")
+public class FileBip extends BaseModel<FileBip> {
+
+	@Schema(description = "鏂囦欢id")
+	@Column(columnDefinition="VARCHAR(500) comment '鏂囦欢id'")
+	private String fileId;
+
+	@Schema(description = "鏂囦欢璺緞")
+	@Column(columnDefinition="VARCHAR(500) comment '鏂囦欢璺緞'")
+	private String filePath;
+
+	@Schema(description = "鏂囦欢鏈湴璺緞")
+	@Column(columnDefinition="VARCHAR(500) comment '鏂囦欢鏈湴璺緞'")
+	private String fileLocalPath;
+
+	@Schema(description = "鏂囦欢鍒涘缓鏃堕棿鎴�")
+	@Column(columnDefinition="VARCHAR(500) comment '鏂囦欢鍒涘缓鏃堕棿鎴�'")
+	private String fileCTime;
+
+	@Schema(description = "鏂囦欢鏇存柊鏃堕棿鎴�")
+	@Column(columnDefinition="VARCHAR(500) comment '鏂囦欢鏇存柊鏃堕棿鎴�'")
+	private String fileUTime;
+
+	@Schema(description = "bip绯荤粺id")
+	@Column(columnDefinition="VARCHAR(500) comment 'bip绯荤粺id'")
+	private String fileBipId;
+
+	@Schema(description = "鏂囦欢鍚庣紑")
+	@Column(columnDefinition="VARCHAR(500) comment '鏂囦欢鍚庣紑'")
+	private String fileExtension;
+
+	@Schema(description = "鏂囦欢澶у皬")
+	@Column(columnDefinition="double comment '鏂囦欢澶у皬'")
+	private double fileSize;
+
+	@Schema(description = "鏂囦欢澶у皬鏂囨湰")
+	@Column(columnDefinition="VARCHAR(500) comment '鏂囦欢澶у皬鏂囨湰'")
+	private String fileSizeText;
+
+	@Schema(description = "鏂囦欢鍚嶇О")
+	@Column(columnDefinition="VARCHAR(500) comment '鏂囦欢鍚嶇О'")
+	private String fileName;
+
+	@Schema(description = "鏂囦欢鍏ㄧО")
+	@Column(columnDefinition="VARCHAR(500) comment '鏂囦欢鍏ㄧО'")
+	private String name;
+
+	@Schema(description = "鐢ㄦ埛id")
+	@Column(columnDefinition="VARCHAR(500) comment '鐢ㄦ埛id'")
+	private String yhtUserId;
+
+	@Schema(description = "绉熸埛id")
+	@Column(columnDefinition="VARCHAR(500) comment '绉熸埛id'")
+	private String tenantId;
+
+	@Schema(description = "绛惧悕")
+	@Column(columnDefinition="VARCHAR(500) comment '绛惧悕'")
+	private String sign;
+
+	@Schema(description = "澶嶅埗")
+	@Column(columnDefinition="VARCHAR(500) comment '澶嶅埗'")
+	private String copy;
+
+	@Schema(description = "缁撶畻鍗昳d")
+	@Column(columnDefinition="int comment '缁撶畻鍗昳d'")
+	private Long entrustId;
+
+	@Schema(description = "缁撶畻鍗曠紪鍙�")
+	@Column(columnDefinition="VARCHAR(500) comment '缁撶畻鍗曠紪鍙�'")
+	private String entrustCode;
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResult.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResult.java
new file mode 100644
index 0000000..2a62569
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResult.java
@@ -0,0 +1,218 @@
+package com.by4cloud.platformx.business.entity.invoice;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.by4cloud.platformx.common.data.mybatis.BaseModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.hibernate.annotations.Comment;
+import jakarta.persistence.Table;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+/**
+ * @author kdq
+ * @version 1.0.0
+ * @ClassName InvoiceResult.java
+ * @Description TODO
+ * @createTime 10024骞�11鏈�05鏃� 17:10:00
+ */
+@Data
+@Entity
+@org.hibernate.annotations.Table(appliesTo="fp_invoice_result",comment = "寮�鍏峰彂绁ㄨ繑鍥炲��")//缁欒〃鍔犳敞閲�
+@jakarta.persistence.Table(name = "fp_invoice_result")//寮�鍏峰彂绁ㄨ繑鍥炲��
+@Comment("寮�鍏峰彂绁ㄨ繑鍥炲��")
+public class InvoiceResult extends BaseModel<InvoiceResult> {
+	@Schema(description = "閿�鍞寕璐d")
+	@Column(columnDefinition = "bigint default null comment '閿�鍞寕璐d'")
+	private Long saleCreditId;
+
+	@Schema(description = "鎺ㄩ�乥ip")
+	@Column(columnDefinition = "int comment '鎺ㄩ�乥ip'")
+	private Integer pushBip;
+
+	@Schema(description = "鎺ㄩ�乥ip搴斾粯")
+	@Column(columnDefinition = "int comment '鎺ㄩ�乥ip搴斾粯'")
+	private Integer pushBipyf;
+
+	@Schema(description = "鎺ㄩ�乥ip绾㈢エ")
+	@Column(columnDefinition = "int comment '鎺ㄩ�乥ip绾㈢エ'")
+	private Integer pushRedBip;
+
+	@Schema(description = "鎺ㄩ�乥ip绾㈢エ搴斾粯")
+	@Column(columnDefinition = "int comment '鎺ㄩ�乥ip绾㈢エ搴斾粯'")
+	private Integer pushRedBipyf;
+
+	@Schema(description = "鏄惁鎴愬姛")
+	@Column(columnDefinition = "tinyint(1) comment '鏄惁鎴愬姛'")
+	private Boolean success;
+
+	@Schema(description = "閿�鏂圭◣鍙�")
+	@Column(columnDefinition = "varchar(100) comment '閿�鏂圭◣鍙�'")
+	private String xTaxNo;
+
+	@Schema(description = "閿�鏂瑰悕绉�")
+	@Column(columnDefinition = "varchar(100) comment '閿�鏂瑰悕绉�'")
+	private String xName;
+
+	@Schema(description = "璐柟绋庡彿")
+	@Column(columnDefinition = "varchar(100) comment '璐柟绋庡彿'")
+	private String gTaxNo;
+
+	@Schema(description = "璐柟鍚嶇О")
+	@Column(columnDefinition = "varchar(100) comment '璐柟鍚嶇О'")
+	private String gName;
+
+	@Schema(description = "閿�鏂筩ode")
+	@Column(columnDefinition = "varchar(100) comment '閿�鏂筩ode'")
+	private String xOrgCode;
+
+	@Schema(description = "璇锋眰id")
+	@Column(columnDefinition = "varchar(50) comment '璇锋眰id'")
+	private String requestId;
+
+	@Schema(description = "鍙戠エ涓嬭浇璇锋眰id")
+	@Column(columnDefinition = "varchar(50) comment '鍙戠エ涓嬭浇璇锋眰id'")
+	private String fpRequestId;
+
+	@Schema(description = "璇锋眰缁撴灉")
+	@Column(columnDefinition = "varchar(100) comment '璇锋眰缁撴灉'")
+	private String result;
+
+	@Schema(description = "璇锋眰缁撴灉")
+	@Column(columnDefinition = "varchar(100) comment '璇锋眰缁撴灉'")
+	private String message;
+
+	@Schema(description = "璇锋眰鎺ュ彛")
+	@Column(columnDefinition = "varchar(100) comment '璇锋眰鎺ュ彛'")
+	private String methodName;
+
+	@Schema(description = "椤圭洰鍚嶇О")
+	@Column(columnDefinition = "varchar(100) comment '椤圭洰鍚嶇О'")
+	private String projectName;
+
+	@Schema(description = "钃濈エ鍚堣閲戦")
+	@Column(columnDefinition = "double comment '钃濈エ鍚堣閲戦'")
+	private Double originInvoiceTotalPrice;
+
+	@Schema(description = "寮�绁ㄦ祦姘村彿")
+	@Column(columnDefinition = "varchar(100) comment '寮�绁ㄦ祦姘村彿'")
+	private String serialNo;
+
+	@Schema(description = "鍚堣绋庨")
+	@Column(columnDefinition = "double comment '鍚堣绋庨'")
+	private Double invoiceTotalTax;
+
+	@Schema(description = "鍚堣閲戦")
+	@Column(columnDefinition = "double comment '鍚堣閲戦'")
+	private Double invoiceTotalPrice;
+
+	@Schema(description = "钃濈エ鍚堣绋庨")
+	@Column(columnDefinition = "double comment '钃濈エ鍚堣绋庨'")
+	private Double originInvoiceTotalTax;
+
+	@Schema(description = "浠风◣鍚堣")
+	@Column(columnDefinition = "double comment '浠风◣鍚堣'")
+	private Double invoiceTotalPriceTax;
+
+	@Schema(description = "涓績code")
+	@Column(columnDefinition = "varchar(100) comment '涓績code'")
+	private String taxControlCode;
+
+	@Schema(description = "鍙戠エurl")
+	@Column(columnDefinition = "varchar(100) comment '鍙戠エurl'")
+	private String eInvoiceUrl;
+
+	@Schema(description = "鍙戠エ鍚嶇О")
+	@Column(columnDefinition = "varchar(100) comment '鍙戠エ鍚嶇О'")
+	private String eInvoiceName;
+
+	@Schema(description = "鍙戠エ鏍搁獙缂栧彿")
+	@Column(columnDefinition = "varchar(100) comment '鍙戠エ鏍搁獙缂栧彿'")
+	private String invoiceCheckCode;
+
+	@Schema(description = "鍙戠エqrCode")
+	@Column(columnDefinition = "varchar(1000) comment '鍙戠エqrCode'")
+	private String invoiceQrCode;
+
+	@Schema(description = "鍙戠エ鍙�")
+	@Column(columnDefinition = "varchar(50) comment '鍙戠エ鍙�'")
+	private String invoiceNo;
+
+	@Schema(description = "钃濈エ鍙戠エ鍙�")
+	@Column(columnDefinition = "varchar(50) comment '钃濈エ鍙戠エ鍙�'")
+	private String originalInvoiceNo;
+
+	@Schema(description = "绾㈢エ寮�绁ㄧ紪鍙�")
+	@Column(columnDefinition = "varchar(100) comment '绾㈢エ寮�绁ㄧ紪鍙�'")
+	private String redInvoiceNo;
+
+	@Schema(description = "绾㈢エ寮�绁ㄥ師鍥�")
+	@Column(columnDefinition = "varchar(100) comment '绾㈢エ寮�绁ㄥ師鍥�'")
+	private String redInvoiceLabel;
+
+	@Schema(description = "寮�绁ㄦ椂闂�")
+	@Column(columnDefinition = "varchar(100) comment '鍙戠エ鍙�'")
+	private String invoiceDate;
+
+	@Schema(description = "绾㈢エ寮�绁ㄦ椂闂�")
+	@Column(columnDefinition = "varchar(100) comment '绾㈢エ寮�绁ㄦ椂闂�'")
+	private String redInvoiceDate;
+
+	@Schema(description = "褰曞叆鏃堕棿")
+	@Column(columnDefinition = "varchar(100) comment '褰曞叆鏃堕棿'")
+	private String entryDate;
+
+	@Schema(description = "褰曞叆韬唤")
+	@Column(columnDefinition = "varchar(100) comment '褰曞叆韬唤'")
+	private String entryIdentity;
+
+	@Schema(description = "鏈夋晥鏍囧織")
+	@Column(columnDefinition = "varchar(100) comment '鏈夋晥鏍囧織'")
+	private String validFlag;
+
+	@Schema(description = "鏄惁绾歌川鍙戠エ")
+	@Column(columnDefinition = "varchar(100) comment '鏄惁绾歌川鍙戠エ'")
+	private String originInvoiceIsPaper;
+
+	@Schema(description = "钃濈エ绫诲瀷")
+	@Column(columnDefinition = "varchar(100) comment '钃濈エ绫诲瀷'")
+	private String originInvoiceType;
+
+	@Schema(description = "钃濈エ寮�绁ㄦ椂闂�")
+	@Column(columnDefinition = "varchar(100) comment '钃濈エ寮�绁ㄦ椂闂�'")
+	private String originalInvoiceDate;
+
+	@Schema(description = "寮�绁ㄧ被鍨�")
+	@Column(columnDefinition = "varchar(100) comment '寮�绁ㄧ被鍨�'")
+	private String invoiceTyCode;
+
+	@Schema(description = "鍏宠仈缁撶畻鍗�")
+	@Column(columnDefinition = "varchar(100) comment '鍏宠仈缁撶畻鍗�'")
+	private String entrustCode;
+
+	@Schema(description = "鏈夋棤鍏卞悓璐拱鏂�")
+	@Column(columnDefinition = "varchar(100) comment '鏈夋棤鍏卞悓璐拱鏂�'")
+	private String mulPurchaserMark;
+
+	@Schema(description = "绾㈠瓧纭鍗昒UID")
+	@Column(columnDefinition = "varchar(100) comment '绾㈠瓧纭鍗昒UID'")
+	private String redConfirmUuid;
+
+	@Schema(description = "绾㈠瓧纭鍗曠姸鎬�")
+	@Column(columnDefinition = "varchar(100) comment '绾㈠瓧纭鍗曠姸鎬�'")
+	private String confirmState;
+
+	@Schema(description = "绋庡眬纭鍗冲紑鏍囧織")
+	@Column(columnDefinition = "varchar(100) comment '绋庡眬纭鍗冲紑鏍囧織'")
+	private String confirmBillingMark;
+
+	@Schema(description = "纭绾㈢エ鏍囧織")
+	@Column(columnDefinition = "varchar(100) comment '纭绾㈢エ鏍囧織'")
+	private String alreadyRedInvoiceFlag;
+
+
+
+
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResultItem.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResultItem.java
new file mode 100644
index 0000000..dc02a98
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResultItem.java
@@ -0,0 +1,110 @@
+package com.by4cloud.platformx.business.entity.invoice;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.by4cloud.platformx.common.data.mybatis.BaseModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.hibernate.annotations.Comment;
+import jakarta.persistence.Table;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+/**
+ * @author kdq
+ * @version 1.0.0
+ * @ClassName InvoiceResultItem.java
+ * @Description TODO
+ * @createTime 2024骞�11鏈�28鏃� 10:45:00
+ */
+@Data
+@Entity
+@org.hibernate.annotations.Table(appliesTo="fp_invoice_result_item",comment = "寮�鍏峰彂绁ㄨ繑鍥炲�兼槑缁嗚")//寮�鍏峰彂绁ㄨ繑鍥炲�兼槑缁嗚
+@jakarta.persistence.Table(name = "fp_invoice_result_item")//寮�鍏峰彂绁ㄨ繑鍥炲�兼槑缁嗚
+@Comment("寮�鍏峰彂绁ㄨ繑鍥炲�兼槑缁嗚")
+public class InvoiceResultItem extends BaseModel<InvoiceResultItem> {
+
+	@Schema(description = "杩斿洖鍊糹d")
+	@Column(columnDefinition = "int comment '杩斿洖鍊糹d'")
+	private Long resultId;
+
+	@Schema(description = "鍘熺エ鎹")
+	@Column(columnDefinition = "int comment '鍘熺エ鎹'")
+	private Integer originalInvoiceDetailNo;
+
+	@Schema(description = "绁ㄦ嵁琛�")
+	@Column(columnDefinition = "int comment '绁ㄦ嵁琛�'")
+	private Integer goodsLineNo;
+
+	@Schema(description = "鍟嗗搧缂栧彿")
+	@Column(columnDefinition = "varchar(100) comment '鍟嗗搧缂栧彿'")
+	private String goodsCode;
+
+	@Schema(description = "鍟嗗搧绫诲瀷")
+	@Column(columnDefinition = "varchar(100) comment '鍟嗗搧绫诲瀷'")
+	private String goodsType;
+
+	@Schema(description = "鍟嗗搧鍚嶇О")
+	@Column(columnDefinition = "varchar(100) comment '鍟嗗搧鍚嶇О'")
+	private String goodsName;
+
+	@Schema(description = "鐓ょ鍚嶇О")
+	@Column(columnDefinition = "varchar(100) comment '鐓ょ鍚嶇О'")
+	private String coalName;
+
+	@Schema(description = "鍏宠仈缁撶畻鍗�")
+	@Column(columnDefinition = "varchar(100) comment '鍏宠仈缁撶畻鍗�'")
+	private String entrustCode;
+
+	@Schema(description = "鍟嗗搧绠�绉�")
+	@Column(columnDefinition = "varchar(100) comment '鍟嗗搧绠�绉�'")
+	private String goodsSimpleName;
+
+	@Schema(description = "椤圭洰鍚嶇О")
+	@Column(columnDefinition = "varchar(100) comment '椤圭洰鍚嶇О'")
+	private String projectName;
+
+	@Schema(description = "鍗曚綅")
+	@Column(columnDefinition = "varchar(100) comment '鍗曚綅'")
+	private String goodsUnit;
+
+	@Schema(description = "鍗曚环")
+	@Column(columnDefinition = "double comment '鍗曚綅'")
+	private Double goodsPrice;
+
+	@Schema(description = "鏁伴噺")
+	@Column(columnDefinition = "double comment '鏁伴噺'")
+	private Double goodsQuantity;
+
+	@Schema(description = "鍟嗗搧閲戦")
+	@Column(columnDefinition = "double comment '鍟嗗搧閲戦'")
+	private Double goodsTotalPrice;
+
+	@Schema(description = "绋庣巼")
+	@Column(columnDefinition = "double comment '绋庣巼'")
+	private Double goodsTaxRate;
+
+	@Schema(description = "绋庨")
+	@Column(columnDefinition = "double comment '绋庨'")
+	private Double goodsTotalTax;
+
+	@Schema(description = "鏄惁鍚堝苟")
+	@Column(columnDefinition = "varchar(10) comment '绋庨'")
+	private String goodsLineNature;
+
+	@Schema(description = "瑙勬牸鍨嬪彿")
+	@Column(columnDefinition = "varchar(50) comment '瑙勬牸鍨嬪彿'")
+	private String goodsSpecification;
+
+	@Schema(description = "鍚◣鏍囧織")
+	@Column(columnDefinition = "varchar(10) comment '鍚◣鏍囧織'")
+	private String priceTaxMark;
+
+	@Schema(description = "绫诲埆")
+	@Column(columnDefinition = "varchar(10) comment '鐓ょ绫诲埆'")
+	private String coalType;
+
+	@Schema(description = "闀垮崗鏃堕棿")
+	@Column(columnDefinition = "varchar(10) comment '闀垮崗鏃堕棿'")
+	private String agreementTerm;
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoicingVo.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoicingVo.java
new file mode 100644
index 0000000..c8db56c
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoicingVo.java
@@ -0,0 +1,291 @@
+package com.by4cloud.platformx.business.entity.invoice;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author kdq
+ * @version 1.0.0
+ * @ClassName InvoicingVo.java
+ * @Description TODO
+ * @createTime 2024骞�10鏈�08鏃� 11:16:00
+ */
+@Data
+public class InvoicingVo {//鍙戠エ寮�鍏�
+	private Long saleCreditId;
+	private String taxNo; //绋庡彿
+	private String entrustCode; //缁撶畻鍗曞彿
+	private Integer fatherEntrustId; //鐖剁粨绠楀崟id
+	private Integer settlementPathId; //缁撶畻璺緞id
+	private Integer sort; //鎺掑簭
+	private String ledgerName; //閿�鏂瑰悕绉�
+	private String taxUserName;//鐧诲綍鍚�
+	private String invoiceTerminalCode;//寮�绁ㄧ粓绔唬鐮�
+	private Boolean isSplit;//鏄惁闇�瑕佹媶鍒嗗紑鍏凤紝榛樿涓嶆媶鍒�
+	private String orgCode;//缁勭粐鏈烘瀯缂栫爜
+	private String taxDiskNo;//璁惧缂栧彿
+	private Boolean formatGenerate;//鏄惁闇�瑕佺敓鎴愮増寮忚繑鍥炵増寮忛摼鎺�(true / false)
+	private Boolean formatPushType;// 鐗堝紡鐢熸垚鏄惁鎺ㄩ��(true / false)
+	/**
+	 * 鍊间负锛�1/0 1 闇�瑕佽ˉ鍏� 0涓嶉渶瑕佽ˉ鍏紝榛樿涓�0锛夋槸鍚︽牴鎹鎴风紪鐮侊紝璐柟绋庡彿锛岃喘鏂瑰悕绉版煡璇㈠鎴蜂俊鎭ˉ鍏ㄦ湭濉啓鐨勮喘
+	 * 鏂逛俊鎭紙璐柟绋庡彿锛岃喘鏂瑰悕绉帮紝璐柟鍦板潃鐢佃瘽锛岃喘鏂归摱琛岃处鍙凤紝閭锛屾墜鏈猴級
+	 */
+	private String completionCustom;
+	/**
+	 * 寮�鍏疯姹傜被鍨嬶細isAsync 0 鍚屾 1 寮傛 榛樿鍚屾寮�鍏凤紙浠呮敮鎸乺pa锛�
+	 */
+	private String isAsync;
+	/**
+	 * 鏄惁杩斿洖钃濈エ宸茬孩鍐茬孩绁ㄤ俊鎭紝0鍚︼紝1鏄紝榛樿涓�0锛堜粎鏀寔绋庢帶鍙戠エ锛�
+	 */
+	private String isReturnRedInfo;
+	private InvoicingVoInfo data;
+
+	@Data
+	public static class InvoicingVoInfo {
+		/**
+		 * 鍙戠エ绫诲瀷浠g爜, 004锛氬鍊肩◣涓撶敤鍙戠エ锛�007锛氬鍊肩◣鏅�氬彂绁紱026锛氬鍊肩◣鐢靛瓙鍙戠エ锛�025锛氬鍊肩◣鍗峰紡鍙戠エ锛�028:澧炲�肩◣鐢靛瓙涓撶敤鍙戠エ
+		 *  01:鍏ㄧ數鍙戠エ(澧炲�肩◣涓撶敤鍙戠エ) 02:鍏ㄧ數鍙戠エ(鏅�氬彂绁�)
+		 */
+		private String invoiceTypeCode;
+		/**
+		 * 鏁扮數绾歌川鍙戠エ鏍囧織锛孻锛氭槸锛孨锛氬惁銆傜◣鎺х被鍙戠エ寮�鍏蜂笉鏍¢獙姝ゅ瓧娈碉紱鏆傚彧鏀寔鐢ㄦ暟鐢电數绁ㄧ孩鍐叉暟鐢电焊绁�
+		 */
+		private String paperInvoiceFlag;
+		/**
+		 * 閫夋嫨绾歌川鍙戠エ鏍囧織涓篩鏃讹紝绾哥エ绫诲瀷蹇呭~銆傜エ绉嶄负 鏅�氬彂绁�02鏃跺彲浼狅細 04 2016鐗堝鍊肩◣鏅�氬彂绁紙浜岃仈鎶樺彔绁級锛� 052016鐗堝鍊肩◣鏅�氬彂绁紙浜旇仈鎶樺彔绁�);
+		 * 绁ㄧ涓� 澧炲�肩◣涓撶敤鍙戠エ01鍙紶锛� 1130 澧炲�肩◣涓撶敤鍙戠エ锛堜腑鏂囦笁鑱旀棤閲戦闄愬埗鐗堬級 锛�1140 澧炲�肩◣涓撶敤鍙戠エ锛堜腑鏂囧洓鑱旀棤閲戦闄愬埗鐗堬級 1160澧炲�硷紝绋庝笓鐢ㄥ彂绁紙涓枃鍏仈鏃犻噾棰濋檺鍒剁増锛� 锛�
+		 * 1170 澧炲�肩◣涓撶敤鍙戠エ锛堜腑鏂囦竷鑱旀棤閲戦闄愬埗鐗堬級
+		 */
+		private String paperInvoiceTypeCode;
+		/**
+		 * 寮�绁ㄧ被鍨� 0:姝f暟鍙戠エ锛堣摑绁級 1锛氳礋鏁板彂绁紙绾㈢エ锛夐粯璁�0
+		 */
+		private String invoiceType;
+		/**
+		 * 鐗规畩绁ㄧ鏍囧織锛� 00锛氭櫘閫氬彂绁紱01锛氬啘浜у搧閿�鍞紱02锛氬啘浜у搧鏀惰喘锛�08锛氭垚鍝佹补 鏈哄姩杞︼紙榛樿鏄�00鏅�氬彂绁級;16鐭夸骇鍝侊紱03绋�鍦燂紱 鍏ㄧ數绫诲彂绁ㄧ壒娈婄エ绉嶆爣蹇楋細01 鎴愬搧娌瑰彂绁紱
+		 * 03锛氬缓绛戞湇鍔″彂绁紱04锛氳揣鐗╄繍杈撴湇鍔″彂绁紱05锛氫笉鍔ㄤ骇閿�鍞湇鍔″彂绁紱06锛氫笉鍔ㄤ骇绉熻祦鏈嶅姟鍙戠エ锛�09锛氭梾瀹㈣繍杈撳彂绁紱12锛氳嚜浜у啘浜у搧閿�鍞紱
+		 * 13锛氭嫋鎷夋満鍜岃仈鍚堟敹鍓叉満锛�14锛氭満鍔ㄨ溅锛�15锛氫簩鎵嬭溅锛�16锛氬啘浜у搧鏀惰喘锛�31锛氫簩鎵嬭溅*锛�24锛氭姤搴熶骇鍝佹敹璐紱02锛氱█鍦燂紱17锛氬厜浼忔敹璐紱07锛氫唬鏀惰溅鑸圭◣锛�32锛氱數瀛愮儫锛�18鍗风儫
+		 */
+		private String invoiceSpecialMark;
+		/**
+		 * 鎴愬搧娌瑰崟浠疯繃浣庢槸鍚︾‘璁ゅ紑鍏锋爣璇嗭細Y 鏄紱 N 鍚� 涓虹┖鏃堕粯璁ゅ�间负N 锛堝娉細涓撶エ鍗曚环杩囦綆寮哄埗寮�绁ㄤ細璁板叆寮傚父鍙戠エ锛岀孩鍐查渶瑕佸湪鐢靛瓙绋庡姟灞�鐢宠瑙i櫎鐒跺悗鍐嶇孩鍐诧紱鏅エ鍗曚环杩�
+		 * 浣庡紑鍏锋垚鍔熷彂绁ㄥ彲浠ユ甯哥孩鍐诧級
+		 */
+		private String  isConfirmIssue;
+		/**
+		 * 绋庡眬浜屾纭鏄惁缁х画寮�绁紝1锛氭槸锛�0锛氬惁锛涳紙03寤虹瓚鏈嶅姟鍙戠エ锛屽缓绛戞湇鍔″彂鐢熷湴鍜岄攢鏂规敞鍐屽湴鍧�涓嶅悓鏃舵槸鍚︾户缁紑绁�,24鎶ュ簾浜у搧鏀惰喘闇�瑕佺即绾宠喘缃◣鐨勬彁绀烘槸鍚︾户缁紑鍏�
+		 * 锛夛紝鑻ヤ笉浼犲�硷紝绯荤粺榛樿鎸夌収鈥滄槸鈥濆鐞�;
+		 */
+		private String  confirmIssue;
+		/**
+		 * 寰佺◣鏂瑰紡锛� 0锛氭櫘閫氬緛绋庯紱2锛氬樊棰濆緛绋庯紙榛樿鏄�0鏅�氬緛绋庯級
+		 */
+		private String  taxationMethod;
+		/**
+		 * 宸寰佺◣鏍囩锛�01 鍏ㄩ寮�绁ㄣ�� 02 宸寮�绁� 锛涘彂绁ㄧ被鍨嬩唬鐮佷负01锛�02鏃朵笖寰佺◣鏂瑰紡涓�2蹇呭~
+		 */
+		private String  taxationLabel;
+		/**
+		 * 鍑忔寜寰佺◣鏍囪瘑锛�01锛氫釜浜哄嚭绉熶綇鎴匡紱03锛氶攢鍞嚜宸变娇鐢ㄨ繃鐨勫浐瀹氳祫浜э紱05锛氫綇鎴跨璧併�傞粯璁や负绌�,绌轰唬琛ㄦ棤銆�
+		 */
+		private String  reducedTaxCode;
+		/**
+		 * 0锛氭棤娓呭崟锛�1锛氬甫娓呭崟锛堜笓鏅エ鍙戠エ鏄庣粏澶т簬绛変簬8琛屽繀椤诲甫娓呭崟锛夛細澶т簬8琛屽繀椤讳负娓呭崟绁�(鐢靛瓙绁ㄥ彧鑳戒负闈炶鍗曠エ)锛堥粯璁ゆ槸0鏃犳竻鍗曪級锛屽彂绁ㄧ被鍨嬩唬鐮佷负01锛�02鏃惰瀛楁鏃�
+		 */
+		private String  invoiceListMark;
+		/**
+		 * 鍚◣鏍囧織锛� 0锛氫笉鍚◣锛�1锛氬惈绋庯紙榛樿涓嶅惈绋庯級
+		 */
+		private String  priceTaxMark;
+		/**
+		 * 寮�绁ㄦ祦姘村彿锛� 鍞竴鏍囧織寮�绁ㄨ姹傘�傛敮鎸佹暟瀛楀瓧姣嶄笅鍒掔嚎缁勫悎銆�
+		 */
+		private String  serialNo;
+		/**
+		 * 鍙戠エ璇锋眰娴佹按鍙�
+		 */
+		private String  orderNo;
+		/**
+		 * 璐柟鍗曚綅绋庡彿锛� invoiceTypeCode=004銆�028銆�01锛堝鍊肩◣涓撶敤鍙戠エ銆佸鍊肩◣鐢靛瓙涓撶敤鍙戠エ銆佸叏鐢靛彂绁紙澧炲�肩◣涓撶敤鍙戠エ锛夛級寮�鍏锋椂蹇呬紶 invoiceSpecialMark=16|17锛堝啘浜у搧鏀惰喘銆佸厜浼忔敹璐級寮�鍏锋椂蹇呬紶
+		 */
+		private String  buyerTaxNo;
+		/**
+		 * 璐柟鍗曚綅鍚嶇О 鍏ㄧ數涓�100涓瓧绗�
+		 */
+		private String  buyerName;
+		/**
+		 * 璐柟鍦板潃鍙婄數璇濓紝 澧炲�肩◣涓撶敤鍙戠エ寮�鍏锋椂蹇呭~锛屽彂绁ㄧ被鍨嬩唬鐮佷负01銆�02鏃惰瀛楁鎷嗗垎涓哄湴鍧�鐢佃瘽涓や釜瀛楁
+		 */
+		private String  buyerAddressPhone;
+		/**
+		 * 璐柟寮�鎴疯鍙婅处鍙凤紝 澧炲�肩◣涓撶敤鍙戠エ寮�鍏锋椂蹇呭~锛屽彂绁ㄧ被鍨嬩唬鐮佷负01銆�02鏃惰瀛楁鎷嗗垎涓洪摱琛屽悕绉般�佽处鍙蜂袱涓瓧娈�
+		 */
+		private String  buyerBankAccount;
+		/**
+		 * 寮�绁ㄤ汉锛岀◣绁ㄩ�夊~锛屽彇鍊奸�昏緫锛氬鏋滅粓绔湁鍊煎彇缁堢锛屽鏋滄病鏈夊幓鏈烘瀯鑾峰彇锛屽鏋滈兘娌℃湁浼氳嚜鍔ㄨ幏鍙栨満鏋勪笅闅忔満鐢ㄦ埛鍚嶇О锛涙暟鐢电エWeb杩炴帴鍣ㄩ�夊~锛�
+		 * 鍙栧�奸�昏緫锛歵axUserName锛瀌rawer锛為粯璁ゅ紑绁ㄤ汉锛炵粓绔巿鏉冨紑绁ㄤ汉锛屽鏋滀互涓婂洓澶勯兘鏈彇鍒伴殢鏈鸿幏鍙栬绋庡彿涓嬫渶杩戜竴娆$櫥褰曠殑鏁扮數璐﹀彿瀵瑰簲鐨勫紑
+		 * 绁ㄤ汉锛涙暟鐢电エ涔愪紒杩炴帴鍣ㄥ繀濉紝闀垮害鏈�澶�300瀛楃銆�
+		 */
+		private String  drawer;
+		/**
+		 * 澶嶆牳浜猴紝 16涓瓧绗︼紱绋庢帶寮�鍏锋椂锛� 涓虹┖鏃讹紝濡傛灉缁堢鏈夊�煎彇缁堢锛屽鏋滄病鏈夊幓鏈烘瀯鑾峰彇锛岃嫢閮芥病鏈夊垯涓虹┖锛佸叏鐢电被寮�鍏锋椂锛氭瀛楁闈炲繀濉紝鍗冲彂绁ㄧ被鍨嬩唬鐮佷负01锛�02鏃惰瀛楁闈炲繀濉�
+		 */
+		private String   checker;
+		/**
+		 * 鏀舵浜猴紝 16涓瓧绗︼紱绋庢帶绫诲紑鍏锋椂锛氳嫢涓虹┖锛屽鏋滅粓绔湁鍊煎彇缁堢锛屽鏋滄病鏈夊幓鏈烘瀯鑾峰彇锛岃嫢閮芥病鏈夊垯涓虹┖锛涘叏鐢电被寮�鍏锋椂锛氭瀛楁闈炲繀濉紝鍗冲彂绁ㄧ被鍨嬩唬鐮佷负01锛�02鏃惰瀛楁闈炲繀濉�
+		 */
+		private String   payee;
+		/**
+		 *鍚堣閲戦锛� 淇濈暀涓や綅灏忔暟锛涙敮鎸佷环绋庡垎绂�
+		 */
+		private BigDecimal   invoiceTotalPrice;
+		/**
+		 * 鍚堣绋庨锛� 淇濈暀涓や綅灏忔暟锛涙敮鎸佷环绋庡垎绂�
+		 */
+		private BigDecimal   invoiceTotalTax;
+		/**
+		 * 浠风◣鍚堣锛� 淇濈暀涓や綅灏忔暟锛涙敮鎸佷环绋庡垎绂�
+		 */
+		private BigDecimal   invoiceTotalPriceTax;
+		/**
+		 * 澶囨敞 涔愪紒闀垮害涓�230涓瓧绗�
+		 */
+		private String   remarks;
+		/**
+		 * 绾㈠瓧淇℃伅琛�/纭鍗曠紪鍙凤紝浠卛nvoiceType=1鏃堕渶瑕佷紶鍏ユ暟鎹◣鎺х被绾㈢エ寮�鍏锋椂锛宨nvoiceTypeCode=004銆�028鏃跺繀椤讳紶鍊硷紝浼犲叆绾㈠瓧淇℃伅琛ㄧ紪鍙凤紱 鍏ㄧ數绫荤孩绁ㄥ紑鍏锋椂锛�
+		 * invoiceTypeCode=01銆�02鏃跺繀椤讳紶鍊硷紝浼犲叆绾㈠瓧纭鍗曠紪鍙凤紱
+		 */
+		private String    redInfoNo;
+		/**
+		 * 鍘熷彂绁ㄤ唬鐮侊紝 invoiceType=1锛岀◣鎺ц礋鏁版櫘绁ㄥ紑鍏锋椂蹇呬紶锛涚孩绁ㄩ�夋暟鐢电エ鏃讹紝姝ら」鍙负绌恒��
+		 */
+		private String     originalInvoiceCode;
+		/**
+		 * 鍘熷彂绁ㄥ彿鐮侊紝 invoiceType=1锛岀◣鎺ц礋鏁版櫘绁ㄥ紑鍏锋椂蹇呬紶锛涚孩绁ㄩ�夋暟鐢电エ鏃讹紝姝ら」鍙负绌恒��
+		 */
+		private String     originalInvoiceNo;
+		/**
+		 * 鎵i櫎棰濓紝 taxationLabel=2锛屽樊棰濆緛绋庢椂蹇呬紶銆傛暟鍊煎繀椤诲皬浜庝环绋庡悎璁°��
+		 */
+		private BigDecimal     deductibleAmount;
+		/**
+		 * 閿�鏂瑰湴鍧�鍙婄數璇濓紝鍙戠エ绫诲瀷浠g爜涓�01銆�02鏃惰瀛楁鎷嗗垎涓哄湴鍧�銆佺數璇濅袱涓瓧娈�
+		 */
+		private String     sellerAddressPhone;
+		/**
+		 * 閿�鏂瑰紑鎴疯鍙婅处鍙凤紝鍙戠エ绫诲瀷浠g爜涓�01銆�02鏃朵笉鐢ㄦ瀛楁
+		 */
+		private String     sellerBankAccount;
+		private Map ext;//鎵╁睍瀛楁
+		/**
+		 * 绗笁鏂圭郴缁熷悕绉�
+		 */
+		private String     systemName;
+		/**
+		 * 绗笁鏂圭郴缁焛d
+		 */
+		private String     systemId;
+		/**
+		 * 瀹㈡埛閭
+		 */
+		private String     buyerEmail;
+		/**
+		 * 鎶勯�侀偖绠�
+		 */
+		private String     emailCarbonCopy;
+		/**
+		 * 瀹㈡埛鐢佃瘽
+		 */
+		private String     buyerPhone;
+		/**
+		 * 鐢ㄦ埛璐﹀彿锛岀敤浜庝釜浜虹淮搴︽暟鎹爣璁�
+		 */
+		private String     userAccount;
+		/**
+		 * 绾㈠啿鍘熷洜锛�1 閿�璐ч��鍥� 2 寮�绁ㄦ湁璇� 3 鏈嶅姟缁堟 4 閿�鍞姌璁╋級绋庢帶绾㈠啿鍘熷洜锛氬缓璁寜瀹為檯寮�绁ㄦ儏鍐典紶鍏ョ孩鍐插師鍥狅紝鑻ヤ笉浼犵郴缁熶細鑷姩鏍规嵁鎯呭喌鍒ゆ柇骞惰祴鍊硷紱鍏ㄧ數绾㈠啿鍘熷洜锛氬繀濉�
+		 */
+		private String     redIssueReason;
+		private String     buyerBankName;
+		private String     buyerBankNumber;
+		private String     buyerAddress;
+		private String     buyerTelphone;
+		private String     redConfirmUuid;
+		private String     coalCalorificValue;  //姣忓崈鍏嬬叅鐐彂鐑噺( 鍗冨崱 ) ,澶т簬1000w蹇呭~
+		private String     totalSulfurOnDryBasis; //骞插熀鍏ㄧ~( % ) ,澶т簬1000w蹇呭~
+		private String     dryAshFreeVolatileMatter; //骞茬叅鏃犵伆鍩烘尌鍙戝垎(%) ,澶т簬1000w蹇呭~
+
+		private List<InvoiceDetail> invoiceDetailsList;
+
+	}
+
+	@Data
+	public static class InvoiceDetail{
+		private Map<String,Object> ext;
+		private String goodsType;
+		/**
+		 * 鏄庣粏琛屽彿
+		 */
+		private Integer goodsLineNo;
+		/**
+		 * 瀵瑰簲钃濈エ鏄庣粏琛屽彿 绋庢帶绫荤孩瀛楀彂绁ㄥ紑鍏锋椂鏃犻渶浼犲�硷紱 鍏ㄧ數绫荤孩瀛楀彂绁ㄥ紑鍏锋椂蹇呴』浼犲�硷紱
+		 */
+		private String originalInvoiceDetailNo;
+		/**
+		 * 鍙戠エ琛屾�ц川锛� 0锛氭甯歌锛�1锛氭姌鎵h锛�2锛氳鎶樻墸琛岋紝榛樿涓�0
+		 */
+		private String invoiceLineNature;
+		/**
+		 * 绋庢敹鍒嗙被缂栫爜
+		 */
+		private String goodsCode;
+		/**
+		 * 鍟嗗搧缂栫爜
+		 */
+		private String goodsPersonalCode;
+		/**
+		 * 鍟嗗搧鍚嶇О
+		 */
+		private String goodsName;
+		/**
+		 * 瑙勬牸鍨嬪彿
+		 */
+		private String goodsSpecification;
+		/**
+		 * 璁¢噺鍗曚綅
+		 */
+		private String goodsUnit;
+		/**
+		 * 閲戦锛屽皬鏁扮偣鍚�2浣�,瓒呴暱鑷姩淇濈暀涓や綅灏忔暟
+		 */
+		private BigDecimal goodsTotalPrice;
+		/**
+		 * 鍟嗗搧鏁伴噺
+		 */
+		private BigDecimal goodsQuantity;
+		/**
+		 * 鍟嗗搧鍗曚环
+		 */
+		private BigDecimal goodsPrice;
+		/**
+		 * 绋庣巼,瓒呴暱鑷姩淇濈暀涓変綅灏忔暟
+		 */
+		private Double goodsTaxRate;
+		/**
+		 * 绋庨锛屼袱浣嶅皬鏁�
+		 */
+		private BigDecimal goodsTotalTax;
+
+		private String coalType;
+		private String agreementTerm;
+
+
+	}
+
+
+
+
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/RedConfirmVo.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/RedConfirmVo.java
new file mode 100644
index 0000000..e819ba8
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/RedConfirmVo.java
@@ -0,0 +1,64 @@
+package com.by4cloud.platformx.business.entity.invoice;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author kdq
+ * @version 1.0.0
+ * @ClassName RedConfirmVo.java
+ * @Description TODO
+ * @createTime 2024骞�11鏈�06鏃� 11:35:00
+ */
+@Data
+public class RedConfirmVo {//绾㈢エ纭
+	private String taxNo;
+	private String orgCode;
+	private String taxUserName;
+	private String redConfirmSerialNo; //绾㈠瓧纭鍗曟祦姘村彿
+	private String entryIdentity; //褰曞叆鏂硅韩浠� 01:閿�鏂�,02:璐柟,03:浜屾墜杞﹀競鍦�/鎷嶅崠浼佷笟
+	private String sellerTaxNo; //閿�鍞柟缁熶竴绀句細淇$敤浠g爜/绾崇◣浜鸿瘑鍒彿/韬唤璇佷欢鍙风爜
+	private String sellerTaxName;//閿�鍞柟鍚嶇О
+	private String buyerTaxNo;//璐拱鏂圭粺涓�绀句細淇$敤浠g爜/绾崇◣浜鸿瘑鍒彿/韬唤璇佷欢鍙风爜, 褰曞叆鏂硅韩浠戒负銆愯喘鏂广�戞椂蹇呭~
+	private String buyerTaxName;//璐拱鏂瑰悕绉�
+	private String originInvoiceIsPaper;//鏄惁绾歌川鍙戠エ鏍囧織 Y锛氱焊璐ㄥ彂绁� N锛氱數瀛愬彂绁�
+	private String originalInvoiceNo;//钃濆瓧鍙戠エ鍏ㄧ數鍙戠エ鍙风爜锛屻�愬彂绁ㄦ潵婧愩�戜负2鏃跺繀濉�
+	private String originalPaperInvoiceCode;//绾歌川銆佺◣鎺у彂绁ㄤ唬鐮侊紝銆愬彂绁ㄦ潵婧愩�戜负1鏃舵垨鍏ㄧ數绾哥エ鏃跺繀濉�
+	private String originalPaperInvoiceNo;//绾歌川銆佺◣鎺у彂绁ㄥ彿鐮侊紝銆愬彂绁ㄦ潵婧愩�戜负1鏃舵垨鍏ㄧ數绾哥エ鏃跺繀濉�
+	private String originInvoiceDate;//钃濆瓧鍙戠エ寮�绁ㄦ棩鏈� yyyy-MM-dd HH:mm:ss
+	private String originInvoiceType;//钃濆瓧鍙戠エ绁ㄧ浠g爜 01:澧炲�肩◣涓撶敤鍙戠エ 02:鏅�氬彂绁� 03:鏈哄姩杞︾粺涓�閿�鍞彂绁� 04:浜屾墜杞︾粺涓�閿�鍞彂绁�
+	private String originInvoiceSetCode;//
+	private String autoIssueSwitch;//闈炵‘璁ゅ嵆寮�鈥斺�旇嚜鍔ㄥ紑绁� Y:鑷姩寮�绁� N锛氫笉鑷姩寮�绁� 榛樿涓篘
+	private String redInvoiceLabel;//绾㈠瓧鍙戠エ鍐茬孩鍘熷洜浠g爜 01:寮�绁ㄦ湁璇� 02:閿�璐ч��鍥� 03:鏈嶅姟涓 04:閿�鍞姌璁┿�備簩鎵嬭溅閿�鍞粺涓�鍙戠エ浠呭彲浣跨敤01銆�02
+	private String invoiceSource;//鍙戠エ鏉ユ簮  1:澧炲�肩◣鍙戠エ绠$悊绯荤粺锛� 2锛氱數瀛愬彂绁ㄦ湇鍔″钩鍙帮細
+	private Double originInvoiceTotalPrice;//钃濆瓧鍙戠エ鍚堣閲戦
+	private Double originInvoiceTotalTax;//钃濆瓧鍙戠エ鍚堣绋庨
+	private Double invoiceTotalPrice;//绾㈠瓧鍐查攢閲戦
+	private Double invoiceTotalTax;//绾㈠瓧鍐查攢绋庨
+	private List<RedConfirmDetail> redConfirmDetailReqEntityList;
+	@Data
+	public static class RedConfirmDetail{
+		private Map<String, Object> ext;
+		private Integer originalInvoiceDetailNo; //钃濆瓧鍙戠エ鏄庣粏搴忓彿
+		private Integer goodsLineNo; //琛屽彿
+		private String goodsCode; //绋庢敹鍒嗙被缂栫爜
+		private String goodsName; //鍟嗗搧鍏ㄧО
+		private String goodsSimpleName; //鍟嗗搧鏈嶅姟绠�绉�
+		private String projectName; //椤圭洰鍚嶇О锛堣嚜瀹氫箟鍟嗗搧鍚嶇О锛�
+		private String goodsSpecification; //瑙勬牸鍨嬪彿
+		private String goodsUnit;//鍗曚綅
+		private String goodsPrice;//鍗曚环
+		private String goodsQuantity;//鏁伴噺
+		private Double goodsTaxRate; //绋庣巼
+		private Double goodsTotalPrice; //閲戦
+		private Double goodsTotalTax; //绋庨
+		private String coalType;
+		private String agreementTerm;
+
+
+	}
+
+}
diff --git a/platformx-business-finance-biz/pom.xml b/platformx-business-finance-biz/pom.xml
index 7ad150f..2c6a695 100644
--- a/platformx-business-finance-biz/pom.xml
+++ b/platformx-business-finance-biz/pom.xml
@@ -141,6 +141,23 @@
 			<artifactId>poi-tl</artifactId>
 			<version>1.12.2</version> <!-- 璇蜂娇鐢ㄦ渶鏂扮ǔ瀹氱増 -->
 		</dependency>
+        <dependency>
+            <groupId>org.apache.pdfbox</groupId>
+            <artifactId>pdfbox</artifactId>
+            <version>2.0.24</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.14</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpmime</artifactId>
+            <version>4.5.14</version>
+        </dependency>
+
 
 
 	</dependencies>
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/InvoiceResultController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/InvoiceResultController.java
new file mode 100644
index 0000000..3bf5bd6
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/InvoiceResultController.java
@@ -0,0 +1,353 @@
+package com.by4cloud.platformx.business.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.by4cloud.platformx.business.entity.ContractOutBound;
+import com.by4cloud.platformx.business.entity.SaleCredit;
+import com.by4cloud.platformx.business.entity.invoice.InvoiceResult;
+import com.by4cloud.platformx.business.entity.invoice.InvoiceResultItem;
+import com.by4cloud.platformx.business.entity.invoice.InvoicingVo;
+import com.by4cloud.platformx.business.invoice.service.FpInvoiceResultItemService;
+import com.by4cloud.platformx.business.service.ContractOutBoundService;
+import com.by4cloud.platformx.business.service.InvoiceService;
+import com.by4cloud.platformx.business.service.SaleCreditService;
+import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.common.log.annotation.SysLog;
+import com.google.gson.Gson;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 閿�鍞寕璐�
+ *
+ * @author wjli
+ * @date 2026-05-21 16:16:31
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/invoiceResult" )
+@Tag(description = "invoice" , name = "寮�绁ㄧ鐞�" )
+public class InvoiceResultController {
+    //鍙戠エ缁撴灉
+    private final FpInvoiceResultItemService invoiceResultItemService;
+    private final InvoiceService invoiceService;
+    private final SaleCreditService saleCreditService;
+    private final ContractOutBoundService contractOutBoundService;
+
+    @Operation(summary = "鎺ㄩ�佸簲浠樿摑绁�" , description = "鎺ㄩ�佸簲浠樿摑绁�" )
+    @GetMapping("/pushYfBlue" )
+    public R pushYfBlue(@RequestBody SaleCredit saleCredit1) {
+        SaleCredit byId = saleCreditService.getById(saleCredit1.getId());
+        if(byId.getBipStatus()==null ||!byId.getBipStatus().equals("200")){
+            return R.failed("璇峰厛鎺ㄩ�佸崟鎹悗鍐嶆帹閫佸彂绁�");
+        }
+        if(byId.getBlueInvoiceResultId()==null){
+            return R.failed("鍙戠エ鏈紑鍏�");
+        }
+        boolean b = invoiceService.pushBlue(saleCredit1.getId(), 1);
+        if(b){
+            return R.ok(null,"鎺ㄩ�佹垚鍔�");
+        }else {
+            return R.failed(null,"鎺ㄩ�佸け璐�");
+        }
+    }
+    @Operation(summary = "鎺ㄩ�佸簲鏀惰摑绁�" , description = "鎺ㄩ�佸簲鏀惰摑绁�" )
+    @GetMapping("/pushYsBlue" )
+    public R pushYsBlue(@RequestBody SaleCredit saleCredit1) {
+        SaleCredit byId = saleCreditService.getById(saleCredit1.getId());
+        if(byId.getBipStatus()==null || !byId.getBipStatus().equals("200")){
+            return R.failed("璇峰厛鎺ㄩ�佸崟鎹悗鍐嶆帹閫佸彂绁�");
+        }
+        if(byId.getBlueInvoiceResultId()==null){
+            return R.failed("鍙戠エ鏈紑鍏�");
+        }
+        boolean b = invoiceService.pushBlue(saleCredit1.getId(),0);
+        if(b){
+            return R.ok(null,"鎺ㄩ�佹垚鍔�");
+        }else {
+            return R.failed(null,"鎺ㄩ�佸け璐�");
+        }
+    }
+
+
+    /**
+     * 鍘诲紑钃濈エ
+     * @param saleCredit1 鍘诲紑钃濈エ
+     * @return R
+     */
+    @Operation(summary = "鍘诲紑钃濈エ" , description = "鍘诲紑钃濈エ" )
+    @SysLog("鍘诲紑钃濈エ" )
+    @PostMapping("/toBluePiao")
+    @PreAuthorize("@pms.hasPermission('business_saleCredit_add')" )
+    public R toBluePiao(@RequestBody SaleCredit saleCredit1) {
+        if(saleCredit1.getId()==null){
+            return R.failed("閿�鍞寕璐d涓嶈兘涓虹┖锛�");
+        }
+        SaleCredit saleCredit = saleCreditService.getById(saleCredit1.getId());
+        List<ContractOutBound> contractOutBoundList = contractOutBoundService.list(new LambdaQueryWrapper<ContractOutBound>()
+                .eq(ContractOutBound::getSaleCreditId,saleCredit.getId())
+        );
+
+        //鐢熸垚vo
+        InvoicingVo invoicingVo = invoiceService.toGetByCompare(saleCredit,contractOutBoundList);
+        try {
+            Map<String, Object> objectMap = invoiceService.toKaipiao(invoicingVo);
+            Boolean success = (Boolean) objectMap.get("success");
+            String message = (String) objectMap.get("message");
+            System.out.println(saleCredit.getEntrustCode() + "鐨剅ailwayEntrust钃濆瓧寮�绁ㄧ粨鏋滀负锛�" + success + "------" + message);
+            if(success){
+                saleCredit.setStatus(2);
+                saleCreditService.updateById(saleCredit);
+                return R.ok("寮�绁ㄦ垚鍔燂紒");
+            }else{
+                saleCredit.setStatus(3);
+                saleCreditService.updateById(saleCredit);
+                return R.failed("寮�绁ㄥけ璐ワ紒");
+            }
+
+        }catch (Exception e){
+            saleCredit.setStatus(3);
+            saleCreditService.updateById(saleCredit);
+            return R.failed("寮�绁ㄥけ璐ワ紒");
+        }
+    }
+
+    @Operation(summary = "鍙戠エ鏌ョ湅" , description = "鍙戠エ鏌ョ湅" )
+    @GetMapping("/downInvoice" )
+    public R downInvoice(String code) {
+        QueryWrapper<InvoiceResult> invoiceResultQueryWrapper = new QueryWrapper<>();
+        invoiceResultQueryWrapper.lambda()
+                .eq(InvoiceResult::getEntrustCode,code)
+                .eq(InvoiceResult::getMethodName,"钃濆瓧寮�绁ㄦ帴鍙�")
+                .eq(InvoiceResult::getSuccess,1)
+                .orderByDesc(InvoiceResult::getCreateTime);
+        List<InvoiceResult> list = invoiceService.list(invoiceResultQueryWrapper);
+        if(list !=null && list.size()>0){
+            InvoiceResult result = list.get(0);
+            Map<String, Object> objectMap = invoiceService.downInvoiceMethod(result);
+            Boolean success = (Boolean) objectMap.get("success");
+            String message = (String) objectMap.get("message");
+            if(success){
+//				if(result.getPushBip()==null||result.getPushBip()!=1){
+//					QueryWrapper<RailwayEntrust> wrapper = new QueryWrapper<>();
+//					wrapper.lambda()
+//							.eq(RailwayEntrust::getEntrustCode,code);
+//					List<RailwayEntrust> railwayEntrusts = railwayEntrustService.list(wrapper);
+//					if(railwayEntrusts !=null && railwayEntrusts.size()>0){
+//						RailwayEntrust railwayEntrust = railwayEntrusts.get(0);
+//						System.out.println(railwayEntrust.getEntrustCode()+"寮�濮嬫帹閫乥ip钃濈エ");
+//						try {
+//							pushBip(railwayEntrust.getId(),railwayEntrust.getInvoicUrl());
+//							System.out.println(railwayEntrust.getEntrustCode()+"鎺ㄩ�乥ip钃濈エ鎴愬姛");
+//							result.setPushBip(1);
+//							result.setPushBipyf(1);
+//							invoiceResultService.updateById(result);
+//						}catch (Exception e){
+//							e.printStackTrace();
+//						}
+//					}
+//				}
+                return R.ok(objectMap);
+            }else {
+                return R.failed(message);
+            }
+        }else {
+            return R.failed("鏈煡璇㈠埌寮�绁ㄨ褰�");
+        }
+    }
+
+
+    /**
+     * 鍘诲紑绾㈢エ
+     * @param saleCredit1 鍘诲紑绾㈢エ
+     * @return R
+     */
+    @Operation(summary = "鍘诲紑绾㈢エ" , description = "鍘诲紑绾㈢エ" )
+    @SysLog("鍘诲紑绾㈢エ" )
+    @PostMapping("/toRedPiao")
+    @PreAuthorize("@pms.hasPermission('business_saleCredit_add')" )
+    public R toRedPiao(@RequestBody SaleCredit saleCredit1){
+        if(saleCredit1.getId()==null){
+            return R.failed("閿�鍞寕璐d涓嶈兘涓虹┖锛�");
+        }
+        SaleCredit saleCredit = saleCreditService.getById(saleCredit1.getId());
+        try {
+            Map<String, Object> map = invoiceService.toRedTicket(saleCredit);
+            Boolean success = (Boolean) map.get("success");
+            if(success){
+                return R.ok("绾㈠瓧寮�绁ㄦ垚鍔�");
+            }else {
+                return R.failed((String) map.get("message"));
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            return R.failed("绾㈠瓧寮�绁ㄥけ璐�");
+        }
+    }
+
+    @Operation(summary = "绾㈢エ鏌ョ湅" , description = "绾㈢エ鏌ョ湅" )
+    @GetMapping("/downRedInvoice" )
+    public R downRedInvoice(String code) {
+        QueryWrapper<InvoiceResult> invoiceResultQueryWrapper = new QueryWrapper<>();
+        invoiceResultQueryWrapper.lambda()
+                .eq(InvoiceResult::getEntrustCode,code)
+                .eq(InvoiceResult::getMethodName,"绾㈠瓧纭鍗曠‘璁ゆ帴鍙�")
+                .eq(InvoiceResult::getSuccess,1)
+                .orderByDesc(InvoiceResult::getCreateTime);
+        List<InvoiceResult> list = invoiceService.list(invoiceResultQueryWrapper);
+        if(list !=null && list.size()>0){
+            Map<String, Object> objectMap = null;
+            Boolean success = null;
+            String message = null;
+            InvoiceResult result = list.get(0);
+            if(result.getConfirmBillingMark().equals("Y")){
+                objectMap = invoiceService.downInvoiceMethod(result);
+                success = (Boolean) objectMap.get("success");
+                message = (String) objectMap.get("message");
+            }else {
+                QueryWrapper<InvoiceResult> invoiceResultQueryWrapper1 = new QueryWrapper<>();
+                invoiceResultQueryWrapper1.lambda()
+                        .eq(InvoiceResult::getEntrustCode,code)
+                        .eq(InvoiceResult::getMethodName,"绾㈠瓧寮�绁ㄦ帴鍙�")
+                        .eq(InvoiceResult::getSuccess,1)
+                        .orderByDesc(InvoiceResult::getCreateTime);
+                List<InvoiceResult> list1 = invoiceService.list(invoiceResultQueryWrapper1);
+                InvoiceResult result1 = list1.get(0);
+                objectMap = invoiceService.downInvoiceMethod(result1);
+                success = (Boolean) objectMap.get("success");
+                message = (String) objectMap.get("message");
+            }
+            if(success){
+                return R.ok(objectMap);
+            }else {
+                return R.failed(message);
+            }
+        }else {
+            return R.failed("鏈煡璇㈠埌寮�绁ㄨ褰�");
+        }
+    }
+
+   /* @Operation(summary = "绾㈠啿纭鍗�" , description = "绾㈠啿纭鍗�" )
+    @PostMapping("/redConfirm" )
+    public R redConfirm(@RequestBody InvoicingVo vo) {
+
+        SaleCredit saleCredit = saleCreditService.getOne(new LambdaQueryWrapper<SaleCredit>()
+                .eq(SaleCredit::getEntrustCode,vo.getEntrustCode())
+                .last("limit 1")
+        );
+        if(saleCredit==null){
+            return R.failed("鏈壘鍒板搴旂粨绠楀崟");
+        }
+
+        try {
+            Map<String, Object> objectMap = invoiceService.toRedTicket(saleCredit);
+            Boolean success = (Boolean) objectMap.get("success");
+            String message = (String) objectMap.get("message");
+            if(success){
+                return R.ok(null,message);
+            }else {
+                return R.failed(null,message);
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+            return R.failed("寮�绾㈢エ澶辫触");
+        }
+    }*/
+
+    //鍙戠孩鍐蹭箣鍓嶏紝鍏堣繘琛岀孩绁ㄧ‘璁ゃ��
+    @Operation(summary = "绾㈠啿鍙戠エform" , description = "绾㈠啿鍙戠エform" )
+    @GetMapping("/issueRed" )
+    public R issueRed(@RequestBody SaleCredit saleCredit1) {
+        SaleCredit saleCredit = saleCreditService.getById(saleCredit1.getId());
+        InvoiceResult blueResult = null;
+        InvoiceResult redResult = null;
+        if(saleCredit.getBlueInvoiceResultId()==null){
+            return R.failed("璇峰厛寮�鍏疯摑瀛楀彂绁�");
+        }
+        blueResult = invoiceService.getById(saleCredit.getRedInvoiceResultId());
+
+        InvoicingVo invoicingVo = new InvoicingVo();
+
+        QueryWrapper<InvoiceResultItem> itemQueryWrapper  = new QueryWrapper<>();
+        itemQueryWrapper.lambda()
+                .eq(InvoiceResultItem::getResultId,blueResult.getId());
+        List<InvoiceResultItem> resultItems = invoiceResultItemService.list(itemQueryWrapper);
+
+        if(saleCredit!=null) {
+
+            invoicingVo.setTaxNo(saleCredit.getCreditCodeB());
+            invoicingVo.setLedgerName(saleCredit.getPartyB());
+            invoicingVo.setOrgCode(saleCredit.getCreditCodeB());
+            invoicingVo.setFormatGenerate(false);
+            invoicingVo.setIsSplit(false);
+            invoicingVo.setFormatPushType(false);
+            invoicingVo.setTaxUserName(saleCredit.getContactPhoneB());
+            invoicingVo.setEntrustCode(saleCredit.getEntrustCode());
+            InvoicingVo.InvoicingVoInfo invoicingVoInfo = new InvoicingVo.InvoicingVoInfo();
+            invoicingVoInfo.setInvoiceTypeCode("01");
+            invoicingVoInfo.setInvoiceType("1");
+            invoicingVoInfo.setSerialNo("MX_REDPP_" + System.currentTimeMillis());
+//			invoicingVoInfo.setRedInfoNo(redResult.getInvoiceNo());
+//			invoicingVoInfo.setRedIssueReason("1");
+//			invoicingVoInfo.setRedConfirmUuid(redResult.getRedConfirmUuid());
+            invoicingVoInfo.setDrawer(saleCredit.getContactPhoneB());
+			/*Map<String, Object> ext1 = new HashMap<>();
+			ContractOrder order = contractOrderService.getOrderByNum(railwayEntrust.getOrderNumber());
+			if(order!=null){
+				ext1.put("htbh",order.getContractNum());
+				invoicingVoInfo.setExt(ext1);
+			}*/
+            invoicingVoInfo.setSystemName("**閿�鍞鐞嗕俊鎭郴缁�");
+
+            List<InvoicingVo.InvoiceDetail> details = new ArrayList<>();
+            for (int i = 0; i < resultItems.size(); i++) {
+                InvoiceResultItem resultItem = resultItems.get(i);
+                Map<String,Object> ext = new HashMap<>();
+                ext.put("coalType",resultItem.getCoalType());
+                InvoicingVo.InvoiceDetail invoiceDetail = new InvoicingVo.InvoiceDetail();
+                invoiceDetail.setGoodsLineNo(resultItem.getGoodsLineNo());
+                invoiceDetail.setOriginalInvoiceDetailNo(resultItem.getGoodsLineNo()+"");
+                invoiceDetail.setGoodsTaxRate(resultItem.getGoodsTaxRate());
+                invoiceDetail.setGoodsUnit(resultItem.getGoodsUnit());
+                invoiceDetail.setGoodsName(resultItem.getCoalName());
+                invoiceDetail.setGoodsType(resultItem.getGoodsType());
+                invoiceDetail.setGoodsCode(resultItem.getGoodsCode());
+                invoiceDetail.setGoodsSpecification(resultItem.getGoodsSpecification());
+                invoiceDetail.setExt(ext);
+                invoiceDetail.setGoodsQuantity(new BigDecimal(resultItem.getGoodsQuantity()*-1).setScale(3,BigDecimal.ROUND_HALF_UP));
+                invoiceDetail.setGoodsPrice(new BigDecimal(resultItem.getGoodsPrice()).setScale(8,BigDecimal.ROUND_HALF_UP));
+                invoiceDetail.setGoodsTotalPrice(new BigDecimal(resultItem.getGoodsTotalPrice()*-1).setScale(2,BigDecimal.ROUND_HALF_UP));
+                invoiceDetail.setGoodsTotalTax(new BigDecimal(resultItem.getGoodsTotalTax()*-1).setScale(2,BigDecimal.ROUND_HALF_UP));
+                details.add(invoiceDetail);
+            }
+
+            invoicingVoInfo.setBuyerTaxNo(saleCredit.getCreditCodeA());
+            invoicingVoInfo.setBuyerName(saleCredit.getPartyA());
+            invoicingVoInfo.setInvoiceTotalPrice(new BigDecimal(blueResult.getInvoiceTotalPrice()*-1).setScale(2,BigDecimal.ROUND_HALF_UP));
+            invoicingVoInfo.setInvoiceTotalTax(new BigDecimal(blueResult.getInvoiceTotalTax()*-1).setScale(2,BigDecimal.ROUND_HALF_UP));
+            invoicingVoInfo.setInvoiceTotalPriceTax(new BigDecimal(blueResult.getInvoiceTotalPriceTax()*-1).setScale(2,BigDecimal.ROUND_HALF_UP));
+            invoicingVoInfo.setBuyerBankName(saleCredit.getBankNameA());
+            invoicingVoInfo.setBuyerBankNumber(saleCredit.getBankAccountA());
+            //invoicingVoInfo.setBuyerAddress(invoiceCustomer.getBuyerAddress());
+            invoicingVoInfo.setBuyerTelphone(saleCredit.getContactPhoneA());
+            invoicingVoInfo.setInvoiceDetailsList(details);
+            invoicingVo.setData(invoicingVoInfo);
+            Gson gson =new Gson();
+            String vostr = gson.toJson(invoicingVo);
+            System.out.println(vostr);
+            return R.ok(invoicingVo);
+        }else {
+            return R.failed("鏆傛湭鏌ヨ鍒伴攢鏂瑰紑绁ㄤ俊鎭�");
+        }
+    }
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/controller/FpInvoiceResultController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/controller/FpInvoiceResultController.java
new file mode 100644
index 0000000..df6de4e
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/controller/FpInvoiceResultController.java
@@ -0,0 +1,117 @@
+package com.by4cloud.platformx.business.invoice.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.by4cloud.platformx.business.entity.invoice.InvoiceResult;
+import com.by4cloud.platformx.business.invoice.service.FpInvoiceResultService;
+import com.by4cloud.platformx.common.excel.annotation.ResponseExcel;
+import com.by4cloud.platformx.common.log.annotation.SysLog;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import com.by4cloud.platformx.common.core.util.R;
+
+import java.util.List;
+
+/**
+ * 寮�鍏峰彂绁ㄨ繑鍥炲��
+ *
+ * @author kdq
+ * @date 2024-11-05 18:44:09
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/fpinvoiceresult" )
+@Tag(description = "fpinvoiceresult" , name = "寮�鍏峰彂绁ㄨ繑鍥炲�肩鐞�" )
+public class FpInvoiceResultController {
+
+    private final FpInvoiceResultService fpInvoiceResultService;
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page 鍒嗛〉瀵硅薄
+     * @param fpInvoiceResult 寮�鍏峰彂绁ㄨ繑鍥炲��
+     * @return
+     */
+    @Operation(summary = "鍒嗛〉鏌ヨ" , description = "鍒嗛〉鏌ヨ" )
+    @GetMapping("/page" )
+    @PreAuthorize("@pms.hasPermission('business_fpinvoiceresult_view')" )
+    public R getFpInvoiceResultPage(Page page, InvoiceResult fpInvoiceResult) {
+		QueryWrapper<InvoiceResult> wrapper = new QueryWrapper<>();
+		wrapper.lambda()
+				.eq(InvoiceResult::getSuccess,fpInvoiceResult.getSuccess())
+				.eq(StringUtils.isNotBlank(fpInvoiceResult.getMethodName()),InvoiceResult::getMethodName,fpInvoiceResult.getMethodName())
+				.like(fpInvoiceResult.getEntrustCode() !=null,InvoiceResult::getEntrustCode,fpInvoiceResult.getEntrustCode())
+				.orderByDesc(InvoiceResult::getCreateTime);
+        return R.ok(fpInvoiceResultService.page(page, wrapper));
+    }
+
+
+    /**
+     * 閫氳繃id鏌ヨ寮�鍏峰彂绁ㄨ繑鍥炲��
+     * @param id id
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鏌ヨ" , description = "閫氳繃id鏌ヨ" )
+    @GetMapping("/{id}" )
+    @PreAuthorize("@pms.hasPermission('business_fpinvoiceresult_view')" )
+    public R getById(@PathVariable("id" ) Integer id) {
+        return R.ok(fpInvoiceResultService.getById(id));
+    }
+
+    /**
+     * 鏂板寮�鍏峰彂绁ㄨ繑鍥炲��
+     * @param fpInvoiceResult 寮�鍏峰彂绁ㄨ繑鍥炲��
+     * @return R
+     */
+    @Operation(summary = "鏂板寮�鍏峰彂绁ㄨ繑鍥炲��" , description = "鏂板寮�鍏峰彂绁ㄨ繑鍥炲��" )
+    @SysLog("鏂板寮�鍏峰彂绁ㄨ繑鍥炲��" )
+    @PostMapping
+    @PreAuthorize("@pms.hasPermission('business_fpinvoiceresult_add')" )
+    public R save(@RequestBody InvoiceResult fpInvoiceResult) {
+        return R.ok(fpInvoiceResultService.save(fpInvoiceResult));
+    }
+
+    /**
+     * 淇敼寮�鍏峰彂绁ㄨ繑鍥炲��
+     * @param fpInvoiceResult 寮�鍏峰彂绁ㄨ繑鍥炲��
+     * @return R
+     */
+    @Operation(summary = "淇敼寮�鍏峰彂绁ㄨ繑鍥炲��" , description = "淇敼寮�鍏峰彂绁ㄨ繑鍥炲��" )
+    @SysLog("淇敼寮�鍏峰彂绁ㄨ繑鍥炲��" )
+    @PutMapping
+    @PreAuthorize("@pms.hasPermission('business_fpinvoiceresult_edit')" )
+    public R updateById(@RequestBody InvoiceResult fpInvoiceResult) {
+        return R.ok(fpInvoiceResultService.updateById(fpInvoiceResult));
+    }
+
+    /**
+     * 閫氳繃id鍒犻櫎寮�鍏峰彂绁ㄨ繑鍥炲��
+     * @param id id
+     * @return R
+     */
+    @Operation(summary = "閫氳繃id鍒犻櫎寮�鍏峰彂绁ㄨ繑鍥炲��" , description = "閫氳繃id鍒犻櫎寮�鍏峰彂绁ㄨ繑鍥炲��" )
+    @SysLog("閫氳繃id鍒犻櫎寮�鍏峰彂绁ㄨ繑鍥炲��" )
+    @DeleteMapping("/{id}" )
+    @PreAuthorize("@pms.hasPermission('business_fpinvoiceresult_del')" )
+    public R removeById(@PathVariable Integer id) {
+        return R.ok(fpInvoiceResultService.removeById(id));
+    }
+
+
+    /**
+     * 瀵煎嚭excel 琛ㄦ牸
+     * @param fpInvoiceResult 鏌ヨ鏉′欢
+     * @return excel 鏂囦欢娴�
+     */
+    @ResponseExcel
+    @GetMapping("/export")
+    @PreAuthorize("@pms.hasPermission('business_fpinvoiceresult_export')" )
+    public List<InvoiceResult> export(InvoiceResult fpInvoiceResult) {
+        return fpInvoiceResultService.list(Wrappers.query(fpInvoiceResult));
+    }
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/BipInvoiceMapper.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/BipInvoiceMapper.java
new file mode 100644
index 0000000..2ddfb7b
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/BipInvoiceMapper.java
@@ -0,0 +1,17 @@
+
+package com.by4cloud.platformx.business.invoice.mapper;
+
+import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
+import com.by4cloud.platformx.business.entity.invoice.BipInvoice;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * bip瀵瑰簲鍗曟嵁琛�
+ *
+ * @author zzl
+ * @date 2024-09-05 17:59:36
+ */
+@Mapper
+public interface BipInvoiceMapper extends PlatformxBaseMapper<BipInvoice> {
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FileBipMapper.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FileBipMapper.java
new file mode 100644
index 0000000..05bb078
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FileBipMapper.java
@@ -0,0 +1,17 @@
+
+package com.by4cloud.platformx.business.invoice.mapper;
+
+import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
+import com.by4cloud.platformx.business.entity.invoice.FileBip;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * bip鐢靛瓙褰卞儚琛�
+ *
+ * @author kdq
+ * @date 2024-09-06 08:51:32
+ */
+@Mapper
+public interface FileBipMapper extends PlatformxBaseMapper<FileBip> {
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FpInvoiceResultItemMapper.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FpInvoiceResultItemMapper.java
new file mode 100644
index 0000000..95bd521
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FpInvoiceResultItemMapper.java
@@ -0,0 +1,19 @@
+
+package com.by4cloud.platformx.business.invoice.mapper;
+
+
+import com.by4cloud.platformx.business.entity.invoice.InvoiceResultItem;
+import org.apache.ibatis.annotations.Mapper;
+import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
+
+
+/**
+ * 寮�鍏峰彂绁ㄨ繑鍥炲�兼槑缁嗚
+ *
+ * @author kdq
+ * @date 2024-11-28 15:35:41
+ */
+@Mapper
+public interface FpInvoiceResultItemMapper extends PlatformxBaseMapper<InvoiceResultItem> {
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FpInvoiceResultMapper.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FpInvoiceResultMapper.java
new file mode 100644
index 0000000..81ad018
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FpInvoiceResultMapper.java
@@ -0,0 +1,18 @@
+
+package com.by4cloud.platformx.business.invoice.mapper;
+
+import com.by4cloud.platformx.business.entity.invoice.InvoiceResult;
+import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
+
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 寮�鍏峰彂绁ㄨ繑鍥炲��
+ *
+ * @author kdq
+ * @date 2024-11-05 18:44:09
+ */
+@Mapper
+public interface FpInvoiceResultMapper extends PlatformxBaseMapper<InvoiceResult> {
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/BipInvoiceService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/BipInvoiceService.java
new file mode 100644
index 0000000..274feac
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/BipInvoiceService.java
@@ -0,0 +1,16 @@
+
+
+package com.by4cloud.platformx.business.invoice.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.by4cloud.platformx.business.entity.invoice.BipInvoice;
+
+/**
+ * bip瀵瑰簲鍗曟嵁琛�
+ *
+ * @author zzl
+ * @date 2024-09-05 17:59:36
+ */
+public interface BipInvoiceService extends IService<BipInvoice> {
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FileBipService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FileBipService.java
new file mode 100644
index 0000000..62ae2ae
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FileBipService.java
@@ -0,0 +1,17 @@
+
+
+package com.by4cloud.platformx.business.invoice.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.by4cloud.platformx.business.entity.invoice.FileBip;
+
+
+/**
+ * bip鐢靛瓙褰卞儚琛�
+ *
+ * @author kdq
+ * @date 2024-09-06 08:51:32
+ */
+public interface FileBipService extends IService<FileBip> {
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FileUploadService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FileUploadService.java
new file mode 100644
index 0000000..79b0abb
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FileUploadService.java
@@ -0,0 +1,31 @@
+package com.by4cloud.platformx.business.invoice.service;
+
+/**
+ * @author kdq
+ * @version 1.0.0
+ * @ClassName FileUploadService.java
+ * @Description TODO
+ * @createTime 2024骞�09鏈�03鏃� 10:04:00
+ */
+
+
+
+import com.by4cloud.platformx.business.entity.Contract;
+
+import java.util.List;
+
+/**
+ * 鐢靛瓙褰卞儚鎺ュ彛
+ *
+ * @author kdq
+ */
+public interface FileUploadService {
+
+	//涓婁紶鏂囦欢鍒癰ip
+	String uploadToBip(Long railwayEntrustId, String businessId, String filename);
+
+	String uploadUrlToBip(Long railwayEntrustId, String businessId, String fileUrl);
+
+	String deleteFileBip(Integer railwayEntrustId, String businessId, String fid);
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FpInvoiceResultItemService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FpInvoiceResultItemService.java
new file mode 100644
index 0000000..7b305eb
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FpInvoiceResultItemService.java
@@ -0,0 +1,17 @@
+
+
+package com.by4cloud.platformx.business.invoice.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.by4cloud.platformx.business.entity.invoice.InvoiceResultItem;
+
+
+/**
+ * 寮�鍏峰彂绁ㄨ繑鍥炲�兼槑缁嗚
+ *
+ * @author kdq
+ * @date 2024-11-28 15:35:41
+ */
+public interface FpInvoiceResultItemService extends IService<InvoiceResultItem> {
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FpInvoiceResultService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FpInvoiceResultService.java
new file mode 100644
index 0000000..ccec451
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FpInvoiceResultService.java
@@ -0,0 +1,20 @@
+
+
+package com.by4cloud.platformx.business.invoice.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+
+
+import com.by4cloud.platformx.business.entity.invoice.*;
+import com.by4cloud.platformx.common.core.util.R;
+import java.util.Map;
+
+/**
+ * 寮�鍏峰彂绁ㄨ繑鍥炲��
+ *
+ * @author kdq
+ * @date 2024-11-05 18:44:09
+ */
+public interface FpInvoiceResultService extends IService<InvoiceResult> {
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/BipInvoiceServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/BipInvoiceServiceImpl.java
new file mode 100644
index 0000000..89e271c
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/BipInvoiceServiceImpl.java
@@ -0,0 +1,24 @@
+
+package com.by4cloud.platformx.business.invoice.service.impl;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.by4cloud.platformx.business.invoice.mapper.BipInvoiceMapper;
+import com.by4cloud.platformx.business.invoice.service.BipInvoiceService;
+import com.by4cloud.platformx.business.entity.invoice.*;
+
+
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * bip瀵瑰簲鍗曟嵁琛�
+ *
+ * @author zzl
+ * @date 2024-09-05 17:59:36
+ */
+@Service
+@AllArgsConstructor
+public class BipInvoiceServiceImpl extends ServiceImpl<BipInvoiceMapper, BipInvoice> implements BipInvoiceService {
+
+}
+
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FileBipServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FileBipServiceImpl.java
new file mode 100644
index 0000000..9feb3f9
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FileBipServiceImpl.java
@@ -0,0 +1,19 @@
+
+package com.by4cloud.platformx.business.invoice.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.by4cloud.platformx.business.entity.invoice.FileBip;
+import com.by4cloud.platformx.business.invoice.mapper.FileBipMapper;
+import com.by4cloud.platformx.business.invoice.service.FileBipService;
+import org.springframework.stereotype.Service;
+
+/**
+ * bip鐢靛瓙褰卞儚琛�
+ *
+ * @author kdq
+ * @date 2024-09-06 08:51:32
+ */
+@Service
+public class FileBipServiceImpl extends ServiceImpl<FileBipMapper, FileBip> implements FileBipService {
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FileUploadServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FileUploadServiceImpl.java
new file mode 100644
index 0000000..37b4729
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FileUploadServiceImpl.java
@@ -0,0 +1,138 @@
+package com.by4cloud.platformx.business.invoice.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.by4cloud.platformx.business.entity.SaleCredit;
+import com.by4cloud.platformx.business.entity.invoice.FileBip;
+import com.by4cloud.platformx.business.invoice.mapper.FileBipMapper;
+import com.by4cloud.platformx.business.invoice.service.FileUploadService;
+import com.by4cloud.platformx.business.invoice.utils.BipHttpUtil;
+import com.by4cloud.platformx.business.service.SaleCreditService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author kdq
+ * @version 1.0.0
+ * @ClassName FileUploadServiceImpl.java
+ * @Description TODO
+ * @createTime 2024骞�09鏈�03鏃� 10:06:00
+ */
+@Service
+public class FileUploadServiceImpl implements FileUploadService {
+	@Autowired
+	private SaleCreditService saleCreditService;
+
+	@Autowired
+	private FileBipMapper fileBipMapper;
+
+	@Autowired
+	private BipHttpUtil bipHttpUtil;
+
+	@Value("${bip.filePath}")
+	private String bipFilePath;
+
+
+
+	@Override
+	public String uploadToBip(Long railwayEntrustId,String businessId,String filename) {
+		String s = bipHttpUtil.postUploadFile(businessId, filename);
+		SaleCredit saleCredit = saleCreditService.getById(railwayEntrustId);
+		JSONObject result = JSON.parseObject(s) ;
+		String code = (String) result.get("code");
+		if(code.equals("200")){
+			// 浣跨敤JSON.parseObject()鏉ヨВ鏋怞SON瀵硅薄
+			JSONObject jsonObject = JSON.parseObject(s);
+			JSONObject data = jsonObject.getJSONObject("data");
+			JSONArray jsonArray = data.getJSONArray("data");
+
+			for (int i = 0; i < jsonArray.size(); i++) {
+				JSONObject obj = jsonArray.getJSONObject(i);
+				FileBip fileBip = new FileBip();
+				fileBip.setFileId(obj.get("fileId").toString());
+				fileBip.setFilePath(obj.get("filePath").toString());
+				fileBip.setFileCTime(obj.get("ctime")+"");
+				fileBip.setFileUTime(obj.get("utime")+"");
+				fileBip.setFileBipId(obj.get("id").toString());
+				fileBip.setFileExtension(obj.get("fileExtension").toString());
+				fileBip.setFileSize((Integer)obj.get("fileSize"));
+				fileBip.setFileSizeText(obj.get("fileSizeText").toString());
+				fileBip.setFileName(obj.get("fileName").toString());
+				fileBip.setName(obj.get("name").toString());
+				fileBip.setYhtUserId(obj.get("yhtUserId").toString());
+				fileBip.setTenantId(obj.get("tenantId").toString());
+				fileBip.setSign(obj.get("sign").toString());
+				fileBip.setCopy(obj.get("copy")+"");
+				fileBip.setEntrustId(railwayEntrustId);
+				fileBip.setEntrustCode(saleCredit.getEntrustCode());
+				fileBip.setFileLocalPath("/yunxiao/filebip/local/"+filename);
+				fileBipMapper.insert(fileBip);
+			}
+		}
+		return s;
+	}
+
+	@Override
+	public String uploadUrlToBip(Long railwayEntrustId, String businessId, String fileUrl) {
+		String s = bipHttpUtil.postUploadFileUrl(businessId, fileUrl);
+		SaleCredit saleCredit = saleCreditService.getById(railwayEntrustId);
+		JSONObject result = JSON.parseObject(s) ;
+		String code = (String) result.get("code");
+		if(code.equals("200")){
+			// 浣跨敤JSON.parseObject()鏉ヨВ鏋怞SON瀵硅薄
+			JSONObject jsonObject = JSON.parseObject(s);
+			JSONObject data = jsonObject.getJSONObject("data");
+			JSONArray jsonArray = data.getJSONArray("data");
+
+			for (int i = 0; i < jsonArray.size(); i++) {
+				JSONObject obj = jsonArray.getJSONObject(i);
+				FileBip fileBip = new FileBip();
+				fileBip.setFileId(obj.get("fileId").toString());
+				fileBip.setFilePath(obj.get("filePath").toString());
+				fileBip.setFileCTime(obj.get("ctime")+"");
+				fileBip.setFileUTime(obj.get("utime")+"");
+				fileBip.setFileBipId(obj.get("id").toString());
+				fileBip.setFileExtension(obj.get("fileExtension").toString());
+				fileBip.setFileSize((Integer)obj.get("fileSize"));
+				fileBip.setFileSizeText(obj.get("fileSizeText").toString());
+				fileBip.setFileName(obj.get("fileName").toString());
+				fileBip.setName(obj.get("name").toString());
+				fileBip.setYhtUserId(obj.get("yhtUserId").toString());
+				fileBip.setTenantId(obj.get("tenantId").toString());
+				fileBip.setSign(obj.get("sign").toString());
+				fileBip.setCopy(obj.get("copy")+"");
+				fileBip.setEntrustId(railwayEntrustId);
+				fileBip.setEntrustCode(saleCredit.getEntrustCode());
+				fileBip.setFileLocalPath(fileUrl);
+				fileBipMapper.insert(fileBip);
+			}
+		}
+		return s;
+	}
+
+
+	@Override
+	public String deleteFileBip(Integer railwayEntrustId,String businessId, String fid) {
+		String s = bipHttpUtil.postDeleteFile(businessId, fid);
+		JSONObject result = JSON.parseObject(s) ;
+		String code = (String) result.get("code");
+		if(code.equals("200")){
+			QueryWrapper<FileBip> wrapper = new QueryWrapper<>();
+			wrapper.lambda()
+					.eq(FileBip::getFileBipId,fid);
+			List<FileBip> fileBips = fileBipMapper.selectList(wrapper);
+			if(!fileBips.isEmpty() && fileBips.size()>0){
+				for (FileBip fileBip : fileBips) {
+					fileBipMapper.deleteById(fileBip);
+				}
+			}
+		}
+		return s;
+	}
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FpInvoiceResultItemServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FpInvoiceResultItemServiceImpl.java
new file mode 100644
index 0000000..688d46c
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FpInvoiceResultItemServiceImpl.java
@@ -0,0 +1,20 @@
+
+package com.by4cloud.platformx.business.invoice.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.by4cloud.platformx.business.entity.invoice.InvoiceResultItem;
+import com.by4cloud.platformx.business.invoice.mapper.FpInvoiceResultItemMapper;
+import com.by4cloud.platformx.business.invoice.service.FpInvoiceResultItemService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 寮�鍏峰彂绁ㄨ繑鍥炲�兼槑缁嗚
+ *
+ * @author kdq
+ * @date 2024-11-28 15:35:41
+ */
+@Service
+public class FpInvoiceResultItemServiceImpl extends ServiceImpl<FpInvoiceResultItemMapper, InvoiceResultItem> implements FpInvoiceResultItemService {
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FpInvoiceResultServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FpInvoiceResultServiceImpl.java
new file mode 100644
index 0000000..6d51f8a
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FpInvoiceResultServiceImpl.java
@@ -0,0 +1,22 @@
+
+package com.by4cloud.platformx.business.invoice.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import com.by4cloud.platformx.business.invoice.service.FpInvoiceResultService;
+import com.by4cloud.platformx.business.entity.invoice.*;
+import com.by4cloud.platformx.business.invoice.mapper.FpInvoiceResultMapper;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.stereotype.Service;
+
+/**
+ * 寮�鍏峰彂绁ㄨ繑鍥炲��
+ *
+ * @author kdq
+ * @date 2024-11-05 18:44:09
+ */
+@Service
+@EnableAsync
+public class FpInvoiceResultServiceImpl extends ServiceImpl<FpInvoiceResultMapper, InvoiceResult> implements FpInvoiceResultService {
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/BipApiEnum.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/BipApiEnum.java
new file mode 100644
index 0000000..e5c95a7
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/BipApiEnum.java
@@ -0,0 +1,32 @@
+package com.by4cloud.platformx.business.invoice.utils;
+
+public enum BipApiEnum {
+    鑾峰彇TOKEN("/iuap-api-auth/open-auth/selfAppAuth/getAccessToken"),
+    搴旀敹鍙戠エ淇濆瓨鎺ュ彛("/iuap-api-gateway/yonbip/EFI/receivable/saveandsubmit"),
+    搴旀敹鍙戠エ鍒犻櫎鎺ュ彛("/iuap-api-gateway/yonbip/EFI/earap/openapi/bill/receivable/batchdelete"),
+    搴旀敹鍙戠エ鏌ヨ鎺ュ彛("/iuap-api-gateway/yonbip/EFI/receivable/list"),
+
+	搴旀敹鍙戠エ淇敼鎺ュ彛("/iuap-api-gateway/yonbip/EFI/receivable/batchupdate"),
+    搴斾粯鍙戠エ淇濆瓨鎺ュ彛("/iuap-api-gateway/yonbip/EFI/payable/saveandsubmit"),
+    搴斾粯鍙戠エ鍒犻櫎鎺ュ彛("/iuap-api-gateway/yonbip/EFI/earap/openapi/bill/payable/batchdelete"),
+    搴斾粯鍙戠エ鏌ヨ鎺ュ彛("/iuap-api-gateway/yonbip/EFI/payable/list"),
+
+	搴斾粯鍙戠エ淇敼鎺ュ彛("/iuap-api-gateway/yonbip/EFI/payable/batchupdate"),
+    鏀舵鍗曟煡璇㈡帴鍙�("/iuap-api-gateway/yonbip/EFI/collection/list"),
+    鏀舵閫�娆惧崟淇濆瓨鎺ュ彛("/iuap-api-gateway/yonbip/EFI/arRefund/save"),
+    鏀舵閫�娆惧崟鍒犻櫎鎺ュ彛("/iuap-api-gateway/yonbip/EFI/arRefund/delete"),
+    鏀舵閫�娆惧崟鏌ヨ鎺ュ彛("/iuap-api-gateway/yonbip/EFI/arRefund/list"),
+    BIP鏂囦欢涓婃帴鍙�("/iuap-api-gateway/yonbip/uspace/iuap-apcom-file/rest/v1/file"),
+    BIP鏂囦欢鍒犻櫎鎺ュ彛("/iuap-api-gateway/yonbip/uspace/iuap-apcom-file/rest/v1/file/delete"),
+    搴旀敹鏄庣粏璐︽煡璇�("/iuap-api-gateway/h7rx7y0r/current_yonbip_default_sys/KKJCJK/DetailedAccountsReceivableController");
+
+
+
+    private String url;
+    BipApiEnum(String url) {
+        this.url = url;
+    }
+    public String getUrl() {
+        return url;
+    }
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/BipHttpUtil.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/BipHttpUtil.java
new file mode 100644
index 0000000..6b27c5b
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/BipHttpUtil.java
@@ -0,0 +1,308 @@
+package com.by4cloud.platformx.business.invoice.utils;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+
+import com.by4cloud.platformx.business.entity.invoice.BipResVo;
+import com.by4cloud.platformx.business.entity.invoice.BipTokenVo;
+import com.by4cloud.platformx.business.utils.SignHelper;
+import lombok.RequiredArgsConstructor;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLDecoder;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Component
+@RequiredArgsConstructor
+public class BipHttpUtil {
+    private static final Logger log = LoggerFactory.getLogger(BipHttpUtil.class);
+    @Value("${bip.ip}")
+    private String ip;
+	@Value("${bip.filePath}")
+	private String bipFilePath;
+
+	@Value("${bip.appKey}")
+	private String appKey;
+	@Value("${bip.appSecret}")
+	private String appSecret;
+    private final RedisTemplate redisTemplate;
+    public String getToken(){
+        String redisKey="BIP_TOKEN:";
+//        String appKey = "800b2805c5584f0abb8705acbe487dc5";
+//        String appSecret = "59ba72c62a6a27203d7e517787a738be89ba55cb";
+        redisKey+=appKey;
+        if (redisTemplate.hasKey(redisKey)){
+            return (String) redisTemplate.opsForValue().get(redisKey);
+        }
+        for (int i=0;i<10;i++){
+            long timestamp = System.currentTimeMillis();
+            Map<String,Object> paramMap = new HashMap<>();
+            paramMap.put("appKey",appKey);
+            paramMap.put("timestamp",timestamp);
+            String signature = null;
+            try {
+                signature = SignHelper.sign(paramMap,appSecret);
+            } catch (NoSuchAlgorithmException e) {
+                throw new RuntimeException(e);
+            } catch (UnsupportedEncodingException e) {
+                throw new RuntimeException(e);
+            } catch (InvalidKeyException e) {
+                throw new RuntimeException(e);
+            }
+            String url = ip+BipApiEnum.鑾峰彇TOKEN.getUrl()+"?appKey="+appKey+"&timestamp="+timestamp+"&signature="+signature;
+            String result = HttpUtil.get(url);
+            if (result==null){
+                continue;
+            }
+
+			try {
+				BipResVo<BipTokenVo> tokenVo = JSON.parseObject(result,new TypeReference<BipResVo<BipTokenVo>>(){});
+				if (tokenVo.getCode().equals("00000")){
+					redisTemplate.opsForValue().set(redisKey,tokenVo.getData().getAccess_token(),tokenVo.getData().getExpire()-10, TimeUnit.SECONDS);
+					System.out.println("-------bipToken:"+tokenVo.getData().getAccess_token());
+					return tokenVo.getData().getAccess_token();
+				}
+			}catch (Exception e){
+				throw new RuntimeException("bip璁块棶鎺ュ彛寮傚父,璇锋鏌ョ綉缁滄槸鍚︽甯�");
+			}
+
+
+        }
+        return null;
+
+    }
+    public String post(BipApiEnum apiEnum,Object data){
+        log.warn("-------------bipPost-url:"+ip+apiEnum.getUrl()+"?access_token="+getToken());
+        log.warn("-------------bipPost-req:"+JSONUtil.toJsonStr(data));
+		try {
+			String result = HttpRequest.post(ip+apiEnum.getUrl()+"?access_token="+getToken())
+					.body(JSONUtil.toJsonStr(data))
+					.timeout(10*3000)
+					.execute().body();
+			log.warn("-------------bipPost-res:"+result);
+			return result;
+		}catch (Exception e){
+			e.printStackTrace();
+			log.error("-------------bipPost-res:璇锋眰澶辫触");
+			throw new RuntimeException("BIP鎺ュ彛瓒呮椂,璇锋鏌ョ綉缁滃悗閲嶆柊灏濊瘯");
+		}
+            }
+
+	public String postUploadFile(String businessId,String fileLocalPath){
+		// 鍒涘缓HttpClient瀵硅薄
+		CloseableHttpClient httpClient = HttpClients.createDefault();
+		String param = "?access_token="+getToken()+"&businessType=yonbip-fi-earapbill&businessId="+businessId;
+		// 鍒涘缓HttpPost瀵硅薄锛屽苟璁剧疆URL
+		HttpPost httpPost = new HttpPost(ip+BipApiEnum.BIP鏂囦欢涓婃帴鍙�.getUrl()+param);
+		// 鍒涘缓MultipartEntityBuilder瀵硅薄锛屽苟璁剧疆鏂囦欢鍜屽叾浠栧弬鏁�
+		MultipartEntityBuilder builder = MultipartEntityBuilder.create();
+		builder.addBinaryBody("files", new File(bipFilePath+fileLocalPath), ContentType.MULTIPART_FORM_DATA, fileLocalPath);
+		// 灏哅ultipartEntityBuilder鏋勫缓鐨勫疄浣撳璞¤缃埌HttpPost瀵硅薄涓�
+		HttpEntity entity = builder.build();
+		httpPost.setEntity(entity);
+		// 鎵цHttpPost璇锋眰锛岃幏鍙栧搷搴�
+		HttpResponse response = null;
+		String responseBody = null;
+		try {
+			response = httpClient.execute(httpPost);
+			// 瑙f瀽鍝嶅簲
+			HttpEntity responseEntity = response.getEntity();
+			 responseBody= EntityUtils.toString(responseEntity);
+			System.out.println(responseBody);
+
+			// 鍏抽棴HttpClient
+			httpClient.close();
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		return responseBody;
+	}
+
+	public String postUploadFileUrl(String businessId,String fileLocalPath){
+		URL url = null;
+		InputStream stream = null;
+		String lastThreeChars = fileLocalPath.substring(fileLocalPath.length() - 3);
+		String lowLast = lastThreeChars.toLowerCase();
+		if (lowLast.equals("png") || lowLast.equals("jpeg") || lowLast.equals("jpg")) {
+			stream = pngToPdf(fileLocalPath, lowLast);
+		} else {
+			try {
+				url = new URL(fileLocalPath);
+				URLConnection connection = url.openConnection();
+				stream = connection.getInputStream();
+			} catch (MalformedURLException e) {
+				throw new RuntimeException(e);
+			} catch (IOException e) {
+				throw new RuntimeException(e);
+			}
+		}
+		// 鍒涘缓HttpClient瀵硅薄
+		CloseableHttpClient httpClient = HttpClients.createDefault();
+		String param = "?access_token="+getToken()+"&businessType=yonbip-fi-earapbill&businessId="+businessId;
+		// 鍒涘缓HttpPost瀵硅薄锛屽苟璁剧疆URL
+		HttpPost httpPost = new HttpPost(ip+BipApiEnum.BIP鏂囦欢涓婃帴鍙�.getUrl()+param);
+		// 鍒涘缓MultipartEntityBuilder瀵硅薄锛屽苟璁剧疆鏂囦欢鍜屽叾浠栧弬鏁�
+		MultipartEntityBuilder builder = MultipartEntityBuilder.create();
+		// 灏哅ultipartEntityBuilder鏋勫缓鐨勫疄浣撳璞¤缃埌HttpPost瀵硅薄涓�
+		builder.addBinaryBody("files", stream, ContentType.MULTIPART_FORM_DATA, "MX_"+System.currentTimeMillis()+".pdf");
+		HttpEntity entity = builder.build();
+		httpPost.setEntity(entity);
+		// 鎵цHttpPost璇锋眰锛岃幏鍙栧搷搴�
+		HttpResponse response = null;
+		String responseBody = null;
+		try {
+			response = httpClient.execute(httpPost);
+			// 瑙f瀽鍝嶅簲
+			HttpEntity responseEntity = response.getEntity();
+			responseBody= EntityUtils.toString(responseEntity);
+			System.out.println(responseBody);
+
+			// 鍏抽棴HttpClient
+			httpClient.close();
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		return responseBody;
+	}
+
+	public  InputStream pngToPdf(String filePath,String format){
+		//String bipFilePath = "/Users/kongdeqiang/Desktop/";
+		long l = System.currentTimeMillis();
+		InputStream stream = null;
+		try {
+			// 鍔犺浇PNG鍥剧墖
+			URL url1 = new URL(filePath);
+			InputStream inputStream = url1.openStream();
+			OutputStream out = new FileOutputStream(bipFilePath+format+l+"."+format);
+			int bytesRead = 0;
+			byte[] buffer = new byte[8192];
+			while ((bytesRead = inputStream.read(buffer,0,8192)) !=-1){
+				out.write(buffer,0,bytesRead);
+			}
+			out.close();
+			inputStream.close();
+
+			File file = new File(bipFilePath+format+l+"."+format);
+			BufferedImage image = ImageIO.read(file);
+			ByteArrayOutputStream baos = new ByteArrayOutputStream();
+			ImageIO.write(image, format, baos);
+			byte[] bytes = baos.toByteArray();
+			// 鍒涘缓涓�涓狿DF鏂囨。
+			PDDocument document = new PDDocument();
+			PDPage page = new PDPage(new PDRectangle(image.getWidth(), image.getHeight()));
+			document.addPage(page);
+
+			// 灏嗗浘鐗囪浆鎹负PDF涓殑瀵硅薄
+			PDImageXObject pdImage = PDImageXObject.createFromByteArray(document, bytes, format);
+			PDPageContentStream contents = new PDPageContentStream(document, page);
+			contents.drawImage(pdImage, 0, 0, image.getWidth(), image.getHeight());
+			contents.close();
+
+			// 淇濆瓨PDF鏂囨。
+			document.save(bipFilePath+format+l+".pdf");
+			document.close();
+			stream = Files.newInputStream(Paths.get(bipFilePath+format+l+".pdf"));
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return stream;
+	}
+
+
+	public String postDeleteFile(String businessId, String fid){
+		// 鍒涘缓HttpClient瀵硅薄
+		CloseableHttpClient httpClient = HttpClients.createDefault();
+		String param = "?access_token="+getToken()+"&businessType=yonbip-fi-earapbill&businessId="+businessId+"&fid="+fid;
+		// 鍒涘缓HttpPost瀵硅薄锛屽苟璁剧疆URL
+		HttpPost httpPost = new HttpPost(ip+BipApiEnum.BIP鏂囦欢鍒犻櫎鎺ュ彛.getUrl()+param);
+		// 鎵цHttpPost璇锋眰锛岃幏鍙栧搷搴�
+		HttpResponse response = null;
+		String responseBody = null;
+		try {
+			response = httpClient.execute(httpPost);
+			// 瑙f瀽鍝嶅簲
+			HttpEntity responseEntity = response.getEntity();
+			responseBody= EntityUtils.toString(responseEntity);
+			System.out.println(responseBody);
+
+			// 鍏抽棴HttpClient
+			httpClient.close();
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		return responseBody;
+	}
+
+	public static void main1(String[] args) {
+	/*	File file = new File("/Users/kongdeqiang/Desktop/1725590083564FFDXJS.pdf");
+		Map<String,Object> paramMap = new HashMap<>();
+		paramMap.put("access_token","");
+		paramMap.put("businessType","yonbip-fi-earapbill");
+		paramMap.put("businessId","");
+		paramMap.put("file",file);
+		Map<String,Object> dataBody = new HashMap<>();
+		String result = HttpRequest.post("https://bip01.res.jzeg.cn"+BipApiEnum.BIP鏂囦欢涓婃帴鍙�.getUrl())
+				.form(paramMap)
+				.timeout(10*1000)
+				.execute().body();
+		System.out.println(result);*/
+	}
+
+    public static void main(String[] args) throws Exception {
+		//姝e紡
+//        String appKey = "800b2805c5584f0abb8705acbe487dc5";
+//        String appSecret = "59ba72c62a6a27203d7e517787a738be89ba55cb";
+		//娴嬭瘯
+//		String appKey = "91d28a4b776a4ab992db225958cf2d93";
+//		String appSecret = "77abbe9a3bc647ccf4a2a08629a7a0316ffff830";
+//        for (int i=0;i<100;i++){
+//            long timestamp = System.currentTimeMillis();
+//            Map<String,Object> paramMap = new HashMap<>();
+//            paramMap.put("appKey",appKey);
+//            paramMap.put("timestamp",timestamp);
+//            String signature = SignHelper.sign(paramMap,appSecret);
+//            System.out.println("signature:"+signature);
+//            String url = "https://bip.res.jzeg.cn"+BipApiEnum.鑾峰彇TOKEN.getUrl()+"?appKey="+appKey+"&timestamp="+timestamp+"&signature="+signature;
+//            System.out.println(url);
+//            String result = HttpUtil.get(url);
+//            System.out.println(result);
+//            Thread.sleep(300);
+//        }
+
+		//InputStream pdf = BipHttpUtil.pngToPdf("/Users/kongdeqiang/Desktop/WechatIMG316.png", "png");
+
+
+	}
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/NumUtils.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/NumUtils.java
new file mode 100644
index 0000000..634cb36
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/NumUtils.java
@@ -0,0 +1,305 @@
+package com.by4cloud.platformx.business.invoice.utils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * @author xfei
+ * @date 2022/5/27涓嬪崍8:26
+ */
+public class NumUtils {
+	/**
+	 * 绮剧‘灏忔暟
+	 * @param f 灏忔暟
+	 * @param length 绮剧‘浣嶆暟
+	 * @return
+	 */
+	public static Float accurateFloat(Float f,int length){
+		BigDecimal b = new BigDecimal(f.toString());
+		f = b.setScale(length,BigDecimal.ROUND_HALF_UP).floatValue();
+		return f;
+	}
+	public static Float accurateFloat(Float f){
+		return accurateFloat(f,3);
+	}
+
+	public static Double accurateFloat(Double f,int length){
+		BigDecimal b = new BigDecimal(f.toString());
+		f = b.setScale(length,BigDecimal.ROUND_HALF_UP).doubleValue();
+		return f;
+	}
+	public static Double accurateFloat(Double f){
+		return accurateFloat(f,3);
+	}
+
+
+	public static Double accurateDouble(Double f,int length){
+		if(f==null){
+			f=0d;
+		}
+		BigDecimal b2 = new BigDecimal(f.toString());
+		f = b2.setScale(length,BigDecimal.ROUND_HALF_UP).doubleValue();
+		return f;
+	}
+	public static Double accurateDouble(Double f){
+		return accurateDouble(f,3);
+	}
+
+	/**
+	 * 鍔�
+	 * @param a
+	 * @param b
+	 * @return
+	 */
+	public static Double addDouble(Double a,Double b){
+		if (a==null)a=0d;
+		if (b==null)b=0d;
+		BigDecimal aa = new BigDecimal(a+"");
+		BigDecimal bb = new BigDecimal(b+"");
+		aa = aa.add(bb);
+		aa = aa.setScale(2,BigDecimal.ROUND_HALF_UP);
+		return aa.doubleValue();
+	}
+	public static Double addDoubles(Double ... a){
+		Double result = 0d;
+		for (Double d :a){
+			result =addDouble(result,d);
+		}
+		return result;
+	}
+
+	public static Double addDoubles(int len,Double ... a){
+		Double result = 0d;
+		for (Double d :a){
+			result =addDouble(result,d,len);
+		}
+		return result;
+	}
+
+	/**
+	 * 鍑�
+	 * @param a
+	 * @param b
+	 * @return
+	 */
+	public static Double subtractDouble(Double a,Double b){
+		if (a==null)a=0d;
+		if (b==null)b=0d;
+		BigDecimal aa = new BigDecimal(a+"");
+		BigDecimal bb = new BigDecimal(b+"");
+		aa = aa.subtract(bb);
+		aa = aa.setScale(2,BigDecimal.ROUND_HALF_UP);
+		return aa.doubleValue();
+	}
+
+	/**
+	 * 鍑� 鍙垗涓嶅叆
+	 * @param a
+	 * @param b
+	 * @return
+	 */
+	public static Double subtractDoubleDown(Double a,Double b){
+		if (a==null)a=0d;
+		if (b==null)b=0d;
+		BigDecimal aa = new BigDecimal(a+"");
+		BigDecimal bb = new BigDecimal(b+"");
+		aa = aa.subtract(bb);
+		aa = aa.setScale(2,BigDecimal.ROUND_DOWN);
+		return aa.doubleValue();
+	}
+
+	/**
+	 * 涔�
+	 * @param a
+	 * @param b
+	 * @return
+	 */
+	public static Double multiplyDouble(Double a,Double b){
+		if (a==null)a=0d;
+		if (b==null)b=0d;
+		BigDecimal aa = new BigDecimal(a+"");
+		BigDecimal bb = new BigDecimal(b+"");
+		aa = aa.multiply(bb);
+		aa = aa.setScale(2,BigDecimal.ROUND_HALF_UP);
+		return aa.doubleValue();
+	}
+	/**
+	 * 涔� 鍙垗涓嶅叆
+	 * @param a
+	 * @param b
+	 * @return
+	 */
+	public static Double multiplyDoubleDown(Double a,Double b){
+		if (a==null)a=0d;
+		if (b==null)b=0d;
+		BigDecimal aa = new BigDecimal(a+"");
+		BigDecimal bb = new BigDecimal(b+"");
+		aa = aa.multiply(bb);
+		aa = aa.setScale(2,BigDecimal.ROUND_DOWN);
+		return aa.doubleValue();
+	}
+	/**
+	 * 瀹夊叏鐨勯櫎娉曡繍绠楋紝澶勭悊 null 鍜岄櫎浠ラ浂锛屽苟杩斿洖淇濈暀涓や綅灏忔暟鐨勭粨鏋溿��
+	 *
+	 * @param a 琚櫎鏁�
+	 * @param b 闄ゆ暟
+	 * @return (a / b) 鐨勭粨鏋滐紝淇濈暀涓や綅灏忔暟銆傚鏋� b 涓� 0 鎴� null锛屽垯杩斿洖 0.0銆�
+	 */
+	public static Double divideDouble(Double a, Double b) {
+		// 浣跨敤 Double.valueOf(0d) 鏉ラ伩鍏嶈嚜鍔ㄨ绠卞甫鏉ョ殑娼滃湪闂锛岃櫧鐒惰繖閲� 0d 鏄瓧闈㈤噺
+		Double dividend = a==null? 0.0:a;
+		Double divisor = b==null? 0.0:b;
+
+		// 澶勭悊闄や互闆剁殑鎯呭喌
+		if (divisor.equals(0.0)) {
+			// 鍙互鏍规嵁涓氬姟閫昏緫閫夋嫨杩斿洖 0.0銆乶ull 鎴栨姏鍑� IllegalArgumentException
+			return 0.0;
+		}
+
+		// 浣跨敤 String.valueOf 鎴� toString() 鏉ラ伩鍏� double 鏋勯�犲櫒鐨勭簿搴﹂棶棰�
+		BigDecimal bdDividend = new BigDecimal(dividend.toString());
+		BigDecimal bdDivisor = new BigDecimal(divisor.toString());
+
+		// 鍦ㄩ櫎娉曠殑鍚屾椂鎸囧畾绮惧害鍜岃垗鍏ユā寮�
+		BigDecimal result = bdDividend.divide(bdDivisor, 2, RoundingMode.HALF_UP);
+
+		return result.doubleValue();
+	}
+//	/**
+//	 * 闄�
+//	 * 闄ゆ硶
+//	 * @param a
+//	 * @param b
+//	 * @return
+//	 */
+//	public static Double divideDouble(Double a,Double b){
+//		if (a==null)a=0d;
+//		if (b==null)b=0d;
+//		BigDecimal aa = new BigDecimal(a+"");
+//		BigDecimal bb = new BigDecimal(b+"");
+//		aa = aa.divide(bb);
+//		aa = aa.setScale(2,BigDecimal.ROUND_HALF_UP);
+//		return aa.doubleValue();
+//	}
+
+	public static Double divideDoubleUp(Double a,Double b){
+		if (a==null)a=0d;
+		if (b==null)b=0d;
+		BigDecimal aa = new BigDecimal(a+"");
+		BigDecimal bb = new BigDecimal(b+"");
+		aa = aa.divide(bb,BigDecimal.ROUND_HALF_UP);
+		aa = aa.setScale(2,BigDecimal.ROUND_HALF_UP);
+		return aa.doubleValue();
+	}
+
+	/**
+	 * 闄�
+	 * 闄ゆ硶
+	 * @param a
+	 * @param b
+	 * @return
+	 */
+	public static Double divideDoubleDown(Double a,Double b){
+		if (a==null)a=0d;
+		if (b==null)b=0d;
+		BigDecimal aa = new BigDecimal(a+"");
+		BigDecimal bb = new BigDecimal(b+"");
+		aa = aa.divide(bb);
+		aa = aa.setScale(2,BigDecimal.ROUND_DOWN);
+		return aa.doubleValue();
+	}
+	/**
+	 * 鍔�
+	 * @param a
+	 * @param b
+	 * @return
+	 */
+	public static Double addDouble(Double a,Double b,int len){
+		if (a==null)a=0d;
+		if (b==null)b=0d;
+		BigDecimal aa = new BigDecimal(a+"");
+		BigDecimal bb = new BigDecimal(b+"");
+		aa = aa.add(bb);
+		aa = aa.setScale(len,BigDecimal.ROUND_HALF_UP);
+		return aa.doubleValue();
+	}
+
+	/**
+	 * 鍑�
+	 * @param a
+	 * @param b
+	 * @return
+	 */
+	public static Double subtractDouble(Double a,Double b,int len){
+		if (a==null)a=0d;
+		if (b==null)b=0d;
+		BigDecimal aa = new BigDecimal(a+"");
+		BigDecimal bb = new BigDecimal(b+"");
+		aa = aa.subtract(bb);
+		aa = aa.setScale(len,BigDecimal.ROUND_HALF_UP);
+		return aa.doubleValue();
+	}
+
+	/**
+	 * 涔�
+	 * @param a
+	 * @param b
+	 * @return
+	 */
+	public static Double multiplyDouble(Double a,Double b,int len){
+		if (a==null)a=0d;
+		if (b==null)b=0d;
+		BigDecimal aa = new BigDecimal(a+"");
+		BigDecimal bb = new BigDecimal(b+"");
+		aa = aa.multiply(bb);
+		aa = aa.setScale(len,BigDecimal.ROUND_HALF_UP);
+		return aa.doubleValue();
+	}
+	/**
+	 * 闄�
+	 * @param a
+	 * @param b
+	 * @return
+	 */
+	public static Double divideDouble(Double a,Double b,int len){
+		if (a==null)a=0d;
+		if (b==null)b=0d;
+		if(b==0){
+			return 0.0d;
+		}
+		BigDecimal aa = new BigDecimal(a+"");
+		BigDecimal bb = new BigDecimal(b+"");
+		aa = aa.divide(bb,len, BigDecimal.ROUND_HALF_UP);
+		return aa.doubleValue();
+	}
+
+
+
+	public static Double floatToD(Float f){
+		if (f == null) {
+			return new Double(0);
+		}
+		return new Double(f);
+	}
+
+	public static void main(String[] args) {
+//		System.out.println(NumUtils.accurateDouble(60.1575,3));
+		System.out.println(NumUtils.addDoubles(6.1234d, 6.1234d, 4.33d));
+	}
+
+	/**
+	 * 鍙垗涓嶅叆璁$畻鏂规硶
+	 *
+	 * @param number
+	 * @param decimalPlaces
+	 * @return
+	 */
+	public static double truncateToDecimalPlaces(double number, int decimalPlaces) {
+		if (decimalPlaces < 0) {
+			throw new IllegalArgumentException("灏忔暟浣嶆暟涓嶈兘涓鸿礋鏁�");
+		}
+		double multiplier = Math.pow(10, decimalPlaces);
+		return (double) ((long) (number * multiplier)) / multiplier;
+	}
+
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/InvoiceService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/InvoiceService.java
new file mode 100644
index 0000000..4ff9c4d
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/InvoiceService.java
@@ -0,0 +1,24 @@
+package com.by4cloud.platformx.business.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.by4cloud.platformx.business.entity.ContractOutBound;
+import com.by4cloud.platformx.business.entity.SaleCredit;
+import com.by4cloud.platformx.business.entity.invoice.InvoiceResult;
+import com.by4cloud.platformx.business.entity.invoice.InvoicingVo;
+
+import java.util.List;
+import java.util.Map;
+
+public interface InvoiceService extends IService<InvoiceResult> {
+
+    Map<String, Object> toRedTicket(SaleCredit saleCredit);
+
+    InvoicingVo toGetByCompare(SaleCredit saleCredit, List<ContractOutBound> contractOutBoundList);
+
+    Map<String, Object> toKaipiao(InvoicingVo invoicingVo);
+
+    Map<String,Object> downInvoiceMethod(InvoiceResult invoiceResult);
+
+    boolean pushBlue(Long railwayId, Integer type); //0搴旀敹 1搴斾粯
+
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/InvoiceServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/InvoiceServiceImpl.java
new file mode 100644
index 0000000..891c3c6
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/InvoiceServiceImpl.java
@@ -0,0 +1,1458 @@
+package com.by4cloud.platformx.business.service.impl;
+
+import cn.hutool.http.HttpRequest;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.StringUtils;
+import com.alibaba.nacos.common.utils.UuidUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.by4cloud.platformx.business.entity.ContractOutBound;
+import com.by4cloud.platformx.business.entity.SaleCredit;
+import com.by4cloud.platformx.business.entity.invoice.*;
+import com.by4cloud.platformx.business.invoice.mapper.FpInvoiceResultItemMapper;
+import com.by4cloud.platformx.business.invoice.mapper.FpInvoiceResultMapper;
+import com.by4cloud.platformx.business.invoice.service.BipInvoiceService;
+import com.by4cloud.platformx.business.invoice.service.FileUploadService;
+import com.by4cloud.platformx.business.invoice.service.FpInvoiceResultService;
+import com.by4cloud.platformx.business.service.InvoiceService;
+import com.by4cloud.platformx.business.service.SaleCreditService;
+import com.google.gson.Gson;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 閿�鍞寕璐�
+ *
+ * @author wjli
+ * @date 2026-05-21 16:16:31
+ */
+@Service
+public class InvoiceServiceImpl extends ServiceImpl<FpInvoiceResultMapper, InvoiceResult> implements InvoiceService {
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    @Autowired
+    private FpInvoiceResultItemMapper itemMapper;
+
+    @Autowired
+    private SaleCreditService saleCreditService;
+
+    @Autowired
+    private FpInvoiceResultService invoiceResultService;
+
+    @Autowired
+    private BipInvoiceService bipInvoiceService;
+
+    @Autowired
+    private FileUploadService fileUploadService;
+
+    @Value("${BWInvoice.ip}")
+    private String invoiceIp;
+    @Value("${BWInvoice.kaipiao}")
+    private String kpUrl;
+    @Value("${BWInvoice.chaxun}")
+    private String cxUrl;
+    @Value("${BWInvoice.redConfirmAdd}")
+    private String redConfirmUrl;
+
+    @Value("${BWInvoice.redConfirmSearch}")
+    private String redConfirmSearchUrl;
+
+    @Override
+    public Map<String, Object> toKaipiao(InvoicingVo invoicingVo) {
+         Map<String, Object> stringObjectMap = zizhuKaiPiao(invoicingVo);
+         return stringObjectMap;
+    }
+
+    @Override
+    public Map<String, Object> toRedTicket(SaleCredit saleCredit) {
+        return redTicket(saleCredit);
+    }
+
+    @Override
+    public InvoicingVo toGetByCompare(SaleCredit saleCredit, List<ContractOutBound> contractOutBoundList) {
+        return getByCompare(saleCredit,contractOutBoundList);
+    }
+
+    /**
+     * 鑷富缁撶畻寮�绁�
+     */
+    Map<String, Object> zizhuKaiPiao(InvoicingVo vo){
+        String s1 = redisTemplate.opsForValue().get("ZZKP_BLUE:" + vo.getEntrustCode());
+        if(StringUtils.isNotBlank(s1)){
+            System.out.println("缁撶畻鍗曞彿锛�"+vo.getEntrustCode()+"姝e湪寮�绁紝璇峰嬁閲嶅鐐瑰嚮");
+            Map<String,Object> res = new HashMap<>();
+            res.put("success",false);
+            res.put("message","缁撶畻鍗曞彿锛�"+vo.getEntrustCode()+"姝e湪寮�绁紝璇峰嬁閲嶅鐐瑰嚮");
+            return  res;
+        }
+        redisTemplate.opsForValue().set("ZZKP_BLUE:" + vo.getEntrustCode(),"true");
+        try {
+            Gson gson =new Gson();
+            String str = gson.toJson(vo);
+            System.out.println(str);
+            String responseBody = "";
+            responseBody = HttpRequest.post(invoiceIp+kpUrl+ UuidUtils.generateUuid())
+                    .timeout(400000)
+                    .body(str)
+                    .execute()
+                    .body();
+            System.out.println(responseBody);
+            JSONObject jsonObj = JSON.parseObject(responseBody);
+            if(jsonObj!=null){
+                boolean flag = (Boolean)jsonObj.get("success");
+                JSONObject message = jsonObj.getJSONObject("message");
+                String requestId = (String) jsonObj.get("requestId");
+                if(!flag){
+                    Map<String,Object> res = new HashMap<>();
+                    res.put("success",flag);
+                    res.put("message",message.get("errorMessage"));
+                    InvoiceResult invoiceResult = new InvoiceResult();
+                    invoiceResult.setSaleCreditId(vo.getSaleCreditId());
+                    invoiceResult.setRequestId(requestId);
+                    invoiceResult.setSuccess(flag);
+                    invoiceResult.setMessage((String) message.get("errorMessage"));
+                    invoiceResult.setMethodName("钃濆瓧寮�绁ㄦ帴鍙�");
+                    invoiceResult.setEntrustCode(vo.getEntrustCode());
+                    invoiceResultService.save(invoiceResult);
+
+                   SaleCredit saleCredit = saleCreditService.getById(invoiceResult.getSaleCreditId());
+                   saleCredit.setInvoiceRemark((String) message.get("errorMessage"));
+                   saleCreditService.updateById(saleCredit);
+
+                   /* UpdateWrapper<RailwayEntrust> updateWrapper = new UpdateWrapper<>();
+                    updateWrapper.lambda().set(RailwayEntrust::getInvoiceResult,null)
+                            .set(RailwayEntrust::getInvoiceResultId,null)
+                            .set(RailwayEntrust::getTaskId,null)
+                            .set(RailwayEntrust::getInvoiceProcInstId,null)
+                            .set(RailwayEntrust::getInvoiceRemark,(String) message.get("errorMessage"))
+                            .eq(RailwayEntrust::getEntrustCode,vo.getEntrustCode());
+                    railwayEntrustMapper.update(null,updateWrapper);*/
+
+                    redisTemplate.delete("ZZKP_BLUE:" + vo.getEntrustCode());
+                    return res;
+                }else {
+                    String successMessage = (String)message.get("successMessage");
+                    JSONObject model = jsonObj.getJSONObject("model");
+                    JSONArray success = model.getJSONArray("success");
+                    JSONObject modelObject = success.getJSONObject(0);
+                    String invoiceTypeCode = (String)modelObject.get("invoiceTypeCode");
+                    String invoiceNo = (String)modelObject.get("invoiceNo");
+                    String invoiceDate = (String)modelObject.get("invoiceDate");
+                    String invoiceQrCode = (String)modelObject.get("invoiceQrCode");
+                    String serialNo = (String)modelObject.get("serialNo");
+                    BigDecimal invoiceTotalPriceValue = (BigDecimal)modelObject.get("invoiceTotalPrice");
+                    Double invoiceTotalPrice = Double.valueOf(invoiceTotalPriceValue.doubleValue());
+                    BigDecimal invoiceTotalTaxValue = (BigDecimal)modelObject.get("invoiceTotalTax");
+                    Double invoiceTotalTax = Double.valueOf(invoiceTotalTaxValue.doubleValue());
+                    BigDecimal invoiceTotalPriceTaxValue = (BigDecimal)modelObject.get("invoiceTotalPriceTax");
+                    Double invoiceTotalPriceTax = Double.valueOf(invoiceTotalPriceTaxValue.doubleValue());
+                    String mulPurchaserMark = (String)modelObject.get("mulPurchaserMark");
+                    String sellerTaxNo = (String)modelObject.get("sellerTaxNo");
+                    String coalCalorificValue = (String)modelObject.get("coalCalorificValue");
+                    String totalSulfurOnDryBasis = (String)modelObject.get("totalSulfurOnDryBasis");
+                    String dryAshFreeVolatileMatter = (String)modelObject.get("dryAshFreeVolatileMatter");
+
+                    InvoiceResult invoiceResult = new InvoiceResult();
+                    invoiceResult.setSaleCreditId(vo.getSaleCreditId());
+                    invoiceResult.setRequestId(requestId);
+                    invoiceResult.setSuccess(flag);
+                    invoiceResult.setMessage(successMessage);
+                    invoiceResult.setInvoiceNo(invoiceNo);
+                    invoiceResult.setInvoiceTyCode(invoiceTypeCode);
+                    invoiceResult.setInvoiceDate(invoiceDate);
+                    invoiceResult.setInvoiceQrCode(invoiceQrCode);
+                    invoiceResult.setSerialNo(serialNo);
+                    invoiceResult.setMethodName("钃濆瓧寮�绁ㄦ帴鍙�");
+                    invoiceResult.setEntrustCode(vo.getEntrustCode());
+                    invoiceResult.setInvoiceTotalPrice(invoiceTotalPrice);
+                    invoiceResult.setInvoiceTotalTax(invoiceTotalTax);
+                    invoiceResult.setInvoiceTotalPriceTax(invoiceTotalPriceTax);
+                    invoiceResult.setMulPurchaserMark(mulPurchaserMark);
+                    invoiceResult.setXTaxNo(sellerTaxNo);
+					/*if(StringUtils.isNotBlank(coalCalorificValue)){
+						invoiceResult.setCoalCalorificValue(coalCalorificValue);
+					}
+					if(StringUtils.isNotBlank(totalSulfurOnDryBasis)){
+						invoiceResult.setTotalSulfurOnDryBasis(totalSulfurOnDryBasis);
+					}
+					if(StringUtils.isNotBlank(dryAshFreeVolatileMatter)){
+						invoiceResult.setDryAshFreeVolatileMatter(dryAshFreeVolatileMatter);
+					}*/
+                    invoiceResultService.save(invoiceResult);
+
+                    JSONArray invoiceDetailList1 = modelObject.getJSONArray("invoiceDetailsList");
+                    for (int i = 0; i < invoiceDetailList1.size(); i++) {
+                        JSONObject jsonObject = invoiceDetailList1.getJSONObject(i);
+                        int goodsLineNo = (int) jsonObject.get("goodsLineNo");
+                        String goodsName = (String) jsonObject.get("goodsName");
+                        String goodsCode = (String) jsonObject.get("goodsCode");
+                        BigDecimal goodsPriceValue = (BigDecimal)jsonObject.get("goodsPrice");
+                        Double goodsPrice = Double.valueOf(goodsPriceValue.doubleValue());
+
+                        double goodsQuantity=0.0;
+                        try {
+                            int goodsQuantity1 = (int) jsonObject.get("goodsQuantity");
+                            goodsQuantity = goodsQuantity1;
+                        }catch (Exception e){
+                            e.printStackTrace();
+                            BigDecimal goodsQuantityValue = (BigDecimal)jsonObject.get("goodsQuantity");
+                            goodsQuantity = Double.valueOf(goodsQuantityValue.doubleValue());
+                        }
+                        BigDecimal goodsTotalPriceValue = (BigDecimal)jsonObject.get("goodsTotalPrice");
+                        Double goodsTotalPrice = Double.valueOf(goodsTotalPriceValue.doubleValue());
+                        BigDecimal goodsTotalTaxValue = (BigDecimal)jsonObject.get("goodsTotalTax");
+                        Double goodsTotalTax = Double.valueOf(goodsTotalTaxValue.doubleValue());
+                        BigDecimal goodsTaxRateValue = (BigDecimal)jsonObject.get("goodsTaxRate");
+                        Double goodsTaxRate = Double.valueOf(goodsTaxRateValue.doubleValue());
+                        String invoiceLineNature = (String) jsonObject.get("invoiceLineNature");
+                        String goodsUnit = (String) jsonObject.get("goodsUnit");
+                        String goodsSpecification = (String) jsonObject.get("goodsSpecification");
+                        String coalType = (String)jsonObject.get("coalType");
+                        String agreementTerm = (String)jsonObject.get("agreementTerm");
+                        String name = "";
+						/*if(goodsLineNo==1){
+							name = "鐓ゆ";
+						}
+						if(goodsLineNo==2 && goodsTaxRate==0.13){
+							name = "鍙栭�佽溅璐�";
+						}
+						if(goodsTaxRate==0.6){
+							name = "涓撶嚎璐�";
+						}*/
+                        InvoiceResultItem item = new InvoiceResultItem();
+                        item.setGoodsLineNature(invoiceLineNature);
+                        item.setGoodsCode(goodsCode);
+                        item.setGoodsPrice(goodsPrice);
+                        item.setGoodsLineNo(goodsLineNo);
+                        item.setGoodsQuantity(goodsQuantity);
+                        item.setGoodsTaxRate(goodsTaxRate);
+                        item.setGoodsType(name);
+                        item.setGoodsName(goodsName);
+                        item.setGoodsTotalPrice(goodsTotalPrice);
+                        item.setGoodsTotalTax(goodsTotalTax);
+                        item.setGoodsUnit(goodsUnit);
+                        item.setCoalType(coalType);
+                        if(StringUtils.isNotBlank(agreementTerm)){
+                            item.setAgreementTerm(agreementTerm);
+                        }
+                        if(goodsSpecification !=null){
+                            item.setGoodsSpecification(goodsSpecification);
+                        }
+                        item.setResultId(invoiceResult.getId());
+                        item.setEntrustCode(invoiceResult.getEntrustCode());
+                        String[] split = goodsName.split("\\*");
+                        int length = split.length;
+                        String coalName = split[length - 1];
+                        item.setCoalName(coalName);
+                        itemMapper.insert(item);
+                    }
+
+                    /*QueryWrapper<RailwayEntrust> wrapper = new QueryWrapper<>();
+                    wrapper.lambda().eq(RailwayEntrust::getEntrustCode,invoiceResult.getEntrustCode());
+                    RailwayEntrust railwayEntrust = railwayEntrustMapper.selectList(wrapper).get(0);
+                    railwayEntrust.setInvoiceResultId(invoiceResult.getId());
+                    railwayEntrust.setInvoiceResult(2);
+                    railwayEntrust.setInvoiceRemark("钃濆瓧寮�绁ㄦ垚鍔�");
+                    railwayEntrustMapper.updateById(railwayEntrust);*/
+
+                    SaleCredit saleCredit = saleCreditService.getById(invoiceResult.getSaleCreditId());
+                    saleCredit.setInvoiceRemark("钃濆瓧寮�绁ㄦ垚鍔�");
+                    saleCredit.setStatus(2);
+                    saleCredit.setBlueInvoiceResultId(invoiceResult.getId());
+                    saleCreditService.updateById(saleCredit);
+
+                    Map<String,Object> res = new HashMap<>();
+                    res.put("success",flag);
+                    res.put("message",successMessage);
+                    String s = redisTemplate.opsForValue().get("railwayEntrust_invoice_id:" + saleCredit.getId());
+                    if(StringUtils.isNotBlank(s)){
+                        redisTemplate.delete("railwayEntrust_invoice_id:" + saleCredit.getId());
+                    }
+                    redisTemplate.delete("ZZKP_BLUE:" + vo.getEntrustCode());
+                    return res;
+                }
+
+            }else {
+                InvoiceResult invoiceResult = new InvoiceResult();
+                invoiceResult.setSuccess(false);
+                invoiceResult.setMessage("钃濆瓧寮�绁ㄦ帴鍙f棤杩斿洖鍊�");
+                invoiceResult.setMethodName("钃濆瓧寮�绁ㄦ帴鍙�");
+                invoiceResult.setEntrustCode(vo.getEntrustCode());
+                invoiceResultService.save(invoiceResult);
+                Map<String,Object> res = new HashMap<>();
+                res.put("success",false);
+                res.put("message","钃濆瓧寮�绁ㄦ帴鍙f棤杩斿洖鍊�");
+
+                /*UpdateWrapper<RailwayEntrust> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.lambda().set(RailwayEntrust::getInvoiceResult,null)
+                        .set(RailwayEntrust::getInvoiceResultId,null)
+                        .set(RailwayEntrust::getTaskId,null)
+                        .set(RailwayEntrust::getInvoiceProcInstId,null)
+                        .set(RailwayEntrust::getInvoiceRemark,"钃濆瓧寮�绁ㄦ帴鍙f棤杩斿洖鍊�")
+                        .eq(RailwayEntrust::getEntrustCode,vo.getEntrustCode());
+                railwayEntrustMapper.update(null,updateWrapper);*/
+
+                SaleCredit saleCredit = saleCreditService.getById(invoiceResult.getSaleCreditId());
+                saleCredit.setInvoiceRemark("钃濆瓧寮�绁ㄦ帴鍙f棤杩斿洖鍊�");
+                saleCredit.setStatus(3);
+                saleCredit.setBlueInvoiceResultId(null);
+                saleCredit.setEntrustCode(vo.getEntrustCode());
+                saleCreditService.updateById(saleCredit);
+
+                redisTemplate.delete("ZZKP_BLUE:" + vo.getEntrustCode());
+                return res;
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            Map<String,Object> res = new HashMap<>();
+            res.put("success",false);
+            res.put("message","寮�绁ㄦ帴鍙e紓甯�");
+            InvoiceResult invoiceResult = new InvoiceResult();
+            invoiceResult.setSuccess(false);
+            invoiceResult.setMessage("钃濆瓧寮�绁ㄦ帴鍙e紓甯�");
+            invoiceResult.setMethodName("钃濆瓧寮�绁ㄦ帴鍙�");
+            invoiceResult.setEntrustCode(vo.getEntrustCode());
+            invoiceResultService.save(invoiceResult);
+
+            /*UpdateWrapper<RailwayEntrust> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.lambda().set(RailwayEntrust::getInvoiceResult,null)
+                    .set(RailwayEntrust::getInvoiceResultId,null)
+                    .set(RailwayEntrust::getTaskId,null)
+                    .set(RailwayEntrust::getInvoiceProcInstId,null)
+                    .set(RailwayEntrust::getInvoiceRemark,"钃濆瓧寮�绁ㄦ帴鍙e紓甯�")
+                    .eq(RailwayEntrust::getEntrustCode,vo.getEntrustCode());
+            railwayEntrustMapper.update(null,updateWrapper);*/
+
+            SaleCredit saleCredit = saleCreditService.getById(invoiceResult.getSaleCreditId());
+            saleCredit.setInvoiceRemark("钃濆瓧寮�绁ㄦ帴鍙e紓甯�");
+            saleCredit.setStatus(3);
+            saleCredit.setBlueInvoiceResultId(null);
+            saleCredit.setEntrustCode(vo.getEntrustCode());
+            saleCreditService.updateById(saleCredit);
+
+            redisTemplate.delete("ZZKP_BLUE:" + vo.getEntrustCode());
+            return res;
+        }
+    }
+
+
+
+
+    private InvoicingVo getByCompare(SaleCredit saleCredit, List<ContractOutBound> contractOutBoundList){
+        InvoicingVo invoicingVo = new InvoicingVo();
+        invoicingVo.setSaleCreditId(saleCredit.getId());
+        invoicingVo.setEntrustCode(saleCredit.getEntrustCode());
+        //閿�鏂�
+        invoicingVo.setTaxNo(saleCredit.getCreditCodeB());
+        invoicingVo.setLedgerName(saleCredit.getPartyB());
+        invoicingVo.setOrgCode(saleCredit.getCreditCodeB());
+        invoicingVo.setFormatGenerate(false);
+        invoicingVo.setIsSplit(false);
+        invoicingVo.setFormatPushType(false);
+        invoicingVo.setTaxUserName(saleCredit.getContactPhoneB());
+        InvoicingVo.InvoicingVoInfo invoicingVoInfo = new InvoicingVo.InvoicingVoInfo();
+
+
+        invoicingVoInfo.setInvoiceTypeCode("01");
+        invoicingVoInfo.setSerialNo("MX_ZPP_" + System.currentTimeMillis());
+        invoicingVoInfo.setDrawer(saleCredit.getContactPhoneB());
+
+        Map<String, Object> ext = new HashMap<>();
+        ext.put("htbh",saleCredit.getContractNo());
+        invoicingVoInfo.setExt(ext);
+
+        invoicingVoInfo.setSystemName("xx閿�鍞鐞嗕俊鎭郴缁�");
+
+        List<InvoicingVo.InvoiceDetail> details = new ArrayList<>();
+
+        int i = 0;
+        for (ContractOutBound outBoundVo : contractOutBoundList){
+            i++;
+            InvoicingVo.InvoiceDetail invoiceDetail = new InvoicingVo.InvoiceDetail();
+            invoiceDetail.setGoodsLineNo(i);
+            invoiceDetail.setGoodsTaxRate(outBoundVo.getTaxRate());
+            invoiceDetail.setGoodsType(outBoundVo.getSubjectMatterName());
+            invoiceDetail.setGoodsUnit(outBoundVo.getUnit());
+            invoiceDetail.setGoodsQuantity(outBoundVo.getOutBoundNum());
+            invoiceDetail.setGoodsPrice(outBoundVo.getUnitPrice());
+            invoiceDetail.setGoodsTotalPrice(outBoundVo.getTotalPrice());
+            invoiceDetail.setGoodsTotalTax(outBoundVo.getTotalTax());
+            details.add(invoiceDetail);
+        }
+        //璐柟
+        invoicingVoInfo.setBuyerTaxNo(saleCredit.getCreditCodeA());
+        invoicingVoInfo.setBuyerName(saleCredit.getPartyA());
+        invoicingVoInfo.setInvoiceTotalPrice(saleCredit.getTotalAmount());
+        //invoicingVoInfo.setInvoiceTotalTax(new BigDecimal(allTax).setScale(2,BigDecimal.ROUND_HALF_UP));
+        invoicingVoInfo.setInvoiceTotalPriceTax(saleCredit.getTotalTax());
+        invoicingVoInfo.setBuyerBankName(saleCredit.getBankNameB());
+        invoicingVoInfo.setBuyerBankNumber(saleCredit.getBankAccountB());
+        //invoicingVoInfo.setBuyerAddress(.getBuyerAddress());
+        invoicingVoInfo.setBuyerTelphone(saleCredit.getContactPhoneA());
+        invoicingVoInfo.setInvoiceDetailsList(details);
+        invoicingVo.setData(invoicingVoInfo);
+        return invoicingVo;
+    }
+
+    //@Async("myExecutor")
+    public Map<String, Object> redTicket(SaleCredit saleCredit) {
+        System.out.println("杩涘叆寮傛鏂规硶");
+        System.out.println("褰撳墠绾跨▼鍚嶇О锛�" + Thread.currentThread().getName());
+
+        try {
+            //绾㈠瓧纭鍗�
+            InvoiceResult result = invoiceResultService.getById(saleCredit.getBlueInvoiceResultId());
+            Map<String, Object> objectMap = redTicketConfirm(result,saleCredit);
+            Boolean success = (Boolean) objectMap.get("success");
+            if(success){
+                InvoiceResult obj = (InvoiceResult) objectMap.get("obj");
+                //绾㈠瓧纭鍗曠‘璁ゆ帴鍙�
+                Map<String, Object> stringObjectMap = redTicketConfirmSearch(obj,saleCredit);
+                Boolean confimSuccess = (Boolean) stringObjectMap.get("success");
+                if(confimSuccess){
+                    //寮�绁ㄦ帴鍙�
+                    InvoiceResult invoiceObj = (InvoiceResult) stringObjectMap.get("obj");
+                    if(invoiceObj.getConfirmBillingMark().equals("Y")){
+                        //鏃犻渶寮�绁�
+                        System.out.println(saleCredit.getEntrustCode()+"鐨剅ailwayEntrust宸插紑绾㈠瓧寮�绁�");
+
+                        QueryWrapper<InvoiceResult> invoiceResultQueryWrapper = new QueryWrapper<>();
+                        invoiceResultQueryWrapper.lambda()
+                                .eq(InvoiceResult::getEntrustCode,saleCredit.getEntrustCode())
+                                .eq(InvoiceResult::getMethodName,"钃濆瓧寮�绁ㄦ帴鍙�")
+                                .like(InvoiceResult::getMessage,"%鍙戠エ寮�鍏锋垚鍔�%");
+                        List<InvoiceResult> list = invoiceResultService.list(invoiceResultQueryWrapper);
+                        if(list !=null && list.size()>0){
+                            invoiceResultService.removeByIds(list);
+                        }
+
+                        /*UpdateWrapper<RailwayEntrust> updateWrapper = new UpdateWrapper<>();
+                        updateWrapper.lambda().set(RailwayEntrust::getInvoiceResult,null)
+                                .set(RailwayEntrust::getInvoiceResultId,null)
+                                .set(RailwayEntrust::getInvoiceRemark,"绾㈠瓧寮�绁ㄦ垚鍔�")
+                                .set(RailwayEntrust::getInvoiceRedResultId,invoiceObj.getId())
+                                .eq(RailwayEntrust::getEntrustCode,saleCredit.getEntrustCode());
+                        railwayEntrustMapper.update(null,updateWrapper);*/
+                        saleCredit.setInvoiceRemark("绾㈠瓧寮�绁ㄦ垚鍔�");
+                        saleCredit.setRedInvoiceResultId(invoiceObj.getId());
+                        saleCredit.setStatus(7);
+                        saleCreditService.updateById(saleCredit);
+                        return stringObjectMap;
+                    }else {
+
+                        InvoicingVo invoicingVo = redKaiPiaoVo(invoiceObj);
+                        invoicingVo.setSaleCreditId(saleCredit.getId());
+                        if(invoicingVo !=null){
+                            Map<String, Object> stringObjectMap1 = redTicketKaiPiao(invoicingVo);
+                            Boolean confimSuccess1 = (Boolean) stringObjectMap1.get("success");
+                            String message1 = (String) stringObjectMap1.get("message");
+                            if(confimSuccess1){
+                                System.out.println(saleCredit.getEntrustCode()+"鐨剅ailwayEntrust绾㈠瓧寮�绁ㄧ粨鏋滀负锛�"+confimSuccess1+"------"+message1);
+                                return stringObjectMap1;
+                            }
+                        }
+                    }
+                }else {
+                    System.out.println(saleCredit.getEntrustCode()+"鐨勭孩瀛楃‘璁ゅ崟纭鎺ュ彛寮傚父");
+                    return stringObjectMap;
+                }
+            }else {
+                System.out.println(saleCredit.getEntrustCode()+"鐨勭孩瀛楃‘璁ゅ崟鏂板鎺ュ彛寮傚父");
+                return objectMap;
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        System.out.println("寮傛鏂规硶鎵ц瀹屾垚");
+        Map<String, Object> result = new HashMap<>();
+        result.put("success",false);
+        result.put("message","寮�绁ㄥ紓甯�");
+        return result;
+    }
+
+    /**
+     * 鐗堝紡鏂囦欢鏌ヨ
+     * @param invoiceResult
+     * @return
+     */
+    @Override
+    public Map<String, Object> downInvoiceMethod(InvoiceResult invoiceResult) {
+        SaleCredit saleCredit = saleCreditService.getById(invoiceResult.getSaleCreditId());
+        Map<String,Object> map = new HashMap<>();
+        Map<String,Object> map1 = new HashMap<>();
+        map.put("taxNo",invoiceResult.getXTaxNo());
+        map1.put("serialNo",invoiceResult.getSerialNo());
+        if(invoiceResult.getMethodName().equals("绾㈠瓧纭鍗曠‘璁ゆ帴鍙�")){
+            map1.put("einvoiceNo",invoiceResult.getRedInvoiceNo());
+        }else {
+            map1.put("einvoiceNo",invoiceResult.getInvoiceNo());
+        }
+        map1.put("returnType","1");
+        map1.put("invoiceIssueMode","1");
+        map.put("data",map1);
+        Gson gson =new Gson();
+        String str = gson.toJson(map);
+        System.out.println(str);
+        String responseBody = "";
+        responseBody = HttpRequest.post(invoiceIp+cxUrl+UuidUtils.generateUuid())
+                .timeout(400000)
+                .body(str)
+                .execute()
+                .body();
+        System.out.println(responseBody);
+        JSONObject jsonObj = JSON.parseObject(responseBody);
+        if(jsonObj!=null){
+            boolean flag = (Boolean)jsonObj.get("success");
+            JSONObject message = jsonObj.getJSONObject("message");
+            if(!flag){
+                String successMessage = (String) message.get("errorMessage");
+                Map<String,Object> res = new HashMap<>();
+                res.put("success",flag);
+                res.put("message",successMessage);
+                return res;
+            }else {
+                String requestId = (String) jsonObj.get("requestId");
+                String successMessage = (String) message.get("successMessage");
+                JSONObject model = jsonObj.getJSONObject("model");
+                String modelRequestId = (String)model.get("requestId");
+                String invoiceNo = (String)model.get("invoiceNo");
+                String serialNo = (String)model.get("serialNo");
+                String sellerTaxNo = (String)model.get("sellerTaxNo");
+                String eInvoiceUrlOld = (String)model.get("eInvoiceUrl");
+                String returnType = (String)model.get("returnType");
+
+                String eInvoiceUrl = eInvoiceUrlOld.replace("http://","https://");
+
+                InvoiceResult result = new InvoiceResult();
+                result.setXTaxNo(sellerTaxNo);
+                result.setRequestId(requestId);
+                result.setFpRequestId(modelRequestId);
+                result.setSuccess(flag);
+                result.setMessage(successMessage);
+                result.setSerialNo(serialNo);
+                result.setInvoiceNo(invoiceNo);
+                result.setEInvoiceUrl(eInvoiceUrl);
+                result.setMethodName("鐗堝紡鏂囦欢鏌ヨ鎺ュ彛");
+                result.setEntrustCode(invoiceResult.getEntrustCode());
+                invoiceResultService.save(result);
+
+                /*QueryWrapper<RailwayEntrust> wrapper = new QueryWrapper<>();
+                wrapper.lambda().eq(RailwayEntrust::getEntrustCode,invoiceResult.getEntrustCode());
+                RailwayEntrust railwayEntrust = railwayEntrustMapper.selectList(wrapper).get(0);*/
+                if(invoiceResult.getMethodName().contains("钃濆瓧")){
+                   /* railwayEntrust.setInvoiceRemark("钃濆瓧鍙戠エ宸叉煡璇�");
+                    railwayEntrust.setInvoicUrl(result.getEInvoiceUrl());
+                    if(railwayEntrust.getInvoiceResultId()==null){
+                        railwayEntrust.setInvoiceResultId(result.getId());
+                    }*/
+                    saleCredit.setInvoiceRemark("钃濆瓧鍙戠エ宸叉煡璇�");
+                    saleCredit.setInvoicUrl(result.getEInvoiceUrl());
+                    saleCredit.setBlueInvoiceResultId(result.getId());
+                    saleCreditService.updateById(saleCredit);
+
+
+                }else {
+                    /*railwayEntrust.setInvoiceRemark("绾㈠瓧鍙戠エ宸叉煡璇�");
+                    railwayEntrust.setInvoicRedUrl(result.getEInvoiceUrl());
+                    if(railwayEntrust.getInvoiceRedResultId()==null){
+                        railwayEntrust.setInvoiceRedResultId(result.getId());
+                    }*/
+                    saleCredit.setInvoiceRemark("绾㈠瓧鍙戠エ宸叉煡璇�");
+                    saleCredit.setInvoicUrl(result.getEInvoiceUrl());
+                    saleCredit.setBlueInvoiceResultId(result.getId());
+                    saleCreditService.updateById(saleCredit);
+                }
+
+                //railwayEntrustMapper.updateById(railwayEntrust);
+
+                Map<String,Object> res = new HashMap<>();
+                res.put("success",flag);
+                res.put("message",successMessage);
+                res.put("url",eInvoiceUrl);
+                res.put("name",invoiceNo);
+                return res;
+            }
+        }else {
+            Map<String,Object> res = new HashMap<>();
+            res.put("success",false);
+            res.put("message","寮�绁ㄦ帴鍙e紓甯�");
+            return res;
+        }
+    }
+
+    @Override
+    public boolean pushBlue(Long railwayId, Integer type) {
+        SaleCredit saleCredit = saleCreditService.getById(railwayId);
+
+        if (saleCredit.getBipStatus() == null || !saleCredit.getBipStatus().equals("200")) {
+            return false;
+        } else {
+            InvoiceResult result = null;
+            QueryWrapper<InvoiceResult> invoiceResultQueryWrapper = new QueryWrapper<>();
+            invoiceResultQueryWrapper.lambda()
+                    .eq(InvoiceResult::getEntrustCode, saleCredit.getEntrustCode())
+                    .eq(InvoiceResult::getMethodName,"钃濆瓧寮�绁ㄦ帴鍙�")
+                    .eq(InvoiceResult::getSuccess,1)
+                    .like(InvoiceResult::getMessage,"%鍙戠エ寮�鍏锋垚鍔�%")
+                    .orderByAsc(InvoiceResult::getCreateTime)
+                    .last( " limit 4 ");
+            if(type==0){
+                invoiceResultQueryWrapper.lambda().eq(InvoiceResult::getPushBip,1);
+            }else {
+                invoiceResultQueryWrapper.lambda().eq(InvoiceResult::getPushBipyf,1);
+            }
+            List<InvoiceResult> list = invoiceResultService.list(invoiceResultQueryWrapper);
+            if(list !=null && list.size()>0){
+                return false;
+            }
+
+            QueryWrapper<InvoiceResult> invoiceResultQueryWrapper1 = new QueryWrapper<>();
+            invoiceResultQueryWrapper1.lambda()
+                    .eq(InvoiceResult::getEntrustCode, saleCredit.getEntrustCode())
+                    .eq(InvoiceResult::getMethodName,"钃濆瓧寮�绁ㄦ帴鍙�")
+                    .eq(InvoiceResult::getSuccess,1)
+                    .like(InvoiceResult::getMessage,"%鍙戠エ寮�鍏锋垚鍔�%")
+                    .orderByAsc(InvoiceResult::getCreateTime)
+                    .last( " limit 4 ");
+            if(type==0){
+                invoiceResultQueryWrapper1.lambda().isNull(InvoiceResult::getPushBip);
+            }else {
+                invoiceResultQueryWrapper1.lambda().isNull(InvoiceResult::getPushBipyf);
+            }
+            List<InvoiceResult> list1 = invoiceResultService.list(invoiceResultQueryWrapper1);
+            if(list1 !=null && list1.size()>0){
+                result = list1.get(0);
+            }else {
+                System.out.println(saleCredit.getEntrustCode()+"鏈煡璇㈠埌寮�绁ㄨ褰�");
+                return false;
+            }
+
+            if(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(saleCredit.getInvoicUrl())){
+                if(type==0){
+                    if(result.getPushBip()==null||result.getPushBip()==0) {
+                        System.out.println(saleCredit.getEntrustCode() + "寮�濮嬫帹閫乥ip搴旀敹钃濈エ");
+                        try {
+                            boolean b = pushBipYS(saleCredit.getId(), saleCredit.getInvoicUrl());
+                            if(b){
+                                System.out.println(saleCredit.getEntrustCode() + "鎺ㄩ�乥ip搴旀敹钃濈エ鎴愬姛");
+                                result.setPushBip(1);
+                                invoiceResultService.updateById(result);
+                                return true;
+                            }else {
+                                System.out.println(saleCredit.getEntrustCode() + "鎺ㄩ�乥ip搴旀敹钃濈エ澶辫触");
+                                return false;
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }else if (type==1){
+                    if(result.getPushBipyf()==null||result.getPushBipyf()==0) {
+                        System.out.println(saleCredit.getEntrustCode() + "寮�濮嬫帹閫乥ip搴斾粯钃濈エ");
+                        try {
+                            boolean b = pushBipYF(saleCredit.getId(), saleCredit.getInvoicUrl());
+                            if(b){
+                                System.out.println(saleCredit.getEntrustCode() + "鎺ㄩ�乥ip搴斾粯钃濈エ鎴愬姛");
+                                result.setPushBipyf(1);
+                                invoiceResultService.updateById(result);
+                                return true;
+                            }else {
+                                System.out.println(saleCredit.getEntrustCode() + "鎺ㄩ�乥ip搴斾粯钃濈エ澶辫触");
+                                return false;
+                            }
+                        }catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }else {
+                Map<String, Object> objectMap = downInvoiceMethod(result);
+                Boolean success = (Boolean) objectMap.get("success");
+                String message = (String) objectMap.get("message");
+                String url = (String) objectMap.get("url");
+                if(success){
+                    try {
+                        if(type==0){
+                            boolean b = pushBipYS(saleCredit.getId(),url);
+                            if(b){
+                                System.out.println(saleCredit.getEntrustCode()+"鎺ㄩ�乥ip搴旀敹钃濈エ鎴愬姛");
+                                result.setPushBip(1);
+                                invoiceResultService.updateById(result);
+                                return true;
+                            }else {
+                                System.out.println(saleCredit.getEntrustCode()+"鎺ㄩ�乥ip搴旀敹钃濈エ澶辫触");
+                                return false;
+                            }
+
+                        }else if (type==1){
+                            boolean b = pushBipYF(saleCredit.getId(),url);
+                            if(b){
+                                System.out.println(saleCredit.getEntrustCode()+"鎺ㄩ�乥ip搴斾粯钃濈エ鎴愬姛");
+                                result.setPushBipyf(1);
+                                invoiceResultService.updateById(result);
+                                return true;
+                            }else {
+                                System.out.println(saleCredit.getEntrustCode()+"鎺ㄩ�乥ip搴斾粯钃濈エ澶辫触");
+                                return false;
+                            }
+                        }
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 鎺ㄩ�乥ip搴旀敹钃濈エ
+     * @param id
+     * @param file
+     */
+    public boolean pushBipYS(Long id,String file){
+        //搴旀敹
+        QueryWrapper<BipInvoice> bipInvoiceQueryWrapper = new QueryWrapper<>();
+        bipInvoiceQueryWrapper.lambda()
+                .eq(BipInvoice::getRailwayEntrustId, id)
+                .eq(BipInvoice::getInvoiceType, 0)
+                .in(BipInvoice::getResStatus, 200, 910)
+                .orderByDesc(BipInvoice::getCreateTime);
+        List<BipInvoice> list1 = bipInvoiceService.list(bipInvoiceQueryWrapper);
+        if(list1!=null && list1.size()>0){
+            BipInvoice bipInvoice = list1.get(0);
+            String bipNumber = bipInvoice.getBipNumber();
+            fileUploadService.uploadUrlToBip(id,bipNumber,file);
+            return true;
+        }else {
+            return false;
+        }
+    }
+
+    /**
+     * 鎺ㄩ�乥ip搴斾粯钃濈エ
+     * @param id
+     * @param file
+     */
+    public boolean pushBipYF(Long id,String file){
+        //搴斾粯
+        QueryWrapper<BipInvoice> bipInvoiceQueryWrapper1 = new QueryWrapper<>();
+        bipInvoiceQueryWrapper1.lambda()
+                .eq(BipInvoice::getRailwayEntrustId, id)
+                .eq(BipInvoice::getInvoiceType, 1)
+                .in(BipInvoice::getResStatus, 200, 910)
+                .orderByDesc(BipInvoice::getCreateTime);
+        List<BipInvoice> list2 = bipInvoiceService.list(bipInvoiceQueryWrapper1);
+        if(list2!=null && list2.size()>0){
+            BipInvoice bipInvoice = list2.get(0);
+            String bipNumber = bipInvoice.getBipNumber();
+            fileUploadService.uploadUrlToBip(id,bipNumber,file);
+            return true;
+        }else {
+            return false;
+        }
+    }
+
+    /**
+     * 绾㈠啿寮�绁ㄦ帴鍙�
+     */
+    Map<String,Object> redTicketKaiPiao(InvoicingVo vo){
+        SaleCredit saleCredit = saleCreditService.getById(vo.getSaleCreditId());
+        Gson gson =new Gson();
+        String str = gson.toJson(vo);
+        System.out.println(str);
+        String responseBody = "";
+        responseBody = HttpRequest.post(invoiceIp+kpUrl+UuidUtils.generateUuid())
+                .timeout(400000)
+                .body(str)
+                .execute()
+                .body();
+        System.out.println(responseBody);
+
+        JSONObject jsonObj = JSON.parseObject(responseBody);
+        if(jsonObj!=null){
+            boolean flag = (Boolean)jsonObj.get("success");
+            JSONObject message = jsonObj.getJSONObject("message");
+            String requestId = (String) jsonObj.get("requestId");
+            if(!flag){
+                Map<String,Object> res = new HashMap<>();
+                res.put("success",flag);
+                res.put("message",message.get("errorMessage"));
+                InvoiceResult invoiceResult = new InvoiceResult();
+                invoiceResult.setRequestId(requestId);
+                invoiceResult.setSuccess(flag);
+                invoiceResult.setMessage((String) message.get("errorMessage"));
+                invoiceResult.setMethodName("绾㈠瓧寮�绁ㄦ帴鍙�");
+                invoiceResult.setEntrustCode(vo.getEntrustCode());
+                invoiceResultService.save(invoiceResult);
+
+                /*UpdateWrapper<RailwayEntrust> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.lambda()
+                        .set(RailwayEntrust::getInvoiceRemark,(String) message.get("errorMessage"))
+                        .eq(RailwayEntrust::getEntrustCode,invoiceResult.getEntrustCode());
+                railwayEntrustMapper.update(null,updateWrapper);*/
+
+                saleCredit.setInvoiceRemark((String) message.get("errorMessage"));
+                saleCreditService.updateById(saleCredit);
+
+                return res;
+            }else {
+                String successMessage = (String)message.get("successMessage");
+                JSONObject model = jsonObj.getJSONObject("model");
+                JSONArray success = model.getJSONArray("success");
+                JSONObject modelObject = success.getJSONObject(0);
+                String invoiceTypeCode = (String) modelObject.get("invoiceTypeCode");
+                String invoiceNo = (String) modelObject.get("invoiceNo");
+                String invoiceDate = (String) modelObject.get("invoiceDate");
+                String invoiceQrCode = (String) modelObject.get("invoiceQrCode");
+                String serialNo = (String) modelObject.get("serialNo");
+                BigDecimal invoiceTotalPriceValue = (BigDecimal) modelObject.get("invoiceTotalPrice");
+                Double invoiceTotalPrice = Double.valueOf(invoiceTotalPriceValue.doubleValue());
+                BigDecimal invoiceTotalTaxValue = (BigDecimal) modelObject.get("invoiceTotalTax");
+                Double invoiceTotalTax = Double.valueOf(invoiceTotalTaxValue.doubleValue());
+                BigDecimal invoiceTotalPriceTaxValue = (BigDecimal) modelObject.get("invoiceTotalPriceTax");
+                Double invoiceTotalPriceTax = Double.valueOf(invoiceTotalPriceTaxValue.doubleValue());
+                String mulPurchaserMark = (String) modelObject.get("mulPurchaserMark");
+                String sellerTaxNo = (String) modelObject.get("sellerTaxNo");
+
+                InvoiceResult issueRedResult = new InvoiceResult();
+                issueRedResult.setRequestId(requestId);
+                issueRedResult.setSuccess(flag);
+                issueRedResult.setMessage(successMessage);
+                issueRedResult.setInvoiceNo(invoiceNo);
+                issueRedResult.setInvoiceTyCode(invoiceTypeCode);
+                issueRedResult.setInvoiceDate(invoiceDate);
+                issueRedResult.setInvoiceQrCode(invoiceQrCode);
+                issueRedResult.setSerialNo(serialNo);
+                issueRedResult.setMethodName("绾㈠瓧寮�绁ㄦ帴鍙�");
+                issueRedResult.setEntrustCode(vo.getEntrustCode());
+                issueRedResult.setInvoiceTotalPrice(invoiceTotalPrice);
+                issueRedResult.setInvoiceTotalTax(invoiceTotalTax);
+                issueRedResult.setInvoiceTotalPriceTax(invoiceTotalPriceTax);
+                issueRedResult.setMulPurchaserMark(mulPurchaserMark);
+                issueRedResult.setXTaxNo(sellerTaxNo);
+                invoiceResultService.save(issueRedResult);
+
+
+                JSONArray invoiceDetailList1 = modelObject.getJSONArray("invoiceDetailsList");
+                for (int i = 0; i < invoiceDetailList1.size(); i++) {
+                    JSONObject jsonObject = invoiceDetailList1.getJSONObject(i);
+                    int goodsLineNo = (int) jsonObject.get("goodsLineNo");
+                    String goodsName = (String) jsonObject.get("goodsName");
+                    String goodsCode = (String) jsonObject.get("goodsCode");
+                    BigDecimal goodsPriceValue = (BigDecimal)jsonObject.get("goodsPrice");
+                    Double goodsPrice = Double.valueOf(goodsPriceValue.doubleValue());
+
+                    double goodsQuantity=0.0;
+                    try {
+                        BigDecimal goodsQuantityValue = (BigDecimal)jsonObject.get("goodsQuantity");
+                        goodsQuantity = Double.valueOf(goodsQuantityValue.doubleValue());
+                    }catch (Exception e){
+                        e.printStackTrace();
+                        int goodsQuantity1 = (int) jsonObject.get("goodsQuantity");
+                        goodsQuantity = goodsQuantity1;
+                    }
+
+                    BigDecimal goodsTotalPriceValue = (BigDecimal)jsonObject.get("goodsTotalPrice");
+                    Double goodsTotalPrice = Double.valueOf(goodsTotalPriceValue.doubleValue());
+                    BigDecimal goodsTotalTaxValue = (BigDecimal)jsonObject.get("goodsTotalTax");
+                    Double goodsTotalTax = Double.valueOf(goodsTotalTaxValue.doubleValue());
+                    BigDecimal goodsTaxRateValue = (BigDecimal)jsonObject.get("goodsTaxRate");
+                    Double goodsTaxRate = Double.valueOf(goodsTaxRateValue.doubleValue());
+                    String invoiceLineNature = (String) jsonObject.get("invoiceLineNature");
+                    String goodsUnit = (String) jsonObject.get("goodsUnit");
+                    String goodsSpecification = (String) jsonObject.get("goodsSpecification");
+                    String coalType = (String)jsonObject.get("coalType");
+                    String agreementTerm = (String)jsonObject.get("agreementTerm");
+                    String name = "";
+                    if(goodsLineNo==1){
+                        name = "鐓ゆ";
+                    }
+                    if(goodsLineNo==2 && goodsTaxRate==0.13){
+                        name = "鍙栭�佽溅璐�";
+                    }
+                    if(goodsTaxRate==0.6){
+                        name = "涓撶嚎璐�";
+                    }
+
+                    InvoiceResultItem item = new InvoiceResultItem();
+                    item.setGoodsLineNature(invoiceLineNature);
+                    item.setGoodsCode(goodsCode);
+                    item.setGoodsPrice(goodsPrice);
+                    item.setGoodsType(name);
+                    if(goodsSpecification != null){
+                        item.setGoodsSpecification(goodsSpecification);
+                    }
+                    if(coalType !=null){
+                        item.setCoalType(coalType);
+                    }
+                    if(agreementTerm !=null){
+                        item.setAgreementTerm(agreementTerm);
+                    }
+                    item.setGoodsLineNo(goodsLineNo);
+                    item.setGoodsQuantity(goodsQuantity);
+                    item.setGoodsTaxRate(goodsTaxRate);
+                    item.setGoodsName(goodsName);
+                    item.setGoodsTotalPrice(goodsTotalPrice);
+                    item.setGoodsTotalTax(goodsTotalTax);
+                    item.setGoodsUnit(goodsUnit);
+                    item.setResultId(issueRedResult.getId());
+                    item.setEntrustCode(issueRedResult.getEntrustCode());
+                    String[] split = goodsName.split("\\*");
+                    int length = split.length;
+                    String coalName = split[length - 1];
+                    item.setCoalName(coalName);
+                    itemMapper.insert(item);
+                }
+
+                QueryWrapper<InvoiceResult> invoiceResultQueryWrapper = new QueryWrapper<>();
+                invoiceResultQueryWrapper.lambda()
+                        .eq(InvoiceResult::getEntrustCode,issueRedResult.getEntrustCode())
+                        .eq(InvoiceResult::getMethodName,"钃濆瓧寮�绁ㄦ帴鍙�");
+                List<InvoiceResult> list = invoiceResultService.list(invoiceResultQueryWrapper);
+                List<Long> collect = list.stream().map(item -> item.getId()).collect(Collectors.toList());
+                removeByIds(collect);
+
+                /*UpdateWrapper<RailwayEntrust> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.lambda().set(RailwayEntrust::getInvoiceResult,null)
+                        .set(RailwayEntrust::getInvoiceResultId,null)
+                        .set(RailwayEntrust::getInvoiceRemark,"绾㈠瓧寮�绁ㄦ垚鍔�")
+                        .set(RailwayEntrust::getInvoiceRedResult,2)
+                        .set(RailwayEntrust::getInvoicUrl,null)
+                        .set(RailwayEntrust::getInvoiceRedResultId,issueRedResult.getId())
+                        .eq(RailwayEntrust::getEntrustCode,issueRedResult.getEntrustCode());
+                railwayEntrustMapper.update(null,updateWrapper);*/
+
+                saleCredit.setInvoiceRemark("绾㈠瓧寮�绁ㄦ垚鍔�");
+                saleCredit.setRedInvoiceResultId(issueRedResult.getId());
+                saleCredit.setStatus(7);
+                saleCreditService.updateById(saleCredit);
+
+                Map<String,Object> res = new HashMap<>();
+                res.put("success",flag);
+                res.put("message",successMessage);
+                return res;
+            }
+        }else {
+            Map<String,Object> res = new HashMap<>();
+            res.put("success",false);
+            res.put("message","绾㈠瓧寮�绁ㄦ帴鍙e紓甯�");
+            InvoiceResult invoiceResult = new InvoiceResult();
+            invoiceResult.setSuccess(false);
+            invoiceResult.setMessage("绾㈠瓧寮�绁ㄦ帴鍙e紓甯�");
+            invoiceResult.setMethodName("绾㈠瓧寮�绁ㄦ帴鍙�");
+            invoiceResult.setEntrustCode(vo.getEntrustCode());
+            invoiceResultService.save(invoiceResult);
+
+           /* QueryWrapper<RailwayEntrust> wrapper = new QueryWrapper<>();
+            wrapper.lambda().eq(RailwayEntrust::getEntrustCode,invoiceResult.getEntrustCode());
+            RailwayEntrust railwayEntrust = railwayEntrustMapper.selectList(wrapper).get(0);
+            railwayEntrust.setInvoiceRemark("绾㈠瓧寮�绁ㄦ帴鍙e紓甯�");
+            railwayEntrustMapper.updateById(railwayEntrust);*/
+
+            saleCredit.setInvoiceRemark("绾㈠瓧寮�绁ㄦ帴鍙e紓甯�");
+            saleCredit.setStatus(6);
+            saleCreditService.updateById(saleCredit);
+
+
+            return res;
+        }
+
+    }
+
+    /**
+     * 鏁扮數绾㈠瓧纭鍗曟柊澧炴帴鍙�
+     */
+    Map<String,Object> redTicketConfirm(InvoiceResult invoiceResult,SaleCredit saleCredit){
+        String format = strToFormat(invoiceResult.getInvoiceDate());
+        List<InvoiceResultItem> resultItems = itemMapper.selectList(new LambdaQueryWrapper<InvoiceResultItem>()
+                .eq(InvoiceResultItem::getResultId,invoiceResult.getId())
+        );
+
+        if(saleCredit!=null) {
+            RedConfirmVo confirmVo = new RedConfirmVo();
+            confirmVo.setTaxNo(saleCredit.getCreditCodeB());
+            confirmVo.setOrgCode(saleCredit.getCreditCodeB());
+            confirmVo.setTaxUserName(saleCredit.getContactPhoneB());
+            confirmVo.setRedConfirmSerialNo("MX_RPP_"+System.currentTimeMillis());
+            confirmVo.setEntryIdentity("01");
+            confirmVo.setSellerTaxNo(saleCredit.getCreditCodeB());
+            confirmVo.setSellerTaxName(saleCredit.getPartyB());
+            confirmVo.setBuyerTaxName(saleCredit.getPartyA());
+            confirmVo.setBuyerTaxNo(saleCredit.getCreditCodeA());
+            confirmVo.setOriginInvoiceIsPaper("N");
+            confirmVo.setInvoiceSource("2");
+            confirmVo.setOriginalInvoiceNo(invoiceResult.getInvoiceNo());
+            confirmVo.setOriginInvoiceDate(format);
+            confirmVo.setOriginInvoiceTotalPrice(invoiceResult.getInvoiceTotalPrice());
+            confirmVo.setOriginInvoiceTotalTax(invoiceResult.getInvoiceTotalTax());
+            confirmVo.setOriginInvoiceType("01");
+            confirmVo.setInvoiceTotalPrice(invoiceResult.getInvoiceTotalPrice()*-1);
+            confirmVo.setInvoiceTotalTax(invoiceResult.getInvoiceTotalTax()*-1);
+            confirmVo.setRedInvoiceLabel("02");
+            confirmVo.setAutoIssueSwitch("N");
+
+            List<RedConfirmVo.RedConfirmDetail> detailList = new ArrayList<>();
+            for (InvoiceResultItem resultItem : resultItems) {
+                RedConfirmVo.RedConfirmDetail detail = new RedConfirmVo.RedConfirmDetail();
+                detail.setOriginalInvoiceDetailNo(resultItem.getGoodsLineNo());
+                detail.setGoodsLineNo(resultItem.getGoodsLineNo());
+                detail.setGoodsCode(resultItem.getGoodsCode());
+                detail.setGoodsTaxRate(resultItem.getGoodsTaxRate());
+                detail.setGoodsName(resultItem.getCoalName());
+                detail.setProjectName(resultItem.getCoalName());
+                detail.setGoodsPrice(resultItem.getGoodsPrice()+"");
+                detail.setGoodsSpecification(resultItem.getGoodsSpecification());
+                detail.setGoodsUnit(resultItem.getGoodsUnit());
+                detail.setGoodsQuantity(resultItem.getGoodsQuantity()*-1+"");
+                detail.setGoodsTotalPrice(resultItem.getGoodsTotalPrice()*-1);
+                detail.setGoodsTotalTax(resultItem.getGoodsTotalTax()*-1);
+                detail.setCoalType(resultItem.getCoalType());
+                detail.setAgreementTerm(resultItem.getAgreementTerm());
+                detailList.add(detail);
+            }
+            confirmVo.setRedConfirmDetailReqEntityList(detailList);
+            Gson gson =new Gson();
+            String str = gson.toJson(confirmVo);
+            System.out.println(str);
+            String responseBody = "";
+            responseBody = HttpRequest.post(invoiceIp+redConfirmUrl+ UuidUtils.generateUuid())
+                    .timeout(400000)
+                    .body(str)
+                    .execute()
+                    .body();
+            System.out.println(responseBody);
+            JSONObject jsonObj = JSON.parseObject(responseBody);
+            if(jsonObj!=null) {
+                boolean flag = (Boolean) jsonObj.get("success");
+                JSONObject message = jsonObj.getJSONObject("message");
+                String requestId = (String) jsonObj.get("requestId");
+                if (!flag) {
+                    Map<String,Object> res = new HashMap<>();
+                    res.put("success",flag);
+                    res.put("message",message.get("errorMessage"));
+                    InvoiceResult result = new InvoiceResult();
+                    result.setRequestId(requestId);
+                    result.setSuccess(flag);
+                    result.setMessage((String) message.get("errorMessage"));
+                    result.setMethodName("绾㈠瓧纭鍗曟柊澧炴帴鍙�");
+                    result.setEntrustCode(saleCredit.getEntrustCode());
+                    invoiceResultService.save(result);
+
+                    saleCredit.setInvoiceRemark((String) message.get("errorMessage"));
+                    saleCreditService.updateById(saleCredit);
+                    return res;
+                } else {
+                    String successMessage = (String) message.get("successMessage");
+                    JSONArray modelarr = jsonObj.getJSONArray("model");
+                    JSONObject model = modelarr.getJSONObject(0);
+
+                    String redConfirmSerialNo = (String)model.get("redConfirmSerialNo");
+                    String redConfirmNo = (String)model.get("redConfirmNo");
+                    String redConfirmUuid = (String)model.get("redConfirmUuid");
+                    String confirmState = (String)model.get("confirmState");
+                    String confirmBillingMark = (String)model.get("confirmBillingMark");
+
+                    InvoiceResult result = new InvoiceResult();
+                    result.setXTaxNo(invoiceResult.getXTaxNo());
+                    result.setRequestId(requestId);
+                    result.setSuccess(flag);
+                    result.setMessage(successMessage);
+                    result.setSerialNo(redConfirmSerialNo);
+                    result.setInvoiceNo(redConfirmNo);
+                    result.setRedConfirmUuid(redConfirmUuid);
+                    result.setConfirmState(confirmState);
+                    result.setConfirmBillingMark(confirmBillingMark);
+                    result.setMethodName("绾㈠瓧纭鍗曟柊澧炴帴鍙�");
+                    result.setOriginalInvoiceNo(invoiceResult.getInvoiceNo());
+                    result.setEntrustCode(invoiceResult.getEntrustCode());
+                    invoiceResultService.save(result);
+                    Map<String,Object> res = new HashMap<>();
+                    res.put("success",flag);
+                    res.put("message",successMessage);
+                    res.put("obj",result);
+                    return res;
+                }
+            }else {
+                Map<String,Object> res = new HashMap<>();
+                res.put("success",false);
+                res.put("message","寮�绁ㄦ帴鍙e紓甯�");
+
+                InvoiceResult result = new InvoiceResult();
+                result.setSuccess(false);
+                result.setMessage("绾㈠瓧纭鍗曟柊澧炴帴鍙e紓甯�");
+                result.setMethodName("绾㈠瓧纭鍗曟柊澧炴帴鍙�");
+                result.setEntrustCode(saleCredit.getEntrustCode());
+                invoiceResultService.save(result);
+
+                saleCredit.setInvoiceRemark("绾㈠瓧纭鍗曟柊澧炴帴鍙e紓甯�");
+                saleCreditService.updateById(saleCredit);
+                return res;
+            }
+        }else {
+            Map<String,Object> res = new HashMap<>();
+            res.put("success",false);
+            res.put("message","绾㈠瓧纭鍗曟柊澧炴帴鍙e紓甯�");
+            InvoiceResult result = new InvoiceResult();
+            result.setSuccess(false);
+            result.setMessage("绾㈠瓧纭鍗曟柊澧炴帴鍙e紓甯�");
+            result.setMethodName("绾㈠瓧纭鍗曟柊澧炴帴鍙�");
+            result.setEntrustCode(saleCredit.getEntrustCode());
+            invoiceResultService.save(result);
+
+            saleCredit.setInvoiceRemark("绾㈠瓧纭鍗曟柊澧炴帴鍙e紓甯�");
+            saleCreditService.updateById(saleCredit);
+            return res;
+        }
+    }
+
+    /**
+     * 鏁扮數绾㈠瓧纭鍗曟煡璇㈡帴鍙�
+     */
+    Map<String,Object> redTicketConfirmSearch(InvoiceResult invoiceResult,SaleCredit saleCredit){
+       /* QueryWrapper<RailwayEntrust> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(RailwayEntrust::getEntrustCode,invoiceResult.getEntrustCode());
+        RailwayEntrust railwayEntrust = railwayEntrustMapper.selectList(wrapper).get(0);*/
+
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("taxNo",invoiceResult.getXTaxNo());
+        //map.put("taxUserName",dwuser);
+        map.put("sellerTaxNo",invoiceResult.getXTaxNo());
+        map.put("redConfirmUuid",invoiceResult.getRedConfirmUuid());
+        Gson gson =new Gson();
+        String str = gson.toJson(map);
+        System.out.println(str);
+        String responseBody = "";
+        responseBody = HttpRequest.post(invoiceIp+redConfirmSearchUrl+UuidUtils.generateUuid())
+                .timeout(400000)
+                .body(str)
+                .execute()
+                .body();
+        System.out.println(responseBody);
+
+        JSONObject jsonObj = JSON.parseObject(responseBody);
+        if(jsonObj!=null) {
+            boolean flag = (Boolean) jsonObj.get("success");
+            JSONObject message = jsonObj.getJSONObject("message");
+            String requestId = (String) jsonObj.get("requestId");
+            if (!flag) {
+                Map<String,Object> res = new HashMap<>();
+                res.put("success",false);
+                res.put("message","绾㈠瓧纭鍗曠‘璁ゆ帴鍙e紓甯�");
+                InvoiceResult result = new InvoiceResult();
+                result.setSuccess(false);
+                result.setRequestId(requestId);
+                result.setMessage("绾㈠瓧纭鍗曠‘璁ゆ帴鍙e紓甯�");
+                result.setMethodName("绾㈠瓧纭鍗曠‘璁ゆ帴鍙�");
+                result.setEntrustCode(invoiceResult.getEntrustCode());
+                invoiceResultService.save(result);
+
+                saleCredit.setInvoiceRemark("绾㈠瓧纭鍗曠‘璁ゆ帴鍙e紓甯�");
+                saleCreditService.updateById(saleCredit);
+                return res;
+            } else {
+
+
+                String successMessage = (String) message.get("successMessage");
+                JSONArray modelarr = jsonObj.getJSONArray("model");
+                JSONObject model = modelarr.getJSONObject(0);
+
+                String redConfirmSerialNo = (String)model.get("redConfirmSerialNo");
+                String redConfirmNo = (String)model.get("redConfirmNo");
+                String redConfirmUuid = (String)model.get("redConfirmUuid");
+                String confirmState = (String)model.get("confirmState");
+                String confirmBillingMark = (String)model.get("confirmBillingMark");
+                String entryIdentity = (String)model.get("entryIdentity");
+                String sellerTaxNo = (String)model.get("sellerTaxNo");
+                String sellerName = (String)model.get("sellerName");
+                String buyerTaxNo = (String)model.get("buyerTaxNo");
+                String buyerName = (String)model.get("buyerName");
+                String originalInvoiceNo = (String)model.get("originalInvoiceNo");
+                String originInvoiceIsPaper = (String)model.get("originInvoiceIsPaper");
+                String originInvoiceDate = (String)model.get("originInvoiceDate");
+                String originInvoiceType = (String)model.get("originInvoiceType");
+                String redInvoiceLabel = (String)model.get("redInvoiceLabel");
+                String alreadyRedInvoiceFlag = (String)model.get("alreadyRedInvoiceFlag");
+                String redInvoiceNo = (String)model.get("redInvoiceNo");
+                String redInvoiceDate = (String)model.get("redInvoiceDate");
+                String entryDate = (String)model.get("entryDate");
+                String validFlag = (String)model.get("validFlag");
+                String invoiceSource = (String)model.get("invoiceSource");
+                String tenantCode = (String)model.get("tenantCode");
+                String orgCode = (String)model.get("orgCode");
+                String buySelSelector = (String)model.get("buySelSelector");
+                String autoIssueSwitch = (String)model.get("autoIssueSwitch");
+                String priceTaxMark = (String)model.get("priceTaxMark");
+                BigDecimal originInvoiceTotalPriceValue = (BigDecimal) model.get("originInvoiceTotalPrice");
+                Double originInvoiceTotalPrice = Double.valueOf(originInvoiceTotalPriceValue.doubleValue());
+                BigDecimal originInvoiceTotalTaxValue = (BigDecimal) model.get("originInvoiceTotalTax");
+                Double originInvoiceTotalTax = Double.valueOf(originInvoiceTotalTaxValue.doubleValue());
+                BigDecimal invoiceTotalPriceValue = (BigDecimal) model.get("invoiceTotalPrice");
+                Double invoiceTotalPrice = Double.valueOf(invoiceTotalPriceValue.doubleValue());
+                BigDecimal invoiceTotalTaxValue = (BigDecimal) model.get("invoiceTotalTax");
+                Double invoiceTotalTax = Double.valueOf(invoiceTotalTaxValue.doubleValue());
+
+                InvoiceResult result = new InvoiceResult();
+                result.setRequestId(requestId);
+                result.setMessage(successMessage);
+                result.setSerialNo(redConfirmSerialNo);
+                result.setInvoiceNo(redConfirmNo);
+                result.setSuccess(flag);
+                result.setInvoiceNo(invoiceResult.getInvoiceNo());
+                result.setEntrustCode(invoiceResult.getEntrustCode());
+                result.setXTaxNo(sellerTaxNo);
+                result.setXOrgCode(orgCode);
+                result.setXName(sellerName);
+                result.setGName(buyerName);
+                result.setGTaxNo(buyerTaxNo);
+                result.setEntryDate(entryDate);
+                result.setEntryIdentity(entryIdentity);
+                result.setAlreadyRedInvoiceFlag(alreadyRedInvoiceFlag);
+                result.setOriginInvoiceType(originInvoiceType);
+                result.setOriginalInvoiceDate(originInvoiceDate);
+                result.setOriginInvoiceIsPaper(originInvoiceIsPaper);
+                result.setOriginalInvoiceNo(originalInvoiceNo);
+                result.setRedInvoiceNo(redInvoiceNo);
+                result.setRedInvoiceDate(redInvoiceDate);
+                result.setValidFlag(validFlag);
+                result.setRedInvoiceLabel(redInvoiceLabel);
+                result.setRedConfirmUuid(redConfirmUuid);
+                result.setConfirmState(confirmState);
+                result.setConfirmBillingMark(confirmBillingMark);
+                result.setMethodName("绾㈠瓧纭鍗曠‘璁ゆ帴鍙�");
+                result.setInvoiceTotalPrice(invoiceTotalPrice);
+                result.setInvoiceTotalTax(invoiceTotalTax);
+                result.setOriginInvoiceTotalPrice(originInvoiceTotalPrice);
+                result.setOriginInvoiceTotalTax(originInvoiceTotalTax);
+                invoiceResultService.save(result);
+
+
+                JSONArray invoiceDetailList1 = model.getJSONArray("electricInvoiceDetails");
+                for (int i = 0; i < invoiceDetailList1.size(); i++) {
+                    JSONObject jsonObject = invoiceDetailList1.getJSONObject(i);
+                    int goodsLineNo = (int) jsonObject.get("goodsLineNo");
+                    int originalInvoiceDetailNo = (int) jsonObject.get("originalInvoiceDetailNo");
+                    String goodsName = (String) jsonObject.get("goodsName");
+                    String goodsCode = (String) jsonObject.get("goodsCode");
+                    BigDecimal goodsPriceValue = (BigDecimal)jsonObject.get("goodsPrice");
+                    Double goodsPrice = Double.valueOf(goodsPriceValue.doubleValue());
+                    double goodsQuantity=0.0;
+                    try {
+                        BigDecimal goodsQuantityValue = (BigDecimal)jsonObject.get("goodsQuantity");
+                        goodsQuantity = Double.valueOf(goodsQuantityValue.doubleValue());
+                    }catch (Exception e){
+                        e.printStackTrace();
+                        int goodsQuantity1 = (int) jsonObject.get("goodsQuantity");
+                        goodsQuantity = goodsQuantity1;
+                    }
+
+                    BigDecimal goodsTotalPriceValue = (BigDecimal)jsonObject.get("goodsTotalPrice");
+                    Double goodsTotalPrice = Double.valueOf(goodsTotalPriceValue.doubleValue());
+                    BigDecimal goodsTotalTaxValue = (BigDecimal)jsonObject.get("goodsTotalTax");
+                    Double goodsTotalTax = Double.valueOf(goodsTotalTaxValue.doubleValue());
+                    BigDecimal goodsTaxRateValue = (BigDecimal)jsonObject.get("goodsTaxRate");
+                    Double goodsTaxRate = Double.valueOf(goodsTaxRateValue.doubleValue());
+                    String invoiceLineNature = (String) jsonObject.get("invoiceLineNature");
+                    String goodsUnit = (String) jsonObject.get("goodsUnit");
+                    String goodsSpecification = (String) jsonObject.get("goodsSpecification");
+                    String coalType = (String)jsonObject.get("coalType");
+                    String agreementTerm = (String)jsonObject.get("agreementTerm");
+                    String name = "";
+                    if(goodsLineNo==1){
+                        name = "鐓ゆ";
+                    }
+                    if(goodsLineNo==2){
+                        name = "鍙栭�佽溅璐�";
+                    }
+                    if(goodsLineNo==3){
+                        name = "涓撶嚎璐�";
+                    }
+
+                    InvoiceResultItem item = new InvoiceResultItem();
+                    item.setGoodsLineNature(invoiceLineNature);
+                    item.setOriginalInvoiceDetailNo(originalInvoiceDetailNo);
+                    item.setGoodsCode(goodsCode);
+                    item.setGoodsPrice(goodsPrice);
+                    item.setGoodsType(name);
+                    if(goodsSpecification !=null){
+                        item.setGoodsSpecification(goodsSpecification);
+                    }
+                    item.setGoodsLineNo(goodsLineNo);
+                    item.setGoodsQuantity(goodsQuantity);
+                    item.setGoodsTaxRate(goodsTaxRate);
+                    item.setGoodsName(goodsName);
+                    item.setGoodsTotalPrice(goodsTotalPrice);
+                    item.setGoodsTotalTax(goodsTotalTax);
+                    item.setGoodsUnit(goodsUnit);
+                    item.setResultId(result.getId());
+                    item.setEntrustCode(result.getEntrustCode());
+                    if(coalType !=null){
+                        item.setCoalType(coalType);
+                    }
+                    if(agreementTerm !=null){
+                        item.setAgreementTerm(agreementTerm);
+                    }
+                    String[] split = goodsName.split("\\*");
+                    int length = split.length;
+                    String coalName = split[length - 1];
+                    item.setCoalName(coalName);
+                    itemMapper.insert(item);
+                }
+                Map<String,Object> res = new HashMap<>();
+                res.put("success",flag);
+                res.put("message",successMessage);
+                res.put("obj",result);
+                saleCredit.setInvoiceRemark("绾㈠瓧纭鍗曠‘璁ゆ帴鍙f垚鍔�");
+                saleCredit.setRedInvoiceResultId(result.getId());
+                saleCreditService.updateById(saleCredit);
+                return res;
+            }
+        }else {
+            Map<String,Object> res = new HashMap<>();
+            res.put("success",false);
+            res.put("message","绾㈠瓧纭鍗曠‘璁ゆ帴鍙e紓甯�");
+            InvoiceResult result = new InvoiceResult();
+            result.setSuccess(false);
+            result.setMessage("绾㈠瓧纭鍗曠‘璁ゆ帴鍙e紓甯�");
+            result.setMethodName("绾㈠瓧纭鍗曠‘璁ゆ帴鍙�");
+            result.setEntrustCode(invoiceResult.getEntrustCode());
+            invoiceResultService.save(result);
+
+            saleCredit.setInvoiceRemark("绾㈠瓧纭鍗曠‘璁ゆ帴鍙e紓甯�");
+            saleCreditService.updateById(saleCredit);
+            return res;
+        }
+
+    }
+
+    /**
+     * 绾㈠瓧纭鍗昮orm
+     * @param result
+     * @return
+     */
+    InvoicingVo redKaiPiaoVo(InvoiceResult result){
+        SaleCredit saleCredit = saleCreditService.getById(result.getSaleCreditId());
+        InvoiceResult blueResult = null;
+        InvoiceResult redResult = null;
+        QueryWrapper<InvoiceResult> invoiceResultQueryWrapper = new QueryWrapper<>();
+        invoiceResultQueryWrapper.lambda()
+                .eq(InvoiceResult::getEntrustCode,result.getEntrustCode())
+                .eq(InvoiceResult::getMethodName,"钃濆瓧寮�绁ㄦ帴鍙�")
+                .eq(InvoiceResult::getSuccess,1)
+                .orderByDesc(InvoiceResult::getCreateTime);
+        List<InvoiceResult> InvoiceResultList = invoiceResultService.list(invoiceResultQueryWrapper);
+        if(InvoiceResultList!=null&&InvoiceResultList.size()>0){
+            blueResult = InvoiceResultList.get(0);
+            redResult = result;
+        }else {
+            return null;
+        }
+
+
+        InvoicingVo invoicingVo = new InvoicingVo();
+
+        QueryWrapper<InvoiceResultItem> itemQueryWrapper  = new QueryWrapper<>();
+        itemQueryWrapper.lambda()
+                .eq(InvoiceResultItem::getResultId,blueResult.getId());
+        List<InvoiceResultItem> resultItems = itemMapper.selectList(itemQueryWrapper);
+
+        if(saleCredit!=null) {
+
+            invoicingVo.setTaxNo(saleCredit.getCreditCodeB());
+            invoicingVo.setEntrustCode(blueResult.getEntrustCode());
+            invoicingVo.setLedgerName(saleCredit.getPartyB());
+            invoicingVo.setOrgCode(saleCredit.getCreditCodeB());
+            invoicingVo.setFormatGenerate(false);
+            invoicingVo.setIsSplit(false);
+            invoicingVo.setFormatPushType(false);
+            invoicingVo.setTaxUserName(saleCredit.getContactPhoneB());
+            InvoicingVo.InvoicingVoInfo invoicingVoInfo = new InvoicingVo.InvoicingVoInfo();
+            invoicingVoInfo.setInvoiceTypeCode("01");
+            invoicingVoInfo.setInvoiceType("1");
+            invoicingVoInfo.setSerialNo("MX_REDPP_" + System.currentTimeMillis());
+            invoicingVoInfo.setRedInfoNo(redResult.getInvoiceNo());
+            invoicingVoInfo.setRedIssueReason("1");
+            invoicingVoInfo.setRedConfirmUuid(redResult.getRedConfirmUuid());
+            invoicingVoInfo.setDrawer(saleCredit.getContactPhoneB());
+
+            Map<String, Object> ext1 = new HashMap<>();
+			ext1.put("htbh",saleCredit.getContractNo());
+			invoicingVoInfo.setExt(ext1);
+
+            invoicingVoInfo.setSystemName("**閿�鍞鐞嗕俊鎭郴缁�");
+
+            List<InvoicingVo.InvoiceDetail> details = new ArrayList<>();
+            for (InvoiceResultItem resultItem : resultItems) {
+                InvoicingVo.InvoiceDetail invoiceDetail = new InvoicingVo.InvoiceDetail();
+                invoiceDetail.setGoodsLineNo(resultItem.getGoodsLineNo());
+                invoiceDetail.setCoalType(resultItem.getCoalType());
+                invoiceDetail.setAgreementTerm(resultItem.getAgreementTerm());
+                invoiceDetail.setOriginalInvoiceDetailNo(resultItem.getGoodsLineNo()+"");
+                invoiceDetail.setGoodsTaxRate(resultItem.getGoodsTaxRate());
+                invoiceDetail.setGoodsUnit(resultItem.getGoodsUnit());
+                invoiceDetail.setGoodsName(resultItem.getCoalName());
+                invoiceDetail.setGoodsCode(resultItem.getGoodsCode());
+                invoiceDetail.setGoodsType(resultItem.getGoodsType());
+                invoiceDetail.setGoodsSpecification(resultItem.getGoodsSpecification());
+                invoiceDetail.setGoodsQuantity(new BigDecimal(resultItem.getGoodsQuantity()*-1).setScale(3,BigDecimal.ROUND_HALF_UP));
+                invoiceDetail.setGoodsPrice(new BigDecimal(resultItem.getGoodsPrice()).setScale(8,BigDecimal.ROUND_HALF_UP));
+                invoiceDetail.setGoodsTotalPrice(new BigDecimal(resultItem.getGoodsTotalPrice()*-1).setScale(2,BigDecimal.ROUND_HALF_UP));
+                invoiceDetail.setGoodsTotalTax(new BigDecimal(resultItem.getGoodsTotalTax()*-1).setScale(2,BigDecimal.ROUND_HALF_UP));
+                details.add(invoiceDetail);
+            }
+
+            invoicingVoInfo.setBuyerTaxNo(saleCredit.getCreditCodeA());
+            invoicingVoInfo.setBuyerName(saleCredit.getPartyA());
+            invoicingVoInfo.setInvoiceTotalPrice(new BigDecimal(blueResult.getInvoiceTotalPrice()*-1).setScale(2,BigDecimal.ROUND_HALF_UP));
+            invoicingVoInfo.setInvoiceTotalTax(new BigDecimal(blueResult.getInvoiceTotalTax()*-1).setScale(2,BigDecimal.ROUND_HALF_UP));
+            invoicingVoInfo.setInvoiceTotalPriceTax(new BigDecimal(blueResult.getInvoiceTotalPriceTax()*-1).setScale(2,BigDecimal.ROUND_HALF_UP));
+            invoicingVoInfo.setBuyerBankName(saleCredit.getBankNameA());
+            invoicingVoInfo.setBuyerBankNumber(saleCredit.getBankAccountA());
+            //invoicingVoInfo.setBuyerAddress(invoiceCustomer.getBuyerAddress());
+            invoicingVoInfo.setBuyerTelphone(saleCredit.getContactPhoneA());
+            invoicingVoInfo.setInvoiceDetailsList(details);
+			/*if(invoicingVoInfo.getInvoiceTotalPriceTax().compareTo(new BigDecimal(10000000))>=0){
+				invoicingVoInfo.setCoalCalorificValue(blueResult.getCoalCalorificValue());
+				invoicingVoInfo.setDryAshFreeVolatileMatter(blueResult.getDryAshFreeVolatileMatter());
+				invoicingVoInfo.setTotalSulfurOnDryBasis(blueResult.getTotalSulfurOnDryBasis());
+			}*/
+            invoicingVo.setData(invoicingVoInfo);
+            return invoicingVo;
+        }else {
+            return null;
+        }
+    }
+
+    /**
+     * 鏃堕棿鏍煎紡鍖栧伐鍏�
+     * @param s
+     * @return
+     */
+    String strToFormat(String s){
+        String year = s.substring(0, 4);
+        String month = s.substring(4, 6);
+        String day = s.substring(6, 8);
+        String hour = s.substring(8, 10);
+        String minute = s.substring(10, 12);
+        String second = s.substring(12);
+        String date = year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second;
+        System.out.println(date);
+        return date;
+    }
+}
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/resources/mapper/BipInvoiceMapper.xml b/platformx-business-finance-biz/src/main/resources/mapper/BipInvoiceMapper.xml
new file mode 100644
index 0000000..0328760
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/resources/mapper/BipInvoiceMapper.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  ~
+  ~      Copyright (c) 2018-2025, platform All rights reserved.
+  ~
+  ~  Redistribution and use in source and binary forms, with or without
+  ~  modification, are permitted provided that the following conditions are met:
+  ~
+  ~ Redistributions of source code must retain the above copyright notice,
+  ~  this list of conditions and the following disclaimer.
+  ~  Redistributions in binary form must reproduce the above copyright
+  ~  notice, this list of conditions and the following disclaimer in the
+  ~  documentation and/or other materials provided with the distribution.
+  ~  Neither the name of the pig4cloud.com developer nor the names of its
+  ~  contributors may be used to endorse or promote products derived from
+  ~  this software without specific prior written permission.
+  ~  Author: platform
+  ~
+  -->
+
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.by4cloud.platformx.business.invoice.mapper.BipInvoiceMapper">
+
+  <resultMap id="bipInvoiceMap" type="com.by4cloud.platformx.business.entity.invoice.BipInvoice">
+                  <id property="id" column="id"/>
+                        <result property="compId" column="comp_id"/>
+                        <result property="createBy" column="create_by"/>
+                        <result property="createTime" column="create_time"/>
+                        <result property="delFlag" column="del_flag"/>
+                        <result property="updateBy" column="update_by"/>
+                        <result property="updateTime" column="update_time"/>
+                        <result property="bipNumber" column="bip_number"/>
+                        <result property="day" column="day"/>
+                        <result property="invoice" column="invoice"/>
+                        <result property="returnInvoice" column="return_invoice"/>
+            </resultMap>
+</mapper>
diff --git a/platformx-business-finance-biz/src/main/resources/mapper/FileBipMapper.xml b/platformx-business-finance-biz/src/main/resources/mapper/FileBipMapper.xml
new file mode 100644
index 0000000..1d668a2
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/resources/mapper/FileBipMapper.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  ~
+  ~      Copyright (c) 2018-2025, platform All rights reserved.
+  ~
+  ~  Redistribution and use in source and binary forms, with or without
+  ~  modification, are permitted provided that the following conditions are met:
+  ~
+  ~ Redistributions of source code must retain the above copyright notice,
+  ~  this list of conditions and the following disclaimer.
+  ~  Redistributions in binary form must reproduce the above copyright
+  ~  notice, this list of conditions and the following disclaimer in the
+  ~  documentation and/or other materials provided with the distribution.
+  ~  Neither the name of the pig4cloud.com developer nor the names of its
+  ~  contributors may be used to endorse or promote products derived from
+  ~  this software without specific prior written permission.
+  ~  Author: platform
+  ~
+  -->
+
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.by4cloud.platformx.business.invoice.mapper.FileBipMapper">
+
+  <resultMap id="fileBipMap" type="com.by4cloud.platformx.business.entity.invoice.FileBip">
+                  <id property="id" column="id"/>
+                        <result property="compId" column="comp_id"/>
+                        <result property="createBy" column="create_by"/>
+                        <result property="createTime" column="create_time"/>
+                        <result property="delFlag" column="del_flag"/>
+                        <result property="updateBy" column="update_by"/>
+                        <result property="updateTime" column="update_time"/>
+                        <result property="fileId" column="file_id"/>
+                        <result property="copy" column="copy"/>
+                        <result property="fileBipId" column="file_bip_id"/>
+                        <result property="filectime" column="filectime"/>
+                        <result property="fileExtension" column="file_extension"/>
+                        <result property="fileName" column="file_name"/>
+                        <result property="filePath" column="file_path"/>
+                        <result property="fileSize" column="file_size"/>
+                        <result property="fileSizeText" column="file_size_text"/>
+                        <result property="fileutime" column="fileutime"/>
+                        <result property="name" column="name"/>
+                        <result property="railwayEntrustId" column="railway_entrust_id"/>
+                        <result property="sign" column="sign"/>
+                        <result property="tenantId" column="tenant_id"/>
+                        <result property="yhtUserId" column="yht_user_id"/>
+            </resultMap>
+</mapper>
diff --git a/platformx-business-finance-biz/src/main/resources/mapper/FpInvoiceResultItemMapper.xml b/platformx-business-finance-biz/src/main/resources/mapper/FpInvoiceResultItemMapper.xml
new file mode 100644
index 0000000..46c2376
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/resources/mapper/FpInvoiceResultItemMapper.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  ~
+  ~      Copyright (c) 2018-2025, platform All rights reserved.
+  ~
+  ~  Redistribution and use in source and binary forms, with or without
+  ~  modification, are permitted provided that the following conditions are met:
+  ~
+  ~ Redistributions of source code must retain the above copyright notice,
+  ~  this list of conditions and the following disclaimer.
+  ~  Redistributions in binary form must reproduce the above copyright
+  ~  notice, this list of conditions and the following disclaimer in the
+  ~  documentation and/or other materials provided with the distribution.
+  ~  Neither the name of the pig4cloud.com developer nor the names of its
+  ~  contributors may be used to endorse or promote products derived from
+  ~  this software without specific prior written permission.
+  ~  Author: platform
+  ~
+  -->
+
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.by4cloud.platformx.business.invoice.mapper.FpInvoiceResultItemMapper">
+
+  <resultMap id="fpInvoiceResultItemMap" type="com.by4cloud.platformx.business.entity.invoice.InvoiceResultItem">
+                  <id property="id" column="id"/>
+                        <result property="compId" column="comp_id"/>
+                        <result property="createBy" column="create_by"/>
+                        <result property="createTime" column="create_time"/>
+                        <result property="delFlag" column="del_flag"/>
+                        <result property="updateBy" column="update_by"/>
+                        <result property="updateTime" column="update_time"/>
+                        <result property="goodsCode" column="goods_code"/>
+                        <result property="goodsLineNature" column="goods_line_nature"/>
+                        <result property="goodsLineNo" column="goods_line_no"/>
+                        <result property="goodsName" column="goods_name"/>
+                        <result property="goodsPrice" column="goods_price"/>
+                        <result property="goodsQuantity" column="goods_quantity"/>
+                        <result property="goodsSimpleName" column="goods_simple_name"/>
+                        <result property="goodsTaxRate" column="goods_tax_rate"/>
+                        <result property="goodsTotalPrice" column="goods_total_price"/>
+                        <result property="goodsTotalTax" column="goods_total_tax"/>
+                        <result property="goodsUnit" column="goods_unit"/>
+                        <result property="originalInvoiceDetailNo" column="original_invoice_detail_no"/>
+                        <result property="priceTaxMark" column="price_tax_mark"/>
+                        <result property="projectName" column="project_name"/>
+                        <result property="resultId" column="result_id"/>
+            </resultMap>
+</mapper>
diff --git a/platformx-business-finance-biz/src/main/resources/mapper/FpInvoiceResultMapper.xml b/platformx-business-finance-biz/src/main/resources/mapper/FpInvoiceResultMapper.xml
new file mode 100644
index 0000000..d2145d5
--- /dev/null
+++ b/platformx-business-finance-biz/src/main/resources/mapper/FpInvoiceResultMapper.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  ~
+  ~      Copyright (c) 2018-2025, platform All rights reserved.
+  ~
+  ~  Redistribution and use in source and binary forms, with or without
+  ~  modification, are permitted provided that the following conditions are met:
+  ~
+  ~ Redistributions of source code must retain the above copyright notice,
+  ~  this list of conditions and the following disclaimer.
+  ~  Redistributions in binary form must reproduce the above copyright
+  ~  notice, this list of conditions and the following disclaimer in the
+  ~  documentation and/or other materials provided with the distribution.
+  ~  Neither the name of the pig4cloud.com developer nor the names of its
+  ~  contributors may be used to endorse or promote products derived from
+  ~  this software without specific prior written permission.
+  ~  Author: platform
+  ~
+  -->
+
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.by4cloud.platformx.business.invoice.mapper.FpInvoiceResultMapper">
+
+  <resultMap id="fpInvoiceResultMap" type="com.by4cloud.platformx.business.entity.invoice.InvoiceResult">
+                  <id property="id" column="id"/>
+                        <result property="compId" column="comp_id"/>
+                        <result property="createBy" column="create_by"/>
+                        <result property="createTime" column="create_time"/>
+                        <result property="delFlag" column="del_flag"/>
+                        <result property="updateBy" column="update_by"/>
+                        <result property="updateTime" column="update_time"/>
+                        <result property="eInvoiceUrl" column="e_invoice_url"/>
+                        <result property="invoiceCheckCode" column="invoice_check_code"/>
+                        <result property="invoiceNo" column="invoice_no"/>
+                        <result property="invoiceQrCode" column="invoice_qr_code"/>
+                        <result property="invoiceTotalPrice" column="invoice_total_price"/>
+                        <result property="invoiceTotalPriceTax" column="invoice_total_price_tax"/>
+                        <result property="invoiceTotalTax" column="invoice_total_tax"/>
+                        <result property="methodName" column="method_name"/>
+                        <result property="requestId" column="request_id"/>
+                        <result property="result" column="result"/>
+                        <result property="serialNo" column="serial_no"/>
+                        <result property="taxControlCode" column="tax_control_code"/>
+            </resultMap>
+</mapper>

--
Gitblit v1.9.1