叶静 пре 1 месец
родитељ
комит
5c38d13265

+ 0 - 198
doc/bmd.json

@@ -1,198 +0,0 @@
-{
-  "openapi": "3.0.1",
-  "info": {
-    "title": "默认模块",
-    "description": "",
-    "version": "1.0.0"
-  },
-  "tags": [],
-  "paths": {
-    "/merchant/getWhitelist": {
-      "get": {
-        "summary": "查看白名单",
-        "deprecated": false,
-        "description": "",
-        "tags": [],
-        "parameters": [],
-        "responses": {
-          "200": {
-            "description": "",
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/RString"
-                },
-                "example": {
-                  "code": 0,
-                  "msg": "",
-                  "data": ""
-                }
-              }
-            },
-            "headers": {}
-          }
-        },
-        "security": [
-          {
-            "bearer": []
-          }
-        ]
-      }
-    },
-    "/merchant/editWhitelist": {
-      "patch": {
-        "summary": "设置白名单",
-        "deprecated": false,
-        "description": "",
-        "tags": [],
-        "parameters": [],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/EditMerchantSafeRO",
-                "description": ""
-              }
-            }
-          }
-        },
-        "responses": {
-          "200": {
-            "description": "",
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/R",
-                  "description": "响应信息主体"
-                },
-                "example": {
-                  "ok": false,
-                  "code": 0,
-                  "msg": "",
-                  "data": {}
-                }
-              }
-            },
-            "headers": {}
-          }
-        },
-        "security": [
-          {
-            "bearer": []
-          }
-        ]
-      }
-    },
-    "/merchant/editSecondaryPwd": {
-      "patch": {
-        "summary": "设置二级密码",
-        "deprecated": false,
-        "description": "",
-        "tags": [],
-        "parameters": [],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/EditMerchantSafeRO",
-                "description": ""
-              }
-            }
-          }
-        },
-        "responses": {
-          "200": {
-            "description": "",
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/R",
-                  "description": "响应信息主体"
-                },
-                "example": {
-                  "ok": false,
-                  "code": 0,
-                  "msg": "",
-                  "data": {}
-                }
-              }
-            },
-            "headers": {}
-          }
-        },
-        "security": [
-          {
-            "bearer": []
-          }
-        ]
-      }
-    }
-  },
-  "components": {
-    "schemas": {
-      "RString": {
-        "type": "object",
-        "properties": {
-          "code": {
-            "type": "integer",
-            "description": "返回标记:成功标记=0,失败标记=1"
-          },
-          "msg": {
-            "type": "string",
-            "description": "返回信息"
-          },
-          "data": {
-            "type": "string",
-            "description": "数据"
-          }
-        }
-      },
-      "EditMerchantSafeRO": {
-        "type": "object",
-        "properties": {
-          "whitelist": {
-            "type": "string",
-            "description": "白名单"
-          },
-          "secondaryPwd": {
-            "type": "string",
-            "description": "二级密码"
-          },
-          "oldSecondaryPwd": {
-            "type": "string",
-            "description": "旧二级密码"
-          }
-        }
-      },
-      "R": {
-        "type": "object",
-        "properties": {
-          "ok": {
-            "type": "boolean"
-          },
-          "code": {
-            "type": "integer",
-            "description": "返回标记:成功标记=0,失败标记=1"
-          },
-          "msg": {
-            "type": "string",
-            "description": "返回信息"
-          },
-          "data": {
-            "type": "object",
-            "properties": {},
-            "description": "数据"
-          }
-        }
-      }
-    },
-    "securitySchemes": {
-      "bearer": {
-        "type": "http",
-        "scheme": "bearer"
-      }
-    }
-  },
-  "servers": [],
-  "security": []
-}

+ 0 - 192
doc/google.json

@@ -1,192 +0,0 @@
-{
-  "openapi": "3.0.1",
-  "info": {
-    "title": "默认模块",
-    "description": "",
-    "version": "1.0.0"
-  },
-  "tags": [],
-  "paths": {
-    "/google/getCode": {
-      "post": {
-        "summary": "获取二维码",
-        "deprecated": false,
-        "description": "",
-        "tags": [],
-        "parameters": [],
-        "responses": {
-          "200": {
-            "description": "",
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/RString"
-                },
-                "example": {
-                  "code": 0,
-                  "msg": "",
-                  "data": ""
-                }
-              }
-            },
-            "headers": {}
-          }
-        },
-        "security": [
-          {
-            "bearer": []
-          }
-        ]
-      }
-    },
-    "/google/binding": {
-      "get": {
-        "summary": "绑定验证码",
-        "deprecated": false,
-        "description": "",
-        "tags": [],
-        "parameters": [
-          {
-            "name": "code",
-            "in": "query",
-            "description": "",
-            "required": false,
-            "example": 487722,
-            "schema": {
-              "type": "integer"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "",
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/R",
-                  "description": "响应信息主体"
-                },
-                "example": {
-                  "code": 0,
-                  "msg": "",
-                  "data": ""
-                }
-              }
-            },
-            "headers": {}
-          }
-        },
-        "security": [
-          {
-            "bearer": []
-          }
-        ]
-      }
-    },
-    "/google/unbinding": {
-      "post": {
-        "summary": "解绑验证码",
-        "deprecated": false,
-        "description": "",
-        "tags": [],
-        "parameters": [],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/GoogleUnbindingRO",
-                "description": ""
-              }
-            }
-          }
-        },
-        "responses": {
-          "200": {
-            "description": "",
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/R",
-                  "description": "响应信息主体"
-                },
-                "example": {
-                  "code": 0,
-                  "msg": "",
-                  "data": ""
-                }
-              }
-            },
-            "headers": {}
-          }
-        },
-        "security": [
-          {
-            "bearer": []
-          }
-        ]
-      }
-    }
-  },
-  "components": {
-    "schemas": {
-      "RString": {
-        "type": "object",
-        "properties": {
-          "code": {
-            "type": "integer",
-            "description": "返回标记:成功标记=0,失败标记=1"
-          },
-          "msg": {
-            "type": "string",
-            "description": "返回信息"
-          },
-          "data": {
-            "type": "string",
-            "description": "数据"
-          }
-        }
-      },
-      "GoogleUnbindingRO": {
-        "type": "object",
-        "properties": {
-          "pwd": {
-            "type": "string",
-            "description": ""
-          }
-        },
-        "required": [
-          "pwd"
-        ]
-      },
-      "R": {
-        "type": "object",
-        "properties": {
-          "ok": {
-            "type": "boolean"
-          },
-          "code": {
-            "type": "integer",
-            "description": "返回标记:成功标记=0,失败标记=1"
-          },
-          "msg": {
-            "type": "string",
-            "description": "返回信息"
-          },
-          "data": {
-            "type": "object",
-            "properties": {},
-            "description": "数据"
-          }
-        }
-      }
-    },
-    "securitySchemes": {
-      "bearer": {
-        "type": "http",
-        "scheme": "bearer"
-      }
-    }
-  },
-  "servers": [],
-  "security": []
-}

+ 0 - 1117
doc/order.json

@@ -1,1117 +0,0 @@
-{
-  "openapi": "3.0.1",
-  "info": {
-    "title": "默认模块",
-    "description": "",
-    "version": "1.0.0"
-  },
-  "tags": [],
-  "paths": {
-    "/admin/payOrder/page": {
-      "post": {
-        "summary": "分页查询列表",
-        "deprecated": false,
-        "description": "",
-        "tags": [],
-        "parameters": [],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/PayOrderPageDTO",
-                "description": "参数集"
-              }
-            }
-          }
-        },
-        "responses": {
-          "200": {
-            "description": "",
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/RIPagePayOrder",
-                  "description": "用户集合"
-                },
-                "example": {
-                  "ok": false,
-                  "code": 0,
-                  "msg": "",
-                  "data": {}
-                }
-              }
-            },
-            "headers": {}
-          }
-        },
-        "security": []
-      }
-    },
-    "/admin/payOrder/statistics": {
-      "post": {
-        "summary": "代付列表统计",
-        "deprecated": false,
-        "description": "",
-        "tags": [],
-        "parameters": [],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/PayOrderPageDTO",
-                "description": "参数集"
-              }
-            }
-          }
-        },
-        "responses": {
-          "200": {
-            "description": "",
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/RPayOrderStatisticsRO",
-                  "description": "用户集合"
-                },
-                "example": {
-                  "ok": false,
-                  "code": 0,
-                  "msg": "",
-                  "data": {}
-                }
-              }
-            },
-            "headers": {}
-          }
-        },
-        "security": []
-      }
-    },
-    "/admin/withdrawOrder/page": {
-      "post": {
-        "summary": "分页查询列表",
-        "deprecated": false,
-        "description": "",
-        "tags": [],
-        "parameters": [],
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "$ref": "#/components/schemas/WithdrawOrderPageDTO",
-                "description": "参数集"
-              }
-            }
-          }
-        },
-        "responses": {
-          "200": {
-            "description": "",
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/RIPageWithdrawOrder",
-                  "description": "用户集合"
-                },
-                "example": {
-                  "ok": false,
-                  "code": 0,
-                  "msg": "",
-                  "data": {}
-                }
-              }
-            },
-            "headers": {}
-          }
-        },
-        "security": []
-      }
-    },
-    "/admin/payNotify/page": {
-      "get": {
-        "summary": "分页查询列表",
-        "deprecated": false,
-        "description": "",
-        "tags": [],
-        "parameters": [
-          {
-            "name": "appId",
-            "in": "query",
-            "description": "",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          },
-          {
-            "name": "orderId",
-            "in": "query",
-            "description": "",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "",
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/RPayNotifyRO",
-                  "description": "通知记录"
-                },
-                "example": {
-                  "code": 0,
-                  "msg": "",
-                  "data": {
-                    "id": 0,
-                    "orderId": "",
-                    "status": 0,
-                    "nextNotifyTime": "",
-                    "lastExecuteTime": "",
-                    "notifyTimes": 0,
-                    "maxNotifyTimes": 0,
-                    "notifyUrl": "",
-                    "errorMsg": "",
-                    "payNotifyLogs": [
-                      {
-                        "notifyTimes": 0,
-                        "response": "",
-                        "status": 0,
-                        "createTime": ""
-                      }
-                    ]
-                  }
-                }
-              }
-            },
-            "headers": {}
-          }
-        },
-        "security": []
-      }
-    },
-    "/statistisc/index": {
-      "get": {
-        "summary": "首页数据统计 index_select",
-        "deprecated": false,
-        "description": "",
-        "tags": [],
-        "parameters": [],
-        "responses": {
-          "200": {
-            "description": "",
-            "content": {
-              "application/json": {
-                "schema": {
-                  "$ref": "#/components/schemas/ROrderStatisticsVO"
-                },
-                "example": {
-                  "code": 0,
-                  "msg": "",
-                  "data": {
-                    "submitCreateNum": 0,
-                    "payOrderNum": 0,
-                    "submitCreateAmount": 0,
-                    "payOrderAmount": 0,
-                    "withdrawOrderNum": 0,
-                    "withdrawOrderSuccessNum": 0,
-                    "withdrawOrderAmount": 0,
-                    "withdrawOrderSuccessAmount": 0,
-                    "paySuccessRate": 0
-                  }
-                }
-              }
-            },
-            "headers": {}
-          }
-        },
-        "security": []
-      }
-    }
-  },
-  "components": {
-    "schemas": {
-      "PayNotifyLogRO": {
-        "type": "object",
-        "properties": {
-          "notifyTimes": {
-            "type": "integer",
-            "description": "第几次被通知\n\n对应到{@link MchPayNotifyTask#getNotifyTimes()}"
-          },
-          "response": {
-            "type": "string",
-            "description": "HTTP 响应结果"
-          },
-          "status": {
-            "type": "integer",
-            "description": "支付通知状态\n\n枚举{@link PayNotifyStatusEnum}"
-          },
-          "createTime": {
-            "type": "string",
-            "description": "创建时间"
-          }
-        }
-      },
-      "PayOrder": {
-        "type": "object",
-        "properties": {
-          "id": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "createTime": {
-            "type": "string",
-            "description": "创建时间"
-          },
-          "updateTime": {
-            "type": "string",
-            "description": "修改时间"
-          },
-          "appId": {
-            "type": "string",
-            "description": "appId"
-          },
-          "mchOrderNo": {
-            "type": "string",
-            "description": "商户订单号"
-          },
-          "orderStatus": {
-            "type": "string",
-            "description": "订单状态",
-            "enum": [
-              "CREATE_ORDER",
-              "PAY_SUCCESS",
-              "PAY_FAIL",
-              "CANCEL_ORDER",
-              "PAY_TIMEOUT"
-            ]
-          },
-          "currency": {
-            "type": "string",
-            "description": "币种"
-          },
-          "amount": {
-            "type": "number",
-            "description": "订单原始金额"
-          },
-          "clientIp": {
-            "type": "string",
-            "description": "客户端IP"
-          },
-          "device": {
-            "type": "string",
-            "description": "设备"
-          },
-          "returnUrl": {
-            "type": "string",
-            "description": "支付结果前端跳转URL"
-          },
-          "notifyUrl": {
-            "type": "string",
-            "description": "支付结果后台回调URL"
-          },
-          "subject": {
-            "type": "string",
-            "description": "主题"
-          },
-          "body": {
-            "type": "string",
-            "description": "内容不能为空"
-          },
-          "extra": {
-            "type": "string",
-            "description": "扩展参数"
-          },
-          "reqTime": {
-            "type": "string",
-            "description": "请求时间"
-          },
-          "merchantUserId": {
-            "type": "integer",
-            "description": "商户id",
-            "format": "int64"
-          },
-          "agentUserId": {
-            "type": "integer",
-            "description": "代理商id",
-            "format": "int64"
-          },
-          "paymentTypeId": {
-            "type": "integer",
-            "description": "通道类型id",
-            "format": "int64"
-          },
-          "paymentChannelId": {
-            "type": "integer",
-            "description": "支付通道id",
-            "format": "int64"
-          },
-          "paymentChannelName": {
-            "type": "string",
-            "description": "支付通道名称"
-          },
-          "feeStatus": {
-            "type": "boolean",
-            "description": "获取通道费率成功标识"
-          },
-          "mFeeType": {
-            "type": "string",
-            "description": "平台手续费类型",
-            "enum": [
-              "PERCENTAGE",
-              "FIXED",
-              "MIXED"
-            ]
-          },
-          "mFeeRate": {
-            "type": "number",
-            "description": "平台手续费比例(百分比)"
-          },
-          "mFeeEvery": {
-            "type": "number",
-            "description": "平台手续费固定金额"
-          },
-          "mFee": {
-            "type": "number",
-            "description": "平台手续费"
-          },
-          "aFeeType": {
-            "type": "string",
-            "description": "代理商手续费类型",
-            "enum": [
-              "PERCENTAGE",
-              "FIXED",
-              "MIXED"
-            ]
-          },
-          "aFeeRate": {
-            "type": "number",
-            "description": "代理商手续费比例(百分比)"
-          },
-          "aFeeEvery": {
-            "type": "number",
-            "description": "代理商手续费固定金额"
-          },
-          "aFee": {
-            "type": "number",
-            "description": "代理商手续"
-          },
-          "noticeDatetime": {
-            "type": "string",
-            "description": "支付完成时间"
-          },
-          "noticeAmount": {
-            "type": "number",
-            "description": "实际支付金额"
-          },
-          "noticeMFee": {
-            "type": "number",
-            "description": "实际平台手续费"
-          },
-          "noticeAFee": {
-            "type": "number",
-            "description": "实际平台手续费"
-          },
-          "transactionId": {
-            "type": "string",
-            "description": "上游三方支付流水号"
-          }
-        }
-      },
-      "WithdrawOrder": {
-        "type": "object",
-        "properties": {
-          "id": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "createTime": {
-            "type": "string",
-            "description": "创建时间"
-          },
-          "updateTime": {
-            "type": "string",
-            "description": "修改时间"
-          },
-          "appId": {
-            "type": "string",
-            "description": "appId"
-          },
-          "mchOrderNo": {
-            "type": "string",
-            "description": "商户订单号"
-          },
-          "orderStatus": {
-            "type": "string",
-            "description": "订单状态",
-            "enum": [
-              "CREATE_ORDER",
-              "WITHDRAW_SUCCESS",
-              "WITHDRAW_FAIL"
-            ]
-          },
-          "currencyType": {
-            "type": "string",
-            "description": "币种"
-          },
-          "amount": {
-            "type": "number",
-            "description": "订单原始金额"
-          },
-          "notifyUrl": {
-            "type": "string",
-            "description": "支付结果后台回调URL"
-          },
-          "subject": {
-            "type": "string",
-            "description": "主题"
-          },
-          "payUsername": {
-            "type": "string",
-            "description": "用户姓名"
-          },
-          "payBankNumber": {
-            "type": "string",
-            "description": "银行账号"
-          },
-          "payBankName": {
-            "type": "string",
-            "description": "银行名称"
-          },
-          "payAttach": {
-            "type": "string",
-            "description": "扩展参数"
-          },
-          "payEmail": {
-            "type": "string",
-            "description": "用户邮箱"
-          },
-          "payMobile": {
-            "type": "string",
-            "description": "用户电话"
-          },
-          "reqTime": {
-            "type": "string",
-            "description": "请求时间"
-          },
-          "merchantUserId": {
-            "type": "integer",
-            "description": "商户id",
-            "format": "int64"
-          },
-          "paymentTypeId": {
-            "type": "integer",
-            "description": "通道类型id",
-            "format": "int64"
-          },
-          "paymentChannelId": {
-            "type": "integer",
-            "description": "支付通道id",
-            "format": "int64"
-          },
-          "feeStatus": {
-            "type": "boolean",
-            "description": "获取通道费率成功标识"
-          },
-          "mFeeType": {
-            "type": "string",
-            "description": "平台手续费类型",
-            "enum": [
-              "PERCENTAGE",
-              "FIXED",
-              "MIXED"
-            ]
-          },
-          "mFeeRate": {
-            "type": "number",
-            "description": "平台手续费比例(百分比)"
-          },
-          "mFeeEvery": {
-            "type": "number",
-            "description": "平台手续费固定金额"
-          },
-          "mFee": {
-            "type": "number",
-            "description": "平台手续费"
-          },
-          "aFeeType": {
-            "type": "string",
-            "description": "代理商手续费类型",
-            "enum": [
-              "PERCENTAGE",
-              "FIXED",
-              "MIXED"
-            ]
-          },
-          "aFeeRate": {
-            "type": "number",
-            "description": "代理商手续费比例(百分比)"
-          },
-          "aFeeEvery": {
-            "type": "number",
-            "description": "代理商手续费固定金额"
-          },
-          "aFee": {
-            "type": "number",
-            "description": "代理商手续"
-          },
-          "noticeDatetime": {
-            "type": "string",
-            "description": "支付完成时间"
-          },
-          "noticeAmount": {
-            "type": "number",
-            "description": "实际支付金额"
-          },
-          "noticeMFee": {
-            "type": "number",
-            "description": "实际平台手续费"
-          },
-          "noticeAFee": {
-            "type": "number",
-            "description": "实际平台手续费"
-          },
-          "transactionId": {
-            "type": "string",
-            "description": "上游三方支付流水号"
-          }
-        }
-      },
-      "OrderStatisticsVO": {
-        "type": "object",
-        "properties": {
-          "submitCreateNum": {
-            "type": "integer",
-            "description": "提交订单数"
-          },
-          "payOrderNum": {
-            "type": "integer",
-            "description": "支付订单数"
-          },
-          "submitCreateAmount": {
-            "type": "number",
-            "description": "提交订单金额"
-          },
-          "payOrderAmount": {
-            "type": "number",
-            "description": "支付订单金额"
-          },
-          "withdrawOrderNum": {
-            "type": "integer",
-            "description": "提现订单数"
-          },
-          "withdrawOrderSuccessNum": {
-            "type": "integer",
-            "description": "提现订单成功数"
-          },
-          "withdrawOrderAmount": {
-            "type": "number",
-            "description": "提现订单金额"
-          },
-          "withdrawOrderSuccessAmount": {
-            "type": "number",
-            "description": "提现订单成功金额"
-          },
-          "paySuccessRate": {
-            "type": "number",
-            "description": "支付成功率"
-          }
-        }
-      },
-      "": {
-        "type": "object",
-        "properties": {}
-      },
-      "PayNotifyRO": {
-        "type": "object",
-        "properties": {
-          "id": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "orderId": {
-            "type": "string",
-            "description": "平台订单ID"
-          },
-          "status": {
-            "type": "integer",
-            "description": "通知状态\n\n枚举{@link PayNotifyStatusEnum}"
-          },
-          "nextNotifyTime": {
-            "type": "string",
-            "description": "下一次通知时间"
-          },
-          "lastExecuteTime": {
-            "type": "string",
-            "description": "最后一次执行时间"
-          },
-          "notifyTimes": {
-            "type": "integer",
-            "description": "当前通知次数"
-          },
-          "maxNotifyTimes": {
-            "type": "integer",
-            "description": "最大可通知次数"
-          },
-          "notifyUrl": {
-            "type": "string",
-            "description": "通知地址"
-          },
-          "errorMsg": {
-            "type": "string",
-            "description": "失败原因"
-          },
-          "payNotifyLogs": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/PayNotifyLogRO",
-              "description": "com.mw.bridging.open.ro.PayNotifyLogRO"
-            },
-            "description": "通知日志"
-          }
-        }
-      },
-      "ROrderStatisticsVO": {
-        "type": "object",
-        "properties": {
-          "code": {
-            "type": "integer",
-            "description": "返回标记:成功标记=0,失败标记=1"
-          },
-          "msg": {
-            "type": "string",
-            "description": "返回信息"
-          },
-          "data": {
-            "$ref": "#/components/schemas/OrderStatisticsVO",
-            "description": "数据"
-          }
-        }
-      },
-      "RPayNotifyRO": {
-        "type": "object",
-        "properties": {
-          "code": {
-            "type": "integer",
-            "description": "返回标记:成功标记=0,失败标记=1"
-          },
-          "msg": {
-            "type": "string",
-            "description": "返回信息"
-          },
-          "data": {
-            "$ref": "#/components/schemas/PayNotifyRO",
-            "description": "数据"
-          }
-        }
-      },
-      "IPagePayOrder": {
-        "type": "object",
-        "properties": {
-          "records": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/PayOrder",
-              "description": ""
-            },
-            "description": ""
-          },
-          "total": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "size": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "current": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "orders": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/OrderItem",
-              "description": "com.baomidou.mybatisplus.core.metadata.OrderItem"
-            },
-            "description": ""
-          },
-          "optimizeCountSql": {
-            "type": "boolean",
-            "description": ""
-          },
-          "searchCount": {
-            "type": "boolean",
-            "description": ""
-          },
-          "optimizeJoinOfCountSql": {
-            "type": "boolean",
-            "description": ""
-          },
-          "maxLimit": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "countId": {
-            "type": "string",
-            "description": ""
-          },
-          "pages": {
-            "type": "integer",
-            "format": "int64"
-          }
-        }
-      },
-      "IPageWithdrawOrder": {
-        "type": "object",
-        "properties": {
-          "records": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/WithdrawOrder",
-              "description": ""
-            },
-            "description": ""
-          },
-          "total": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "size": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "current": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "orders": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/OrderItem",
-              "description": "com.baomidou.mybatisplus.core.metadata.OrderItem"
-            },
-            "description": ""
-          },
-          "optimizeCountSql": {
-            "type": "boolean",
-            "description": ""
-          },
-          "searchCount": {
-            "type": "boolean",
-            "description": ""
-          },
-          "optimizeJoinOfCountSql": {
-            "type": "boolean",
-            "description": ""
-          },
-          "maxLimit": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "countId": {
-            "type": "string",
-            "description": ""
-          },
-          "pages": {
-            "type": "integer",
-            "format": "int64"
-          }
-        }
-      },
-      "PayOrderPageDTO": {
-        "type": "object",
-        "properties": {
-          "records": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/1"
-            },
-            "description": ""
-          },
-          "total": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "size": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "current": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "orders": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/OrderItem",
-              "description": "com.baomidou.mybatisplus.core.metadata.OrderItem"
-            },
-            "description": ""
-          },
-          "optimizeCountSql": {
-            "type": "boolean",
-            "description": ""
-          },
-          "searchCount": {
-            "type": "boolean",
-            "description": ""
-          },
-          "optimizeJoinOfCountSql": {
-            "type": "boolean",
-            "description": ""
-          },
-          "maxLimit": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "countId": {
-            "type": "string",
-            "description": ""
-          },
-          "mchOrderNo": {
-            "type": "string",
-            "description": "商户单号"
-          },
-          "transactionId": {
-            "type": "string",
-            "description": "支付单号"
-          },
-          "orderStatus": {
-            "type": "string",
-            "description": "订单状态",
-            "enum": [
-              "CREATE_ORDER",
-              "PAY_SUCCESS",
-              "PAY_FAIL",
-              "CANCEL_ORDER",
-              "PAY_TIMEOUT"
-            ]
-          },
-          "startTime": {
-            "type": "string",
-            "description": "开始时间"
-          },
-          "endTime": {
-            "type": "string",
-            "description": "结束时间"
-          },
-          "paymentChannelId": {
-            "type": "integer",
-            "description": "支付通道id",
-            "format": "int64"
-          }
-        }
-      },
-      "WithdrawOrderPageDTO": {
-        "type": "object",
-        "properties": {
-          "records": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/1"
-            },
-            "description": ""
-          },
-          "total": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "size": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "current": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "orders": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/OrderItem",
-              "description": "com.baomidou.mybatisplus.core.metadata.OrderItem"
-            },
-            "description": ""
-          },
-          "optimizeCountSql": {
-            "type": "boolean",
-            "description": ""
-          },
-          "searchCount": {
-            "type": "boolean",
-            "description": ""
-          },
-          "optimizeJoinOfCountSql": {
-            "type": "boolean",
-            "description": ""
-          },
-          "maxLimit": {
-            "type": "integer",
-            "description": "",
-            "format": "int64"
-          },
-          "countId": {
-            "type": "string",
-            "description": ""
-          },
-          "mchOrderNo": {
-            "type": "string",
-            "description": "商户单号"
-          },
-          "transactionId": {
-            "type": "string",
-            "description": "支付单号"
-          },
-          "orderStatus": {
-            "type": "string",
-            "description": "订单状态",
-            "enum": [
-              "CREATE_ORDER",
-              "WITHDRAW_SUCCESS",
-              "WITHDRAW_FAIL"
-            ]
-          },
-          "startTime": {
-            "type": "string",
-            "description": "开始时间"
-          },
-          "endTime": {
-            "type": "string",
-            "description": "结束时间"
-          }
-        }
-      },
-      "RIPagePayOrder": {
-        "type": "object",
-        "properties": {
-          "ok": {
-            "type": "boolean"
-          },
-          "code": {
-            "type": "integer",
-            "description": "返回标记:成功标记=0,失败标记=1"
-          },
-          "msg": {
-            "type": "string",
-            "description": "返回信息"
-          },
-          "data": {
-            "$ref": "#/components/schemas/IPagePayOrder",
-            "description": "数据"
-          }
-        }
-      },
-      "RIPageWithdrawOrder": {
-        "type": "object",
-        "properties": {
-          "ok": {
-            "type": "boolean"
-          },
-          "code": {
-            "type": "integer",
-            "description": "返回标记:成功标记=0,失败标记=1"
-          },
-          "msg": {
-            "type": "string",
-            "description": "返回信息"
-          },
-          "data": {
-            "$ref": "#/components/schemas/IPageWithdrawOrder",
-            "description": "数据"
-          }
-        }
-      },
-      "OrderItem": {
-        "type": "object",
-        "properties": {
-          "column": {
-            "type": "string",
-            "description": ""
-          },
-          "asc": {
-            "type": "boolean",
-            "description": ""
-          }
-        }
-      },
-      "PayOrderStatisticsRO": {
-        "type": "object",
-        "properties": {
-          "numberOrders": {
-            "type": "integer",
-            "description": "提交订单数"
-          },
-          "totalOrderAmount": {
-            "type": "number",
-            "description": "订单总金额"
-          },
-          "paidOrders": {
-            "type": "integer",
-            "description": "已付订单数"
-          },
-          "totalAmountPaid": {
-            "type": "number",
-            "description": "已付总金额"
-          },
-          "totalMerchantAmount": {
-            "type": "number",
-            "description": "商户总收入"
-          },
-          "totalAgentAmount": {
-            "type": "number",
-            "description": "代理商总收入"
-          },
-          "unpaidOrders": {
-            "type": "integer",
-            "description": "未付订单数"
-          },
-          "totalAmountUnpaid": {
-            "type": "number",
-            "description": "未付总金额"
-          }
-        }
-      },
-      "RPayOrderStatisticsRO": {
-        "type": "object",
-        "properties": {
-          "code": {
-            "type": "integer",
-            "description": "返回标记:成功标记=0,失败标记=1"
-          },
-          "msg": {
-            "type": "string",
-            "description": "返回信息"
-          },
-          "data": {
-            "$ref": "#/components/schemas/PayOrderStatisticsRO",
-            "description": "数据"
-          }
-        }
-      }
-    },
-    "securitySchemes": {}
-  },
-  "servers": [],
-  "security": []
-}

+ 531 - 0
doc/shtx.json

@@ -0,0 +1,531 @@
+{
+  "openapi": "3.0.1",
+  "info": {
+    "title": "默认模块",
+    "description": "",
+    "version": "1.0.0"
+  },
+  "tags": [],
+  "paths": {
+    "/merchantWithdraw/page": {
+      "post": {
+        "summary": "分页 merchantWithdraw_admin",
+        "deprecated": false,
+        "description": "",
+        "tags": [],
+        "parameters": [],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/AgentWithdrawDTO",
+                "description": ""
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/RPageMerchantWithdrawPageVO"
+                },
+                "examples": {
+                  "1": {
+                    "summary": "成功示例",
+                    "value": {
+                      "code": 0,
+                      "msg": "",
+                      "data": {
+                        "records": [
+                          {
+                            "id": 0,
+                            "merchantId": 0,
+                            "merchantName": "",
+                            "amount": 0,
+                            "type": 0,
+                            "bankName": "",
+                            "bankAccount": "",
+                            "realName": "",
+                            "applyTime": "",
+                            "auditStatus": 0,
+                            "transferStatus": 0,
+                            "failReason": "",
+                            "createdTime": "",
+                            "updatedTime": ""
+                          }
+                        ],
+                        "total": 0,
+                        "size": 0,
+                        "current": 0,
+                        "orders": [
+                          {
+                            "column": "",
+                            "asc": false
+                          }
+                        ],
+                        "optimizeCountSql": false,
+                        "searchCount": false,
+                        "optimizeJoinOfCountSql": false,
+                        "maxLimit": 0,
+                        "countId": ""
+                      }
+                    }
+                  },
+                  "2": {
+                    "summary": "成功示例",
+                    "value": {
+                      "code": 0,
+                      "msg": "",
+                      "data": {
+                        "records": [
+                          {
+                            "id": 0,
+                            "merchantId": 0,
+                            "merchantName": "",
+                            "amount": 0,
+                            "type": 0,
+                            "bankName": "",
+                            "bankAccount": "",
+                            "realName": "",
+                            "applyTime": "",
+                            "auditStatus": 0,
+                            "transferStatus": 0,
+                            "failReason": "",
+                            "createdTime": "",
+                            "updatedTime": ""
+                          }
+                        ],
+                        "total": 0,
+                        "size": 0,
+                        "current": 0,
+                        "orders": [
+                          {
+                            "column": "",
+                            "asc": false
+                          }
+                        ],
+                        "optimizeCountSql": false,
+                        "searchCount": false,
+                        "optimizeJoinOfCountSql": false,
+                        "maxLimit": 0,
+                        "countId": ""
+                      }
+                    }
+                  },
+                  "3": {
+                    "summary": "成功示例",
+                    "value": {
+                      "code": 0,
+                      "msg": "",
+                      "data": {
+                        "records": [
+                          {
+                            "id": 0,
+                            "merchantId": 0,
+                            "merchantName": "",
+                            "amount": 0,
+                            "type": 0,
+                            "bankName": "",
+                            "bankAccount": "",
+                            "realName": "",
+                            "applyTime": "",
+                            "auditStatus": 0,
+                            "transferStatus": 0,
+                            "failReason": "",
+                            "createdTime": "",
+                            "updatedTime": ""
+                          }
+                        ],
+                        "total": 0,
+                        "size": 0,
+                        "current": 0,
+                        "orders": [
+                          {
+                            "column": "",
+                            "asc": false
+                          }
+                        ],
+                        "optimizeCountSql": false,
+                        "searchCount": false,
+                        "optimizeJoinOfCountSql": false,
+                        "maxLimit": 0,
+                        "countId": ""
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearer": []
+          }
+        ]
+      }
+    },
+    "/merchantWithdraw/apply": {
+      "post": {
+        "summary": "申请提现 merchantWithdraw_apply_admin",
+        "deprecated": false,
+        "description": "",
+        "tags": [],
+        "parameters": [],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/AddAgentWithdrawDTO",
+                "description": ""
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/R",
+                  "description": "响应信息主体"
+                },
+                "examples": {
+                  "1": {
+                    "summary": "成功示例",
+                    "value": {
+                      "ok": false,
+                      "code": 0,
+                      "msg": "",
+                      "data": {}
+                    }
+                  },
+                  "2": {
+                    "summary": "成功示例",
+                    "value": {
+                      "ok": false,
+                      "code": 0,
+                      "msg": "",
+                      "data": {}
+                    }
+                  },
+                  "3": {
+                    "summary": "成功示例",
+                    "value": {
+                      "ok": false,
+                      "code": 0,
+                      "msg": "",
+                      "data": {}
+                    }
+                  }
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearer": []
+          }
+        ]
+      }
+    }
+  },
+  "components": {
+    "schemas": {
+      "MerchantWithdrawPageVO": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "merchantId": {
+            "type": "integer",
+            "description": "代理商ID",
+            "format": "int64"
+          },
+          "merchantName": {
+            "type": "string",
+            "description": "代理商明显"
+          },
+          "amount": {
+            "type": "number",
+            "description": "提现金额"
+          },
+          "type": {
+            "type": "integer",
+            "description": "提现类型:1 银行卡 2 U"
+          },
+          "bankName": {
+            "type": "string",
+            "description": "银行名称"
+          },
+          "bankAccount": {
+            "type": "string",
+            "description": "银行卡账号"
+          },
+          "realName": {
+            "type": "string",
+            "description": "姓名"
+          },
+          "applyTime": {
+            "type": "string",
+            "description": "审核时间"
+          },
+          "auditStatus": {
+            "type": "integer",
+            "description": "0待审核 1通过 2拒绝"
+          },
+          "transferStatus": {
+            "type": "integer",
+            "description": "0待打款 1成功 2失败"
+          },
+          "failReason": {
+            "type": "string",
+            "description": "拒绝原因"
+          },
+          "createdTime": {
+            "type": "string",
+            "description": "添加时间"
+          },
+          "updatedTime": {
+            "type": "string",
+            "description": "更新时间"
+          }
+        }
+      },
+      "": {
+        "type": "object",
+        "properties": {}
+      },
+      "PageMerchantWithdrawPageVO": {
+        "type": "object",
+        "properties": {
+          "records": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/MerchantWithdrawPageVO",
+              "description": "com.mw.bridging.admin.api.vo.merchant.MerchantWithdrawPageVO"
+            },
+            "description": ""
+          },
+          "total": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "size": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "current": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "orders": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/OrderItem",
+              "description": "com.baomidou.mybatisplus.core.metadata.OrderItem"
+            },
+            "description": ""
+          },
+          "optimizeCountSql": {
+            "type": "boolean",
+            "description": ""
+          },
+          "searchCount": {
+            "type": "boolean",
+            "description": ""
+          },
+          "optimizeJoinOfCountSql": {
+            "type": "boolean",
+            "description": ""
+          },
+          "maxLimit": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "countId": {
+            "type": "string",
+            "description": ""
+          }
+        }
+      },
+      "RPageMerchantWithdrawPageVO": {
+        "type": "object",
+        "properties": {
+          "code": {
+            "type": "integer",
+            "description": "返回标记:成功标记=0,失败标记=1"
+          },
+          "msg": {
+            "type": "string",
+            "description": "返回信息"
+          },
+          "data": {
+            "$ref": "#/components/schemas/PageMerchantWithdrawPageVO",
+            "description": "数据"
+          }
+        }
+      },
+      "R": {
+        "type": "object",
+        "properties": {
+          "ok": {
+            "type": "boolean"
+          },
+          "code": {
+            "type": "integer",
+            "description": "返回标记:成功标记=0,失败标记=1"
+          },
+          "msg": {
+            "type": "string",
+            "description": "返回信息"
+          },
+          "data": {
+            "type": "object",
+            "properties": {},
+            "description": "数据"
+          }
+        }
+      },
+      "AgentWithdrawDTO": {
+        "type": "object",
+        "properties": {
+          "records": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/1"
+            },
+            "description": ""
+          },
+          "total": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "size": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "current": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "orders": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/OrderItem",
+              "description": "com.baomidou.mybatisplus.core.metadata.OrderItem"
+            },
+            "description": ""
+          },
+          "optimizeCountSql": {
+            "type": "boolean",
+            "description": ""
+          },
+          "searchCount": {
+            "type": "boolean",
+            "description": ""
+          },
+          "optimizeJoinOfCountSql": {
+            "type": "boolean",
+            "description": ""
+          },
+          "maxLimit": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "countId": {
+            "type": "string",
+            "description": ""
+          },
+          "auditStatus": {
+            "type": "integer",
+            "description": "0待审核 1通过 2拒绝"
+          },
+          "transferStatus": {
+            "type": "integer",
+            "description": "0待打款 1成功 2失败"
+          },
+          "bankAccount": {
+            "type": "string",
+            "description": "银行卡账号"
+          },
+          "realName": {
+            "type": "string",
+            "description": "姓名"
+          },
+          "startTime": {
+            "type": "string",
+            "description": "开始时间"
+          },
+          "endTime": {
+            "type": "string",
+            "description": "结束时间"
+          }
+        }
+      },
+      "OrderItem": {
+        "type": "object",
+        "properties": {
+          "column": {
+            "type": "string",
+            "description": ""
+          },
+          "asc": {
+            "type": "boolean",
+            "description": ""
+          }
+        }
+      },
+      "AddAgentWithdrawDTO": {
+        "type": "object",
+        "properties": {
+          "amount": {
+            "type": "number",
+            "description": "提现金额"
+          },
+          "type": {
+            "type": "integer",
+            "description": "提现类型:1 银行卡 2 U"
+          },
+          "bankName": {
+            "type": "string",
+            "description": "银行名称"
+          },
+          "bankAccount": {
+            "type": "string",
+            "description": "银行卡账号"
+          },
+          "realName": {
+            "type": "string",
+            "description": "姓名"
+          }
+        }
+      }
+    },
+    "responses": {},
+    "securitySchemes": {
+      "bearer": {
+        "type": "http",
+        "scheme": "bearer"
+      }
+    }
+  },
+  "servers": [],
+  "security": []
+}

+ 103 - 0
doc/yue.json

@@ -0,0 +1,103 @@
+{
+	"openapi": "3.0.1",
+	"info": {
+		"title": "默认模块",
+		"description": "",
+		"version": "1.0.0"
+	},
+	"tags": [],
+	"paths": {
+		"/merchant/getBalance": {
+			"get": {
+				"summary": "商户余额",
+				"deprecated": false,
+				"description": "",
+				"tags": [],
+				"parameters": [],
+				"responses": {
+					"200": {
+						"description": "",
+						"content": {
+							"application/json": {
+								"schema": {
+									"$ref": "#/components/schemas/RMerchantBalanceVO"
+								},
+								"example": {
+									"code": 0,
+									"msg": "",
+									"data": {
+										"totalAmount": 0,
+										"totalUseAmount": 0,
+										"freezeAmount": 0,
+										"withdrawnAmount": 0,
+										"withdrawnTotalAmount": 0
+									}
+								}
+							}
+						}
+					}
+				},
+				"security": [
+					{
+						"bearer": []
+					}
+				]
+			}
+		}
+	},
+	"components": {
+		"schemas": {
+			"MerchantBalanceVO": {
+				"type": "object",
+				"properties": {
+					"totalAmount": {
+						"type": "number",
+						"description": "总交易金额"
+					},
+					"totalUseAmount": {
+						"type": "number",
+						"description": "总到账金额"
+					},
+					"freezeAmount": {
+						"type": "number",
+						"description": "总冻结金额"
+					},
+					"withdrawnAmount": {
+						"type": "number",
+						"description": "总提现金额"
+					},
+					"withdrawnTotalAmount": {
+						"type": "number",
+						"description": "总提现扣款金额"
+					}
+				}
+			},
+			"RMerchantBalanceVO": {
+				"type": "object",
+				"properties": {
+					"code": {
+						"type": "integer",
+						"description": "返回标记:成功标记=0,失败标记=1"
+					},
+					"msg": {
+						"type": "string",
+						"description": "返回信息"
+					},
+					"data": {
+						"$ref": "#/components/schemas/MerchantBalanceVO",
+						"description": "数据"
+					}
+				}
+			}
+		},
+		"responses": {},
+		"securitySchemes": {
+			"bearer": {
+				"type": "http",
+				"scheme": "bearer"
+			}
+		}
+	},
+	"servers": [],
+	"security": []
+}

+ 404 - 0
doc/zjmx.json

@@ -0,0 +1,404 @@
+{
+  "openapi": "3.0.1",
+  "info": {
+    "title": "默认模块",
+    "description": "",
+    "version": "1.0.0"
+  },
+  "tags": [],
+  "paths": {
+    "/fundFlow/flowsPage": {
+      "get": {
+        "summary": "查看流水",
+        "deprecated": false,
+        "description": "",
+        "tags": [],
+        "parameters": [
+          {
+            "name": "records[0].key",
+            "in": "query",
+            "description": "",
+            "required": false,
+            "schema": {
+              "type": ""
+            }
+          },
+          {
+            "name": "total",
+            "in": "query",
+            "description": "",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "size",
+            "in": "query",
+            "description": "",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "current",
+            "in": "query",
+            "description": "",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "orders[0].column",
+            "in": "query",
+            "description": "",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "orders[0].asc",
+            "in": "query",
+            "description": "",
+            "required": false,
+            "schema": {
+              "type": "boolean"
+            }
+          },
+          {
+            "name": "optimizeCountSql",
+            "in": "query",
+            "description": "",
+            "required": false,
+            "schema": {
+              "type": "boolean"
+            }
+          },
+          {
+            "name": "searchCount",
+            "in": "query",
+            "description": "",
+            "required": false,
+            "schema": {
+              "type": "boolean"
+            }
+          },
+          {
+            "name": "optimizeJoinOfCountSql",
+            "in": "query",
+            "description": "",
+            "required": false,
+            "schema": {
+              "type": "boolean"
+            }
+          },
+          {
+            "name": "maxLimit",
+            "in": "query",
+            "description": "",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "countId",
+            "in": "query",
+            "description": "",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "payStartTime",
+            "in": "query",
+            "description": "支付开始时间",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "payEndTime",
+            "in": "query",
+            "description": "支付结束时间",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "orderCreateStartTime",
+            "in": "query",
+            "description": "订单创建开始时间",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "orderCreateEndTime",
+            "in": "query",
+            "description": "订单创建结束时间",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "query",
+            "in": "query",
+            "description": "查询条件",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "orderFlowType",
+            "in": "query",
+            "description": "订单流水类型\nPAY :支付订单\nWITHDRAW :提交提现",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "enum": [
+                "PAY",
+                "WITHDRAW"
+              ]
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/RPageFlowPageVO"
+                },
+                "example": {
+                  "code": 0,
+                  "msg": "",
+                  "data": {
+                    "records": [
+                      {
+                        "orderId": 0,
+                        "orderType": "",
+                        "orderNo": "",
+                        "orderCreateTime": "",
+                        "payTime": "",
+                        "originalOrderAmount": 0,
+                        "orderAmount": 0,
+                        "operationAmount": 0,
+                        "beforeAmount": 0,
+                        "afterAmount": 0,
+                        "amountType": "",
+                        "walletType": ""
+                      }
+                    ],
+                    "total": 0,
+                    "size": 0,
+                    "current": 0,
+                    "orders": [
+                      {
+                        "column": "",
+                        "asc": false
+                      }
+                    ],
+                    "optimizeCountSql": false,
+                    "searchCount": false,
+                    "optimizeJoinOfCountSql": false,
+                    "maxLimit": 0,
+                    "countId": ""
+                  }
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearer": []
+          }
+        ]
+      }
+    }
+  },
+  "components": {
+    "schemas": {
+      "FlowPageVO": {
+        "type": "object",
+        "properties": {
+          "orderId": {
+            "type": "integer",
+            "description": "订单id",
+            "format": "int64"
+          },
+          "orderType": {
+            "type": "string",
+            "description": "订单类型",
+            "enum": [
+              "PAY",
+              "WITHDRAW"
+            ]
+          },
+          "orderNo": {
+            "type": "string",
+            "description": "商户原始订单号"
+          },
+          "orderCreateTime": {
+            "type": "string",
+            "description": "订单创建时间"
+          },
+          "payTime": {
+            "type": "string",
+            "description": "支付时间"
+          },
+          "originalOrderAmount": {
+            "type": "number",
+            "description": "订单原始金额"
+          },
+          "orderAmount": {
+            "type": "number",
+            "description": "订单实际金额"
+          },
+          "operationAmount": {
+            "type": "number",
+            "description": "变更金额"
+          },
+          "beforeAmount": {
+            "type": "number",
+            "description": "变更前金额"
+          },
+          "afterAmount": {
+            "type": "number",
+            "description": "变更后金额"
+          },
+          "amountType": {
+            "type": "string",
+            "description": "变更类型",
+            "enum": [
+              "SUB",
+              "ADD"
+            ]
+          },
+          "walletType": {
+            "type": "string",
+            "description": "操作钱包类型",
+            "enum": [
+              "TOTAL",
+              "USE",
+              "FREEZE",
+              "WITHDRAW",
+              "WITHDRAW_TOTAL"
+            ]
+          }
+        }
+      },
+      "PageFlowPageVO": {
+        "type": "object",
+        "properties": {
+          "records": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/FlowPageVO",
+              "description": ""
+            },
+            "description": ""
+          },
+          "total": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "size": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "current": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "orders": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/OrderItem",
+              "description": "com.baomidou.mybatisplus.core.metadata.OrderItem"
+            },
+            "description": ""
+          },
+          "optimizeCountSql": {
+            "type": "boolean",
+            "description": ""
+          },
+          "searchCount": {
+            "type": "boolean",
+            "description": ""
+          },
+          "optimizeJoinOfCountSql": {
+            "type": "boolean",
+            "description": ""
+          },
+          "maxLimit": {
+            "type": "integer",
+            "description": "",
+            "format": "int64"
+          },
+          "countId": {
+            "type": "string",
+            "description": ""
+          }
+        }
+      },
+      "RPageFlowPageVO": {
+        "type": "object",
+        "properties": {
+          "code": {
+            "type": "integer",
+            "description": "返回标记:成功标记=0,失败标记=1"
+          },
+          "msg": {
+            "type": "string",
+            "description": "返回信息"
+          },
+          "data": {
+            "$ref": "#/components/schemas/PageFlowPageVO",
+            "description": "数据"
+          }
+        }
+      },
+      "OrderItem": {
+        "type": "object",
+        "properties": {
+          "column": {
+            "type": "string",
+            "description": ""
+          },
+          "asc": {
+            "type": "boolean",
+            "description": ""
+          }
+        }
+      }
+    },
+    "responses": {},
+    "securitySchemes": {
+      "bearer": {
+        "type": "http",
+        "scheme": "bearer"
+      }
+    }
+  },
+  "servers": [],
+  "security": []
+}

+ 42 - 0
src/api/order/index.ts

@@ -0,0 +1,42 @@
+import request from '/@/utils/request';
+
+// ==================== 代收订单相关 API ====================
+
+export function fetchPayOrderList(query?: Object) {
+	return request({
+		url: 'open/admin/payOrder/page',
+		method: 'post',
+		data: query,
+	});
+}
+
+export function fetchPayOrderStatistics(query?: Object) {
+	return request({
+		url: 'open/admin/payOrder/statistics',
+		method: 'post',
+		data: query,
+	});
+}
+
+// ==================== 代付订单相关 API ====================
+
+export function fetchWithdrawOrderList(query?: Object) {
+	return request({
+		url: 'open/admin/withdrawOrder/page',
+		method: 'post',
+		data: query,
+	});
+}
+
+// ==================== 回调日志相关 API ====================
+
+export function fetchPayNotifyLog(appId: string, orderId: string) {
+	return request({
+		url: 'open/admin/payNotify/page',
+		method: 'get',
+		params: {
+			appId,
+			orderId,
+		},
+	});
+}

+ 11 - 0
src/api/payment/channel.ts

@@ -0,0 +1,11 @@
+import request from '/@/utils/request';
+
+/**
+ * 查看开通的费率
+ */
+export function getMerchantRate() {
+	return request({
+		url: 'admin/merchant/getRate',
+		method: 'get',
+	});
+}

+ 44 - 0
src/api/settlement/index.ts

@@ -0,0 +1,44 @@
+import request from '/@/utils/request';
+
+/**
+ * 申请提现
+ */
+export function applyWithdraw(data: any) {
+	return request({
+		url: 'admin/merchantWithdraw/apply',
+		method: 'post',
+		data,
+	});
+}
+
+/**
+ * 分页查询提现记录
+ */
+export function fetchWithdrawList(query?: Object) {
+	return request({
+		url: 'admin/merchantWithdraw/page',
+		method: 'post',
+		data: query,
+	});
+}
+
+/**
+ * 获取商户余额
+ */
+export function getMerchantBalance() {
+	return request({
+		url: 'admin/merchant/getBalance',
+		method: 'get',
+	});
+}
+
+/**
+ * 查看资金流水
+ */
+export function fetchFundFlowList(query?: Object) {
+	return request({
+		url: 'admin/fundFlow/flowsPage',
+		method: 'get',
+		params: query,
+	});
+}

+ 189 - 3
src/config/menuConfig.ts

@@ -8,10 +8,196 @@ export function getStaticMenuData() {
 		code: 0,
 		msg: null,
 		data: [
+			{
+				id: '1000',
+				parentId: '-1',
+				weight: 1,
+				name: '订单管理',
+				path: '/order',
+				componentPath: null,
+				meta: {
+					isLink: '',
+					isIframe: false,
+					isKeepAlive: false,
+					icon: 'iconfont icon-document-record',
+					isAffix: false,
+					title: '订单管理',
+					isHide: false,
+				},
+				sortOrder: 1,
+				menuType: '0',
+				permission: null,
+				children: [
+					{
+						id: '1001',
+						parentId: '1000',
+						weight: 0,
+						name: '代收订单',
+						path: '/order/payOrder/index',
+						componentPath: null,
+						meta: {
+							isLink: '',
+							isIframe: false,
+							isKeepAlive: true,
+							icon: 'iconfont icon-document-record',
+							isAffix: false,
+							title: '代收订单',
+							isHide: false,
+						},
+						sortOrder: 1,
+						menuType: '0',
+						permission: null,
+					},
+					{
+						id: '1002',
+						parentId: '1000',
+						weight: 0,
+						name: '代付订单',
+						path: '/order/withdrawOrder/index',
+						componentPath: null,
+						meta: {
+							isLink: '',
+							isIframe: false,
+							isKeepAlive: true,
+							icon: 'iconfont icon-document-record',
+							isAffix: false,
+							title: '代付订单',
+							isHide: false,
+						},
+						sortOrder: 2,
+						menuType: '0',
+						permission: null,
+					},
+				],
+			},
+			{
+				id: '2000',
+				parentId: '-1',
+				weight: 1,
+				name: '支付配置',
+				path: '/payment',
+				componentPath: null,
+				meta: {
+					isLink: '',
+					isIframe: false,
+					isKeepAlive: false,
+					icon: 'iconfont icon-shujuyuanguanli',
+					isAffix: false,
+					title: '支付配置',
+					isHide: false,
+				},
+				sortOrder: 2,
+				menuType: '0',
+				permission: null,
+				children: [
+					{
+						id: '2001',
+						parentId: '2000',
+						weight: 0,
+						name: '支付通道',
+						path: '/payment/channel/index',
+						componentPath: null,
+						meta: {
+							isLink: '',
+							isIframe: false,
+							isKeepAlive: true,
+							icon: 'iconfont icon-shujuyuanguanli',
+							isAffix: false,
+							title: '支付通道',
+							isHide: false,
+						},
+						sortOrder: 1,
+						menuType: '0',
+						permission: null,
+					},
+				],
+			},
 			{
 				id: '3000',
 				parentId: '-1',
 				weight: 1,
+				name: '结算管理',
+				path: '/settlement',
+				componentPath: null,
+				meta: {
+					isLink: '',
+					isIframe: false,
+					isKeepAlive: false,
+					icon: 'iconfont icon-lingpai',
+					isAffix: false,
+					title: '结算管理',
+					isHide: false,
+				},
+				sortOrder: 3,
+				menuType: '0',
+				permission: null,
+				children: [
+					{
+						id: '3001',
+						parentId: '3000',
+						weight: 0,
+						name: '申请结算',
+						path: '/settlement/apply/index',
+						componentPath: null,
+						meta: {
+							isLink: '',
+							isIframe: false,
+							isKeepAlive: false,
+							icon: 'iconfont icon-lingpai',
+							isAffix: false,
+							title: '申请结算',
+							isHide: false,
+						},
+						sortOrder: 1,
+						menuType: '0',
+						permission: null,
+					},
+					{
+						id: '3002',
+						parentId: '3000',
+						weight: 0,
+						name: '结算记录',
+						path: '/settlement/record/index',
+						componentPath: null,
+						meta: {
+							isLink: '',
+							isIframe: false,
+							isKeepAlive: false,
+							icon: 'iconfont icon-lingpai',
+							isAffix: false,
+							title: '结算记录',
+							isHide: false,
+						},
+						sortOrder: 2,
+						menuType: '0',
+						permission: null,
+					},
+					{
+						id: '3003',
+						parentId: '3000',
+						weight: 0,
+						name: '资金明细',
+						path: '/settlement/fundFlow/index',
+						componentPath: null,
+						meta: {
+							isLink: '',
+							isIframe: false,
+							isKeepAlive: false,
+							icon: 'iconfont icon-lingpai',
+							isAffix: false,
+							title: '资金明细',
+							isHide: false,
+						},
+						sortOrder: 3,
+						menuType: '0',
+						permission: null,
+					},
+				],
+			},
+			{
+				id: '4000',
+				parentId: '-1',
+				weight: 1,
 				name: '系统设置',
 				path: '/settings',
 				componentPath: null,
@@ -24,13 +210,13 @@ export function getStaticMenuData() {
 					title: '系统设置',
 					isHide: false,
 				},
-				sortOrder: 1,
+				sortOrder: 4,
 				menuType: '0',
 				permission: null,
 				children: [
 					{
-						id: '3001',
-						parentId: '3000',
+						id: '4001',
+						parentId: '4000',
 						weight: 0,
 						name: '安全中心',
 						path: '/settings/security/index',

+ 6 - 4
src/stores/userInfo.ts

@@ -18,6 +18,7 @@ export const useUserInfo = defineStore('userInfo', {
 			authBtnList: [],
 			tenantId: '',
 			tenantName: '',
+			appId: '', // 商户号
 		},
 	}),
 
@@ -128,10 +129,11 @@ export const useUserInfo = defineStore('userInfo', {
 				const userInfo: any = {
 					user: res.data,
 					time: new Date().getTime(),
-					roles: res.data.roleList,
-					authBtnList: res.data.permissions,
-					tenantId: res.data.tenantId,
-					tenantName: res.data.tenantName || ''
+					roles: res.data.roleList || [],
+					authBtnList: res.data.permissions || [],
+					tenantId: res.data.tenantId || '',
+					tenantName: res.data.tenantName || '',
+					appId: res.data.appId || '' // 商户号
 				};
 				this.userInfos = userInfo;
 

+ 1 - 0
src/types/pinia.d.ts

@@ -12,6 +12,7 @@ declare interface UserInfosState<T = any> {
 		userName: string;
 		tenantId: string;
 		tenantName: string;
+		appId: string; // 商户号
 		[key: string]: T;
 	};
 }

+ 80 - 107
src/views/admin/system/user/personal.vue

@@ -2,79 +2,76 @@
 	<el-drawer v-model="visible" :title="$t('personal.name')" size="40%">
 		<el-tabs style="height: 200px" class="demo-tabs">
 			<el-tab-pane label="基本信息" v-loading="loading">
-        <template #label>
-          <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
-            <path stroke-linecap="round" stroke-linejoin="round" d="M17.982 18.725A7.488 7.488 0 0 0 12 15.75a7.488 7.488 0 0 0-5.982 2.975m11.963 0a9 9 0 1 0-11.963 0m11.963 0A8.966 8.966 0 0 1 12 21a8.966 8.966 0 0 1-5.982-2.275M15 9.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" />
-          </svg>
-          基本信息
-        </template>
+				<template #label>
+					<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
+						<path
+							stroke-linecap="round"
+							stroke-linejoin="round"
+							d="M17.982 18.725A7.488 7.488 0 0 0 12 15.75a7.488 7.488 0 0 0-5.982 2.975m11.963 0a9 9 0 1 0-11.963 0m11.963 0A8.966 8.966 0 0 1 12 21a8.966 8.966 0 0 1-5.982-2.275M15 9.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z"
+						/>
+					</svg>
+					基本信息
+				</template>
 				<el-form :model="formData" :rules="ruleForm" label-width="100px" class="mt30" ref="formdataRef">
 					<el-row :gutter="20">
-						<el-col :span="24" class="mb20">
-							<el-form-item prop="avatar">
-								<ImageUpload v-model:imageUrl="formData.avatar" borderRadius="50%">
-									<template #empty>
-										<el-icon><Avatar /></el-icon>
-										<span>请上传头像</span>
-									</template>
-								</ImageUpload>
-							</el-form-item>
-						</el-col>
-						<el-col :span="24" class="mb20">
-							<el-form-item label="用户名" prop="username">
-								<el-input v-model="formData.username" clearable disabled></el-input>
+						<el-col :span="24" class="mb20" v-if="formData?.appId">
+							<el-form-item label="商户号">
+								<el-input v-model="formData.appId" readonly></el-input>
 							</el-form-item>
 						</el-col>
-						<el-col :span="24" class="mb20">
-							<el-form-item label="手机" prop="phone">
-								<el-input v-model="formData.phone" placeholder="请输入手机" clearable></el-input>
+						<el-col :span="24" class="mb20" v-if="formData?.nickname">
+							<el-form-item label="昵称" prop="nickname">
+								<el-input v-model="formData.nickname" placeholder="请输入昵称" clearable readonly></el-input>
 							</el-form-item>
 						</el-col>
-
-						<el-col :span="24" class="mb20">
-							<el-form-item label="邮箱" prop="email">
-								<el-input v-model="formData.email" placeholder="请输入邮箱" clearable></el-input>
+						<el-col :span="24" class="mb20" v-if="formData?.name">
+							<el-form-item label="姓名" prop="name">
+								<el-input v-model="formData.name" placeholder="请输入姓名" clearable readonly></el-input>
 							</el-form-item>
 						</el-col>
-						<el-col :span="24" class="mb20">
-							<el-form-item label="昵称" prop="nickname">
-								<el-input v-model="formData.nickname" placeholder="请输入昵称" clearable></el-input>
+						<el-col :span="24" class="mb20" v-if="formData?.phone">
+							<el-form-item label="手机" prop="phone">
+								<el-input v-model="formData.phone" placeholder="请输入手机" clearable readonly></el-input>
 							</el-form-item>
 						</el-col>
-						<el-col :span="24" class="mb20">
-							<el-form-item label="姓名" prop="name">
-								<el-input v-model="formData.name" placeholder="请输入姓名" clearable></el-input>
+						<el-col :span="24" class="mb20" v-if="formData?.email">
+							<el-form-item label="邮箱" prop="email">
+								<el-input v-model="formData.email" placeholder="请输入邮箱" clearable readonly></el-input>
 							</el-form-item>
 						</el-col>
-						<el-col :span="24" class="mb20">
+						<!-- <el-col :span="24" class="mb20">
 							<el-form-item>
 								<el-button type="primary" @click="handleSaveUser"> 更新个人信息 </el-button>
 							</el-form-item>
-						</el-col>
+						</el-col> -->
 					</el-row>
 				</el-form>
 			</el-tab-pane>
 			<el-tab-pane label="安全信息">
-        <template #label>
-          <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
-            <path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75 11.25 15 15 9.75m-3-7.036A11.959 11.959 0 0 1 3.598 6 11.99 11.99 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285Z" />
-          </svg>
-          安全信息
-        </template>
+				<template #label>
+					<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
+						<path
+							stroke-linecap="round"
+							stroke-linejoin="round"
+							d="M9 12.75 11.25 15 15 9.75m-3-7.036A11.959 11.959 0 0 1 3.598 6 11.99 11.99 0 0 0 3 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285Z"
+						/>
+					</svg>
+					安全信息
+				</template>
 				<el-form :model="passwordFormData" :rules="passwordRuleForm" label-width="100px" class="mt30" ref="passwordFormdataRef">
 					<el-row :gutter="20">
 						<el-col :span="24" class="mb20">
 							<el-form-item label="原密码" prop="password">
-								<el-input v-model="passwordFormData.password"  :type="showPassword ? 'text' : 'password'" placeholder="请输入密码" clearable type="password">
-                  <template #suffix>
-                    <i
-                        class="iconfont el-input__icon login-content-password"
-                        :class="showPassword ? 'icon-yincangmima' : 'icon-xianshimima'"
-                        @click="showPassword = !showPassword"
-                    >
-                    </i>
-                  </template>
-                </el-input>
+								<el-input v-model="passwordFormData.password" :type="showPassword ? 'text' : 'password'" placeholder="请输入密码" clearable>
+									<template #suffix>
+										<i
+											class="iconfont el-input__icon login-content-password"
+											:class="showPassword ? 'icon-yincangmima' : 'icon-xianshimima'"
+											@click="showPassword = !showPassword"
+										>
+										</i>
+									</template>
+								</el-input>
 							</el-form-item>
 						</el-col>
 						<el-col :span="24" class="mb20">
@@ -102,49 +99,23 @@
 					</el-row>
 				</el-form>
 			</el-tab-pane>
-			<el-tab-pane label="第三方账号">
-        <template #label>
-          <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-4">
-            <path stroke-linecap="round" stroke-linejoin="round" d="M7.864 4.243A7.5 7.5 0 0 1 19.5 10.5c0 2.92-.556 5.709-1.568 8.268M5.742 6.364A7.465 7.465 0 0 0 4.5 10.5a7.464 7.464 0 0 1-1.15 3.993m1.989 3.559A11.209 11.209 0 0 0 8.25 10.5a3.75 3.75 0 1 1 7.5 0c0 .527-.021 1.049-.064 1.565M12 10.5a14.94 14.94 0 0 1-3.6 9.75m6.633-4.596a18.666 18.666 0 0 1-2.485 5.33" />
-          </svg>
-
-          社交登录
-        </template>
-				<el-table :data="socialList" class="mt10">
-					<el-table-column type="index" label="序号" width="80"></el-table-column>
-					<el-table-column prop="name" label="平台"></el-table-column>
-					<el-table-column label="状态">
-						<template #default="scope">
-							<el-tag v-if="scope.row.openId"> 已绑定 </el-tag>
-							<el-tag v-else> 未绑定 </el-tag>
-						</template>
-					</el-table-column>
-					<el-table-column prop="action" label="操作">
-						<template #default="scope">
-							<el-button @click="unbinding(scope.row.type)" text type="primary" v-if="scope.row.openId"> 解绑 </el-button>
-							<el-button @click="handleClick(scope.row.type)" text type="primary" v-else> 绑定 </el-button>
-						</template>
-					</el-table-column>
-				</el-table>
-			</el-tab-pane>
 		</el-tabs>
 	</el-drawer>
 </template>
 
 <script setup lang="ts" name="personal">
-import {useUserInfo} from '/@/stores/userInfo';
-import {editInfo, getObj, password, unbindingUser} from '/@/api/admin/user';
-import {useMessage} from '/@/hooks/message';
-import {rule, validateNull} from '/@/utils/validate';
+import { useUserInfo } from '/@/stores/userInfo';
+import { editInfo, password, unbindingUser } from '/@/api/admin/user';
+import { useMessage } from '/@/hooks/message';
+import { rule, validateNull } from '/@/utils/validate';
 import other from '/@/utils/other';
-import {Session} from '/@/utils/storage';
-import {useI18n} from 'vue-i18n';
-import {getLoginAppList} from "/@/api/admin/social";
+import { Session } from '/@/utils/storage';
+import { useI18n } from 'vue-i18n';
+import { getLoginAppList } from '/@/api/admin/social';
 import { SocialLoginEnum } from '/@/api/login';
 
 const { t } = useI18n();
 
-const ImageUpload = defineAsyncComponent(() => import('/@/components/Upload/Image.vue'));
 const StrengthMeter = defineAsyncComponent(() => import('/@/components/StrengthMeter/index.vue'));
 
 const visible = ref(false);
@@ -153,13 +124,14 @@ const visible = ref(false);
 const formData = ref({
 	userId: '',
 	username: '',
+	appId: '',
 	name: '',
 	email: '',
 	avatar: '',
 	nickname: '',
 	wxDingUserid: '',
 	wxCpUserid: '',
-	phone: ('' as string) || undefined,
+	phone: '',
 });
 
 const showPassword = ref(false);
@@ -173,13 +145,10 @@ const formdataRef = ref();
 const passwordFormdataRef = ref();
 
 const ruleForm = reactive({
-	phone: [
-		{ required: true, message: '手机号不能为空', trigger: 'blur' },
-		{ validator: rule.validatePhone, trigger: 'blur' },
-	],
-	nickname: [{ validator: rule.overLength, trigger: 'blur' },{ required: true, message: '昵称不能为空', trigger: 'blur' }],
-	email: [{ validator: rule.overLength, trigger: 'blur' },{ required: true, message: '邮箱不能为空', trigger: 'blur' }],
-	name: [{ validator: rule.overLength, trigger: 'blur' },{ required: true, message: '姓名不能为空', trigger: 'blur' }],
+	phone: [{ validator: rule.validatePhone, trigger: 'blur' }],
+	nickname: [{ validator: rule.overLength, trigger: 'blur' }],
+	email: [{ validator: rule.overLength, trigger: 'blur' }],
+	name: [{ validator: rule.overLength, trigger: 'blur' }],
 });
 const validatorPassword2 = (rule: any, value: any, callback: any) => {
 	if (value !== passwordFormData.newpassword1) {
@@ -252,7 +221,7 @@ const handleSaveUser = () => {
 		}
 
 		if (formData.value.phone && formData.value.phone.includes('*')) {
-			formData.value.phone = undefined;
+			formData.value.phone = '';
 		}
 
 		editInfo(formData.value)
@@ -318,31 +287,35 @@ const unbinding = (type: SocialLoginEnum) => {
 			useMessage().error(err.msg);
 		})
 		.finally(() => {
-			initUserInfo(formData.value.userId);
+			// 重新获取用户信息
+			useUserInfo()
+				.setUserInfos()
+				.then(() => {
+					const data = useUserInfo().userInfos;
+					initUserInfo(data.user);
+				});
 		});
 };
 
 const open = () => {
 	visible.value = true;
 	const data = useUserInfo().userInfos;
-	initUserInfo(data.user.userId);
-	// Object.assign(formData, data.user);
+	initUserInfo(data.user);
 };
 
 const loading = ref(false);
-const initUserInfo = (userId: any) => {
+const initUserInfo = (userData: any) => {
 	loading.value = true;
-	getObj(userId)
-		.then((res) => {
-			formData.value = res.data;
-			initSocialList();
-		})
-		.catch((err) => {
-			useMessage().error(err.msg);
-		})
-		.finally(() => {
-			loading.value = false;
-		});
+	// 过滤掉 null 和 undefined 值
+	const filteredData: any = {};
+	Object.keys(userData).forEach((key) => {
+		if (userData[key] !== null && userData[key] !== undefined) {
+			filteredData[key] = userData[key];
+		}
+	});
+	formData.value = filteredData;
+	initSocialList();
+	loading.value = false;
 };
 
 // 暴露变量

+ 110 - 0
src/views/order/payOrder/detail.vue

@@ -0,0 +1,110 @@
+<template>
+	<el-dialog :close-on-click-modal="false" title="代收订单详情" draggable v-model="visible" width="900px">
+		<el-descriptions :column="2" border v-loading="loading">
+			<el-descriptions-item label="订单ID">{{ orderData.id }}</el-descriptions-item>
+			<el-descriptions-item label="AppId">{{ orderData.appId }}</el-descriptions-item>
+			<el-descriptions-item label="商户订单号" :span="2">{{ orderData.mchOrderNo }}</el-descriptions-item>
+			<el-descriptions-item label="平台订单号" :span="2">{{ orderData.transactionId || '-' }}</el-descriptions-item>
+			<el-descriptions-item label="订单状态">
+				<el-tag v-if="orderData.orderStatus === 'CREATE_ORDER'" type="info">创建订单</el-tag>
+				<el-tag v-else-if="orderData.orderStatus === 'PAY_SUCCESS'" type="success">支付成功</el-tag>
+				<el-tag v-else-if="orderData.orderStatus === 'PAY_FAIL'" type="danger">支付失败</el-tag>
+				<el-tag v-else-if="orderData.orderStatus === 'CANCEL_ORDER'" type="warning">取消订单</el-tag>
+				<el-tag v-else-if="orderData.orderStatus === 'PAY_TIMEOUT'" type="info">支付超时</el-tag>
+				<el-tag v-else>{{ orderData.orderStatus }}</el-tag>
+			</el-descriptions-item>
+			<el-descriptions-item label="币种">{{ orderData.currency }}</el-descriptions-item>
+
+			<el-descriptions-item label="订单金额">
+				<span style="color: #f56c6c; font-weight: bold; font-size: 16px">¥{{ orderData.amount ? orderData.amount.toFixed(2) : '0.00' }}</span>
+			</el-descriptions-item>
+			<el-descriptions-item label="实付金额">
+				<span v-if="orderData.noticeAmount" style="color: #67c23a; font-weight: bold; font-size: 16px"
+					>¥{{ orderData.noticeAmount.toFixed(2) }}</span
+				>
+				<span v-else>-</span>
+			</el-descriptions-item>
+
+			<el-descriptions-item label="支付通道ID">{{ orderData.paymentChannelId }}</el-descriptions-item>
+			<el-descriptions-item label="支付通道名称">{{ orderData.paymentChannelName || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="商户ID">{{ orderData.merchantUserId }}</el-descriptions-item>
+			<el-descriptions-item label="代理商ID">{{ orderData.agentUserId }}</el-descriptions-item>
+
+			<el-descriptions-item label="商户手续费类型">
+				<el-tag v-if="orderData.mFeeType === 'PERCENTAGE'" type="info">百分比</el-tag>
+				<el-tag v-else-if="orderData.mFeeType === 'FIXED'" type="warning">固定</el-tag>
+				<el-tag v-else-if="orderData.mFeeType === 'MIXED'" type="success">百分比+固定</el-tag>
+				<span v-else>-</span>
+			</el-descriptions-item>
+			<el-descriptions-item label="商户手续费">
+				{{ orderData.mFee ? `¥${orderData.mFee.toFixed(2)}` : '-' }}
+			</el-descriptions-item>
+
+			<el-descriptions-item label="商户手续费比例">
+				{{ orderData.mFeeRate ? `${orderData.mFeeRate}%` : '-' }}
+			</el-descriptions-item>
+			<el-descriptions-item label="商户手续费固定金额">
+				{{ orderData.mFeeEvery ? `¥${orderData.mFeeEvery.toFixed(2)}` : '-' }}
+			</el-descriptions-item>
+
+			<el-descriptions-item label="代理商手续费类型">
+				<el-tag v-if="orderData.aFeeType === 'PERCENTAGE'" type="info">百分比</el-tag>
+				<el-tag v-else-if="orderData.aFeeType === 'FIXED'" type="warning">固定</el-tag>
+				<el-tag v-else-if="orderData.aFeeType === 'MIXED'" type="success">百分比+固定</el-tag>
+				<span v-else>-</span>
+			</el-descriptions-item>
+			<el-descriptions-item label="代理商手续费">
+				{{ orderData.aFee ? `¥${orderData.aFee.toFixed(2)}` : '-' }}
+			</el-descriptions-item>
+
+			<el-descriptions-item label="代理商手续费比例">
+				{{ orderData.aFeeRate ? `${orderData.aFeeRate}%` : '-' }}
+			</el-descriptions-item>
+			<el-descriptions-item label="代理商手续费固定金额">
+				{{ orderData.aFeeEvery ? `¥${orderData.aFeeEvery.toFixed(2)}` : '-' }}
+			</el-descriptions-item>
+
+			<el-descriptions-item label="客户端IP">{{ orderData.clientIp || '-' }}</el-descriptions-item>
+			<el-descriptions-item label="设备">{{ orderData.device || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="主题" :span="2">{{ orderData.subject || '-' }}</el-descriptions-item>
+			<el-descriptions-item label="内容" :span="2">{{ orderData.body || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="前端跳转URL" :span="2">{{ orderData.returnUrl || '-' }}</el-descriptions-item>
+			<el-descriptions-item label="后台回调URL" :span="2">{{ orderData.notifyUrl || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="扩展参数" :span="2">{{ orderData.extra || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="请求时间">{{ orderData.reqTime || '-' }}</el-descriptions-item>
+			<el-descriptions-item label="支付完成时间">{{ orderData.noticeDatetime || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="创建时间">{{ orderData.createTime }}</el-descriptions-item>
+			<el-descriptions-item label="更新时间">{{ orderData.updateTime }}</el-descriptions-item>
+		</el-descriptions>
+
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="visible = false">关闭</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script lang="ts" name="PayOrderDetailDialog" setup>
+// 定义变量
+const visible = ref(false);
+const loading = ref(false);
+const orderData = reactive<any>({});
+
+// 打开弹窗
+const openDialog = (row: any) => {
+	visible.value = true;
+	Object.assign(orderData, row);
+};
+
+// 暴露方法
+defineExpose({
+	openDialog,
+});
+</script>

+ 250 - 0
src/views/order/payOrder/index.vue

@@ -0,0 +1,250 @@
+<template>
+	<div class="layout-padding">
+		<div class="layout-padding-auto layout-padding-view">
+			<el-row class="ml10" v-show="showSearch">
+				<el-form :inline="true" :model="state.queryForm" @keyup.enter="getDataList" ref="queryRef">
+					<el-form-item label="商户订单号" prop="mchOrderNo">
+						<el-input placeholder="请输入商户订单号" style="max-width: 180px" v-model="state.queryForm.mchOrderNo" clearable />
+					</el-form-item>
+					<el-form-item label="平台订单号" prop="transactionId">
+						<el-input placeholder="请输入平台订单号" style="max-width: 180px" v-model="state.queryForm.transactionId" clearable />
+					</el-form-item>
+					<el-form-item label="商户名称" prop="merchantName">
+						<el-input placeholder="请输入商户名称" style="max-width: 180px" v-model="state.queryForm.merchantName" clearable />
+					</el-form-item>
+					<el-form-item label="代理名称" prop="agentName">
+						<el-input placeholder="请输入代理名称" style="max-width: 180px" v-model="state.queryForm.agentName" clearable />
+					</el-form-item>
+					<el-form-item label="订单状态" prop="orderStatus">
+						<el-select v-model="state.queryForm.orderStatus" placeholder="请选择订单状态" style="max-width: 180px" clearable>
+							<el-option label="创建订单" value="CREATE_ORDER" />
+							<el-option label="支付成功" value="PAY_SUCCESS" />
+							<el-option label="支付失败" value="PAY_FAIL" />
+							<el-option label="取消订单" value="CANCEL_ORDER" />
+							<el-option label="支付超时" value="PAY_TIMEOUT" />
+						</el-select>
+					</el-form-item>
+					<el-form-item>
+						<el-button @click="getDataList" icon="search" type="primary">查询</el-button>
+						<el-button @click="resetQuery" icon="Refresh">重置</el-button>
+					</el-form-item>
+				</el-form>
+			</el-row>
+			<el-row>
+				<div class="mb8" style="width: 100%">
+					<right-toolbar
+						@queryTable="getDataList"
+						class="ml10"
+						style="float: right; margin-right: 20px"
+						v-model:showSearch="showSearch"
+					></right-toolbar>
+				</div>
+			</el-row>
+
+			<!-- 统计信息卡片 -->
+			<el-row :gutter="20" class="mb20" v-if="statistics">
+				<el-col :span="6">
+					<el-card shadow="hover">
+						<div class="statistic-item">
+							<div class="statistic-label">提交订单数</div>
+							<div class="statistic-value">{{ statistics.numberOrders || 0 }}</div>
+						</div>
+					</el-card>
+				</el-col>
+				<el-col :span="6">
+					<el-card shadow="hover">
+						<div class="statistic-item">
+							<div class="statistic-label">订单总金额</div>
+							<div class="statistic-value">¥{{ (statistics.totalOrderAmount || 0).toFixed(2) }}</div>
+						</div>
+					</el-card>
+				</el-col>
+				<el-col :span="6">
+					<el-card shadow="hover">
+						<div class="statistic-item">
+							<div class="statistic-label">已付订单数</div>
+							<div class="statistic-value success">{{ statistics.paidOrders || 0 }}</div>
+						</div>
+					</el-card>
+				</el-col>
+				<el-col :span="6">
+					<el-card shadow="hover">
+						<div class="statistic-item">
+							<div class="statistic-label">已付总金额</div>
+							<div class="statistic-value success">¥{{ (statistics.totalAmountPaid || 0).toFixed(2) }}</div>
+						</div>
+					</el-card>
+				</el-col>
+			</el-row>
+
+			<el-table
+				:data="state.dataList"
+				@selection-change="handleSelectionChange"
+				@sort-change="sortChangeHandle"
+				style="width: 100%"
+				v-loading="state.loading"
+				border
+				:cell-style="tableStyle.cellStyle"
+				:header-cell-style="tableStyle.headerCellStyle"
+			>
+				<el-table-column align="center" type="selection" width="40" />
+				<el-table-column label="商户订单号" prop="mchOrderNo" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.mchOrderNo || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="平台订单号" prop="transactionId" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.transactionId || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="商户名称" prop="merchantName" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.merchantName || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="代理名称" prop="agentName" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.agentName || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="通道名称" prop="paymentChannelName" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.paymentChannelName || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="金额" prop="amount" show-overflow-tooltip>
+					<template #default="scope">
+						<span style="color: #f56c6c; font-weight: bold">¥{{ scope.row.amount ? scope.row.amount.toFixed(2) : '0.00' }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="订单状态" prop="orderStatus" show-overflow-tooltip>
+					<template #default="scope">
+						<el-tag :type="orderStatusMap[scope.row.orderStatus]?.type || 'info'" size="small">
+							{{ orderStatusMap[scope.row.orderStatus]?.label || scope.row.orderStatus }}
+						</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column label="创建时间" prop="createTime" show-overflow-tooltip width="180">
+					<template #default="scope">
+						{{ scope.row.createTime || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="操作">
+					<template #default="scope">
+						<!-- <el-button icon="View" @click="handleView(scope.row)" text type="primary" size="small">查看</el-button> -->
+						<el-button icon="Document" @click="handleNotifyLog(scope.row)" text type="warning" size="small">回调日志</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<pagination @current-change="currentChangeHandle" @size-change="sizeChangeHandle" v-bind="state.pagination" />
+		</div>
+
+		<!-- 回调日志弹窗 -->
+		<notify-log-dialog ref="notifyLogDialogRef" />
+	</div>
+</template>
+
+<script lang="ts" name="orderPayOrder" setup>
+import { BasicTableProps, useTable } from '/@/hooks/table';
+import { fetchPayOrderList, fetchPayOrderStatistics } from '/@/api/order';
+import { useMessage } from '/@/hooks/message';
+
+// 引入组件
+const NotifyLogDialog = defineAsyncComponent(() => import('./notifyLog.vue'));
+
+// 订单状态映射
+const orderStatusMap: Record<string, { label: string; type: any }> = {
+	CREATE_ORDER: { label: '创建订单', type: 'info' },
+	PAY_SUCCESS: { label: '支付成功', type: 'success' },
+	PAY_FAIL: { label: '支付失败', type: 'danger' },
+	CANCEL_ORDER: { label: '取消订单', type: 'warning' },
+	PAY_TIMEOUT: { label: '支付超时', type: 'info' },
+};
+
+// 定义变量内容
+const notifyLogDialogRef = ref();
+const queryRef = ref();
+const showSearch = ref(true);
+const selectObjs = ref([]);
+const multiple = ref(true);
+const statistics = ref<any>(null);
+
+// 定义表格查询、变更
+const state: BasicTableProps = reactive<BasicTableProps>({
+	queryForm: {
+		mchOrderNo: '',
+		transactionId: '',
+		merchantName: '',
+		agentName: '',
+		orderStatus: '',
+	},
+	pageList: fetchPayOrderList,
+	descs: ['create_time'],
+	createdIsNeed: false, // 禁用自动加载,由 getDataListWithStats 手动调用
+});
+
+const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, tableStyle } = useTable(state);
+
+// 加载统计数据
+const loadStatistics = async () => {
+	try {
+		const res = await fetchPayOrderStatistics(state.queryForm);
+		statistics.value = res.data;
+	} catch (err: any) {
+		useMessage().error(err.msg);
+	}
+};
+
+// 重写 getDataList,同时加载统计数据
+const originalGetDataList = getDataList;
+const getDataListWithStats = async (reload = true) => {
+	await originalGetDataList(reload);
+	await loadStatistics();
+};
+
+// 重置查询
+const resetQuery = () => {
+	queryRef.value?.resetFields();
+	getDataListWithStats();
+};
+
+// 多选事件
+const handleSelectionChange = (objs: any) => {
+	selectObjs.value = objs.map((val: any) => val.id);
+	multiple.value = !objs.length;
+};
+
+// 查看回调日志
+const handleNotifyLog = (row: any) => {
+	notifyLogDialogRef.value.openDialog(row.appId, row.mchOrderNo);
+};
+
+// 初始化加载数据
+onMounted(() => {
+	getDataListWithStats();
+});
+</script>
+
+<style scoped>
+.statistic-item {
+	text-align: center;
+	padding: 10px 0;
+}
+
+.statistic-label {
+	font-size: 14px;
+	color: #909399;
+	margin-bottom: 8px;
+}
+
+.statistic-value {
+	font-size: 24px;
+	font-weight: bold;
+	color: #303133;
+}
+
+.statistic-value.success {
+	color: #67c23a;
+}
+</style>

+ 168 - 0
src/views/order/payOrder/notifyLog.vue

@@ -0,0 +1,168 @@
+<template>
+	<el-dialog :close-on-click-modal="false" title="回调日志" draggable v-model="visible" width="1000px">
+		<div v-loading="loading">
+			<!-- 回调信息概览 -->
+			<el-descriptions :column="2" border class="mb20" v-if="notifyData.id">
+				<el-descriptions-item label="订单号">{{ notifyData.orderId || '-' }}</el-descriptions-item>
+				<el-descriptions-item label="通知状态">
+					<el-tag :type="getStatusType(notifyData.status)" size="default">
+						{{ getStatusLabel(notifyData.status) }}
+					</el-tag>
+				</el-descriptions-item>
+				<el-descriptions-item label="当前通知次数">
+					<el-tag type="info">{{ notifyData.notifyTimes || 0 }}</el-tag>
+				</el-descriptions-item>
+				<el-descriptions-item label="最大通知次数">
+					<el-tag type="info">{{ notifyData.maxNotifyTimes || 0 }}</el-tag>
+				</el-descriptions-item>
+				<el-descriptions-item label="最后执行时间" :span="2">{{ notifyData.lastExecuteTime || '-' }}</el-descriptions-item>
+				<el-descriptions-item label="下次通知时间" :span="2">{{ notifyData.nextNotifyTime || '-' }}</el-descriptions-item>
+				<el-descriptions-item label="通知地址" :span="2">
+					<el-text class="notify-url" truncated>{{ notifyData.notifyUrl || '-' }}</el-text>
+				</el-descriptions-item>
+				<el-descriptions-item label="失败原因" :span="2">
+					<span style="color: #f56c6c">{{ notifyData.errorMsg || '-' }}</span>
+				</el-descriptions-item>
+			</el-descriptions>
+
+			<!-- 通知日志列表 -->
+			<el-divider content-position="left">通知日志</el-divider>
+			<el-timeline v-if="notifyData.payNotifyLogs && notifyData.payNotifyLogs.length > 0">
+				<el-timeline-item
+					v-for="(log, index) in notifyData.payNotifyLogs"
+					:key="index"
+					:timestamp="log.createTime"
+					placement="top"
+					:type="getStatusType(log.status)"
+				>
+					<el-card shadow="hover">
+						<div class="log-item">
+							<div class="log-header">
+								<span class="log-title">第 {{ log.notifyTimes }} 次通知</span>
+								<el-tag :type="getStatusType(log.status)" size="small">
+									{{ getStatusLabel(log.status) }}
+								</el-tag>
+							</div>
+							<div class="log-content">
+								<div class="log-label">响应结果:</div>
+								<pre class="log-response">{{ log.response || '无响应' }}</pre>
+							</div>
+						</div>
+					</el-card>
+				</el-timeline-item>
+			</el-timeline>
+			<el-empty v-else description="暂无通知日志" />
+		</div>
+
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="visible = false">关闭</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script lang="ts" name="NotifyLogDialog" setup>
+import { fetchPayNotifyLog } from '/@/api/order';
+import { useMessage } from '/@/hooks/message';
+
+// 通知状态映射
+const statusMap: Record<number, { label: string; type: any }> = {
+	0: { label: '待通知', type: 'info' },
+	10: { label: '通知成功', type: 'success' },
+	20: { label: '通知失败', type: 'danger' },
+	30: { label: '通知中', type: 'warning' },
+};
+
+// 定义变量
+const visible = ref(false);
+const loading = ref(false);
+const notifyData = reactive<any>({});
+
+// 获取状态标签类型
+const getStatusType = (status: number) => {
+	return statusMap[status]?.type || 'info';
+};
+
+// 获取状态标签文本
+const getStatusLabel = (status: number) => {
+	return statusMap[status]?.label || `未知状态(${status})`;
+};
+
+// 打开弹窗
+const openDialog = async (appId: string, orderId: string) => {
+	visible.value = true;
+	loading.value = true;
+
+	// 清空数据
+	Object.keys(notifyData).forEach((key) => delete notifyData[key]);
+
+	try {
+		const res = await fetchPayNotifyLog(appId, orderId);
+		Object.assign(notifyData, res.data);
+	} catch (err: any) {
+		useMessage().error(err.msg || '获取回调日志失败');
+	} finally {
+		loading.value = false;
+	}
+};
+
+// 暴露方法
+defineExpose({
+	openDialog,
+});
+</script>
+
+<style scoped>
+.notify-url {
+	max-width: 100%;
+	word-break: break-all;
+}
+
+.log-item {
+	padding: 10px 0;
+}
+
+.log-header {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	margin-bottom: 10px;
+}
+
+.log-title {
+	font-size: 16px;
+	font-weight: bold;
+	color: #303133;
+}
+
+.log-content {
+	margin-top: 10px;
+}
+
+.log-label {
+	font-size: 14px;
+	color: #606266;
+	margin-bottom: 5px;
+	font-weight: 500;
+}
+
+.log-response {
+	background: #f5f7fa;
+	padding: 12px;
+	border-radius: 4px;
+	font-size: 13px;
+	color: #303133;
+	white-space: pre-wrap;
+	word-wrap: break-word;
+	max-height: 200px;
+	overflow-y: auto;
+	margin: 0;
+	border: 1px solid #e4e7ed;
+	font-family: 'Courier New', Courier, monospace;
+}
+
+.mb20 {
+	margin-bottom: 20px;
+}
+</style>

+ 114 - 0
src/views/order/withdrawOrder/detail.vue

@@ -0,0 +1,114 @@
+<template>
+	<el-dialog :close-on-click-modal="false" title="代付订单详情" draggable v-model="visible" width="900px">
+		<el-descriptions :column="2" border v-loading="loading">
+			<el-descriptions-item label="订单ID">{{ orderData.id }}</el-descriptions-item>
+			<el-descriptions-item label="AppId">{{ orderData.appId }}</el-descriptions-item>
+			<el-descriptions-item label="商户订单号" :span="2">{{ orderData.mchOrderNo }}</el-descriptions-item>
+			<el-descriptions-item label="平台订单号" :span="2">{{ orderData.transactionId || '-' }}</el-descriptions-item>
+			<el-descriptions-item label="订单状态">
+				<el-tag v-if="orderData.orderStatus === 'CREATE_ORDER'" type="info">创建订单</el-tag>
+				<el-tag v-else-if="orderData.orderStatus === 'WITHDRAW_SUCCESS'" type="success">提现成功</el-tag>
+				<el-tag v-else-if="orderData.orderStatus === 'WITHDRAW_FAIL'" type="danger">提现失败</el-tag>
+				<el-tag v-else>{{ orderData.orderStatus }}</el-tag>
+			</el-descriptions-item>
+			<el-descriptions-item label="币种">{{ orderData.currencyType }}</el-descriptions-item>
+
+			<el-descriptions-item label="订单金额">
+				<span style="color: #f56c6c; font-weight: bold; font-size: 16px">¥{{ orderData.amount ? orderData.amount.toFixed(2) : '0.00' }}</span>
+			</el-descriptions-item>
+			<el-descriptions-item label="实付金额">
+				<span v-if="orderData.noticeAmount" style="color: #67c23a; font-weight: bold; font-size: 16px"
+					>¥{{ orderData.noticeAmount.toFixed(2) }}</span
+				>
+				<span v-else>-</span>
+			</el-descriptions-item>
+
+			<el-descriptions-item label="支付通道ID">{{ orderData.paymentChannelId }}</el-descriptions-item>
+			<el-descriptions-item label="通道类型ID">{{ orderData.paymentTypeId }}</el-descriptions-item>
+
+			<el-descriptions-item label="商户ID">{{ orderData.merchantUserId }}</el-descriptions-item>
+			<el-descriptions-item label="费率状态">
+				<el-tag v-if="orderData.feeStatus" type="success">成功</el-tag>
+				<el-tag v-else type="danger">失败</el-tag>
+			</el-descriptions-item>
+
+			<el-descriptions-item label="商户手续费类型">
+				<el-tag v-if="orderData.mFeeType === 'PERCENTAGE'" type="info">百分比</el-tag>
+				<el-tag v-else-if="orderData.mFeeType === 'FIXED'" type="warning">固定</el-tag>
+				<el-tag v-else-if="orderData.mFeeType === 'MIXED'" type="success">百分比+固定</el-tag>
+				<span v-else>-</span>
+			</el-descriptions-item>
+			<el-descriptions-item label="商户手续费">
+				{{ orderData.mFee ? `¥${orderData.mFee.toFixed(2)}` : '-' }}
+			</el-descriptions-item>
+
+			<el-descriptions-item label="商户手续费比例">
+				{{ orderData.mFeeRate ? `${orderData.mFeeRate}%` : '-' }}
+			</el-descriptions-item>
+			<el-descriptions-item label="商户手续费固定金额">
+				{{ orderData.mFeeEvery ? `¥${orderData.mFeeEvery.toFixed(2)}` : '-' }}
+			</el-descriptions-item>
+
+			<el-descriptions-item label="代理商手续费类型">
+				<el-tag v-if="orderData.aFeeType === 'PERCENTAGE'" type="info">百分比</el-tag>
+				<el-tag v-else-if="orderData.aFeeType === 'FIXED'" type="warning">固定</el-tag>
+				<el-tag v-else-if="orderData.aFeeType === 'MIXED'" type="success">百分比+固定</el-tag>
+				<span v-else>-</span>
+			</el-descriptions-item>
+			<el-descriptions-item label="代理商手续费">
+				{{ orderData.aFee ? `¥${orderData.aFee.toFixed(2)}` : '-' }}
+			</el-descriptions-item>
+
+			<el-descriptions-item label="代理商手续费比例">
+				{{ orderData.aFeeRate ? `${orderData.aFeeRate}%` : '-' }}
+			</el-descriptions-item>
+			<el-descriptions-item label="代理商手续费固定金额">
+				{{ orderData.aFeeEvery ? `¥${orderData.aFeeEvery.toFixed(2)}` : '-' }}
+			</el-descriptions-item>
+
+			<el-descriptions-item label="收款人姓名">{{ orderData.payUsername || '-' }}</el-descriptions-item>
+			<el-descriptions-item label="收款人电话">{{ orderData.payMobile || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="银行账号" :span="2">{{ orderData.payBankNumber || '-' }}</el-descriptions-item>
+			<el-descriptions-item label="银行名称" :span="2">{{ orderData.payBankName || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="收款人邮箱" :span="2">{{ orderData.payEmail || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="主题" :span="2">{{ orderData.subject || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="后台回调URL" :span="2">{{ orderData.notifyUrl || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="扩展参数" :span="2">{{ orderData.payAttach || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="请求时间">{{ orderData.reqTime || '-' }}</el-descriptions-item>
+			<el-descriptions-item label="完成时间">{{ orderData.noticeDatetime || '-' }}</el-descriptions-item>
+
+			<el-descriptions-item label="创建时间">{{ orderData.createTime }}</el-descriptions-item>
+			<el-descriptions-item label="更新时间">{{ orderData.updateTime }}</el-descriptions-item>
+		</el-descriptions>
+
+		<template #footer>
+			<span class="dialog-footer">
+				<el-button @click="visible = false">关闭</el-button>
+			</span>
+		</template>
+	</el-dialog>
+</template>
+
+<script lang="ts" name="WithdrawOrderDetailDialog" setup>
+// 定义变量
+const visible = ref(false);
+const loading = ref(false);
+const orderData = reactive<any>({});
+
+// 打开弹窗
+const openDialog = (row: any) => {
+	visible.value = true;
+	Object.assign(orderData, row);
+};
+
+// 暴露方法
+defineExpose({
+	openDialog,
+});
+</script>

+ 163 - 0
src/views/order/withdrawOrder/index.vue

@@ -0,0 +1,163 @@
+<template>
+	<div class="layout-padding">
+		<div class="layout-padding-auto layout-padding-view">
+			<el-row class="ml10" v-show="showSearch">
+				<el-form :inline="true" :model="state.queryForm" @keyup.enter="getDataList" ref="queryRef">
+					<el-form-item label="商户订单号" prop="mchOrderNo">
+						<el-input placeholder="请输入商户订单号" style="max-width: 180px" v-model="state.queryForm.mchOrderNo" clearable />
+					</el-form-item>
+					<el-form-item label="平台订单号" prop="transactionId">
+						<el-input placeholder="请输入平台订单号" style="max-width: 180px" v-model="state.queryForm.transactionId" clearable />
+					</el-form-item>
+					<el-form-item label="商户名称" prop="merchantName">
+						<el-input placeholder="请输入商户名称" style="max-width: 180px" v-model="state.queryForm.merchantName" clearable />
+					</el-form-item>
+					<el-form-item label="代理名称" prop="agentName">
+						<el-input placeholder="请输入代理名称" style="max-width: 180px" v-model="state.queryForm.agentName" clearable />
+					</el-form-item>
+					<el-form-item label="订单状态" prop="orderStatus">
+						<el-select v-model="state.queryForm.orderStatus" placeholder="请选择订单状态" style="max-width: 180px" clearable>
+							<el-option label="创建订单" value="CREATE_ORDER" />
+							<el-option label="提现成功" value="WITHDRAW_SUCCESS" />
+							<el-option label="提现失败" value="WITHDRAW_FAIL" />
+						</el-select>
+					</el-form-item>
+					<el-form-item>
+						<el-button @click="getDataList" icon="search" type="primary">查询</el-button>
+						<el-button @click="resetQuery" icon="Refresh">重置</el-button>
+					</el-form-item>
+				</el-form>
+			</el-row>
+			<el-row>
+				<div class="mb8" style="width: 100%">
+					<right-toolbar
+						@queryTable="getDataList"
+						class="ml10"
+						style="float: right; margin-right: 20px"
+						v-model:showSearch="showSearch"
+					></right-toolbar>
+				</div>
+			</el-row>
+
+			<el-table
+				:data="state.dataList"
+				@selection-change="handleSelectionChange"
+				@sort-change="sortChangeHandle"
+				style="width: 100%"
+				v-loading="state.loading"
+				border
+				:cell-style="tableStyle.cellStyle"
+				:header-cell-style="tableStyle.headerCellStyle"
+			>
+				<el-table-column align="center" type="selection" width="40" />
+				<el-table-column label="商户订单号" prop="mchOrderNo" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.mchOrderNo || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="平台订单号" prop="transactionId" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.transactionId || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="商户名称" prop="merchantName" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.merchantName || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="代理名称" prop="agentName" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.agentName || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="通道名称" prop="paymentChannelName" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.paymentChannelName || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="金额" prop="amount" show-overflow-tooltip>
+					<template #default="scope">
+						<span style="color: #f56c6c; font-weight: bold">¥{{ scope.row.amount ? scope.row.amount.toFixed(2) : '0.00' }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="订单状态" prop="orderStatus" show-overflow-tooltip>
+					<template #default="scope">
+						<el-tag :type="orderStatusMap[scope.row.orderStatus]?.type || 'info'" size="small">
+							{{ orderStatusMap[scope.row.orderStatus]?.label || scope.row.orderStatus }}
+						</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column label="创建时间" prop="createTime" show-overflow-tooltip width="180">
+					<template #default="scope">
+						{{ scope.row.createTime || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="操作">
+					<template #default="scope">
+						<!-- <el-button icon="View" @click="handleView(scope.row)" text type="primary" size="small">查看</el-button> -->
+						<el-button icon="Document" @click="handleNotifyLog(scope.row)" text type="warning" size="small">回调日志</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<pagination @current-change="currentChangeHandle" @size-change="sizeChangeHandle" v-bind="state.pagination" />
+		</div>
+
+		<!-- 回调日志弹窗 -->
+		<notify-log-dialog ref="notifyLogDialogRef" />
+	</div>
+</template>
+
+<script lang="ts" name="orderWithdrawOrder" setup>
+import { BasicTableProps, useTable } from '/@/hooks/table';
+import { fetchWithdrawOrderList } from '/@/api/order';
+
+// 引入组件
+const NotifyLogDialog = defineAsyncComponent(() => import('../payOrder/notifyLog.vue'));
+
+// 订单状态映射
+const orderStatusMap: Record<string, { label: string; type: any }> = {
+	CREATE_ORDER: { label: '创建订单', type: 'info' },
+	WITHDRAW_SUCCESS: { label: '提现成功', type: 'success' },
+	WITHDRAW_FAIL: { label: '提现失败', type: 'danger' },
+};
+
+// 定义变量内容
+const notifyLogDialogRef = ref();
+const queryRef = ref();
+const showSearch = ref(true);
+const selectObjs = ref([]);
+const multiple = ref(true);
+
+// 定义表格查询、变更
+const state: BasicTableProps = reactive<BasicTableProps>({
+	queryForm: {
+		mchOrderNo: '',
+		transactionId: '',
+		merchantName: '',
+		agentName: '',
+		orderStatus: '',
+	},
+	pageList: fetchWithdrawOrderList,
+	descs: ['create_time'],
+	createdIsNeed: true, // 使用自动加载
+});
+
+const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, tableStyle } = useTable(state);
+
+// 重置查询
+const resetQuery = () => {
+	queryRef.value?.resetFields();
+	getDataList();
+};
+
+// 多选事件
+const handleSelectionChange = (objs: any) => {
+	selectObjs.value = objs.map((val: any) => val.id);
+	multiple.value = !objs.length;
+};
+
+// 查看回调日志
+const handleNotifyLog = (row: any) => {
+	notifyLogDialogRef.value.openDialog(row.appId, row.mchOrderNo);
+};
+</script>

+ 192 - 0
src/views/payment/channel/index.vue

@@ -0,0 +1,192 @@
+<template>
+	<div class="layout-padding">
+		<div class="layout-padding-auto layout-padding-view">
+			<el-row class="ml10" v-show="showSearch">
+				<el-form :inline="true" :model="queryForm" @keyup.enter="handleSearch" ref="queryRef">
+					<el-form-item label="通道名称" prop="channelName">
+						<el-input placeholder="请输入通道名称" style="max-width: 180px" v-model="queryForm.channelName" clearable />
+					</el-form-item>
+					<el-form-item label="支付方式" prop="paymentName">
+						<el-input placeholder="请输入支付方式" style="max-width: 180px" v-model="queryForm.paymentName" clearable />
+					</el-form-item>
+					<el-form-item label="支付类别" prop="paymentType">
+						<el-select v-model="queryForm.paymentType" placeholder="请选择支付类别" style="max-width: 180px" clearable>
+							<el-option label="代付" value="PAY" />
+							<el-option label="代收" value="HARVEST" />
+						</el-select>
+					</el-form-item>
+					<el-form-item>
+						<el-button @click="handleSearch" icon="search" type="primary">查询</el-button>
+						<el-button @click="resetQuery" icon="Refresh">重置</el-button>
+					</el-form-item>
+				</el-form>
+			</el-row>
+			<el-row>
+				<div class="mb8" style="width: 100%">
+					<el-button @click="loadData" class="ml10" icon="Refresh" type="primary">刷新</el-button>
+					<right-toolbar
+						@queryTable="handleSearch"
+						class="ml10"
+						style="float: right; margin-right: 20px"
+						v-model:showSearch="showSearch"
+					></right-toolbar>
+				</div>
+			</el-row>
+
+			<el-table
+				:data="filteredData"
+				style="width: 100%"
+				v-loading="loading"
+				border
+				:cell-style="tableStyle.cellStyle"
+				:header-cell-style="tableStyle.headerCellStyle"
+			>
+				<el-table-column label="通道名称" prop="channelName" show-overflow-tooltip align="center">
+					<template #default="scope">
+						{{ scope.row.channelName || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="支付方式" prop="paymentName" show-overflow-tooltip align="center">
+					<template #default="scope">
+						{{ scope.row.paymentName || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="支付类别" prop="paymentType" show-overflow-tooltip align="center">
+					<template #default="scope">
+						<el-tag :type="scope.row.paymentType === 'PAY' ? 'warning' : 'info'">
+							{{ paymentTypeMap[scope.row.paymentType] || scope.row.paymentType }}
+						</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column label="商户手续费类型" prop="mfeeType" show-overflow-tooltip align="center">
+					<template #default="scope">
+						{{ feeTypeMap[scope.row.mfeeType] || scope.row.mfeeType }}
+					</template>
+				</el-table-column>
+				<el-table-column label="商户手续费比例" prop="mfeeRate" show-overflow-tooltip align="center">
+					<template #default="scope">
+						{{ scope.row.mfeeRate ? `${scope.row.mfeeRate}%` : '0%' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="商户手续费固定金额" prop="mfeeEvery" show-overflow-tooltip align="center">
+					<template #default="scope">
+						<span class="amount-value">¥{{ scope.row.mfeeEvery ? scope.row.mfeeEvery.toFixed(2) : '0.00' }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="代理商手续费类型" prop="afeeType" show-overflow-tooltip align="center">
+					<template #default="scope">
+						{{ feeTypeMap[scope.row.afeeType] || scope.row.afeeType }}
+					</template>
+				</el-table-column>
+				<el-table-column label="代理商手续费比例" prop="afeeRate" show-overflow-tooltip align="center">
+					<template #default="scope">
+						{{ scope.row.afeeRate ? `${scope.row.afeeRate}%` : '0%' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="代理商手续费固定金额" prop="afeeEvery" show-overflow-tooltip align="center">
+					<template #default="scope">
+						<span class="amount-value">¥{{ scope.row.afeeEvery ? scope.row.afeeEvery.toFixed(2) : '0.00' }}</span>
+					</template>
+				</el-table-column>
+			</el-table>
+		</div>
+	</div>
+</template>
+
+<script lang="ts" name="paymentChannel" setup>
+import { getMerchantRate } from '/@/api/payment/channel';
+import { useMessage } from '/@/hooks/message';
+
+// 支付类别映射
+const paymentTypeMap: Record<string, string> = {
+	PAY: '代付',
+	HARVEST: '代收',
+};
+
+// 手续费类型映射
+const feeTypeMap: Record<string, string> = {
+	PERCENTAGE: '百分比',
+	FIXED: '固定金额',
+	MIXED: '混合',
+};
+
+// 定义变量
+const queryRef = ref();
+const showSearch = ref(true);
+const loading = ref(false);
+const tableData = ref<any[]>([]);
+const queryForm = ref({
+	channelName: '',
+	paymentName: '',
+	paymentType: '',
+});
+
+// 表格样式
+const tableStyle = {
+	cellStyle: {
+		textAlign: 'center',
+	},
+	headerCellStyle: {
+		textAlign: 'center',
+		background: '#fafafa',
+	},
+};
+
+// 前端筛选数据
+const filteredData = computed(() => {
+	let data = tableData.value;
+
+	// 通道名称筛选
+	if (queryForm.value.channelName) {
+		data = data.filter((item) => item.channelName?.toLowerCase().includes(queryForm.value.channelName.toLowerCase()));
+	}
+
+	// 支付方式筛选
+	if (queryForm.value.paymentName) {
+		data = data.filter((item) => item.paymentName?.toLowerCase().includes(queryForm.value.paymentName.toLowerCase()));
+	}
+
+	// 支付类别筛选
+	if (queryForm.value.paymentType) {
+		data = data.filter((item) => item.paymentType === queryForm.value.paymentType);
+	}
+
+	return data;
+});
+
+// 查询
+const handleSearch = () => {
+	// 前端筛选,无需额外操作
+};
+
+// 重置查询
+const resetQuery = () => {
+	queryRef.value?.resetFields();
+};
+
+// 加载数据
+const loadData = async () => {
+	loading.value = true;
+	try {
+		const res = await getMerchantRate();
+		tableData.value = res.data || [];
+	} catch (err: any) {
+		useMessage().error(err.msg || '获取费率信息失败');
+	} finally {
+		loading.value = false;
+	}
+};
+
+// 初始化加载
+onMounted(() => {
+	loadData();
+});
+</script>
+
+<style scoped lang="scss">
+.amount-value {
+	font-size: 14px;
+	font-weight: bold;
+	color: #f56c6c;
+}
+</style>

+ 202 - 0
src/views/settlement/apply/index.vue

@@ -0,0 +1,202 @@
+<template>
+	<div class="layout-padding">
+		<div class="layout-padding-auto layout-padding-view">
+			<el-row :gutter="20">
+				<el-col :xs="24" :sm="20" :md="16" :lg="12" :xl="10">
+					<el-card shadow="hover" class="apply-card">
+						<template #header>
+							<div class="card-header">
+								<span class="card-title">申请结算</span>
+								<span class="available-balance"
+									>可提现金额:<span class="balance-amount">¥{{ formatAmount(availableBalance) }}</span></span
+								>
+							</div>
+						</template>
+
+						<el-form :model="formData" :rules="rules" ref="formRef" label-width="120px">
+							<el-form-item label="提现金额" prop="amount">
+								<el-input-number v-model="formData.amount" :min="0" :controls="false" placeholder="请输入提现金额" style="width: 100%" />
+							</el-form-item>
+
+							<el-form-item label="提现类型" prop="type">
+								<el-radio-group v-model="formData.type">
+									<el-radio :label="1">银行卡</el-radio>
+									<el-radio :label="2">USDT</el-radio>
+								</el-radio-group>
+							</el-form-item>
+
+							<el-form-item label="银行名称" prop="bankName" v-if="formData.type === 1">
+								<el-input v-model="formData.bankName" placeholder="请输入银行名称" clearable />
+							</el-form-item>
+
+							<el-form-item label="银行卡账号" prop="bankAccount">
+								<el-input v-model="formData.bankAccount" placeholder="请输入银行卡账号/USDT地址" clearable />
+							</el-form-item>
+
+							<el-form-item label="真实姓名" prop="realName">
+								<el-input v-model="formData.realName" placeholder="请输入真实姓名" clearable />
+							</el-form-item>
+
+							<el-form-item>
+								<el-button type="primary" @click="handleSubmit" :loading="loading" size="large" style="width: 120px"> 提交申请 </el-button>
+								<el-button @click="handleReset" size="large" style="width: 120px">重置</el-button>
+							</el-form-item>
+						</el-form>
+					</el-card>
+				</el-col>
+			</el-row>
+		</div>
+	</div>
+</template>
+
+<script lang="ts" name="settlementApply" setup>
+import { applyWithdraw, getMerchantBalance } from '/@/api/settlement';
+import { useMessage } from '/@/hooks/message';
+
+// 定义变量
+const formRef = ref();
+const loading = ref(false);
+const availableBalance = ref(0);
+const formData = ref({
+	amount: null,
+	type: 1,
+	bankName: '',
+	bankAccount: '',
+	realName: '',
+});
+
+// 表单验证规则
+const rules = {
+	amount: [{ required: true, message: '请输入提现金额', trigger: 'blur' }],
+	type: [{ required: true, message: '请选择提现类型', trigger: 'change' }],
+	bankName: [{ required: true, message: '请输入银行名称', trigger: 'blur' }],
+	bankAccount: [{ required: true, message: '请输入银行卡账号/USDT地址', trigger: 'blur' }],
+	realName: [{ required: true, message: '请输入真实姓名', trigger: 'blur' }],
+};
+
+// 提交申请
+const handleSubmit = async () => {
+	try {
+		await formRef.value?.validate();
+
+		// 验证提现金额不能超过可提现金额
+		if (formData.value.amount && formData.value.amount > availableBalance.value) {
+			useMessage().error(`提现金额不能超过可提现金额 ¥${formatAmount(availableBalance.value)}`);
+			return;
+		}
+
+		loading.value = true;
+
+		const submitData: any = {
+			amount: formData.value.amount,
+			type: formData.value.type,
+			bankAccount: formData.value.bankAccount,
+			realName: formData.value.realName,
+		};
+
+		// 银行卡类型才需要银行名称
+		if (formData.value.type === 1) {
+			submitData.bankName = formData.value.bankName;
+		}
+
+		await applyWithdraw(submitData);
+		useMessage().success('申请提交成功');
+		handleReset();
+	} catch (err: any) {
+		if (err.msg) {
+			useMessage().error(err.msg);
+		}
+	} finally {
+		loading.value = false;
+	}
+};
+
+// 重置表单
+const handleReset = () => {
+	formRef.value?.resetFields();
+	formData.value = {
+		amount: null,
+		type: 1,
+		bankName: '',
+		bankAccount: '',
+		realName: '',
+	};
+};
+
+// 加载商户余额
+const loadBalance = async () => {
+	try {
+		const res = await getMerchantBalance();
+		if (res.code === 0 && res.data) {
+			availableBalance.value = res.data.totalUseAmount || 0;
+		}
+	} catch (err) {
+		// 加载余额失败
+	}
+};
+
+// 格式化金额
+const formatAmount = (amount: number) => {
+	return amount ? amount.toFixed(2) : '0.00';
+};
+
+// 页面加载时获取余额
+onMounted(() => {
+	loadBalance();
+});
+</script>
+
+<style scoped lang="scss">
+.apply-card {
+	margin-top: 20px;
+}
+
+.card-header {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+
+	.card-title {
+		font-size: 18px;
+		font-weight: bold;
+		color: #303133;
+	}
+
+	.available-balance {
+		font-size: 14px;
+		color: #606266;
+
+		.balance-amount {
+			font-size: 18px;
+			font-weight: bold;
+			color: #f56c6c;
+			margin-left: 5px;
+		}
+	}
+}
+
+:deep(.el-form) {
+	padding: 20px 0;
+}
+
+:deep(.el-form-item) {
+	margin-bottom: 28px;
+}
+
+:deep(.el-input-number) {
+	width: 100%;
+
+	.el-input__inner {
+		text-align: left;
+	}
+}
+
+:deep(.el-input__inner) {
+	height: 40px;
+	line-height: 40px;
+}
+
+:deep(.el-radio) {
+	margin-right: 30px;
+}
+</style>

+ 263 - 0
src/views/settlement/fundFlow/index.vue

@@ -0,0 +1,263 @@
+<template>
+	<div class="layout-padding">
+		<div class="layout-padding-auto layout-padding-view">
+			<!-- 余额信息卡片 -->
+			<el-row :gutter="20" class="mb20">
+				<el-col :span="6" v-for="item in balanceCards" :key="item.key">
+					<el-card shadow="hover" class="balance-card">
+						<div class="balance-item">
+							<div class="balance-label">{{ item.label }}</div>
+							<div class="balance-value">¥{{ formatAmount(balanceData[item.key]) }}</div>
+						</div>
+					</el-card>
+				</el-col>
+			</el-row>
+
+			<!-- 搜索表单 -->
+			<el-row class="ml10" v-show="showSearch">
+				<el-form :inline="true" :model="state.queryForm" @keyup.enter="getDataList" ref="queryRef">
+					<el-form-item label="订单号" prop="query">
+						<el-input placeholder="请输入订单号" style="max-width: 180px" v-model="state.queryForm.query" clearable />
+					</el-form-item>
+					<el-form-item label="订单类型" prop="orderFlowType">
+						<el-select v-model="state.queryForm.orderFlowType" placeholder="请选择订单类型" style="max-width: 180px" clearable>
+							<el-option label="支付订单" value="PAY" />
+							<el-option label="提现订单" value="WITHDRAW" />
+						</el-select>
+					</el-form-item>
+					<el-form-item label="订单创建时间" prop="orderCreateTime">
+						<el-date-picker
+							v-model="state.queryForm.orderCreateTime"
+							type="datetimerange"
+							range-separator="至"
+							start-placeholder="开始时间"
+							end-placeholder="结束时间"
+							style="max-width: 360px"
+							clearable
+						/>
+					</el-form-item>
+					<el-form-item label="支付时间" prop="payTime">
+						<el-date-picker
+							v-model="state.queryForm.payTime"
+							type="datetimerange"
+							range-separator="至"
+							start-placeholder="开始时间"
+							end-placeholder="结束时间"
+							style="max-width: 360px"
+							clearable
+						/>
+					</el-form-item>
+					<el-form-item>
+						<el-button @click="getDataList" icon="search" type="primary">查询</el-button>
+						<el-button @click="resetQuery" icon="Refresh">重置</el-button>
+					</el-form-item>
+				</el-form>
+			</el-row>
+			<el-row>
+				<div class="mb8" style="width: 100%">
+					<right-toolbar
+						@queryTable="getDataList"
+						class="ml10"
+						style="float: right; margin-right: 20px"
+						v-model:showSearch="showSearch"
+					></right-toolbar>
+				</div>
+			</el-row>
+
+			<!-- 数据表格 -->
+			<el-table
+				:data="state.dataList"
+				@selection-change="handleSelectionChange"
+				@sort-change="sortChangeHandle"
+				style="width: 100%"
+				v-loading="state.loading"
+				border
+				:cell-style="tableStyle.cellStyle"
+				:header-cell-style="tableStyle.headerCellStyle"
+			>
+				<el-table-column align="center" type="selection" width="40" />
+				<el-table-column label="变更前余额" prop="beforeAmount" show-overflow-tooltip>
+					<template #default="scope">
+						<span>¥{{ scope.row.beforeAmount ? scope.row.beforeAmount.toFixed(2) : '0.00' }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="变更金额" prop="operationAmount" show-overflow-tooltip>
+					<template #default="scope">
+						<span :class="scope.row.amountType === 'ADD' ? 'amount-add' : 'amount-sub'">
+							{{ scope.row.amountType === 'ADD' ? '+' : '-' }} ¥{{ scope.row.operationAmount ? scope.row.operationAmount.toFixed(2) : '0.00' }}
+						</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="变更后余额" prop="afterAmount" show-overflow-tooltip>
+					<template #default="scope">
+						<span>¥{{ scope.row.afterAmount ? scope.row.afterAmount.toFixed(2) : '0.00' }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="订单类型" prop="orderType" show-overflow-tooltip align="center">
+					<template #default="scope">
+						<el-tag :type="orderTypeMap[scope.row.orderType]?.type || 'info'" size="small">
+							{{ orderTypeMap[scope.row.orderType]?.label || '--' }}
+						</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column label="业务订单" prop="orderNo" show-overflow-tooltip width="200">
+					<template #default="scope">
+						{{ scope.row.orderNo || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="订单金额" prop="orderAmount" show-overflow-tooltip>
+					<template #default="scope">
+						<span class="amount-value">¥{{ scope.row.orderAmount ? scope.row.orderAmount.toFixed(2) : '0.00' }}</span>
+					</template>
+				</el-table-column>
+				<!-- <el-table-column label="手续费" prop="feeAmount" show-overflow-tooltip>
+					<template #default="scope">
+						<span class="amount-value">¥{{ calculateFee(scope.row) }}</span>
+					</template>
+				</el-table-column> -->
+				<el-table-column label="创建时间" prop="payTime" show-overflow-tooltip width="180">
+					<template #default="scope">
+						{{ scope.row.payTime || scope.row.orderCreateTime || '--' }}
+					</template>
+				</el-table-column>
+			</el-table>
+			<pagination @current-change="currentChangeHandle" @size-change="sizeChangeHandle" v-bind="state.pagination" />
+		</div>
+	</div>
+</template>
+
+<script lang="ts" name="settlementFundFlow" setup>
+import { BasicTableProps, useTable } from '/@/hooks/table';
+import { fetchFundFlowList, getMerchantBalance } from '/@/api/settlement';
+
+// 余额卡片配置
+const balanceCards = [
+	{ key: 'totalUseAmount', label: '账户余额' },
+	{ key: 'totalAmount', label: '总交易金额' },
+	{ key: 'freezeAmount', label: '总冻结金额' },
+	{ key: 'withdrawnAmount', label: '总提现金额' },
+];
+
+// 余额数据
+const balanceData = ref({
+	totalAmount: 0,
+	totalUseAmount: 0,
+	freezeAmount: 0,
+	withdrawnAmount: 0,
+	withdrawnTotalAmount: 0,
+});
+
+// 订单类型映射
+const orderTypeMap: Record<string, { label: string; type: any }> = {
+	PAY: { label: '支付订单', type: 'success' },
+	WITHDRAW: { label: '提现订单', type: 'warning' },
+};
+
+// 定义变量内容
+const queryRef = ref();
+const showSearch = ref(true);
+const selectObjs = ref([]);
+const multiple = ref(true);
+
+// 定义表格查询、变更
+const state: BasicTableProps = reactive<BasicTableProps>({
+	queryForm: {
+		query: '',
+		orderFlowType: '',
+		walletType: 'USE', // 默认传递可用金额
+		orderCreateTime: '',
+		payTime: '',
+	},
+	pageList: fetchFundFlowList,
+	createdIsNeed: false,
+});
+
+const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, tableStyle } = useTable(state);
+
+// 加载余额数据
+const loadBalance = async () => {
+	try {
+		const res = await getMerchantBalance();
+		if (res.code === 0 && res.data) {
+			balanceData.value = res.data;
+		}
+	} catch (err) {
+		// 加载余额数据失败
+	}
+};
+
+// 格式化金额
+const formatAmount = (amount: number) => {
+	return amount ? amount.toFixed(2) : '0.00';
+};
+
+// 重置查询
+const resetQuery = () => {
+	queryRef.value?.resetFields();
+	state.queryForm = {
+		query: '',
+		orderFlowType: '',
+		walletType: 'USE', // 重置时也保持默认值为可用金额
+		orderCreateTime: '',
+		payTime: '',
+	};
+	getDataList();
+};
+
+// 多选事件
+const handleSelectionChange = (objs: any) => {
+	selectObjs.value = objs.map((val: any) => val.id);
+	multiple.value = !objs.length;
+};
+
+// 页面加载时获取数据
+onMounted(() => {
+	loadBalance();
+	getDataList();
+});
+
+// 页面激活时刷新数据(用于 keep-alive 缓存的页面)
+onActivated(() => {
+	loadBalance();
+	getDataList();
+});
+</script>
+
+<style scoped lang="scss">
+.balance-card {
+	.balance-item {
+		text-align: center;
+		padding: 10px 0;
+
+		.balance-label {
+			font-size: 14px;
+			color: #909399;
+			margin-bottom: 10px;
+		}
+
+		.balance-value {
+			font-size: 24px;
+			font-weight: bold;
+			color: #303133;
+		}
+	}
+}
+
+.amount-value {
+	font-size: 14px;
+	font-weight: bold;
+	color: #f56c6c;
+}
+
+.amount-add {
+	font-size: 14px;
+	font-weight: bold;
+	color: #67c23a;
+}
+
+.amount-sub {
+	font-size: 14px;
+	font-weight: bold;
+	color: #f56c6c;
+}
+</style>

+ 166 - 0
src/views/settlement/record/index.vue

@@ -0,0 +1,166 @@
+<template>
+	<div class="layout-padding">
+		<div class="layout-padding-auto layout-padding-view">
+			<el-row class="ml10" v-show="showSearch">
+				<el-form :inline="true" :model="state.queryForm" @keyup.enter="getDataList" ref="queryRef">
+					<el-form-item label="代理名称" prop="merchantName">
+						<el-input placeholder="请输入代理名称" style="max-width: 180px" v-model="state.queryForm.merchantName" clearable />
+					</el-form-item>
+					<el-form-item label="真实姓名" prop="realName">
+						<el-input placeholder="请输入真实姓名" style="max-width: 180px" v-model="state.queryForm.realName" clearable />
+					</el-form-item>
+					<el-form-item label="银行卡账号" prop="bankAccount">
+						<el-input placeholder="请输入银行卡账号" style="max-width: 180px" v-model="state.queryForm.bankAccount" clearable />
+					</el-form-item>
+					<el-form-item label="审核状态" prop="auditStatus">
+						<el-select v-model="state.queryForm.auditStatus" placeholder="请选择审核状态" style="max-width: 180px" clearable>
+							<el-option label="待审核" :value="0" />
+							<el-option label="通过" :value="1" />
+							<el-option label="拒绝" :value="2" />
+						</el-select>
+					</el-form-item>
+					<el-form-item>
+						<el-button @click="getDataList" icon="search" type="primary">查询</el-button>
+						<el-button @click="resetQuery" icon="Refresh">重置</el-button>
+					</el-form-item>
+				</el-form>
+			</el-row>
+			<el-row>
+				<div class="mb8" style="width: 100%">
+					<right-toolbar
+						@queryTable="getDataList"
+						class="ml10"
+						style="float: right; margin-right: 20px"
+						v-model:showSearch="showSearch"
+					></right-toolbar>
+				</div>
+			</el-row>
+
+			<el-table
+				:data="state.dataList"
+				@selection-change="handleSelectionChange"
+				@sort-change="sortChangeHandle"
+				style="width: 100%"
+				v-loading="state.loading"
+				border
+				:cell-style="tableStyle.cellStyle"
+				:header-cell-style="tableStyle.headerCellStyle"
+			>
+				<el-table-column align="center" type="selection" width="40" />
+				<el-table-column label="代理名称" prop="merchantName" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.merchantName || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="提现金额" prop="amount" show-overflow-tooltip>
+					<template #default="scope">
+						<span class="amount-value">¥{{ scope.row.amount ? scope.row.amount.toFixed(2) : '0.00' }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="提现类型" prop="type" show-overflow-tooltip align="center">
+					<template #default="scope">
+						{{ typeMap[scope.row.type] || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="银行名称" prop="bankName" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.bankName || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="银行卡账号" prop="bankAccount" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.bankAccount || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="真实姓名" prop="realName" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.realName || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="审核状态" prop="auditStatus" show-overflow-tooltip align="center">
+					<template #default="scope">
+						<el-tag :type="auditStatusMap[scope.row.auditStatus]?.type || 'info'" size="small">
+							{{ auditStatusMap[scope.row.auditStatus]?.label || '--' }}
+						</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column label="拒绝原因" prop="failReason" show-overflow-tooltip>
+					<template #default="scope">
+						{{ scope.row.failReason || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="申请时间" prop="applyTime" show-overflow-tooltip width="180">
+					<template #default="scope">
+						{{ scope.row.applyTime || '--' }}
+					</template>
+				</el-table-column>
+				<el-table-column label="创建时间" prop="createdTime" show-overflow-tooltip width="180">
+					<template #default="scope">
+						{{ scope.row.createdTime || '--' }}
+					</template>
+				</el-table-column>
+			</el-table>
+			<pagination @current-change="currentChangeHandle" @size-change="sizeChangeHandle" v-bind="state.pagination" />
+		</div>
+	</div>
+</template>
+
+<script lang="ts" name="settlementRecord" setup>
+import { BasicTableProps, useTable } from '/@/hooks/table';
+import { fetchWithdrawList } from '/@/api/settlement';
+
+// 提现类型映射
+const typeMap: Record<number, string> = {
+	1: '银行卡',
+	2: 'USDT',
+};
+
+// 审核状态映射
+const auditStatusMap: Record<number, { label: string; type: any }> = {
+	0: { label: '待审核', type: 'info' },
+	1: { label: '通过', type: 'success' },
+	2: { label: '拒绝', type: 'danger' },
+};
+
+// 定义变量内容
+const queryRef = ref();
+const showSearch = ref(true);
+const selectObjs = ref([]);
+const multiple = ref(true);
+
+// 定义表格查询、变更
+const state: BasicTableProps = reactive<BasicTableProps>({
+	queryForm: {
+		merchantName: '',
+		realName: '',
+		bankAccount: '',
+		auditStatus: '',
+		transferStatus: '',
+	},
+	pageList: fetchWithdrawList,
+	descs: ['created_time'],
+	createdIsNeed: true,
+});
+
+const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, tableStyle } = useTable(state);
+
+// 重置查询
+const resetQuery = () => {
+	queryRef.value?.resetFields();
+	getDataList();
+};
+
+// 多选事件
+const handleSelectionChange = (objs: any) => {
+	selectObjs.value = objs.map((val: any) => val.id);
+	multiple.value = !objs.length;
+};
+</script>
+
+<style scoped lang="scss">
+.amount-value {
+	font-size: 14px;
+	font-weight: bold;
+	color: #f56c6c;
+}
+</style>