feat(k3cloud): 新增单据查看功能并重构演示代码
- 在 client.py 中新增 view() 函数,支持调用金蝶云星空 DynamicFormService.View 接口 - 在 tools.py 中新增 view_form 工具,供 MCP 客户端调用 - 添加演示脚本 demo_view.py 和示例配置文件 demo_view.json - 重构 demo_save.py 为通用演示脚本,支持自定义 payload 文件 - 删除过时的 demo.json,新增 userful_save.json 作为实用示例 - 添加项目交接文档,详细说明各子项目架构和配置 - 优化 payload 序列化逻辑,提取为共享函数 _serialize_payload
This commit is contained in:
@@ -12,6 +12,22 @@ def build_save_url(path: str) -> str:
|
||||
return f"{Config.BASE_URL.rstrip('/')}{path}"
|
||||
|
||||
|
||||
def _serialize_payload(payload: Any, field_name: str) -> str:
|
||||
if payload is None:
|
||||
raise ValueError(f"{field_name} 不能为空")
|
||||
if isinstance(payload, str):
|
||||
payload_value = payload.strip()
|
||||
if not payload_value:
|
||||
raise ValueError(f"{field_name} 不能为空字符串")
|
||||
return payload_value
|
||||
try:
|
||||
return json.dumps(payload, ensure_ascii=False)
|
||||
except TypeError as exc:
|
||||
raise TypeError(
|
||||
f"{field_name} 必须是可序列化的 JSON 对象或 JSON 字符串"
|
||||
) from exc
|
||||
|
||||
|
||||
def save(formid: str, data_payload: Any, timeout: int = 30) -> Dict[str, Any]:
|
||||
"""
|
||||
Call the K3Cloud Save API.
|
||||
@@ -22,18 +38,7 @@ def save(formid: str, data_payload: Any, timeout: int = 30) -> Dict[str, Any]:
|
||||
normalized_formid = str(formid or "").strip()
|
||||
if not normalized_formid:
|
||||
raise ValueError("formid 不能为空")
|
||||
if data_payload is None:
|
||||
raise ValueError("data_payload 不能为空")
|
||||
|
||||
if isinstance(data_payload, str):
|
||||
payload_value = data_payload.strip()
|
||||
if not payload_value:
|
||||
raise ValueError("data_payload 不能为空字符串")
|
||||
else:
|
||||
try:
|
||||
payload_value = json.dumps(data_payload, ensure_ascii=False)
|
||||
except TypeError as exc:
|
||||
raise TypeError("data_payload 必须是可序列化的 JSON 对象或 JSON 字符串") from exc
|
||||
payload_value = _serialize_payload(data_payload, "data_payload")
|
||||
|
||||
payload = {
|
||||
"formid": normalized_formid,
|
||||
@@ -48,3 +53,30 @@ def save(formid: str, data_payload: Any, timeout: int = 30) -> Dict[str, Any]:
|
||||
)
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
|
||||
|
||||
def view(formid: str, payload: Any, timeout: int = 30) -> Dict[str, Any]:
|
||||
"""
|
||||
Call the K3Cloud View API.
|
||||
|
||||
`payload` can be a JSON object or a pre-serialized JSON string.
|
||||
"""
|
||||
view_service_path = "/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.View.common.kdsvc"
|
||||
normalized_formid = str(formid or "").strip()
|
||||
if not normalized_formid:
|
||||
raise ValueError("formid 不能为空")
|
||||
payload_value = _serialize_payload(payload, "payload")
|
||||
|
||||
request_body = {
|
||||
"formid": normalized_formid,
|
||||
"data": payload_value,
|
||||
}
|
||||
|
||||
response = requests.post(
|
||||
build_save_url(view_service_path),
|
||||
json=request_body,
|
||||
headers=build_headers(view_service_path),
|
||||
timeout=timeout,
|
||||
)
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
{
|
||||
"NeedUpDateFields": [],
|
||||
"NeedReturnFields": [],
|
||||
"IsDeleteEntry": "true",
|
||||
"SubSystemId": "",
|
||||
"IsVerifyBaseDataField": "false",
|
||||
"IsEntryBatchFill": "true",
|
||||
"ValidateFlag": "true",
|
||||
"NumberSearch": "true",
|
||||
"IsAutoAdjustField": "false",
|
||||
"InterationFlags": "",
|
||||
"IgnoreInterationFlag": "",
|
||||
"IsControlPrecision": "false",
|
||||
"ValidateRepeatJson": "false",
|
||||
"Model": {
|
||||
"FID": 0,
|
||||
"FBillTypeID": {
|
||||
"FNUMBER": ""
|
||||
},
|
||||
"FBillNo": "1",
|
||||
"FPAYORGID": {
|
||||
"FNumber": ""
|
||||
},
|
||||
"FDATE": "1900-01-01",
|
||||
"FCONTACTUNITTYPE": "",
|
||||
"FCONTACTUNIT": {
|
||||
"FNumber": ""
|
||||
},
|
||||
"FPAYUNITTYPE": "",
|
||||
"FPAYUNIT": {
|
||||
"FNumber": ""
|
||||
},
|
||||
"FCURRENCYID": {
|
||||
"FNumber": ""
|
||||
},
|
||||
"FSETTLECUR": {
|
||||
"FNUMBER": ""
|
||||
},
|
||||
"FDOCUMENTSTATUS": "",
|
||||
"FBUSINESSTYPE": "",
|
||||
"FCancelStatus": "",
|
||||
"FSETTLEMAINBOOKID": {
|
||||
"FNUMBER": ""
|
||||
},
|
||||
"FRECEIVEBILLENTRY": [
|
||||
{
|
||||
"FEntryID": 0,
|
||||
"FSETTLETYPEID": {
|
||||
"FNumber": ""
|
||||
},
|
||||
"FPURPOSEID": {
|
||||
"FNumber": "SFKYT01_SYS"
|
||||
},
|
||||
"FPOSTDATE": "1900-01-01",
|
||||
"FASSSALESORDER": [
|
||||
{
|
||||
"FDetailID": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"FRECEIVEBILLSRCENTRY": [
|
||||
{
|
||||
"FEntryID": 0
|
||||
}
|
||||
],
|
||||
"FBILLRECEIVABLEENTRY": [
|
||||
{
|
||||
"FEntryID": 0
|
||||
}
|
||||
],
|
||||
"FBILLSKDRECENTRY": [
|
||||
{
|
||||
"FEntryID": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
34
k3cloud_mcp/k3cloud_mcp/demo_save.json
Normal file
34
k3cloud_mcp/k3cloud_mcp/demo_save.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"Model": {
|
||||
"FID": 0,
|
||||
"FBillTypeID": {
|
||||
"FNUMBER": "SKDLX02_SYS"
|
||||
},
|
||||
"FBillNo": "1211",
|
||||
"FPAYORGID": {
|
||||
"FNumber": "100"
|
||||
},
|
||||
"FDATE": "2026-05-02",
|
||||
"FCONTACTUNITTYPE": "BD_Empinfo",
|
||||
"FCONTACTUNIT": {
|
||||
"FNumber": "220804"
|
||||
},
|
||||
"FPAYUNITTYPE": "BD_Empinfo",
|
||||
"FCURRENCYID": {
|
||||
"FNumber": "PRE001"
|
||||
},
|
||||
"FRECEIVEBILLENTRY": [
|
||||
{
|
||||
"FEntryID": 0,
|
||||
"FRECAMOUNTFOR_E": 123.0,
|
||||
"FRECTOTALAMOUNTFOR": 123456.0,
|
||||
"FSETTLETYPEID": {
|
||||
"FNumber": "JSFS01_SYS"
|
||||
},
|
||||
"FPURPOSEID": {
|
||||
"FNumber": "SFKYT004"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@ from typing import Any
|
||||
|
||||
CURRENT_DIR = Path(__file__).resolve().parent
|
||||
PROJECT_ROOT = CURRENT_DIR.parent
|
||||
DEFAULT_PAYLOAD_PATH = CURRENT_DIR / "demo.json"
|
||||
DEFAULT_PAYLOAD_PATH = CURRENT_DIR / "demo_save.json"
|
||||
MCP_SERVER_PATH = PROJECT_ROOT / "mcp-server.json"
|
||||
|
||||
|
||||
6
k3cloud_mcp/k3cloud_mcp/demo_view.json
Normal file
6
k3cloud_mcp/k3cloud_mcp/demo_view.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"CreateOrgId": 0,
|
||||
"Number": "SKD00126864",
|
||||
"Id": "",
|
||||
"IsSortBySeq": "false"
|
||||
}
|
||||
72
k3cloud_mcp/k3cloud_mcp/demo_view.py
Normal file
72
k3cloud_mcp/k3cloud_mcp/demo_view.py
Normal file
@@ -0,0 +1,72 @@
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
|
||||
CURRENT_DIR = Path(__file__).resolve().parent
|
||||
PROJECT_ROOT = CURRENT_DIR.parent
|
||||
DEFAULT_PAYLOAD_PATH = CURRENT_DIR / "demo_view.json"
|
||||
MCP_SERVER_PATH = PROJECT_ROOT / "mcp-server.json"
|
||||
|
||||
|
||||
def _ensure_project_root_on_path() -> None:
|
||||
root = str(PROJECT_ROOT)
|
||||
if root not in sys.path:
|
||||
sys.path.insert(0, root)
|
||||
|
||||
|
||||
def _load_payload(payload_path: Path) -> Any:
|
||||
raw_text = payload_path.read_text(encoding="utf-8").strip()
|
||||
if not raw_text:
|
||||
raise ValueError(f"payload 文件为空: {payload_path}")
|
||||
return json.loads(raw_text)
|
||||
|
||||
|
||||
def _bootstrap_env_from_mcp_server() -> None:
|
||||
if not MCP_SERVER_PATH.exists():
|
||||
return
|
||||
|
||||
data = json.loads(MCP_SERVER_PATH.read_text(encoding="utf-8"))
|
||||
env_map = data.get("mcpServers", {}).get("k3cloud-mcp", {}).get("env", {})
|
||||
for key, value in env_map.items():
|
||||
if key not in os.environ and value is not None:
|
||||
os.environ[key] = str(value)
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(
|
||||
description="读取 payload JSON 并直接调用 k3cloud_mcp.client.view()"
|
||||
)
|
||||
parser.add_argument("formid", help="K3Cloud 表单标识,例如 BD_Customer")
|
||||
parser.add_argument(
|
||||
"--payload",
|
||||
default=str(DEFAULT_PAYLOAD_PATH),
|
||||
help="payload JSON 文件路径,默认读取同级 demo_view.json",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--timeout",
|
||||
type=int,
|
||||
default=30,
|
||||
help="请求超时时间,单位秒,默认 30",
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
payload_path = Path(args.payload).expanduser().resolve()
|
||||
_ensure_project_root_on_path()
|
||||
_bootstrap_env_from_mcp_server()
|
||||
|
||||
from k3cloud_mcp.client import view
|
||||
|
||||
result = view(
|
||||
formid=args.formid,
|
||||
payload=_load_payload(payload_path),
|
||||
timeout=args.timeout,
|
||||
)
|
||||
print(json.dumps(result, ensure_ascii=False, indent=2))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -3,7 +3,7 @@ from typing import Any, Dict, List
|
||||
|
||||
from mcp.types import TextContent, Tool
|
||||
|
||||
from .client import save
|
||||
from .client import save, view
|
||||
|
||||
tools = [
|
||||
Tool(
|
||||
@@ -28,17 +28,40 @@ tools = [
|
||||
},
|
||||
"required": ["formid", "data_payload"],
|
||||
},
|
||||
)
|
||||
),
|
||||
Tool(
|
||||
name="view_form",
|
||||
description="调用金蝶云星空 DynamicFormService.View 接口查看单据。",
|
||||
inputSchema={
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"formid": {
|
||||
"type": "string",
|
||||
"description": "业务对象表单 Id,例如 SAL_QUOTATION",
|
||||
},
|
||||
"payload": {
|
||||
"description": "View 接口的 payload 参数,支持 JSON 对象或 JSON 字符串",
|
||||
},
|
||||
"timeout": {
|
||||
"type": "integer",
|
||||
"description": "HTTP 超时时间(秒),默认 30",
|
||||
"default": 30,
|
||||
"minimum": 1,
|
||||
},
|
||||
},
|
||||
"required": ["formid", "payload"],
|
||||
},
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
def _normalize_payload(value: object) -> Any:
|
||||
def _normalize_payload(value: object, field_name: str) -> Any:
|
||||
if value is None:
|
||||
raise ValueError("missing data_payload")
|
||||
raise ValueError(f"missing {field_name}")
|
||||
if isinstance(value, str):
|
||||
normalized = value.strip()
|
||||
if not normalized:
|
||||
raise ValueError("missing data_payload")
|
||||
raise ValueError(f"missing {field_name}")
|
||||
try:
|
||||
return json.loads(normalized)
|
||||
except json.JSONDecodeError:
|
||||
@@ -48,7 +71,7 @@ def _normalize_payload(value: object) -> Any:
|
||||
|
||||
async def handle_call_tool(name: str, arguments: Dict[str, object]) -> List[TextContent]:
|
||||
try:
|
||||
if name != "save_form":
|
||||
if name not in {"save_form", "view_form"}:
|
||||
raise ValueError(f"unknown tool name: {name}")
|
||||
|
||||
formid = str(arguments.get("formid", "")).strip()
|
||||
@@ -60,11 +83,18 @@ async def handle_call_tool(name: str, arguments: Dict[str, object]) -> List[Text
|
||||
if timeout <= 0:
|
||||
raise ValueError("timeout must be greater than 0")
|
||||
|
||||
result = save(
|
||||
formid=formid,
|
||||
data_payload=_normalize_payload(arguments.get("data_payload")),
|
||||
timeout=timeout,
|
||||
)
|
||||
if name == "save_form":
|
||||
result = save(
|
||||
formid=formid,
|
||||
data_payload=_normalize_payload(arguments.get("data_payload"), "data_payload"),
|
||||
timeout=timeout,
|
||||
)
|
||||
else:
|
||||
result = view(
|
||||
formid=formid,
|
||||
payload=_normalize_payload(arguments.get("payload"), "payload"),
|
||||
timeout=timeout,
|
||||
)
|
||||
return [
|
||||
TextContent(
|
||||
type="text",
|
||||
|
||||
47
k3cloud_mcp/k3cloud_mcp/userful_save.json
Normal file
47
k3cloud_mcp/k3cloud_mcp/userful_save.json
Normal file
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"NeedUpDateFields": [],
|
||||
"NeedReturnFields": [],
|
||||
"IsDeleteEntry": "true",
|
||||
"SubSystemId": "",
|
||||
"IsVerifyBaseDataField": "false",
|
||||
"IsEntryBatchFill": "true",
|
||||
"ValidateFlag": "true",
|
||||
"NumberSearch": "true",
|
||||
"IsAutoAdjustField": "false",
|
||||
"InterationFlags": "",
|
||||
"IgnoreInterationFlag": "",
|
||||
"IsControlPrecision": "false",
|
||||
"ValidateRepeatJson": "false",
|
||||
"Model": {
|
||||
"FID": 0,
|
||||
"FBillTypeID": {
|
||||
"FNUMBER": "SKDLX02_SYS" "--其他业务收款单"
|
||||
},
|
||||
"FBillNo": "3", "--单据编号"
|
||||
"FPAYORGID": {
|
||||
"FNumber": "100" "--收款组织"
|
||||
},
|
||||
"FDATE": "2026-05-02", "--业务日期"
|
||||
"FCONTACTUNITTYPE": "BD_Empinfo", "--往来单位类型"
|
||||
"FCONTACTUNIT": {
|
||||
"FNumber": "220804" "--往来单位"
|
||||
},
|
||||
"FPAYUNITTYPE": "BD_Empinfo", "--付款单位类型"
|
||||
"FCURRENCYID": {
|
||||
"FNumber": "PRE001" "--币别"
|
||||
},
|
||||
"FRECEIVEBILLENTRY": [
|
||||
{
|
||||
"FEntryID": 0,
|
||||
"FRECAMOUNTFOR_E": 123.0, "--收款金额"
|
||||
"FRECTOTALAMOUNTFOR": 123456.0, "--应收金额"
|
||||
"FSETTLETYPEID": {
|
||||
"FNumber": "JSFS01_SYS" "--结算方式 JSFS01_SYS 现金、JSFS04_SYS 电汇"
|
||||
},
|
||||
"FPURPOSEID": {
|
||||
"FNumber": "SFKYT004" "--收款用途 SFKYT10 内部往来-费用往来、SFKYT004 借支还款"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
631
k3cloud_mcp/k3cloud_mcp/view_result.json
Normal file
631
k3cloud_mcp/k3cloud_mcp/view_result.json
Normal file
@@ -0,0 +1,631 @@
|
||||
{
|
||||
"Result": {
|
||||
"ResponseStatus": {
|
||||
"IsSuccess": true
|
||||
},
|
||||
"Result": {
|
||||
"Id": 263989,
|
||||
"BILLNo": "SKD00126001",
|
||||
"DOCUMENTSTATUS": "C",
|
||||
"FCreatorId_Id": 121428040,
|
||||
"FCreatorId": {
|
||||
"Id": 121428040,
|
||||
"Name": "杨苏梅",
|
||||
"UserAccount": "杨苏梅"
|
||||
},
|
||||
"APPROVERID_Id": 676841452,
|
||||
"APPROVERID": {
|
||||
"Id": 676841452,
|
||||
"Name": "郑旭君",
|
||||
"UserAccount": "郑旭君"
|
||||
},
|
||||
"FCreateDate": "2025-01-14T14:56:23.627",
|
||||
"SETTLEORGID_Id": 1,
|
||||
"SETTLEORGID": {
|
||||
"Id": 1,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 1,
|
||||
"LocaleId": 2052,
|
||||
"Name": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"PkId": 100001,
|
||||
"LocaleId": 1033,
|
||||
"Name": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"PkId": 100002,
|
||||
"LocaleId": 3076,
|
||||
"Name": "海圆圆集团"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"Key": 1033,
|
||||
"Value": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"Key": 3076,
|
||||
"Value": "海圆圆集团"
|
||||
}
|
||||
],
|
||||
"Number": "100",
|
||||
"FRadio": null,
|
||||
"ParentOrg_Id": 1,
|
||||
"ParentOrg": {
|
||||
"Id": 1,
|
||||
"Number": "100",
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 1,
|
||||
"LocaleId": 2052,
|
||||
"Name": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"PkId": 100001,
|
||||
"LocaleId": 1033,
|
||||
"Name": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"PkId": 100002,
|
||||
"LocaleId": 3076,
|
||||
"Name": "海圆圆集团"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"Key": 1033,
|
||||
"Value": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"Key": 3076,
|
||||
"Value": "海圆圆集团"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"ApproveDate": "2025-01-15T08:53:57.68",
|
||||
"SALEORGID_Id": 0,
|
||||
"SALEORGID": null,
|
||||
"EXCHANGETYPE_Id": 1,
|
||||
"EXCHANGETYPE": {
|
||||
"Id": 1,
|
||||
"msterID": 1,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 1,
|
||||
"LocaleId": 2052,
|
||||
"Name": "固定汇率"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "固定汇率"
|
||||
}
|
||||
],
|
||||
"Number": "HLTX01_SYS",
|
||||
"Digits": 4,
|
||||
"ReverseDigits": 4
|
||||
},
|
||||
"RECEIVEAMOUNTFOR": 820000.0,
|
||||
"MAINBOOKCURID_Id": 1,
|
||||
"MAINBOOKCURID": {
|
||||
"Id": 1,
|
||||
"msterID": 1,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 2,
|
||||
"LocaleId": 2052,
|
||||
"Name": "人民币"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "人民币"
|
||||
}
|
||||
],
|
||||
"Number": "PRE001",
|
||||
"Sysmbol": "¥",
|
||||
"PriceDigits": 6,
|
||||
"AmountDigits": 2,
|
||||
"IsShowCSymbol": true,
|
||||
"FormatOrder": "1",
|
||||
"RoundType": "1"
|
||||
},
|
||||
"RECEIVEAMOUNT": 820000.0,
|
||||
"CURRENCYID_Id": 1,
|
||||
"CURRENCYID": {
|
||||
"Id": 1,
|
||||
"msterID": 1,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 2,
|
||||
"LocaleId": 2052,
|
||||
"Name": "人民币"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "人民币"
|
||||
}
|
||||
],
|
||||
"Number": "PRE001",
|
||||
"Sysmbol": "¥",
|
||||
"PriceDigits": 6,
|
||||
"AmountDigits": 2,
|
||||
"IsShowCSymbol": true,
|
||||
"FormatOrder": "1",
|
||||
"RoundType": "1"
|
||||
},
|
||||
"DATE": "2025-01-02T00:00:00",
|
||||
"FModifyDate": "2025-01-15T08:53:55.51",
|
||||
"ModifierId_Id": 676841452,
|
||||
"ModifierId": {
|
||||
"Id": 676841452,
|
||||
"Name": "郑旭君",
|
||||
"UserAccount": "郑旭君"
|
||||
},
|
||||
"EXCHANGERATE": 1.0,
|
||||
"WRITTENOFFSTATUS": "A",
|
||||
"SALEERID_Id": 0,
|
||||
"SALEERID": null,
|
||||
"SALEGROUPID_Id": 0,
|
||||
"SALEGROUPID": null,
|
||||
"SALEDEPTID_Id": 0,
|
||||
"SALEDEPTID": null,
|
||||
"BillTypeID_Id": "670b3608188c425a9f696d7ccb47843d",
|
||||
"BillTypeID": {
|
||||
"Id": "670b3608188c425a9f696d7ccb47843d",
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": "557479e6741c42469036c5548c9d9407",
|
||||
"LocaleId": 2052,
|
||||
"Name": "其他业务收款单"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "其他业务收款单"
|
||||
}
|
||||
],
|
||||
"Number": "SKDLX02_SYS"
|
||||
},
|
||||
"REALRECAMOUNTFOR": 820000.0,
|
||||
"REALRECAMOUNT": 820000.0,
|
||||
"ACCOUNTSYSTEM_Id": 0,
|
||||
"ACCOUNTSYSTEM": null,
|
||||
"CancelDate": null,
|
||||
"CancelStatus": "A",
|
||||
"CancellerId_Id": 0,
|
||||
"CancellerId": null,
|
||||
"CONTACTUNITTYPE": "BD_Empinfo",
|
||||
"CONTACTUNIT_Id": 279577322,
|
||||
"CONTACTUNIT": {
|
||||
"Id": 279577322,
|
||||
"msterID": 279577322,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 102684,
|
||||
"LocaleId": 2052,
|
||||
"Name": "吴喜燕"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "吴喜燕"
|
||||
}
|
||||
],
|
||||
"Number": "220804"
|
||||
},
|
||||
"PAYUNITTYPE": "BD_Empinfo",
|
||||
"PAYUNIT_Id": 279577322,
|
||||
"PAYUNIT": {
|
||||
"Id": 279577322,
|
||||
"msterID": 279577322,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 102684,
|
||||
"LocaleId": 2052,
|
||||
"Name": "吴喜燕"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "吴喜燕"
|
||||
}
|
||||
],
|
||||
"Number": "220804"
|
||||
},
|
||||
"BUSINESSTYPE": "3",
|
||||
"CreditCheckResult": "0",
|
||||
"ISINIT": false,
|
||||
"Department_Id": 0,
|
||||
"Department": null,
|
||||
"FPAYORGID_Id": 1,
|
||||
"FPAYORGID": {
|
||||
"Id": 1,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 1,
|
||||
"LocaleId": 2052,
|
||||
"Name": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"PkId": 100001,
|
||||
"LocaleId": 1033,
|
||||
"Name": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"PkId": 100002,
|
||||
"LocaleId": 3076,
|
||||
"Name": "海圆圆集团"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"Key": 1033,
|
||||
"Value": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"Key": 3076,
|
||||
"Value": "海圆圆集团"
|
||||
}
|
||||
],
|
||||
"Number": "100",
|
||||
"FRadio": null,
|
||||
"ParentOrg_Id": 1,
|
||||
"ParentOrg": {
|
||||
"Id": 1,
|
||||
"Number": "100",
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 1,
|
||||
"LocaleId": 2052,
|
||||
"Name": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"PkId": 100001,
|
||||
"LocaleId": 1033,
|
||||
"Name": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"PkId": 100002,
|
||||
"LocaleId": 3076,
|
||||
"Name": "海圆圆集团"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"Key": 1033,
|
||||
"Value": "海圆圆集团"
|
||||
},
|
||||
{
|
||||
"Key": 3076,
|
||||
"Value": "海圆圆集团"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"FIsSameOrg": true,
|
||||
"FSOURCESYSTEM": "0",
|
||||
"FCASHSALE": false,
|
||||
"SETTLECUR_Id": 1,
|
||||
"SETTLECUR": {
|
||||
"Id": 1,
|
||||
"msterID": 1,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 2,
|
||||
"LocaleId": 2052,
|
||||
"Name": "人民币"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "人民币"
|
||||
}
|
||||
],
|
||||
"Number": "PRE001",
|
||||
"Sysmbol": "¥",
|
||||
"PriceDigits": 6,
|
||||
"AmountDigits": 2,
|
||||
"IsShowCSymbol": true,
|
||||
"FormatOrder": "1",
|
||||
"RoundType": "1"
|
||||
},
|
||||
"SETTLERATE": 1.0,
|
||||
"RECAMOUNTFOR": 820000.0,
|
||||
"RECAMOUNT": 820000.0,
|
||||
"ISB2C": false,
|
||||
"WBSETTLENO": " ",
|
||||
"IsWriteOff": false,
|
||||
"MatchMethodID": 0,
|
||||
"FScanPoint_Id": 0,
|
||||
"FScanPoint": null,
|
||||
"FKDPAYNO": " ",
|
||||
"FREMARK": " ",
|
||||
"FTHIRDBILLNO": " ",
|
||||
"FSETTLEMAINBOOKID_Id": 1,
|
||||
"FSETTLEMAINBOOKID": {
|
||||
"Id": 1,
|
||||
"msterID": 1,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 2,
|
||||
"LocaleId": 2052,
|
||||
"Name": "人民币"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "人民币"
|
||||
}
|
||||
],
|
||||
"Number": "PRE001",
|
||||
"Sysmbol": "¥",
|
||||
"PriceDigits": 6,
|
||||
"AmountDigits": 2,
|
||||
"IsShowCSymbol": true,
|
||||
"FormatOrder": "1",
|
||||
"RoundType": "1"
|
||||
},
|
||||
"FSETTLEEXCHANGETYPE_Id": 1,
|
||||
"FSETTLEEXCHANGETYPE": {
|
||||
"Id": 1,
|
||||
"msterID": 1,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 1,
|
||||
"LocaleId": 2052,
|
||||
"Name": "固定汇率"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "固定汇率"
|
||||
}
|
||||
],
|
||||
"Number": "HLTX01_SYS",
|
||||
"Digits": 4,
|
||||
"ReverseDigits": 4
|
||||
},
|
||||
"FOUTCONTACTID_Id": 0,
|
||||
"FOUTCONTACTID": null,
|
||||
"FOUTCONTACTTYPE": " ",
|
||||
"FGYACCOUNTWATERID": 0,
|
||||
"FISCARRYRATE": false,
|
||||
"PRESETBASE1_Id": 0,
|
||||
"PRESETBASE1": null,
|
||||
"PRESETBASE2_Id": 0,
|
||||
"PRESETBASE2": null,
|
||||
"FPRESETASSISTANT1_Id": " ",
|
||||
"FPRESETASSISTANT1": null,
|
||||
"FPRESETASSISTANT2_Id": " ",
|
||||
"FPRESETASSISTANT2": null,
|
||||
"FPRESETTEXT1": " ",
|
||||
"FPRESETTEXT2": " ",
|
||||
"FISFROMSALORDER": false,
|
||||
"FVirIsSameAcctOrg": false,
|
||||
"SourceBillNumber": " ",
|
||||
"RECEIVEBILLENTRY": [
|
||||
{
|
||||
"Id": 288025,
|
||||
"Seq": 1,
|
||||
"SETTLETYPEID_Id": 1,
|
||||
"SETTLETYPEID": {
|
||||
"Id": 1,
|
||||
"msterID": 1,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 1,
|
||||
"LocaleId": 2052,
|
||||
"Name": "现金"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "现金"
|
||||
}
|
||||
],
|
||||
"Number": "JSFS01_SYS",
|
||||
"SETTLECATEGORY": "1",
|
||||
"TYPE": "1",
|
||||
"FRECBILLTYPE": " ",
|
||||
"FACCOUNTTYPE": " "
|
||||
},
|
||||
"SETTLERECAMOUNTFOR": 820000.0,
|
||||
"SETTLEDISTAMOUNTFOR": 0.0,
|
||||
"RECTOTALAMOUNTFOR": 820000.0,
|
||||
"SETTLERECAMOUNT": 820000.0,
|
||||
"SETTLEDISTAMOUNT": 0.0,
|
||||
"RECTOTALAMOUNT": 820000.0,
|
||||
"WRITTENOFFSTATUS": "A",
|
||||
"WRITTENOFFAMOUNTFOR": 0.0,
|
||||
"COMMENT": "收到吴喜燕归还借支款",
|
||||
"OPPOSITEBANKACCOUNT": " ",
|
||||
"OPPOSITECCOUNTNAME": " ",
|
||||
"RECEIVEITEM": " ",
|
||||
"HANDLINGCHARGEFOR": 0.0,
|
||||
"HANDLINGCHARGE": 0.0,
|
||||
"REALRECAMOUNTFOR": 820000.0,
|
||||
"FREALRECAMOUNT": 820000.0,
|
||||
"ASSTOTALAMOUNTFOR": 0.0,
|
||||
"RECEIVEITEMTYPE": " ",
|
||||
"SaleOrderID": 0,
|
||||
"ACCOUNTID_Id": 0,
|
||||
"ACCOUNTID": null,
|
||||
"OVERUNDERAMOUNTFOR": 0.0,
|
||||
"OPPOSITEBANKNAME": " ",
|
||||
"SETTLENO": " ",
|
||||
"BLEND": false,
|
||||
"PURPOSEID_Id": 266819,
|
||||
"PURPOSEID": {
|
||||
"Id": 266819,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 100005,
|
||||
"LocaleId": 2052,
|
||||
"Name": "借支还款"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "借支还款"
|
||||
}
|
||||
],
|
||||
"Number": "SFKYT004",
|
||||
"RECPAYTYPE": "0",
|
||||
"BUSINESSTYPE": "3",
|
||||
"FINMANEGEMENT": true,
|
||||
"FPAYMENTADVANCE": false
|
||||
},
|
||||
"OVERUNDERAMOUNT": 0.0,
|
||||
"FINNERACCOUNTID_Id": 0,
|
||||
"FINNERACCOUNTID": null,
|
||||
"ReFundAmount": 0.0,
|
||||
"CashAccount_Id": 100402,
|
||||
"CashAccount": {
|
||||
"Id": 100402,
|
||||
"msterID": 100402,
|
||||
"MultiLanguageText": [
|
||||
{
|
||||
"PkId": 100001,
|
||||
"LocaleId": 2052,
|
||||
"Name": "海圆圆"
|
||||
}
|
||||
],
|
||||
"Name": [
|
||||
{
|
||||
"Key": 2052,
|
||||
"Value": "海圆圆"
|
||||
}
|
||||
],
|
||||
"Number": "海圆圆"
|
||||
},
|
||||
"RECAMOUNTFOR_E": 820000.0,
|
||||
"RECAMOUNT_E": 820000.0,
|
||||
"FPOSTDATE": "2025-01-02T00:00:00",
|
||||
"FISPOST": true,
|
||||
"FMATERIALID_Id": 0,
|
||||
"FMATERIALID": null,
|
||||
"FSALEORDERNO": " ",
|
||||
"FMATERIALSEQ": 0,
|
||||
"FORDERENTRYID": 0,
|
||||
"TOPAYMENTAMOUNTFOR": 0.0,
|
||||
"FWRITTENOFFAMOUNT": 0.0,
|
||||
"FNOTVERIFICATEAMOUNT": 820000.0,
|
||||
"FPRICEUNITID_Id": 0,
|
||||
"FPRICEUNITID": null,
|
||||
"FPrice": 0.0,
|
||||
"FQty": 0.0,
|
||||
"COSTID_Id": 0,
|
||||
"COSTID": null,
|
||||
"COSTDEPARTMENTID_Id": 0,
|
||||
"COSTDEPARTMENTID": null,
|
||||
"FLINKROWID": " ",
|
||||
"FSALEORDERBASE_Id": 0,
|
||||
"FSALEORDERBASE": null,
|
||||
"FRelateReFundAmount": 0.0,
|
||||
"ENTRYTAXRATE": 0.0,
|
||||
"TAXAMOUNTFOR": 0.0,
|
||||
"TAXAMOUNT": 0.0,
|
||||
"RECNOTAXAMOUNTFOR": 820000.0,
|
||||
"RECNOTAXAMOUNT": 820000.0,
|
||||
"WRITTENOFFTAXAMOUNTFOR": 0.0,
|
||||
"FWRITTENOFFTAXAMOUNT": 0.0,
|
||||
"FSALEORDERNUMBER": null,
|
||||
"AR_ASSSALESORDER": []
|
||||
}
|
||||
],
|
||||
"RECEIVEBILLSRCENTRY": [
|
||||
{
|
||||
"Id": 0,
|
||||
"Seq": 1,
|
||||
"SRCBILLID": 0,
|
||||
"AFTTAXTOTALAMOUNT": 0.0,
|
||||
"SRCSETTLETYPEID_Id": 0,
|
||||
"SRCSETTLETYPEID": null,
|
||||
"SRCCURRENCYID_Id": 0,
|
||||
"SRCCURRENCYID": null,
|
||||
"EXPIRY": null,
|
||||
"PLANRECAMOUNT": 0.0,
|
||||
"REALRECAMOUNT": 0.0,
|
||||
"SRCBILLTYPEID": "",
|
||||
"SRCBILLNO": null,
|
||||
"SRCSEQ": 0,
|
||||
"SRCROWID": 0,
|
||||
"ORDERBILLNO": null,
|
||||
"FSRCMATERIALID_Id": 0,
|
||||
"FSRCMATERIALID": null,
|
||||
"FSRCMATERIALSEQ": 0,
|
||||
"FSRCORDERENTRYID": 0,
|
||||
"FSETTLEAMOUNT": 0.0,
|
||||
"FREALRECAMOUNTFOR": 0.0,
|
||||
"FSRCPRICEUNITID_Id": 0,
|
||||
"FSRCPRICEUNITID": null,
|
||||
"FSRCPRICE": 0.0,
|
||||
"FSRCQTY": 0.0,
|
||||
"SRCCOSTID_Id": 0,
|
||||
"SRCCOSTID": null,
|
||||
"SRCCOSTDEPARTMENTID_Id": 0,
|
||||
"SRCCOSTDEPARTMENTID": null,
|
||||
"FSRCLINKROWID": null,
|
||||
"SRCREMARK": null,
|
||||
"FASSORDERAMOUNT": 0.0,
|
||||
"FSRCPURPOSEID_Id": 0,
|
||||
"FSRCPURPOSEID": null,
|
||||
"FRECEIVEBILLSRCENTRY_Link": []
|
||||
}
|
||||
],
|
||||
"RECEIVEBILLREC": [
|
||||
{
|
||||
"Id": 0,
|
||||
"Seq": 1,
|
||||
"BILLID_Id": 0,
|
||||
"BILLID": null,
|
||||
"PARLEFTAMOUNTFOR": 0.0,
|
||||
"USEDAMOUNTFOR": 0.0,
|
||||
"FInnerAccountID_B_Id": 0,
|
||||
"FInnerAccountID_B": null,
|
||||
"FTempOrgId_Id": 0,
|
||||
"FTempOrgId": null,
|
||||
"FBPBILLNUMBER": null,
|
||||
"BILLPARAMOUNT": 0.0,
|
||||
"PARLEFTAMOUNTSTD": 0.0,
|
||||
"USEDAMOUNTSTD": 0.0,
|
||||
"FBPBILLPARAMOUNT": 0.0
|
||||
}
|
||||
],
|
||||
"BILLSKDRECEIVABLEENTRY": [],
|
||||
"BOS_ConvertTakeDataInfo": null
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user