update
This commit is contained in:
parent
14d9136a3b
commit
d1f335d6a2
|
|
@ -77,4 +77,42 @@ class SeeyonClient(BaseClient):
|
||||||
return super().request(method, path, headers=headers, **kwargs)
|
return super().request(method, path, headers=headers, **kwargs)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
def export_cap4_form_soap(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
templateCode: str,
|
||||||
|
senderLoginName: str | None = None,
|
||||||
|
rightId: str | None = None,
|
||||||
|
doTrigger: str | bool | None = None,
|
||||||
|
param: str | None = None,
|
||||||
|
extra: dict[str, Any] | None = None,
|
||||||
|
) -> httpx.Response:
|
||||||
|
"""
|
||||||
|
无流程表单导出(CAP4):
|
||||||
|
POST /seeyon/rest/cap4/form/soap/export
|
||||||
|
|
||||||
|
返回 httpx.Response,调用方可自行读取 resp.text / resp.headers 等信息。
|
||||||
|
"""
|
||||||
|
body: dict[str, Any] = {"templateCode": templateCode}
|
||||||
|
if senderLoginName:
|
||||||
|
body["senderLoginName"] = senderLoginName
|
||||||
|
if rightId:
|
||||||
|
body["rightId"] = rightId
|
||||||
|
if doTrigger is not None:
|
||||||
|
body["doTrigger"] = doTrigger
|
||||||
|
if param is not None:
|
||||||
|
body["param"] = param
|
||||||
|
if extra:
|
||||||
|
# 兜底扩展字段:仅当 key 不冲突时注入,避免覆盖已显式指定的参数
|
||||||
|
for k, v in extra.items():
|
||||||
|
if k not in body:
|
||||||
|
body[k] = v
|
||||||
|
|
||||||
|
return self.request(
|
||||||
|
"POST",
|
||||||
|
"/seeyon/rest/cap4/form/soap/export",
|
||||||
|
json=body,
|
||||||
|
headers={"Content-Type": "application/json"},
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -56,3 +56,91 @@ class SyncOAToDidiTokenJob(BaseJob):
|
||||||
return {"token_masked": masked, "loginName": login_name or "", "base_url": base_url}
|
return {"token_masked": masked, "loginName": login_name or "", "base_url": base_url}
|
||||||
|
|
||||||
|
|
||||||
|
class SyncOAToDidiExportFormJob(BaseJob):
|
||||||
|
"""
|
||||||
|
无流程表单导出(CAP4):
|
||||||
|
- 调用:POST /seeyon/rest/cap4/form/soap/export
|
||||||
|
- base_url 不包含 /seeyon/rest(例如 https://oa.example.com:8090)
|
||||||
|
|
||||||
|
public_cfg:
|
||||||
|
- base_url: "https://oa.example.com:8090"
|
||||||
|
- templateCode: "employee"
|
||||||
|
- senderLoginName: "xxx" (可选)
|
||||||
|
- rightId: "xxx" (可选)
|
||||||
|
- doTrigger: "true" (可选)
|
||||||
|
- param: "0" (可选)
|
||||||
|
- extra: {...} (可选,兜底扩展字段)
|
||||||
|
|
||||||
|
secret_cfg (解密后):
|
||||||
|
- rest_user
|
||||||
|
- rest_password
|
||||||
|
- loginName (可选)
|
||||||
|
"""
|
||||||
|
|
||||||
|
job_id = "sync_oa_to_didi.export_form_soap"
|
||||||
|
|
||||||
|
def run(self, params: dict[str, Any], secrets: dict[str, Any]) -> dict[str, Any]:
|
||||||
|
base_url = str(params.get("base_url") or "").strip()
|
||||||
|
if not base_url:
|
||||||
|
raise ValueError("public_cfg.base_url is required")
|
||||||
|
|
||||||
|
template_code = str(params.get("templateCode") or "").strip()
|
||||||
|
if not template_code:
|
||||||
|
raise ValueError("public_cfg.templateCode is required")
|
||||||
|
|
||||||
|
sender_login_name = params.get("senderLoginName")
|
||||||
|
sender_login_name = str(sender_login_name).strip() if sender_login_name else None
|
||||||
|
|
||||||
|
right_id = params.get("rightId")
|
||||||
|
right_id = str(right_id).strip() if right_id else None
|
||||||
|
|
||||||
|
do_trigger = params.get("doTrigger")
|
||||||
|
param = params.get("param")
|
||||||
|
param = str(param) if param is not None else None
|
||||||
|
|
||||||
|
extra = params.get("extra")
|
||||||
|
if extra is not None and not isinstance(extra, dict):
|
||||||
|
raise ValueError("public_cfg.extra must be a JSON object (dict) if provided")
|
||||||
|
|
||||||
|
rest_user = str(secrets.get("rest_user") or "").strip()
|
||||||
|
rest_password = str(secrets.get("rest_password") or "").strip()
|
||||||
|
login_name = secrets.get("loginName")
|
||||||
|
login_name = str(login_name).strip() if login_name else None
|
||||||
|
|
||||||
|
if not rest_user or not rest_password:
|
||||||
|
raise ValueError("secret_cfg.rest_user and secret_cfg.rest_password are required")
|
||||||
|
|
||||||
|
client = SeeyonClient(base_url=base_url, rest_user=rest_user, rest_password=rest_password, loginName=login_name)
|
||||||
|
try:
|
||||||
|
resp = client.export_cap4_form_soap(
|
||||||
|
templateCode=template_code,
|
||||||
|
senderLoginName=sender_login_name,
|
||||||
|
rightId=right_id,
|
||||||
|
doTrigger=do_trigger,
|
||||||
|
param=param,
|
||||||
|
extra=extra,
|
||||||
|
)
|
||||||
|
raw_text = resp.text or ""
|
||||||
|
content_type = resp.headers.get("content-type", "") if getattr(resp, "headers", None) else ""
|
||||||
|
finally:
|
||||||
|
client.close()
|
||||||
|
|
||||||
|
# 避免把 raw_text 打到日志或 run_log(会被截断且污染 JobLog)
|
||||||
|
logger.info(
|
||||||
|
"Seeyon export_form_soap done templateCode=%s content_length=%s content_type=%s base_url=%s",
|
||||||
|
template_code,
|
||||||
|
len(raw_text),
|
||||||
|
content_type,
|
||||||
|
base_url,
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
"raw": raw_text,
|
||||||
|
"meta": {
|
||||||
|
"templateCode": template_code,
|
||||||
|
"content_length": len(raw_text),
|
||||||
|
"content_type": content_type,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue