fiuai-sdk-python 0.16.0__tar.gz → 0.16.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/CHANGELOG.md +6 -0
  2. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/PKG-INFO +1 -1
  3. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/pyproject.toml +1 -2
  4. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/__init__.py +1 -1
  5. fiuai_sdk_python-0.16.1/src/fiuai_sdk_python/bank.py +175 -0
  6. fiuai_sdk_python-0.16.0/src/fiuai_sdk_python/bank.py +0 -175
  7. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/.gitignore +0 -0
  8. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/LICENSE +0 -0
  9. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/README.md +0 -0
  10. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/_resp_helpers.py +0 -0
  11. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/auth/__init__.py +0 -0
  12. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/auth/context_mgr.py +0 -0
  13. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/auth/header.py +0 -0
  14. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/auth/helper.py +0 -0
  15. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/auth/type.py +0 -0
  16. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/client.py +0 -0
  17. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/company.py +0 -0
  18. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/config.py +0 -0
  19. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/const.py +0 -0
  20. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/context.py +0 -0
  21. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/datatype.py +0 -0
  22. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/doctype.py +0 -0
  23. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/error.py +0 -0
  24. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/error_code.py +0 -0
  25. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/error_parsers.py +0 -0
  26. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/examples/fastapi_integration.py +0 -0
  27. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/http/__init__.py +0 -0
  28. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/http/client.py +0 -0
  29. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/item.py +0 -0
  30. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/perm.py +0 -0
  31. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/pkg/cache/__init__.py +0 -0
  32. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/pkg/cache/cache_client.py +0 -0
  33. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/pkg/cache/circuit_breaker.py +0 -0
  34. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/pkg/cache/decorator.py +0 -0
  35. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/pkg/cache/redis_manager.py +0 -0
  36. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/pkg/cache/types.py +0 -0
  37. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/pkg/scheduler/__init__.py +0 -0
  38. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/pkg/scheduler/runner.py +0 -0
  39. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/profile.py +0 -0
  40. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/resp.py +0 -0
  41. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/setup.py +0 -0
  42. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/type.py +0 -0
  43. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/util.py +0 -0
  44. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/utils/__init__.py +0 -0
  45. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/utils/ids.py +0 -0
  46. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/utils/logger.py +0 -0
  47. {fiuai_sdk_python-0.16.0 → fiuai_sdk_python-0.16.1}/src/fiuai_sdk_python/utils/text.py +0 -0
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.16.1] - 2026-07-18
9
+
10
+ ### Fixed
11
+ - Bank Account 已存在但未关联标准 Bank/Branch 时仍返回 `exists=True`,关联字段作为可选 enrichment。
12
+ - 修正 `CompanyBankAccountSearchResult.bank_id` 错误返回银行账号 ID。
13
+
8
14
  ## [0.16.0] - 2026-07-15
9
15
 
10
16
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fiuai_sdk_python
3
- Version: 0.16.0
3
+ Version: 0.16.1
4
4
  Summary: FiuAI Python SDK - 企业级AI服务集成开发工具包
5
5
  Project-URL: Homepage, https://github.com/fiuai/fiuai-sdk-python
6
6
  Project-URL: Documentation, https://github.com/fiuai/fiuai-sdk-python#readme
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fiuai_sdk_python"
3
- version = "0.16.0"
3
+ version = "0.16.1"
4
4
  description = "FiuAI Python SDK - 企业级AI服务集成开发工具包"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -74,4 +74,3 @@ dev-dependencies = [
74
74
  "mypy>=1.0.0",
75
75
  "pre-commit>=3.0.0",
76
76
  ]
77
-
@@ -18,7 +18,7 @@ from .error_code import (
18
18
  )
19
19
  from .resp import ApiError, ApiResponse, parse_response
20
20
 
21
- __version__ = "0.16.0"
21
+ __version__ = "0.16.1"
22
22
 
23
23
  __all__ = [
24
24
  'FiuaiSDK',
@@ -0,0 +1,175 @@
1
+ # -- coding: utf-8 --
2
+ # Project: fiuaiclient
3
+ # Created Date: 2025 06 Fr
4
+ # Author: liming
5
+ # Email: lmlala@aliyun.com
6
+ # Copyright (c) 2025 FiuAI
7
+ import logging
8
+ from typing import Optional
9
+
10
+ from pydantic import BaseModel, Field
11
+
12
+ from .client import FiuaiSDK
13
+ from .type import BankAccount
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class CompanyBankAccountSearchResult(BaseModel):
19
+ bank_account_id: str = Field(description="银行账号id", default="")
20
+ bank_account_no: str = Field(description="银行账号", default="")
21
+ bank_account_name: str = Field(description="银行账号", default="")
22
+ bank_id: str = Field(description="银行id", default="")
23
+ bank_name: str = Field(description="银行名称", default="")
24
+ opening_bank_branch_id: str = Field(description="开户行id", default="")
25
+ opening_bank_branch_name: str = Field(description="开户行名称", default="")
26
+
27
+
28
+ exists: bool = Field(description="是否存在", default=False)
29
+
30
+ comment: str = Field(description="备注", default="")
31
+
32
+
33
+ def get_bank_account(
34
+ client: FiuaiSDK,
35
+ bank_account_no: str,
36
+ ) -> Optional[CompanyBankAccountSearchResult]:
37
+ """
38
+ 根据银行账号获取银行账号信息
39
+
40
+ Args:
41
+ bank_account_no: 银行账号
42
+
43
+ Returns:
44
+ CompanyBankAccountSearchResult: 银行账号信息
45
+ """
46
+
47
+ if not bank_account_no:
48
+ logger.error("bank_account_no is empty, return None")
49
+ return None
50
+
51
+ bank_account_response = client.internal_get(
52
+ doctype="Bank Account",
53
+ name=bank_account_no,
54
+ fields=[
55
+ "name",
56
+ "bank_account_no",
57
+ "account_name",
58
+ "bank",
59
+ "opening_bank_branch",
60
+ ],
61
+ )
62
+
63
+ if not bank_account_response.is_success():
64
+ return CompanyBankAccountSearchResult(exists=False)
65
+
66
+ bank_account = bank_account_response.data
67
+ if not bank_account:
68
+ return CompanyBankAccountSearchResult(exists=False)
69
+
70
+ bank_id = str(bank_account.get("bank") or "")
71
+ bank_name = ""
72
+ if bank_id:
73
+ bank_response = client.internal_get(
74
+ doctype="Bank",
75
+ name=bank_id,
76
+ fields=["name", "bank_name"],
77
+ )
78
+ if bank_response.is_success() and bank_response.data:
79
+ bank_name = str(bank_response.data.get("bank_name") or "")
80
+ else:
81
+ logger.warning("bank enrichment failed for id %s", bank_id)
82
+
83
+ opening_value = str(bank_account.get("opening_bank_branch") or "")
84
+ opening_bank_branch_id = ""
85
+ opening_bank_branch_name = opening_value
86
+ if bank_id and opening_value:
87
+ branch_response = client.internal_get(
88
+ doctype="Bank Branch",
89
+ name=opening_value,
90
+ fields=["name", "bank_branch_name"],
91
+ )
92
+ if branch_response.is_success() and branch_response.data:
93
+ opening_bank_branch_id = str(branch_response.data.get("name") or "")
94
+ opening_bank_branch_name = str(
95
+ branch_response.data.get("bank_branch_name") or ""
96
+ )
97
+ else:
98
+ logger.warning("bank branch enrichment failed for id %s", opening_value)
99
+
100
+ return CompanyBankAccountSearchResult(
101
+ exists=True,
102
+ bank_account_id=str(bank_account.get("name") or ""),
103
+ bank_account_no=str(bank_account.get("bank_account_no") or ""),
104
+ bank_account_name=str(bank_account.get("account_name") or ""),
105
+ bank_id=bank_id,
106
+ bank_name=bank_name,
107
+ opening_bank_branch_id=opening_bank_branch_id,
108
+ opening_bank_branch_name=opening_bank_branch_name,
109
+ )
110
+
111
+
112
+ def get_bank_account_by_account_no(
113
+ client: FiuaiSDK,
114
+ account_no: str,
115
+ ) -> BankAccount | None:
116
+ """
117
+ 根据银行账号id获取银行账号信息
118
+ """
119
+ response = client.internal_get_list(
120
+ doctype="Bank Account",
121
+ filters=[["bank_account_no", "=", account_no]],
122
+ fields=[
123
+ "name",
124
+ "account_name",
125
+ "bank",
126
+ "bank_account_no",
127
+ "opening_bank_branch",
128
+ ],
129
+ )
130
+
131
+ if not response.is_success():
132
+ logger.warning("bank account is not found by account no %s", account_no)
133
+ return None
134
+
135
+ rows = response.data
136
+ if not rows:
137
+ logger.warning("bank account is not found by account no %s", account_no)
138
+ return None
139
+
140
+ bank_account = rows[0]
141
+ bank_id = str(bank_account.get("bank") or "")
142
+ bank_name = ""
143
+ if bank_id:
144
+ bank_response = client.internal_get(
145
+ doctype="Bank",
146
+ name=bank_id,
147
+ fields=["name", "bank_name"],
148
+ )
149
+ if bank_response.is_success() and bank_response.data:
150
+ bank_name = str(bank_response.data.get("bank_name") or "")
151
+ else:
152
+ logger.warning("bank enrichment failed for id %s", bank_id)
153
+
154
+ opening_value = str(bank_account.get("opening_bank_branch") or "")
155
+ opening_bank_branch_name = opening_value
156
+ if bank_id and opening_value:
157
+ branch_response = client.internal_get(
158
+ doctype="Bank Branch",
159
+ name=opening_value,
160
+ fields=["name", "bank_branch_name"],
161
+ )
162
+ if branch_response.is_success() and branch_response.data:
163
+ opening_bank_branch_name = str(
164
+ branch_response.data.get("bank_branch_name") or ""
165
+ )
166
+ else:
167
+ logger.warning("bank branch enrichment failed for id %s", opening_value)
168
+
169
+ return BankAccount(
170
+ name=str(bank_account.get("name") or ""),
171
+ account_name=str(bank_account.get("account_name") or ""),
172
+ bank=bank_name,
173
+ bank_account_no=account_no,
174
+ bank_branch=opening_bank_branch_name,
175
+ )
@@ -1,175 +0,0 @@
1
- # -- coding: utf-8 --
2
- # Project: fiuaiclient
3
- # Created Date: 2025 06 Fr
4
- # Author: liming
5
- # Email: lmlala@aliyun.com
6
- # Copyright (c) 2025 FiuAI
7
-
8
-
9
-
10
- from pydantic import BaseModel, Field
11
- import logging
12
- from .type import BankAccount
13
- from .client import FiuaiSDK
14
- from typing import Literal, Optional
15
-
16
- logger = logging.getLogger(__name__)
17
-
18
-
19
- class CompanyBankAccountSearchResult(BaseModel):
20
- bank_account_id: str = Field(description="银行账号id", default="")
21
- bank_account_no: str = Field(description="银行账号", default="")
22
- bank_account_name: str = Field(description="银行账号", default="")
23
- bank_id: str = Field(description="银行id", default="")
24
- bank_name: str = Field(description="银行名称", default="")
25
- opening_bank_branch_id: str = Field(description="开户行id", default="")
26
- opening_bank_branch_name: str = Field(description="开户行名称", default="")
27
-
28
-
29
- exists: bool = Field(description="是否存在", default=False)
30
-
31
- comment: str = Field(description="备注", default="")
32
-
33
-
34
- def get_bank_account(client: FiuaiSDK, bank_account_no: str) -> Optional[CompanyBankAccountSearchResult]:
35
- """
36
- 根据银行账号获取银行账号信息
37
-
38
- Args:
39
- back_account: 银行账号
40
-
41
- Returns:
42
- CompanyBankAccountSearchResult: 银行账号信息
43
- """
44
-
45
- if not bank_account_no:
46
- logger.error(f"bank_account_no is empty, return None")
47
- return None
48
-
49
- _bank_account_response = client.internal_get(
50
- doctype="Bank Account",
51
- name=bank_account_no,
52
- fields=["name","bank_account_no", "account_name", "bank", "opening_bank_branch"]
53
- )
54
-
55
-
56
- if not _bank_account_response.is_success():
57
- return CompanyBankAccountSearchResult(exists=False)
58
-
59
- _bank_account = _bank_account_response.data
60
- if not _bank_account:
61
- return CompanyBankAccountSearchResult(exists=False)
62
-
63
-
64
- # 获取银行信息
65
- _bank_detail_response = client.internal_get(
66
- doctype="Bank",
67
- name=_bank_account["bank"],
68
- fields=["name", "bank_name"]
69
- )
70
- if not _bank_detail_response.is_success():
71
- return CompanyBankAccountSearchResult(exists=False)
72
-
73
- _bank_detail = _bank_detail_response.data
74
- if not _bank_detail:
75
- logger.error(f"bank is not found by id {_bank_account["bank"]}")
76
- return CompanyBankAccountSearchResult(exists=False)
77
-
78
- # 获取支行信息
79
- _bank_branch_response = client.internal_get(
80
- doctype="Bank Branch",
81
- name=_bank_account["opening_bank_branch"],
82
- fields=["name", "bank_branch_name"]
83
- )
84
- if not _bank_branch_response.is_success():
85
- return CompanyBankAccountSearchResult(exists=False)
86
-
87
- _bank_branch = _bank_branch_response.data
88
- if not _bank_branch:
89
- logger.error(f"bank branch is not found by id {_bank_account["opening_bank_branch"]}")
90
- return CompanyBankAccountSearchResult(exists=False)
91
-
92
- return CompanyBankAccountSearchResult(
93
- exists=True,
94
- bank_account_id=_bank_account["name"],
95
- bank_account_no=_bank_account["bank_account_no"],
96
- bank_account_name=_bank_account["account_name"],
97
- bank_id=_bank_account["name"],
98
- bank_name=_bank_detail["bank_name"],
99
- opening_bank_branch_id=_bank_branch["name"],
100
- opening_bank_branch_name=_bank_branch["bank_branch_name"]
101
- )
102
-
103
-
104
- def get_bank_account_by_account_no(client: FiuaiSDK, account_no: str) -> BankAccount|None:
105
- """
106
- 根据银行账号id获取银行账号信息
107
- """
108
- resp_response = client.internal_get_list(
109
- doctype="Bank Account",
110
- filters=[["bank_account_no", "=", account_no]],
111
- fields=[
112
- "name",
113
- "account_name",
114
- "bank",
115
- "bank_account_no",
116
- "opening_bank_branch",
117
- ],
118
- )
119
-
120
- if not resp_response.is_success():
121
- logger.warning(f"bank account is not found by account no {account_no}")
122
- return None
123
-
124
- resp = resp_response.data
125
- if not resp:
126
- logger.warning(f"bank account is not found by account no {account_no}")
127
- return None
128
-
129
- resp = resp[0]
130
-
131
- # 获取支行信息
132
- if resp["opening_bank_branch"] != "":
133
- _bank_branch_response = client.internal_get_list(
134
- doctype="Bank Branch",
135
- filters=[["bank_branch_name", "=", resp["opening_bank_branch"]]],
136
- fields=["parent_bank", "bank_branch_name"]
137
- )
138
- if not _bank_branch_response.is_success():
139
- logger.warning(f"bank branch is not found by id {resp["opening_bank_branch"]}")
140
- return None
141
-
142
- if not _bank_branch_response.data:
143
- logger.warning(f"bank branch is not found by id {resp["opening_bank_branch"]}")
144
- return None
145
-
146
-
147
- _parent_bank_id = _bank_branch_response.data[0]["parent_bank"]
148
- if not _parent_bank_id:
149
- logger.warning(f"parent bank is not found by id {resp["opening_bank_branch"]}")
150
- return None
151
-
152
-
153
- # 获取银行信息
154
- _bank_detail_response = client.internal_get(
155
- doctype="Bank",
156
- name=_parent_bank_id,
157
- fields=["name", "bank_name"]
158
- )
159
-
160
- if not _bank_detail_response.is_success():
161
- logger.warning(f"bank is not found by id {_parent_bank_id}")
162
- return None
163
-
164
- _bank_detail = _bank_detail_response.data
165
- if not _bank_detail:
166
- logger.warning(f"bank is not found by id {_parent_bank_id}")
167
- return None
168
-
169
- return BankAccount(
170
- name=resp["name"],
171
- account_name=resp["account_name"],
172
- bank=_bank_detail["bank_name"],
173
- bank_account_no=account_no,
174
- bank_branch=resp["opening_bank_branch"],
175
- )