From d14994e10797ce5bc0d29668d358f7c5274dcc5b Mon Sep 17 00:00:00 2001
From: wujianwei <wjw@11.com>
Date: 星期三, 15 四月 2026 15:46:17 +0800
Subject: [PATCH] 新增调用外部接口api

---
 service/src/main/java/com/ruoyi/cwgl/mapper/FundFlowMapper.java                |    8 
 service/src/main/java/com/ruoyi/cwgl/controller/FundFlowController.java        |   23 +
 service/src/main/resources/private.sm2                                         |   15 
 ui/admin-ui3/src/api/cwgl/fundFlow.ts                                          |   11 
 service/src/main/java/com/ruoyi/cwgl/domain/Q7517Response.java                 |  320 ++++++++++++++++
 service/src/main/resources/lib/cmbs-client-3.3-RELEASE.jar                     |    0 
 service/src/main/resources/lib/gson-2.8.0.jar                                  |    0 
 ui/admin-ui3/src/views/cwgl/fundFlow/index.vue                                 |   68 +++
 service/src/main/resources/gateway.properties                                  |   37 +
 service/src/main/resources/mapper/cwgl/FundFlowMapper.xml                      |   81 ++++
 service/src/main/java/com/ruoyi/cwgl/test/GatewayConfigUtils.java              |  105 +++++
 service/src/main/resources/cmbs.cer                                            |    3 
 service/src/main/java/com/ruoyi/cwgl/service/impl/CmbsBankSyncServiceImpl.java |  219 +++++++++++
 service/src/main/resources/minsheng.pfx                                        |    0 
 service/src/main/resources/lib/SADK-CMBCNew-3.1.5.0.jar                        |    0 
 service/src/main/java/com/ruoyi/cwgl/domain/Q7517Request.java                  |   84 ++++
 service/src/main/java/com/ruoyi/cwgl/service/ICmbsBankSyncService.java         |   20 +
 service/src/main/resources/lib/logback-cfca-jdk1.6-3.1.0.0.jar                 |    0 
 service/src/main/java/com/ruoyi/cwgl/domain/FundFlow.java                      |  104 +++++
 service/src/main/resources/lib/cryptokit.jni-1.0.jar                           |    0 
 20 files changed, 1,092 insertions(+), 6 deletions(-)

diff --git a/service/src/main/java/com/ruoyi/cwgl/controller/FundFlowController.java b/service/src/main/java/com/ruoyi/cwgl/controller/FundFlowController.java
index 337782d..7a1bda6 100644
--- a/service/src/main/java/com/ruoyi/cwgl/controller/FundFlowController.java
+++ b/service/src/main/java/com/ruoyi/cwgl/controller/FundFlowController.java
@@ -18,6 +18,7 @@
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.cwgl.domain.FundFlow;
 import com.ruoyi.cwgl.service.IFundFlowService;
+import com.ruoyi.cwgl.service.ICmbsBankSyncService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import org.springframework.web.multipart.MultipartFile;
 import com.ruoyi.common.core.page.TableDataInfo;
@@ -35,8 +36,30 @@
     @Autowired
     private IFundFlowService fundFlowService;
 
+    @Autowired
+    private ICmbsBankSyncService cmbsBankSyncService;
 
 
+
+    /**
+     * 浠嶤MBS鍚屾閾惰娴佹按鍒拌祫閲戞祦姘磋〃
+     *
+     * @param acctNum 璐﹀彿
+     * @param startDate 寮�濮嬫棩鏈� yyyy-MM-dd
+     * @param endDate 缁撴潫鏃ユ湡 yyyy-MM-dd
+     */
+    @PreAuthorize("@ss.hasPermi('cwgl:fundFlow:sync')")
+    @Log(title = "CMBS閾惰娴佹按鍚屾", businessType = BusinessType.OTHER)
+    @PostMapping("/syncFromCmbs")
+    public AjaxResult syncFromCmbs(String acctNum, String startDate, String endDate)
+    {
+        try {
+            String result = cmbsBankSyncService.syncFromCmbs(acctNum, startDate, endDate);
+            return AjaxResult.success(result);
+        } catch (Exception e) {
+            return AjaxResult.error("鍚屾澶辫触: " + e.getMessage());
+        }
+    }
     /**
      * 鏌ヨ璧勯噾娴佹按鍒楄〃
      */
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/FundFlow.java b/service/src/main/java/com/ruoyi/cwgl/domain/FundFlow.java
index 6d8e61f..e52da7b 100644
--- a/service/src/main/java/com/ruoyi/cwgl/domain/FundFlow.java
+++ b/service/src/main/java/com/ruoyi/cwgl/domain/FundFlow.java
@@ -37,7 +37,7 @@
 
 
     /** 鏈柟璐﹀彿 */
-    @Excel(name = "鏈柟璐﹀彿")
+    @Excel(name = "鏈柟璐︽埛")
 
         @TableField("our_account")
     private String ourAccount;
@@ -51,7 +51,7 @@
 
 
     /** 鏀舵敮鏍囪瘑鍊熻捶鏍囧織 0-鏀� 1-鏀� */
-    @Excel(name = "鏀舵敮鏍囪瘑", readConverterExp = "0=搴旀敹锛�1=搴斾粯")
+//    @Excel(name = "鏀舵敮鏍囪瘑", readConverterExp = "0=搴旀敹锛�1=搴斾粯")
 
         @TableField("income_expense_flag")
     private Integer incomeExpenseFlag;
@@ -156,4 +156,104 @@
         @TableField("bill_type")
     private Integer billType;
 
+
+    /** 浜ゆ槗璐︽埛瀛愯处鎴峰簭鍙� */
+    @Excel(name = "浜ゆ槗璐︽埛瀛愯处鎴峰簭鍙�")
+
+        @TableField("sub_account_no")
+    private String subAccountNo;
+
+
+    /** 浜ゆ槗瀵规墜琛� */
+    @Excel(name = "浜ゆ槗瀵规墜琛�")
+
+        @TableField("counterparty_bank")
+    private String counterpartyBank;
+
+
+    /** 璐︽埛浣欓 */
+    @Excel(name = "璐︽埛浣欓")
+
+        @TableField("account_balance")
+    private BigDecimal accountBalance;
+
+
+    /** 浜ゆ槗娓犻亾 */
+    @Excel(name = "浜ゆ槗娓犻亾")
+
+        @TableField("transaction_channel")
+    private String transactionChannel;
+
+
+    /** 閾惰涓婚敭URID */
+    @Excel(name = "閾惰涓婚敭")
+
+        @TableField("urid")
+    private String urid;
+
+
+    /** 浼佷笟缂栧彿 */
+    @Excel(name = "浼佷笟缂栧彿")
+
+        @TableField("org_no")
+    private String orgNo;
+
+
+    /** 鏈柟鎴峰悕 */
+    @Excel(name = "鏈柟鎴峰悕")
+
+        @TableField("payer_acct_name")
+    private String payerAcctName;
+
+
+    /** 璧锋伅鏃ユ湡 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "璧锋伅鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+
+        @TableField("value_date")
+    private Date valueDate;
+
+
+    /** 娆鹃」鎬ц川 */
+    @Excel(name = "娆鹃」鎬ц川")
+
+        @TableField("nature_names")
+    private String natureNames;
+
+
+    /** 璁拌处鏃ユ湡 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "璁拌处鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+
+        @TableField("postdate")
+    private Date postdate;
+
+
+    /** 鏄惁閫�姹囷細1-鏄� 0-鍚� */
+    @Excel(name = "鏄惁閫�姹�")
+
+        @TableField("is_return")
+    private String isReturn;
+
+
+    /** 绗笁鏂规祦姘村彿 */
+    @Excel(name = "绗笁鏂规祦姘村彿")
+
+        @TableField("customized_serial_num")
+    private String customizedSerialNum;
+
+
+    /** 鍗曟嵁鍞竴鏍囪瘑鍙� */
+    @Excel(name = "鍗曟嵁鍞竴鏍囪瘑鍙�")
+
+        @TableField("src_note_code")
+    private String srcNoteCode;
+
+
+    /** 甯佺缂栧彿 */
+    @Excel(name = "甯佺缂栧彿")
+
+        @TableField("curr_no")
+    private String currNo;
+
 }
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/Q7517Request.java b/service/src/main/java/com/ruoyi/cwgl/domain/Q7517Request.java
new file mode 100644
index 0000000..a7ace88
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/domain/Q7517Request.java
@@ -0,0 +1,84 @@
+package com.ruoyi.cwgl.domain;
+
+/**
+ * CMBS_Q7517 閾惰璐︽埛浜ゆ槗鏄庣粏鏌ヨ - 璇锋眰鍙傛暟
+ */
+public class Q7517Request {
+
+    /** 浼佷笟缂栧彿锛堝彲閫夛級 */
+    private String orgNo;
+
+    /** 璐﹀彿锛堝繀濉級 */
+    private String acctNum;
+
+    /** 浜ゆ槗鏂瑰悜锛堝彲閫夛級锛�1-鏀嚭 2-鏀跺叆锛屼笉浼犻粯璁ゆ煡鎵�鏈� */
+    private String moneyWay;
+
+    /** 浜ゆ槗鏃ユ湡寮�濮嬶紙蹇呭~锛夛紝鏍煎紡锛歽yyy-MM-dd */
+    private String tradeStartDate;
+
+    /** 浜ゆ槗鏃ユ湡缁撴潫锛堝繀濉級锛屾牸寮忥細yyyy-MM-dd */
+    private String tradeEndDate;
+
+    /** 鏌ヨ椤电爜锛堝彲閫夛級锛岄粯璁ゅ�� 1 */
+    private Integer currentPage;
+
+    /** 姣忛〉鏉℃暟锛堝彲閫夛級锛岄粯璁ゅ�� 15锛屾渶澶у�� 100 */
+    private Integer pageSize;
+
+    public String getOrgNo() {
+        return orgNo;
+    }
+
+    public void setOrgNo(String orgNo) {
+        this.orgNo = orgNo;
+    }
+
+    public String getAcctNum() {
+        return acctNum;
+    }
+
+    public void setAcctNum(String acctNum) {
+        this.acctNum = acctNum;
+    }
+
+    public String getMoneyWay() {
+        return moneyWay;
+    }
+
+    public void setMoneyWay(String moneyWay) {
+        this.moneyWay = moneyWay;
+    }
+
+    public String getTradeStartDate() {
+        return tradeStartDate;
+    }
+
+    public void setTradeStartDate(String tradeStartDate) {
+        this.tradeStartDate = tradeStartDate;
+    }
+
+    public String getTradeEndDate() {
+        return tradeEndDate;
+    }
+
+    public void setTradeEndDate(String tradeEndDate) {
+        this.tradeEndDate = tradeEndDate;
+    }
+
+    public Integer getCurrentPage() {
+        return currentPage;
+    }
+
+    public void setCurrentPage(Integer currentPage) {
+        this.currentPage = currentPage;
+    }
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/domain/Q7517Response.java b/service/src/main/java/com/ruoyi/cwgl/domain/Q7517Response.java
new file mode 100644
index 0000000..27eae70
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/domain/Q7517Response.java
@@ -0,0 +1,320 @@
+package com.ruoyi.cwgl.domain;
+
+import java.util.List;
+
+/**
+ * CMBS_Q7517 閾惰璐︽埛浜ゆ槗鏄庣粏鏌ヨ - 鍝嶅簲鏁版嵁
+ */
+public class Q7517Response {
+
+    /** 姹囨�婚噾棰� */
+    private Number totalAmount;
+
+    /** 褰撳墠椤垫煡璇㈢瑪鏁� */
+    private Number pageSize;
+
+    /** 鏌ヨ椤电爜 */
+    private Number currentPage;
+
+    /** 鏌ヨ鎬荤瑪鏁� */
+    private Number totalNum;
+
+    /** 鏄庣粏鍒楄〃 */
+    private List<BatchInfo> batchInfo;
+
+    public Number getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(Number totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
+    public Number getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Number pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public Number getCurrentPage() {
+        return currentPage;
+    }
+
+    public void setCurrentPage(Number currentPage) {
+        this.currentPage = currentPage;
+    }
+
+    public Number getTotalNum() {
+        return totalNum;
+    }
+
+    public void setTotalNum(Number totalNum) {
+        this.totalNum = totalNum;
+    }
+
+    public List<BatchInfo> getBatchInfo() {
+        return batchInfo;
+    }
+
+    public void setBatchInfo(List<BatchInfo> batchInfo) {
+        this.batchInfo = batchInfo;
+    }
+
+    public static class BatchInfo {
+
+        /** 涓婚敭锛堝彲浣滀负閾惰娴佹按鍞竴鏍¢獙鍙傛暟锛� */
+        private String urid;
+
+        /** 浼佷笟缂栧彿 */
+        private String orgNo;
+
+        /** 鎴戞柟璐﹀彿 */
+        private String payerAcctNo;
+
+        /** 鎴峰悕 */
+        private String payerAcctName;
+
+        /** 浜ゆ槗鏃ユ湡锛屾牸寮忥細yyyy-MM-dd */
+        private String tradeDate;
+
+        /** 浜ゆ槗鏃堕棿锛屾牸寮忥細yyyy-MM-dd HH:mm:ss */
+        private String tradeTime;
+
+        /** 璧锋伅鏃ユ湡 */
+        private String valueDate;
+
+        /** 浜ゆ槗鏂瑰悜锛�1-鏀嚭 2-鏀跺叆 */
+        private String moneyWay;
+
+        /** 閲戦 */
+        private Number transAmount;
+
+        /** 浜ゆ槗鍚庝綑棰� */
+        private Number currentBalance;
+
+        /** 鐢ㄩ�� */
+        private String purpose;
+
+        /** 鎽樿 */
+        private String memo;
+
+        /** 瀵规柟璐﹀彿 */
+        private String payeeAcctNo;
+
+        /** 瀵规柟鎴峰悕 */
+        private String payeeAcctName;
+
+        /** 瀵规柟閾惰 */
+        private String payeeBankNo;
+
+        /** 閾惰娴佹按鍙� */
+        private String bankSerialNumber;
+
+        /** 鍗曟嵁鍞竴鏍囪瘑鍙� */
+        private String srcNoteCode;
+
+        /** 娆鹃」鎬ц川 */
+        private String natureNames;
+
+        /** 甯佺缂栧彿 */
+        private String currNo;
+
+        /** 甯佺 */
+        private String currName;
+
+        /** 璁拌处鏃ユ湡 */
+        private String postdate;
+
+        /** 鏄惁閫�姹囷細1-鏄� 0-鍚� */
+        private String isReturn;
+
+        /** 绗笁鏂规祦姘村彿 */
+        private String customizedSerialNum;
+
+        public String getUrid() {
+            return urid;
+        }
+
+        public void setUrid(String urid) {
+            this.urid = urid;
+        }
+
+        public String getOrgNo() {
+            return orgNo;
+        }
+
+        public void setOrgNo(String orgNo) {
+            this.orgNo = orgNo;
+        }
+
+        public String getPayerAcctNo() {
+            return payerAcctNo;
+        }
+
+        public void setPayerAcctNo(String payerAcctNo) {
+            this.payerAcctNo = payerAcctNo;
+        }
+
+        public String getPayerAcctName() {
+            return payerAcctName;
+        }
+
+        public void setPayerAcctName(String payerAcctName) {
+            this.payerAcctName = payerAcctName;
+        }
+
+        public String getTradeDate() {
+            return tradeDate;
+        }
+
+        public void setTradeDate(String tradeDate) {
+            this.tradeDate = tradeDate;
+        }
+
+        public String getTradeTime() {
+            return tradeTime;
+        }
+
+        public void setTradeTime(String tradeTime) {
+            this.tradeTime = tradeTime;
+        }
+
+        public String getValueDate() {
+            return valueDate;
+        }
+
+        public void setValueDate(String valueDate) {
+            this.valueDate = valueDate;
+        }
+
+        public String getMoneyWay() {
+            return moneyWay;
+        }
+
+        public void setMoneyWay(String moneyWay) {
+            this.moneyWay = moneyWay;
+        }
+
+        public Number getTransAmount() {
+            return transAmount;
+        }
+
+        public void setTransAmount(Number transAmount) {
+            this.transAmount = transAmount;
+        }
+
+        public Number getCurrentBalance() {
+            return currentBalance;
+        }
+
+        public void setCurrentBalance(Number currentBalance) {
+            this.currentBalance = currentBalance;
+        }
+
+        public String getPurpose() {
+            return purpose;
+        }
+
+        public void setPurpose(String purpose) {
+            this.purpose = purpose;
+        }
+
+        public String getMemo() {
+            return memo;
+        }
+
+        public void setMemo(String memo) {
+            this.memo = memo;
+        }
+
+        public String getPayeeAcctNo() {
+            return payeeAcctNo;
+        }
+
+        public void setPayeeAcctNo(String payeeAcctNo) {
+            this.payeeAcctNo = payeeAcctNo;
+        }
+
+        public String getPayeeAcctName() {
+            return payeeAcctName;
+        }
+
+        public void setPayeeAcctName(String payeeAcctName) {
+            this.payeeAcctName = payeeAcctName;
+        }
+
+        public String getPayeeBankNo() {
+            return payeeBankNo;
+        }
+
+        public void setPayeeBankNo(String payeeBankNo) {
+            this.payeeBankNo = payeeBankNo;
+        }
+
+        public String getBankSerialNumber() {
+            return bankSerialNumber;
+        }
+
+        public void setBankSerialNumber(String bankSerialNumber) {
+            this.bankSerialNumber = bankSerialNumber;
+        }
+
+        public String getSrcNoteCode() {
+            return srcNoteCode;
+        }
+
+        public void setSrcNoteCode(String srcNoteCode) {
+            this.srcNoteCode = srcNoteCode;
+        }
+
+        public String getNatureNames() {
+            return natureNames;
+        }
+
+        public void setNatureNames(String natureNames) {
+            this.natureNames = natureNames;
+        }
+
+        public String getCurrNo() {
+            return currNo;
+        }
+
+        public void setCurrNo(String currNo) {
+            this.currNo = currNo;
+        }
+
+        public String getCurrName() {
+            return currName;
+        }
+
+        public void setCurrName(String currName) {
+            this.currName = currName;
+        }
+
+        public String getPostdate() {
+            return postdate;
+        }
+
+        public void setPostdate(String postdate) {
+            this.postdate = postdate;
+        }
+
+        public String getIsReturn() {
+            return isReturn;
+        }
+
+        public void setIsReturn(String isReturn) {
+            this.isReturn = isReturn;
+        }
+
+        public String getCustomizedSerialNum() {
+            return customizedSerialNum;
+        }
+
+        public void setCustomizedSerialNum(String customizedSerialNum) {
+            this.customizedSerialNum = customizedSerialNum;
+        }
+    }
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/mapper/FundFlowMapper.java b/service/src/main/java/com/ruoyi/cwgl/mapper/FundFlowMapper.java
index 955871e..dde6d49 100644
--- a/service/src/main/java/com/ruoyi/cwgl/mapper/FundFlowMapper.java
+++ b/service/src/main/java/com/ruoyi/cwgl/mapper/FundFlowMapper.java
@@ -92,4 +92,12 @@
      * @return 璧勯噾娴佹按
      */
     public FundFlow selectFundFlowByBankFlowNo(String bankFlowNo);
+
+    /**
+     * 鏍规嵁閾惰涓婚敭URID鏌ヨ璧勯噾娴佹按
+     *
+     * @param urid 閾惰涓婚敭URID
+     * @return 璧勯噾娴佹按
+     */
+    public FundFlow selectFundFlowByUrid(String urid);
 }
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/ICmbsBankSyncService.java b/service/src/main/java/com/ruoyi/cwgl/service/ICmbsBankSyncService.java
new file mode 100644
index 0000000..0717c01
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/service/ICmbsBankSyncService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.cwgl.service;
+
+/**
+ * CMBS閾惰娴佹按鍚屾Service鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2026-04-15
+ */
+public interface ICmbsBankSyncService {
+
+    /**
+     * 浠嶤MBS鍚屾鎸囧畾璐﹀彿鐨勪氦鏄撴槑缁嗗埌璧勯噾娴佹按琛�
+     *
+     * @param acctNum 璐﹀彿
+     * @param startDate 寮�濮嬫棩鏈� yyyy-MM-dd
+     * @param endDate 缁撴潫鏃ユ湡 yyyy-MM-dd
+     * @return 鍚屾缁撴灉淇℃伅
+     */
+    String syncFromCmbs(String acctNum, String startDate, String endDate);
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/service/impl/CmbsBankSyncServiceImpl.java b/service/src/main/java/com/ruoyi/cwgl/service/impl/CmbsBankSyncServiceImpl.java
new file mode 100644
index 0000000..f7e5397
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/service/impl/CmbsBankSyncServiceImpl.java
@@ -0,0 +1,219 @@
+package com.ruoyi.cwgl.service.impl;
+
+import com.cmbs.client.header.ClientConfig;
+import com.cmbs.client.util.OutBoundServiceUtils;
+import com.google.gson.Gson;
+import com.ruoyi.cwgl.domain.FundFlow;
+import com.ruoyi.cwgl.mapper.FundFlowMapper;
+import com.ruoyi.cwgl.service.ICmbsBankSyncService;
+import com.ruoyi.cwgl.test.GatewayConfigUtils;
+import com.ruoyi.cwgl.domain.Q7517Request;
+import com.ruoyi.cwgl.domain.Q7517Response;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * CMBS閾惰娴佹按鍚屾Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2026-04-15
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class CmbsBankSyncServiceImpl implements ICmbsBankSyncService {
+
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Resource
+    private FundFlowMapper fundFlowMapper;
+
+    @Override
+    public String syncFromCmbs(String acctNum, String startDate, String endDate) {
+        if (acctNum == null || acctNum.trim().isEmpty()) {
+            throw new RuntimeException("璐﹀彿涓嶈兘涓虹┖");
+        }
+        if (startDate == null || endDate == null) {
+            throw new RuntimeException("鏃ユ湡鑼冨洿涓嶈兘涓虹┖");
+        }
+
+        ClientConfig clientConfig = GatewayConfigUtils.getClientConfig();
+        Gson gson = new Gson();
+        int totalSynced = 0;
+        int totalSkipped = 0;
+        int currentPage = 1;
+        int pageSize = 100;
+
+        try {
+            while (true) {
+                // 鏋勫缓璇锋眰鍙傛暟
+                Q7517Request request = new Q7517Request();
+                request.setAcctNum(acctNum);
+                request.setTradeStartDate(startDate);
+                request.setTradeEndDate(endDate);
+                request.setCurrentPage(currentPage);
+                request.setPageSize(pageSize);
+
+                String queryBody = gson.toJson(request);
+                String reqSeq = generateReqSeq();
+
+                String response = OutBoundServiceUtils.execute(clientConfig, queryBody,
+                        "", "CMBS_Q7517", reqSeq);
+                logger.info("CMBS Q7517 鍝嶅簲 [椤祘}]: {}", currentPage, response);
+
+                Q7517Response resp = gson.fromJson(response, Q7517Response.class);
+                if (resp == null || resp.getBatchInfo() == null || resp.getBatchInfo().isEmpty()) {
+                    break;
+                }
+
+                List<Q7517Response.BatchInfo> batchInfoList = resp.getBatchInfo();
+                List<FundFlow> toInsert = new ArrayList<>();
+
+                for (Q7517Response.BatchInfo info : batchInfoList) {
+                    // 鎸塙RID鍘婚噸
+                    if (info.getUrid() != null && !info.getUrid().isEmpty()) {
+                        FundFlow existing = fundFlowMapper.selectFundFlowByUrid(info.getUrid());
+                        if (existing != null) {
+                            totalSkipped++;
+                            continue;
+                        }
+                    }
+
+                    FundFlow fundFlow = convertToFundFlow(info, acctNum);
+                    toInsert.add(fundFlow);
+                }
+
+                if (!toInsert.isEmpty()) {
+                    fundFlowMapper.insertFundFlowBatch(toInsert);
+                    totalSynced += toInsert.size();
+                }
+
+                // 鍒ゆ柇鏄惁杩樻湁涓嬩竴椤�
+                Number totalNum = resp.getTotalNum();
+                if (totalNum != null && currentPage * pageSize >= totalNum.intValue()) {
+                    break;
+                }
+                currentPage++;
+            }
+
+            return String.format("鍚屾瀹屾垚锛氭柊澧� %d 鏉★紝璺宠繃锛堝凡瀛樺湪锛� %d 鏉�", totalSynced, totalSkipped);
+        } catch (Exception e) {
+            logger.error("CMBS閾惰娴佹按鍚屾澶辫触", e);
+            throw new RuntimeException("CMBS閾惰娴佹按鍚屾澶辫触: " + e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 灏� Q7517 鍝嶅簲鏁版嵁杞崲涓� FundFlow 瀹炰綋
+     */
+    private FundFlow convertToFundFlow(Q7517Response.BatchInfo info, String acctNum) {
+        FundFlow fundFlow = new FundFlow();
+
+        // 閾惰涓婚敭
+        fundFlow.setUrid(info.getUrid());
+        // 浼佷笟缂栧彿
+        fundFlow.setOrgNo(info.getOrgNo());
+        // 閾惰娴佹按鍙�
+        fundFlow.setBankFlowNo(info.getBankSerialNumber());
+        // 鏈柟璐﹀彿
+        fundFlow.setOurAccount(info.getPayerAcctNo());
+        // 鏈柟鎴峰悕
+        fundFlow.setPayerAcctName(info.getPayerAcctName());
+        // 瀵规柟璐﹀彿
+        fundFlow.setCounterpartyAccount(info.getPayeeAcctNo());
+        // 瀵规柟鎴峰悕
+        fundFlow.setCounterpartyName(info.getPayeeAcctName());
+        // 瀵规柟閾惰
+        fundFlow.setCounterpartyBank(info.getPayeeBankNo());
+        // 浜ゆ槗閲戦
+        if (info.getTransAmount() != null) {
+            fundFlow.setTransactionAmount(new BigDecimal(info.getTransAmount().toString()));
+        }
+        // 璐︽埛浣欓
+        if (info.getCurrentBalance() != null) {
+            fundFlow.setAccountBalance(new BigDecimal(info.getCurrentBalance().toString()));
+        }
+        // 浜ゆ槗甯佺
+        fundFlow.setCurrency(info.getCurrName());
+        // 甯佺缂栧彿
+        fundFlow.setCurrNo(info.getCurrNo());
+        // 鐢ㄩ��
+        fundFlow.setPurpose(info.getPurpose());
+        // 鎽樿
+        fundFlow.setSummary(info.getMemo());
+        // 娆鹃」鎬ц川
+        fundFlow.setNatureNames(info.getNatureNames());
+        // 鍗曟嵁鍞竴鏍囪瘑鍙�
+        fundFlow.setSrcNoteCode(info.getSrcNoteCode());
+        // 鏄惁閫�姹�
+        fundFlow.setIsReturn(info.getIsReturn());
+        // 绗笁鏂规祦姘村彿
+        fundFlow.setCustomizedSerialNum(info.getCustomizedSerialNum());
+
+        // 浜ゆ槗鏂瑰悜杞崲锛歈7517(1-鏀嚭 2-鏀跺叆) 鈫� FundFlow(1-鏀� 0-鏀�)
+        if ("1".equals(info.getMoneyWay())) {
+            fundFlow.setIncomeExpenseFlag(1);
+        } else if ("2".equals(info.getMoneyWay())) {
+            fundFlow.setIncomeExpenseFlag(0);
+        }
+
+        // 浜ゆ槗鏃ユ湡锛氬悎骞� tradeDate + tradeTime
+        try {
+            if (info.getTradeTime() != null && !info.getTradeTime().isEmpty()) {
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                fundFlow.setTransactionDate(sdf.parse(info.getTradeTime()));
+            } else if (info.getTradeDate() != null && !info.getTradeDate().isEmpty()) {
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                fundFlow.setTransactionDate(sdf.parse(info.getTradeDate()));
+            }
+        } catch (Exception e) {
+            logger.warn("瑙f瀽浜ゆ槗鏃ユ湡澶辫触: tradeDate={}, tradeTime={}", info.getTradeDate(), info.getTradeTime());
+        }
+
+        // 璧锋伅鏃ユ湡
+        try {
+            if (info.getValueDate() != null && !info.getValueDate().isEmpty()) {
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                fundFlow.setValueDate(sdf.parse(info.getValueDate()));
+            }
+        } catch (Exception e) {
+            logger.warn("瑙f瀽璧锋伅鏃ユ湡澶辫触: {}", info.getValueDate());
+        }
+
+        // 璁拌处鏃ユ湡
+        try {
+            if (info.getPostdate() != null && !info.getPostdate().isEmpty()) {
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                fundFlow.setPostdate(sdf.parse(info.getPostdate()));
+            }
+        } catch (Exception e) {
+            logger.warn("瑙f瀽璁拌处鏃ユ湡澶辫触: {}", info.getPostdate());
+        }
+
+        // 鐘舵�侊細榛樿璁剧疆涓�"0"姝e父锛堣崏绋匡級
+        fundFlow.setStatus("0");
+        // 鍒犻櫎鏍囧織
+        fundFlow.setDelFlag("0");
+
+        return fundFlow;
+    }
+
+    /**
+     * 鐢熸垚璇锋眰娴佹按鍙凤細10浣嶅晢鎴峰彿 + 14浣嶆椂闂� + 8浣嶅簭鍙�
+     */
+    private String generateReqSeq() {
+        String merchantNum = "zjjr";
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+        String dateTime = sdf.format(new Date());
+        String seq = String.format("%08d", (int) (Math.random() * 100000000));
+        return merchantNum + dateTime + seq;
+    }
+}
diff --git a/service/src/main/java/com/ruoyi/cwgl/test/GatewayConfigUtils.java b/service/src/main/java/com/ruoyi/cwgl/test/GatewayConfigUtils.java
new file mode 100644
index 0000000..410959a
--- /dev/null
+++ b/service/src/main/java/com/ruoyi/cwgl/test/GatewayConfigUtils.java
@@ -0,0 +1,105 @@
+package com.ruoyi.cwgl.test;
+
+
+import com.cmbs.client.header.ClientConfig;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+public class GatewayConfigUtils {
+
+    static Properties gatewayProperties;
+
+    static {
+        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("gateway.properties");
+        gatewayProperties = loadProperties(is);
+    }
+
+    public static ClientConfig getClientConfig() {
+
+        ClientConfig clientConfig = new ClientConfig();
+
+        // 鍟嗘埛鍙�
+        clientConfig.setMerchantNum(gatewayProperties.getProperty("merchantNum"));
+
+        // 绯荤粺缂栫爜
+        clientConfig.setSystemCode(gatewayProperties.getProperty("plantFormCode"));
+
+        //浜掕仈缃慼ttps璇锋眰SSL鍙屽悜璁よ瘉
+        clientConfig.setPostUrl(gatewayProperties.getProperty("url"));
+
+        //https鍙屽悜璁よ瘉璇佷功
+        clientConfig.setSslClientCertPath(getCertFilePath("sslPath", "minsheng.pfx"));
+
+        //https鍙屽悜璁よ瘉璇佷功瀵嗙爜
+        clientConfig.setSslClientPassword(gatewayProperties.getProperty("sslPassword"));
+
+        //姘戠敓绉戞妧鐨勫叕閽�
+        clientConfig.setBankCertPath(getCertFilePath("publicCertPath", "cmbs.cer"));
+
+        // 娴嬭瘯鐜鍟嗘埛绉侀挜锛岀敓浜х幆澧冮渶瑕佹浛鎹�(鍘绘皯鐢熺綉绔欎笅杞藉晢鎴疯嚜宸辩殑绉侀挜)
+        clientConfig.setOwnSm2Path(getCertFilePath("sm2Path", "private.sm2"));
+
+        //鍟嗘埛绉侀挜瀵嗙爜
+        clientConfig.setOwnSm2Pwd(gatewayProperties.getProperty("sm2Password"));
+        return clientConfig;
+    }
+
+    public static ClientConfig getClientConfig2() {
+
+        ClientConfig clientConfig = new ClientConfig();
+
+        // 鍟嗘埛鍙�
+        clientConfig.setMerchantNum("zjjr");
+
+        // 绯荤粺缂栫爜
+        clientConfig.setSystemCode("620");
+
+        //浜掕仈缃慼ttps璇锋眰SSL鍙屽悜璁よ瘉
+        clientConfig.setPostUrl("https://tmc-demo.cmbc.com.cn/mop/ecp/httpMhtInVtFwd");
+
+        //https鍙屽悜璁よ瘉璇佷功
+        clientConfig.setSslClientCertPath("C:\\Users\\w\\minsheng.pfx");
+
+        //https鍙屽悜璁よ瘉璇佷功瀵嗙爜
+        clientConfig.setSslClientPassword("cfca1234");
+
+        //姘戠敓绉戞妧鐨勫叕閽�
+        clientConfig.setBankCertPath("C:\\Users\\w\\cmbs.cer");
+
+        // 娴嬭瘯鐜鍟嗘埛绉侀挜锛岀敓浜х幆澧冮渶瑕佹浛鎹�(鍘绘皯鐢熺綉绔欎笅杞藉晢鎴疯嚜宸辩殑绉侀挜)
+        clientConfig.setOwnSm2Path("C:\\Users\\w\\private.sm2");
+
+        //鍟嗘埛绉侀挜瀵嗙爜
+        clientConfig.setOwnSm2Pwd("11111111");
+        return clientConfig;
+    }
+
+    private static Properties loadProperties(InputStream is){
+        Properties properties = new Properties();
+        try {
+            properties.load(is);
+        } catch (IOException e) {
+            System.out.println("properties閰嶇疆鏂囦欢澶辫触");
+        } finally {
+            if (is != null) {
+                try {
+                    is.close();
+                } catch (Exception e) {
+                    System.out.println("鏁版嵁澶勭悊寮傚父");
+                }
+            }
+        }
+        return properties;
+    }
+
+    private static String getCertFilePath(String key, String fileName){
+        String filePath = gatewayProperties.getProperty(key, "");
+        if (filePath.equals("")){
+            String gatewayPath = Thread.currentThread().getContextClassLoader().getResource("gateway.properties").getPath();
+            return gatewayPath.replace("gateway.properties", "") + fileName;
+        }
+        return filePath;
+    }
+}
diff --git a/service/src/main/resources/cmbs.cer b/service/src/main/resources/cmbs.cer
new file mode 100644
index 0000000..ddc8950
--- /dev/null
+++ b/service/src/main/resources/cmbs.cer
@@ -0,0 +1,3 @@
+-----BEGIN CERTIFICATE-----
+MIICuzCCAmCgAwIBAgIFEDhkeFcwDAYIKoEcz1UBg3UFADBcMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDDBJDRkNBIFRFU1QgU00yIE9DQTEwHhcNMTkxMTE5MDMzNDIzWhcNMjExMTE5MDMzNDIzWjB1MQswCQYDVQQGEwJDTjEXMBUGA1UECgwOQ0ZDQSBURVNUIE9DQTExDTALBgNVBAsMBExDQUUxGTAXBgNVBAsMEE9yZ2FuaXphdGlvbmFsLTExIzAhBgNVBAMMGjA1MUDmsJHnlJ/np5HmioBAWjY2NjY2NkAxMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEZ/vFc/oE1nUyouIhfQaiupQ/6/RVTCyS7li7oTbimabAu+gB2BMSylfpgVSLCw83HTB6qgwvKf5CRVIUZITtjqOB8zCB8DAfBgNVHSMEGDAWgBRr/hjaj0I6prhtsy6Igzo0osEw4TBIBgNVHSAEQTA/MD0GCGCBHIbvKgEBMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTQuaHRtMDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6Ly91Y3JsLmNmY2EuY29tLmNuL1NNMi9jcmw3MzU1LmNybDALBgNVHQ8EBAMCA+gwHQYDVR0OBBYEFNzhEITNVnufiCi+fGPHbwP/g0F6MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAMBggqgRzPVQGDdQUAA0cAMEQCIAH5fWLQY+qJKQxhZ0zIyY5vTHIB8acrZvhEvRyIBeSkAiAIVylkjzMJOZjPUC0iMsDqE35TEc20vl0DSH08J3ohlw==
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/service/src/main/resources/gateway.properties b/service/src/main/resources/gateway.properties
new file mode 100644
index 0000000..bfd5c40
--- /dev/null
+++ b/service/src/main/resources/gateway.properties
@@ -0,0 +1,37 @@
+#\u5546\u6237\u53F7  \u4E0A\u7EBF\u65F6\u66FF\u6362\u4E3A \u5546\u6237\u53F7(\u95EE\u8D22\u8D44\u7684\u8FD0\u8425\u4EBA\u5458\u7D22\u8981\u5373\u53EF)\uFF0C\u6D4B\u8BD5\u65F6\u4E3Azjjr
+merchantNum=zjjr
+
+#\u5546\u6237\u79C1\u94A5\u5BC6\u7801 \u8BC1\u4E66\u4E0B\u8F7D\u65F6\u4F1A\u8BBE\u7F6E\u4E00\u4E2A\u5BC6\u7801\uFF0C\u5C31\u7528\u90A3\u4E2A
+sm2Password=11111111
+
+#\u6D4B\u8BD5\u73AF\u5883\u5199620 \u751F\u4EA7\u73AF\u5883\u5199107
+plantFormCode=620
+
+#\u8BF7\u6C42\u5730\u5740 \u6309\u9700\u8981\u4FEE\u6539
+url=https://tmc-demo.cmbc.com.cn/mop/ecp/httpMhtInVtFwd
+#\u6B63\u5F0F\u73AF\u5883\u4E3A https://mop.cmbc.com.cn:9443/mop/ecp/httpMhtInVtFwd
+#\u6D4B\u8BD5\u73AF\u5883\u4E3A https://tmc-demo.cmbc.com.cn/mop/ecp/httpMhtInVtFwd
+
+##https\u53CC\u5411\u8BA4\u8BC1\u8BC1\u4E66 \u8BF7\u6B63\u786E\u586B\u5199\u8DEF\u5F84\u548C\u6587\u4EF6\u540D\u79F0
+sslPath=C:\\Users\\w\\minsheng.pfx
+
+##\u6C11\u751F\u79D1\u6280\u7684\u516C\u94A5 \u8BF7\u6B63\u786E\u586B\u5199\u8DEF\u5F84\u548C\u6587\u4EF6\u540D\u79F0
+publicCertPath=C:\\Users\\w\\cmbs.cer
+
+##\u4F01\u4E1A\u7684\u79C1\u94A5 \u8BF7\u6B63\u786E\u586B\u5199\u8DEF\u5F84\u548C\u6587\u4EF6\u540D\u79F0
+sm2Path=C:\\Users\\w\\private.sm2
+
+
+####################### \u65E0\u9700\u6539\u53D8 ############################
+sslPassword=cfca1234
+
+
+
+
+
+
+
+
+
+
+
diff --git a/service/src/main/resources/lib/SADK-CMBCNew-3.1.5.0.jar b/service/src/main/resources/lib/SADK-CMBCNew-3.1.5.0.jar
new file mode 100644
index 0000000..dfabb34
--- /dev/null
+++ b/service/src/main/resources/lib/SADK-CMBCNew-3.1.5.0.jar
Binary files differ
diff --git a/service/src/main/resources/lib/cmbs-client-3.3-RELEASE.jar b/service/src/main/resources/lib/cmbs-client-3.3-RELEASE.jar
new file mode 100644
index 0000000..bac153f
--- /dev/null
+++ b/service/src/main/resources/lib/cmbs-client-3.3-RELEASE.jar
Binary files differ
diff --git a/service/src/main/resources/lib/cryptokit.jni-1.0.jar b/service/src/main/resources/lib/cryptokit.jni-1.0.jar
new file mode 100644
index 0000000..0a528a7
--- /dev/null
+++ b/service/src/main/resources/lib/cryptokit.jni-1.0.jar
Binary files differ
diff --git a/service/src/main/resources/lib/gson-2.8.0.jar b/service/src/main/resources/lib/gson-2.8.0.jar
new file mode 100644
index 0000000..1235f63
--- /dev/null
+++ b/service/src/main/resources/lib/gson-2.8.0.jar
Binary files differ
diff --git a/service/src/main/resources/lib/logback-cfca-jdk1.6-3.1.0.0.jar b/service/src/main/resources/lib/logback-cfca-jdk1.6-3.1.0.0.jar
new file mode 100644
index 0000000..e5da926
--- /dev/null
+++ b/service/src/main/resources/lib/logback-cfca-jdk1.6-3.1.0.0.jar
Binary files differ
diff --git a/service/src/main/resources/mapper/cwgl/FundFlowMapper.xml b/service/src/main/resources/mapper/cwgl/FundFlowMapper.xml
index 791e3a5..f41096f 100644
--- a/service/src/main/resources/mapper/cwgl/FundFlowMapper.xml
+++ b/service/src/main/resources/mapper/cwgl/FundFlowMapper.xml
@@ -27,10 +27,24 @@
         <result property="updateTime"    column="update_time"    />
         <result property="delFlag"    column="del_flag"    />
         <result property="billType"    column="bill_type"    />
+        <result property="subAccountNo"    column="sub_account_no"    />
+        <result property="counterpartyBank"    column="counterparty_bank"    />
+        <result property="accountBalance"    column="account_balance"    />
+        <result property="transactionChannel"    column="transaction_channel"    />
+        <result property="urid"    column="urid"    />
+        <result property="orgNo"    column="org_no"    />
+        <result property="payerAcctName"    column="payer_acct_name"    />
+        <result property="valueDate"    column="value_date"    />
+        <result property="natureNames"    column="nature_names"    />
+        <result property="postdate"    column="postdate"    />
+        <result property="isReturn"    column="is_return"    />
+        <result property="customizedSerialNum"    column="customized_serial_num"    />
+        <result property="srcNoteCode"    column="src_note_code"    />
+        <result property="currNo"    column="curr_no"    />
     </resultMap>
 
     <sql id="selectFundFlowVo">
-        select thisTab.id, thisTab.bank_flow_no, thisTab.company, thisTab.our_account, thisTab.our_bank_name, thisTab.income_expense_flag, thisTab.transaction_amount, thisTab.currency, thisTab.counterparty_account, thisTab.counterparty_name, thisTab.transaction_date, thisTab.purpose, thisTab.summary, thisTab.remarks, thisTab.status, thisTab.claimed_amount, thisTab.create_by, thisTab.create_time, thisTab.update_by, thisTab.update_time, thisTab.del_flag , thisTab.bill_type from fund_flow AS thisTab
+        select thisTab.id, thisTab.bank_flow_no, thisTab.company, thisTab.our_account, thisTab.our_bank_name, thisTab.income_expense_flag, thisTab.transaction_amount, thisTab.currency, thisTab.counterparty_account, thisTab.counterparty_name, thisTab.transaction_date, thisTab.purpose, thisTab.summary, thisTab.remarks, thisTab.status, thisTab.claimed_amount, thisTab.create_by, thisTab.create_time, thisTab.update_by, thisTab.update_time, thisTab.del_flag , thisTab.bill_type, thisTab.sub_account_no, thisTab.counterparty_bank, thisTab.account_balance, thisTab.transaction_channel, thisTab.urid, thisTab.org_no, thisTab.payer_acct_name, thisTab.value_date, thisTab.nature_names, thisTab.postdate, thisTab.is_return, thisTab.customized_serial_num, thisTab.src_note_code, thisTab.curr_no from fund_flow AS thisTab
     </sql>
     <sql id="selectFundFlowVoCount">
         select count(0) from fund_flow as thisTab
@@ -100,6 +114,20 @@
             <if test="updateTime != null">update_time,</if>
             <if test="delFlag != null">del_flag,</if>
             <if test="billType != null">bill_type,</if>
+            <if test="subAccountNo != null">sub_account_no,</if>
+            <if test="counterpartyBank != null">counterparty_bank,</if>
+            <if test="accountBalance != null">account_balance,</if>
+            <if test="transactionChannel != null">transaction_channel,</if>
+            <if test="urid != null">urid,</if>
+            <if test="orgNo != null">org_no,</if>
+            <if test="payerAcctName != null">payer_acct_name,</if>
+            <if test="valueDate != null">value_date,</if>
+            <if test="natureNames != null">nature_names,</if>
+            <if test="postdate != null">postdate,</if>
+            <if test="isReturn != null">is_return,</if>
+            <if test="customizedSerialNum != null">customized_serial_num,</if>
+            <if test="srcNoteCode != null">src_note_code,</if>
+            <if test="currNo != null">curr_no,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="bankFlowNo != null and bankFlowNo != ''">#{bankFlowNo},</if>
@@ -123,17 +151,31 @@
             <if test="updateTime != null">#{updateTime},</if>
             <if test="delFlag != null">#{delFlag},</if>
             <if test="billType != null">#{billType},</if>
+            <if test="subAccountNo != null">#{subAccountNo},</if>
+            <if test="counterpartyBank != null">#{counterpartyBank},</if>
+            <if test="accountBalance != null">#{accountBalance},</if>
+            <if test="transactionChannel != null">#{transactionChannel},</if>
+            <if test="urid != null">#{urid},</if>
+            <if test="orgNo != null">#{orgNo},</if>
+            <if test="payerAcctName != null">#{payerAcctName},</if>
+            <if test="valueDate != null">#{valueDate},</if>
+            <if test="natureNames != null">#{natureNames},</if>
+            <if test="postdate != null">#{postdate},</if>
+            <if test="isReturn != null">#{isReturn},</if>
+            <if test="customizedSerialNum != null">#{customizedSerialNum},</if>
+            <if test="srcNoteCode != null">#{srcNoteCode},</if>
+            <if test="currNo != null">#{currNo},</if>
          </trim>
     </insert>
 
     <insert id="insertFundFlowBatch" parameterType="java.util.List"  useGeneratedKeys="true" keyProperty="id">
         insert into fund_flow
         <trim prefix="(" suffix=") values" suffixOverrides=",">
-            id,bank_flow_no,company,our_account,our_bank_name,income_expense_flag,transaction_amount,currency,counterparty_account,counterparty_name,transaction_date,purpose,summary,remarks,status,claimed_amount,create_by,create_time,update_by,update_time,del_flag,
+            id,bank_flow_no,company,our_account,our_bank_name,income_expense_flag,transaction_amount,currency,counterparty_account,counterparty_name,transaction_date,purpose,summary,remarks,status,claimed_amount,create_by,create_time,update_by,update_time,del_flag,sub_account_no,counterparty_bank,account_balance,transaction_channel,urid,org_no,payer_acct_name,value_date,nature_names,postdate,is_return,customized_serial_num,src_note_code,curr_no,
         </trim>
         <foreach item="item" index="index" collection="list" separator=",">
             <trim prefix="(" suffix=")" suffixOverrides=",">
-                #{item.id},#{item.bankFlowNo},#{item.company},#{item.ourAccount},#{item.ourBankName},#{item.incomeExpenseFlag},#{item.transactionAmount},#{item.currency},#{item.counterpartyAccount},#{item.counterpartyName},#{item.transactionDate},#{item.purpose},#{item.summary},#{item.remarks},#{item.status},#{item.claimedAmount},#{item.createBy},#{item.createTime},#{item.updateBy},#{item.updateTime},#{item.delFlag},
+                #{item.id},#{item.bankFlowNo},#{item.company},#{item.ourAccount},#{item.ourBankName},#{item.incomeExpenseFlag},#{item.transactionAmount},#{item.currency},#{item.counterpartyAccount},#{item.counterpartyName},#{item.transactionDate},#{item.purpose},#{item.summary},#{item.remarks},#{item.status},#{item.claimedAmount},#{item.createBy},#{item.createTime},#{item.updateBy},#{item.updateTime},#{item.delFlag},#{item.subAccountNo},#{item.counterpartyBank},#{item.accountBalance},#{item.transactionChannel},#{item.urid},#{item.orgNo},#{item.payerAcctName},#{item.valueDate},#{item.natureNames},#{item.postdate},#{item.isReturn},#{item.customizedSerialNum},#{item.srcNoteCode},#{item.currNo},
             </trim>
         </foreach>
     </insert>
@@ -163,6 +205,20 @@
             <if test="updateTime != null">update_time = #{updateTime},</if>
             <if test="delFlag != null">del_flag = #{delFlag},</if>
             <if test="billType != null">bill_type = #{billType},</if>
+            <if test="subAccountNo != null">sub_account_no = #{subAccountNo},</if>
+            <if test="counterpartyBank != null">counterparty_bank = #{counterpartyBank},</if>
+            <if test="accountBalance != null">account_balance = #{accountBalance},</if>
+            <if test="transactionChannel != null">transaction_channel = #{transactionChannel},</if>
+            <if test="urid != null">urid = #{urid},</if>
+            <if test="orgNo != null">org_no = #{orgNo},</if>
+            <if test="payerAcctName != null">payer_acct_name = #{payerAcctName},</if>
+            <if test="valueDate != null">value_date = #{valueDate},</if>
+            <if test="natureNames != null">nature_names = #{natureNames},</if>
+            <if test="postdate != null">postdate = #{postdate},</if>
+            <if test="isReturn != null">is_return = #{isReturn},</if>
+            <if test="customizedSerialNum != null">customized_serial_num = #{customizedSerialNum},</if>
+            <if test="srcNoteCode != null">src_note_code = #{srcNoteCode},</if>
+            <if test="currNo != null">curr_no = #{currNo},</if>
         </trim>
         where id = #{id}
     </update>
@@ -190,6 +246,20 @@
                 <if test="item.updateBy != null">update_by = #{item.updateBy},</if>
                 <if test="item.updateTime != null">update_time = #{item.updateTime},</if>
                 <if test="item.delFlag != null">del_flag = #{item.delFlag},</if>
+                <if test="item.subAccountNo != null">sub_account_no = #{item.subAccountNo},</if>
+                <if test="item.counterpartyBank != null">counterparty_bank = #{item.counterpartyBank},</if>
+                <if test="item.accountBalance != null">account_balance = #{item.accountBalance},</if>
+                <if test="item.transactionChannel != null">transaction_channel = #{item.transactionChannel},</if>
+                <if test="item.urid != null">urid = #{item.urid},</if>
+                <if test="item.orgNo != null">org_no = #{item.orgNo},</if>
+                <if test="item.payerAcctName != null">payer_acct_name = #{item.payerAcctName},</if>
+                <if test="item.valueDate != null">value_date = #{item.valueDate},</if>
+                <if test="item.natureNames != null">nature_names = #{item.natureNames},</if>
+                <if test="item.postdate != null">postdate = #{item.postdate},</if>
+                <if test="item.isReturn != null">is_return = #{item.isReturn},</if>
+                <if test="item.customizedSerialNum != null">customized_serial_num = #{item.customizedSerialNum},</if>
+                <if test="item.srcNoteCode != null">src_note_code = #{item.srcNoteCode},</if>
+                <if test="item.currNo != null">curr_no = #{item.currNo},</if>
             </trim>
         where id = #{item.id}
         </foreach>
@@ -211,4 +281,9 @@
         where thisTab.bank_flow_no = #{bankFlowNo}
     </select>
 
+    <select id="selectFundFlowByUrid" parameterType="String" resultMap="FundFlowResult">
+        <include refid="selectFundFlowVo"/>
+        where thisTab.urid = #{urid}
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git a/service/src/main/resources/minsheng.pfx b/service/src/main/resources/minsheng.pfx
new file mode 100644
index 0000000..6f2b402
--- /dev/null
+++ b/service/src/main/resources/minsheng.pfx
Binary files differ
diff --git a/service/src/main/resources/private.sm2 b/service/src/main/resources/private.sm2
new file mode 100644
index 0000000..ae38eb7
--- /dev/null
+++ b/service/src/main/resources/private.sm2
@@ -0,0 +1,15 @@
+MIIDIgIBATBHBgoqgRzPVQYBBAIBBgcqgRzPVQFoBDDrjRiluqzadTP8f5YyCXAKVzrEu++VsvnA
+f3XX0ib0JAWxdJ0BBxMp49qee1AnOkowggLSBgoqgRzPVQYBBAIBBIICwjCCAr4wggJioAMCAQIC
+BRA4ZHhIMAwGCCqBHM9VAYN1BQAwXDELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFu
+Y2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEbMBkGA1UEAwwSQ0ZDQSBURVNUIFNNMiBPQ0Ex
+MB4XDTE5MTExOTAzMjk1OFoXDTIxMTExOTAzMjk1OFowdzELMAkGA1UEBhMCQ04xFzAVBgNVBAoM
+DkNGQ0EgVEVTVCBPQ0ExMQ0wCwYDVQQLDARMQ0FFMRkwFwYDVQQLDBBPcmdhbml6YXRpb25hbC0x
+MSUwIwYDVQQDDBwwNTFA5rWL6K+V5LyB5LiaQFo4ODg4ODg4OEAxMFkwEwYHKoZIzj0CAQYIKoEc
+z1UBgi0DQgAEp3Cy3Xs5ntOajXwZQLP4Dtpp2czZIVS3OyxAkfKw/bhXe1oIzV9OPh9ydIQeAmAt
+nPrm4WnNHP1Y3/XlWK/zi6OB8zCB8DAfBgNVHSMEGDAWgBRr/hjaj0I6prhtsy6Igzo0osEw4TBI
+BgNVHSAEQTA/MD0GCGCBHIbvKgEBMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20u
+Y24vdXMvdXMtMTQuaHRtMDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6Ly91Y3JsLmNmY2EuY29tLmNu
+L1NNMi9jcmw3MzU1LmNybDALBgNVHQ8EBAMCA+gwHQYDVR0OBBYEFOgpYvNN0aU6Y/EehqXsy4jc
+kuzMMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAMBggqgRzPVQGDdQUAA0gAMEUCIQCY
+kwgmmtamo2IHSv6IlAWFnJJuJWJTrsHJ2Qa4ctwtIwIgbednqMQtQNDyVVxDFEH9uabA7N1KzRDS
+TDmAVnPOqWs=
\ No newline at end of file
diff --git a/ui/admin-ui3/src/api/cwgl/fundFlow.ts b/ui/admin-ui3/src/api/cwgl/fundFlow.ts
index 5828699..83f2f9c 100644
--- a/ui/admin-ui3/src/api/cwgl/fundFlow.ts
+++ b/ui/admin-ui3/src/api/cwgl/fundFlow.ts
@@ -81,4 +81,15 @@
         method: 'post',
         data
     })
+}
+
+/**
+ * 浠嶤MBS鍚屾閾惰娴佹按
+ */
+export const syncFromCmbs:requestType = (data) => {
+    return request({
+        url: '/cwgl/fundFlow/syncFromCmbs',
+        method: 'post',
+        params: data
+    })
 }
\ No newline at end of file
diff --git a/ui/admin-ui3/src/views/cwgl/fundFlow/index.vue b/ui/admin-ui3/src/views/cwgl/fundFlow/index.vue
index a92bfc0..462f371 100644
--- a/ui/admin-ui3/src/views/cwgl/fundFlow/index.vue
+++ b/ui/admin-ui3/src/views/cwgl/fundFlow/index.vue
@@ -17,6 +17,9 @@
           <el-button type="warning" plain icon="Upload" @click="handleImport"
           v-hasPermi="['cwgl:fundFlow:import']">瀵煎叆
         </el-button>
+        <el-button type="primary" plain icon="Refresh" @click="handleSync"
+          v-hasPermi="['cwgl:fundFlow:sync']">鍚屾閾惰娴佹按
+        </el-button>
       </template>
       <template #menu="{ size, row, index }">
         <el-link v-if="row.status == '0'" class="link-btn" type="primary" icon="Edit" :underline="false" :size="size"
@@ -50,10 +53,31 @@
     :open="pageF.importOpen" @submit="importSubmit" @cancel="pageF.importOpen = false" />
 
   <ClaimBillDialog ref="claimDialogRef" @submit="handleClaimSubmit" />
+
+  <!-- 鍚屾閾惰娴佹按瀵硅瘽妗� -->
+  <el-dialog title="鍚屾閾惰娴佹按" v-model="syncDialogVisible" width="500px" append-to-body>
+    <el-form ref="syncFormRef" :model="syncForm" :rules="syncRules" label-width="100px">
+      <el-form-item label="璐﹀彿" prop="acctNum">
+        <el-input v-model="syncForm.acctNum" placeholder="璇疯緭鍏ラ摱琛岃处鍙�" clearable />
+      </el-form-item>
+      <el-form-item label="寮�濮嬫棩鏈�" prop="startDate">
+        <el-date-picker v-model="syncForm.startDate" type="date" value-format="YYYY-MM-DD"
+          placeholder="璇烽�夋嫨寮�濮嬫棩鏈�" style="width: 100%" />
+      </el-form-item>
+      <el-form-item label="缁撴潫鏃ユ湡" prop="endDate">
+        <el-date-picker v-model="syncForm.endDate" type="date" value-format="YYYY-MM-DD"
+          placeholder="璇烽�夋嫨缁撴潫鏃ユ湡" style="width: 100%" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="syncDialogVisible = false">鍙� 娑�</el-button>
+      <el-button type="primary" @click="handleSyncSubmit" :loading="syncLoading">纭� 瀹�</el-button>
+    </template>
+  </el-dialog>
 </template>
 
 <script setup name="fundFlow" lang="ts">
-import { FundFlowI, addFundFlow, delFundFlow, addFundFlowClaimDetailClaim, exportFundFlow, confirmFundFlow, getFundFlow, listFundFlow, updateFundFlow } from "@/api/cwgl/fundFlow";
+import { FundFlowI, addFundFlow, delFundFlow, addFundFlowClaimDetailClaim, exportFundFlow, confirmFundFlow, getFundFlow, listFundFlow, updateFundFlow, syncFromCmbs } from "@/api/cwgl/fundFlow";
 import useCurrentInstance from "@/utils/useCurrentInstance";
   import { listFundFlowLog} from "@/api/cwgl/fundFlowLog";
 
@@ -320,5 +344,47 @@
   pageF.importOpen = false;
   onLoad(page.value);
 };
+
+// 鍚屾閾惰娴佹按
+const syncDialogVisible = ref(false);
+const syncLoading = ref(false);
+const syncFormRef = ref();
+const syncForm = reactive({
+  acctNum: '',
+  startDate: '',
+  endDate: ''
+});
+const syncRules = {
+  acctNum: [{ required: true, message: '璇疯緭鍏ラ摱琛岃处鍙�', trigger: 'blur' }],
+  startDate: [{ required: true, message: '璇烽�夋嫨寮�濮嬫棩鏈�', trigger: 'change' }],
+  endDate: [{ required: true, message: '璇烽�夋嫨缁撴潫鏃ユ湡', trigger: 'change' }]
+};
+
+const handleSync = () => {
+  syncForm.acctNum = '';
+  syncForm.startDate = '';
+  syncForm.endDate = '';
+  syncDialogVisible.value = true;
+};
+
+const handleSyncSubmit = () => {
+  syncFormRef.value?.validate((valid: boolean) => {
+    if (!valid) return;
+    syncLoading.value = true;
+    syncFromCmbs(syncForm).then((response: any) => {
+      syncLoading.value = false;
+      if (response.code === 200) {
+        proxy.$modal.msgSuccess(response.msg || '鍚屾鎴愬姛');
+        syncDialogVisible.value = false;
+        onLoad(page.value);
+      } else {
+        proxy.$modal.msgError(response.msg || '鍚屾澶辫触');
+      }
+    }).catch((err) => {
+      syncLoading.value = false;
+      proxy.$modal.msgError('鍚屾澶辫触: ' + (err.msg || err.message || ''));
+    });
+  });
+};
 /* listFundFlowClaimDetail */
 </script>

--
Gitblit v1.8.0