feat: input-driven contract create RPA with dry_run support

This commit is contained in:
34BFF76918A9449ABAB323149DDCEA73 2026-08-13 14:46:00 +08:00
parent d4a7da2647
commit 6e32177f70
6 changed files with 169 additions and 426 deletions

308
Main.seq
View File

@ -4,9 +4,9 @@
"LineColor": "255, 255, 255", "LineColor": "255, 255, 255",
"LineCommented": 0, "LineCommented": 0,
"LineEnd": { "LineEnd": {
"Pidx": "20260812200005/EPin_Flow_In", "Pidx": "20260813200000/EPin_Flow_In",
"Px": "512", "Px": "512",
"Py": "870" "Py": "300"
}, },
"LineNote": "", "LineNote": "",
"LineSplit": { "LineSplit": {
@ -14,140 +14,33 @@
"Py": "" "Py": ""
}, },
"LineStart": { "LineStart": {
"Pidx": "20260812200004/EPin_Flow_Out", "Pidx": "20260813100000/EPin_Flow_Out",
"Px": "642",
"Py": "750"
},
"LineTag": "20260812300005",
"LineType": 0
},
{
"LineColor": "255, 255, 255",
"LineCommented": 0,
"LineEnd": {
"Pidx": "20260812200004/EPin_Flow_In",
"Px": "512",
"Py": "750"
},
"LineNote": "",
"LineSplit": {
"Px": "",
"Py": ""
},
"LineStart": {
"Pidx": "20260812200003/EPin_Flow_Out",
"Px": "642",
"Py": "630"
},
"LineTag": "20260812300004",
"LineType": 0
},
{
"LineColor": "255, 255, 255",
"LineCommented": 0,
"LineEnd": {
"Pidx": "20260812200003/EPin_Flow_In",
"Px": "512",
"Py": "630"
},
"LineNote": "",
"LineSplit": {
"Px": "",
"Py": ""
},
"LineStart": {
"Pidx": "20260812200002/EPin_Flow_Out",
"Px": "642",
"Py": "510"
},
"LineTag": "20260812300003",
"LineType": 0
},
{
"LineColor": "255, 255, 255",
"LineCommented": 0,
"LineEnd": {
"Pidx": "20260812200002/EPin_Flow_In",
"Px": "512",
"Py": "510"
},
"LineNote": "",
"LineSplit": {
"Px": "",
"Py": ""
},
"LineStart": {
"Pidx": "20260812200001/EPin_Flow_Out",
"Px": "642",
"Py": "390"
},
"LineTag": "20260812300002",
"LineType": 0
},
{
"LineColor": "255, 255, 255",
"LineCommented": 0,
"LineEnd": {
"Pidx": "20260812200001/EPin_Flow_In",
"Px": "512",
"Py": "390"
},
"LineNote": "",
"LineSplit": {
"Px": "",
"Py": ""
},
"LineStart": {
"Pidx": "20260812200000/EPin_Flow_Out",
"Px": "642",
"Py": "270"
},
"LineTag": "20260812300001",
"LineType": 0
},
{
"LineColor": "255, 255, 255",
"LineCommented": 0,
"LineEnd": {
"Pidx": "20260812200000/EPin_Flow_In",
"Px": "512",
"Py": "270"
},
"LineNote": "",
"LineSplit": {
"Px": "",
"Py": ""
},
"LineStart": {
"Pidx": "20260812100000/EPin_Flow_Out",
"Px": "457", "Px": "457",
"Py": "246" "Py": "246"
}, },
"LineTag": "20260812300000", "LineTag": "20260813300000",
"LineType": 0 "LineType": 0
} }
], ],
"NodeList": [ "NodeList": [
{ {
"NodePanelData": { "NodePanelData": {
"ExpandedGroups": [ "ExpandedGroups": [],
],
"InputProperty": { "InputProperty": {
"mouse_x": 0, "mouse_x": 0,
"mouse_y": 0 "mouse_y": 0
}, },
"PubProperty": "", "PubProperty": "",
"RetPins": [ "RetPins": []
]
}, },
"NodeProperty": { "NodeProperty": {
"EP_CONTROL": { "EP_CONTROL": {
"EP_CONTROL_IMPORT": "{\n \"PImport\": \"\",\n \"PBCode\": \"ZnJvbSBycGFfeWlzYWlxaS5jb250cmFjdF9mbG93X3N0ZXBzIGltcG9ydCAoCiAgICBmaWxsX2NvbnRyYWN0X2dvb2RzX2xpbmVzLCBmaWxsX2NvbnRyYWN0X3BheW1lbnRfaW5mbywKICAgIHVwbG9hZF9jb250cmFjdF9kb2N1bWVudF9pZl9uZWVkZWQsIHN1Ym1pdF9jb250cmFjdF9mb3JfYXBwcm92YWwsCiAgICByZWFkX2NvbnRyYWN0X251bWJlcgopCgphZGFwdGVyID0gc2VsZi5fYWRhcHRlcgoKcHJpbnQoIltTMDldIOWhq+WGmei0p+WTgeaYjue7hi4uLiIpCmZpbGxfY29udHJhY3RfZ29vZHNfbGluZXMoYWRhcHRlciwgc2VsZi5fY3R4KQpwcmludChmIltPS10g6LSn5ZOBOiB7bGVuKHNlbGYuX2N0eC5nb29kc19saW5lcyl9IOihjCIpCnByaW50KCJbUzEwXSDloavlhpnku5jmrL7kv6Hmga8uLi4iKQpmaWxsX2NvbnRyYWN0X3BheW1lbnRfaW5mbyhhZGFwdGVyLCBzZWxmLl9jdHgpCnByaW50KGYiW09LXSDku5jmrL7mlrnlvI89e3NlbGYuX2N0eC5wYXltZW50X21ldGhvZH0iKQoKaWYgc2VsZi5fY3R4LnNvdXJjZV90eXBlID09ICJZWUMiOgogICAgcHJpbnQoIltTMTFdIOWQiOW5tlBERiBbWVlD5LiT5bGeXS4uLiAo5Y2VUERGLCDot7Pov4flkIjlubYpIikKICAgIHByaW50KCJbUzEyXSDkuIrkvKBQREbpmYTku7YgW1lZQ+S4k+Wxnl0uLi4gKGRyeV9ydW4g6Lez6L+HKSIpCgpwcmludCgpCnByaW50KCJbUzEzXSDmj5DkuqTlrqHmibkuLi4iKQppZiBub3Qgc3VibWl0X2NvbnRyYWN0X2Zvcl9hcHByb3ZhbChhZGFwdGVyLCBzZWxmLl9jdHgpOgogICAgcHJpbnQoIltEUlktUlVOXSDmvJTnu4PmqKHlvI/vvIzot7Pov4flrp7pmYXmj5DkuqQiKQogICAgcHJpbnQoIj0iICogNjApCiAgICBwcmludCgi5ZCI5ZCM5bu65Y2V5rWB56iL5ryU57uD5a6M5oiQIikKICAgIHByaW50KCI9IiAqIDYwKQplbHNlOgogICAgcHJpbnQoIltTMTRdIOivu+WPluWQiOWQjOe8luWPty4uLiIpCiAgICBjb250cmFjdF9ubyA9IHJlYWRfY29udHJhY3RfbnVtYmVyKGFkYXB0ZXIpCiAgICBwcmludChmIltPS10g5ZCI5ZCM57yW5Y+3OiB7Y29udHJhY3Rfbm99IikKICAgIHByaW50KCI9IiAqIDYwKQogICAgcHJpbnQoZiJbQ09NUExFVEVEXSDlkIjlkIzliJvlu7rmiJDlip86IHtjb250cmFjdF9ub30iKQogICAgcHJpbnQoIj0iICogNjApCg==\"\n}" "EP_CONTROL_IMPORT": "{\n \"PImport\": \"\",\n \"PBCode\": \"aW1wb3J0IHN5cywgb3MsIGpzb24KZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCgpfQ09ERVNfRElSID0gUGF0aChyJ2Q6XFJQQVxBdXRvUnBhXGNvZGVzJykKaWYgc3RyKF9DT0RFU19ESVIpIG5vdCBpbiBzeXMucGF0aDoKICAgIHN5cy5wYXRoLmluc2VydCgwLCBzdHIoX0NPREVTX0RJUikpCgpmcm9tIHJwYV95aXNhaXFpLmNvbnRyYWN0X2NyZWF0ZV9ub2RlIGltcG9ydCAoCiAgICBDb250cmFjdENyZWF0ZUVycm9yLCBsb2FkX2lucHV0X2RhdGEsIHJ1bl9jb250cmFjdF9jcmVhdGUsCikKCmRlZiBfZmlyc3QoKnZhbHVlcyk6CiAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgogICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lIGFuZCBzdHIodmFsdWUpLnN0cmlwKCk6CiAgICAgICAgICAgIHJldHVybiBzdHIodmFsdWUpLnN0cmlwKCkKICAgIHJldHVybiAiIgoKcmF3ID0gKHNlbGYuaW5wdXRfYXJnIG9yICIiKS5zdHJpcCgpCmlmIG5vdCByYXc6CiAgICByYWlzZSBDb250cmFjdENyZWF0ZUVycm9yKCLnvLrlsJHkuJrliqHlhaXlj4LvvJror7fpgJrov4cgLWkvLS1pbnB1dCDkvKDlhaUgSlNPTiDlrZfnrKbkuLLmiJbmlofku7bot6/lvoQiKQoKZGF0YSA9IGxvYWRfaW5wdXRfZGF0YShyYXcpCgpzdGF0ZV9jZW50ZXJfdXJsID0gX2ZpcnN0KAogICAgZGF0YS5nZXQoInN0YXRlQ2VudGVyVXJsIiksIGRhdGEuZ2V0KCJzdGF0ZUNlbnRlclVSTCIpLAogICAgb3MuZ2V0ZW52KCJTVEFURV9DRU5URVJfVVJMIiksICJodHRwOi8vMTI3LjAuMC4xOjgwMDAiLAopCmFnZW50X3Rva2VuID0gX2ZpcnN0KAogICAgZGF0YS5nZXQoImFnZW50VG9rZW4iKSwgb3MuZ2V0ZW52KCJBR0VOVF9UT0tFTiIpLCAiZGV2LWFnZW50LXRva2VuIiwKKQoKcHJpbnQoIj0iICogNjApCnByaW50KCLlkIjlkIzlu7rljZUgQ09OVFJBQ1RfQ1JFQVRFIC0g5byA5aeLIikKcHJpbnQoImpvYklkPSVzIHNvdXJjZVR5cGU9JXMgc3VibWl0TW9kZT0lcyIgJSAoCiAgICBkYXRhLmdldCgiam9iSWQiKSwgZGF0YS5nZXQoInNvdXJjZVR5cGUiKSwgZGF0YS5nZXQoInN1Ym1pdE1vZGUiKSkpCnByaW50KCI9IiAqIDYwKQoKcmVzdWx0ID0gcnVuX2NvbnRyYWN0X2NyZWF0ZSgKICAgIGRhdGEsCiAgICBzdGF0ZV9jZW50ZXJfdXJsPXN0YXRlX2NlbnRlcl91cmwsCiAgICBhZ2VudF90b2tlbj1hZ2VudF90b2tlbiwKKQpwcmludChqc29uLmR1bXBzKHJlc3VsdCwgZW5zdXJlX2FzY2lpPUZhbHNlKSkK\"\n}"
}, },
"EP_Gen": { "EP_Gen": {
"EP_Gen_AFTERDELAY": "{\n \"val\": \"MA==\"\n}", "EP_Gen_AFTERDELAY": "{\n \"val\": \"MA==\"\n}",
"EP_Gen_BEFOREDELAY": "{\n \"val\": \"MA==\"\n}", "EP_Gen_BEFOREDELAY": "{\n \"val\": \"MA==\"\n}",
"EP_Gen_NOTE": "{\n \"val\": \"5aGr5YaZ6LSn5ZOB5piO57uG44CB5LuY5qy+5L+h5oGv5bm25o+Q5Lqk\"\n}" "EP_Gen_NOTE": "{\n \"val\": \"6K+75Y+W5YWl5Y+C5bm25omn6KGMIENPTlRSQUNUX0NSRUFURe+8iOWQq+eKtuaAgeS4reW/g+Wbnuiwg++8iQ==\"\n}"
} }
}, },
"NodeUI": { "NodeUI": {
@ -155,188 +48,21 @@
"NodeModel": "2", "NodeModel": "2",
"NodePropErr": false, "NodePropErr": false,
"NodePx": "515", "NodePx": "515",
"NodePy": "830", "NodePy": "270",
"NodeSubType": "EnumWidget_Code_Custom", "NodeSubType": "EnumWidget_Code_Custom",
"NodeTag": "20260812200005", "NodeTag": "20260813200000",
"NodeTitle": "插入代码块#1" "NodeTitle": "读取入参并执行合同建单"
} }
}, },
{ {
"NodePanelData": { "NodePanelData": {
"ExpandedGroups": [ "ExpandedGroups": [],
],
"InputProperty": { "InputProperty": {
"mouse_x": 0, "mouse_x": 0,
"mouse_y": 0 "mouse_y": 0
}, },
"PubProperty": "", "PubProperty": "",
"RetPins": [ "RetPins": []
]
},
"NodeProperty": {
"EP_CONTROL": {
"EP_CONTROL_IMPORT": "{\n \"PImport\": \"\",\n \"PBCode\": \"ZnJvbSBycGFfeWlzYWlxaS5jb250cmFjdF9mbG93X3N0ZXBzIGltcG9ydCBmaWxsX2NvbnRyYWN0X2Jhc2ljX2luZm8sIGZpbGxfY29udHJhY3RfYW1vdW50X2FuZF9kYXRlcwoKYWRhcHRlciA9IHNlbGYuX2FkYXB0ZXIKCnByaW50KCJbUzA3XSDloavlhpnln7rnoYDooajljZUuLi4iKQpmaWxsX2NvbnRyYWN0X2Jhc2ljX2luZm8oYWRhcHRlciwgc2VsZi5fY3R4KQpwcmludChmIltPS10g57G75YirPXtzZWxmLl9jdHguY29udHJhY3RfY2F0ZWdvcnl9LCDnu5Pnrpc9e3NlbGYuX2N0eC5zZXR0bGVtZW50X3R5cGV9IikKcHJpbnQoIltTMDhdIOWhq+WGmemHkemineS4juaXpeacny4uLiIpCmZpbGxfY29udHJhY3RfYW1vdW50X2FuZF9kYXRlcyhhZGFwdGVyLCBzZWxmLl9jdHgpCnByaW50KGYiW09LXSDph5Hpop09e3NlbGYuX2N0eC5hbW91bnR9LCDnu5PmnZ/ml6XmnJ89e3NlbGYuX2N0eC5jb250cmFjdF9lbmRfZGF0ZX0iKQo=\"\n}"
},
"EP_Gen": {
"EP_Gen_AFTERDELAY": "{\n \"val\": \"MA==\"\n}",
"EP_Gen_BEFOREDELAY": "{\n \"val\": \"MA==\"\n}",
"EP_Gen_NOTE": "{\n \"val\": \"5aGr5YaZ5ZCI5ZCM57G75Yir44CB6YeR6aKd44CB5pel5pyf\"\n}"
}
},
"NodeUI": {
"NodeElementID": "",
"NodeModel": "2",
"NodePropErr": false,
"NodePx": "515",
"NodePy": "710",
"NodeSubType": "EnumWidget_Code_Custom",
"NodeTag": "20260812200004",
"NodeTitle": "插入代码块#1"
}
},
{
"NodePanelData": {
"ExpandedGroups": [
],
"InputProperty": {
"mouse_x": 0,
"mouse_y": 0
},
"PubProperty": "",
"RetPins": [
]
},
"NodeProperty": {
"EP_CONTROL": {
"EP_CONTROL_IMPORT": "{\n \"PImport\": \"\",\n \"PBCode\": \"ZnJvbSBycGFfeWlzYWlxaS5jb250cmFjdF9mbG93X3N0ZXBzIGltcG9ydCBzZWxlY3RfY29udHJhY3RfdGVtcGxhdGUsIGZpbGxfY29udHJhY3Rfc2lnbmF0b3J5X2luZm8KCmFkYXB0ZXIgPSBzZWxmLl9hZGFwdGVyCgpwcmludCgiW1MwNV0g6YCJ5oup5ZCI5ZCM5qih5p2/Li4uIikKc2VsZWN0X2NvbnRyYWN0X3RlbXBsYXRlKGFkYXB0ZXIsIHNlbGYuX2N0eCkKcHJpbnQoZiJbT0tdIOaooeadvzoge3NlbGYuX2N0eC50ZW1wbGF0ZV9uYW1lfSIpCnByaW50KCJbUzA2XSDloavlhpnnrb7nuqbmlrnkv6Hmga8uLi4iKQpmaWxsX2NvbnRyYWN0X3NpZ25hdG9yeV9pbmZvKGFkYXB0ZXIsIHNlbGYuX2N0eCkKcHJpbnQoZiJbT0tdIOetvue6puaWuToge3NlbGYuX2N0eC5jdXN0b21lcl9uYW1lfSIpCg==\"\n}"
},
"EP_Gen": {
"EP_Gen_AFTERDELAY": "{\n \"val\": \"MA==\"\n}",
"EP_Gen_BEFOREDELAY": "{\n \"val\": \"MA==\"\n}",
"EP_Gen_NOTE": "{\n \"val\": \"6YCJ5oup5qih5p2/5bm25aGr5YaZ562+57qm5pa55L+h5oGv\"\n}"
}
},
"NodeUI": {
"NodeElementID": "",
"NodeModel": "2",
"NodePropErr": false,
"NodePx": "515",
"NodePy": "590",
"NodeSubType": "EnumWidget_Code_Custom",
"NodeTag": "20260812200003",
"NodeTitle": "插入代码块#1"
}
},
{
"NodePanelData": {
"ExpandedGroups": [
],
"InputProperty": {
"mouse_x": 0,
"mouse_y": 0
},
"PubProperty": "",
"RetPins": [
]
},
"NodeProperty": {
"EP_CONTROL": {
"EP_CONTROL_IMPORT": "{\n \"PImport\": \"\",\n \"PBCode\": \"ZnJvbSBycGFfeWlzYWlxaS5jb250cmFjdF9mbG93X3N0ZXBzIGltcG9ydCBsb2dpbl9jb250cmFjdF9zeXN0ZW0sIGVudGVyX2NvbnRyYWN0X2NyZWF0ZQoKYWRhcHRlciA9IHNlbGYuX2FkYXB0ZXIKcHJpbnQoIltTMDNdIOeZu+W9leWQiOWQjOezu+e7ny4uLiIpCmxvZ2luX2NvbnRyYWN0X3N5c3RlbShhZGFwdGVyLCBzZWxmLl9jdHgpCnByaW50KCJbT0tdIOeZu+W9leWujOaIkCIpCnByaW50KCJbUzA0XSDov5vlhaXlkIjlkIzotbfojYkuLi4iKQplbnRlcl9jb250cmFjdF9jcmVhdGUoYWRhcHRlcikKcHJpbnQoIltPS10g5bey6L+b5YWl5ZCI5ZCM6LW36I2J6aG16Z2iIikK\"\n}"
},
"EP_Gen": {
"EP_Gen_AFTERDELAY": "{\n \"val\": \"MA==\"\n}",
"EP_Gen_BEFOREDELAY": "{\n \"val\": \"MA==\"\n}",
"EP_Gen_NOTE": "{\n \"val\": \"55m75b2V57O757uf5bm26L+b5YWl5ZCI5ZCM6LW36I2J6aG16Z2i\"\n}"
}
},
"NodeUI": {
"NodeElementID": "",
"NodeModel": "2",
"NodePropErr": false,
"NodePx": "515",
"NodePy": "470",
"NodeSubType": "EnumWidget_Code_Custom",
"NodeTag": "20260812200002",
"NodeTitle": "插入代码块#1"
}
},
{
"NodePanelData": {
"ExpandedGroups": [
],
"InputProperty": {
"mouse_x": 0,
"mouse_y": 0
},
"PubProperty": "",
"RetPins": [
]
},
"NodeProperty": {
"EP_CONTROL": {
"EP_CONTROL_IMPORT": "{\n \"PImport\": \"\",\n \"PBCode\": \"ZnJvbSBycGFfeWlzYWlxaS5hcGFfYnJvd3Nlcl9hZGFwdGVyIGltcG9ydCBBcGFCcm93c2VyQWRhcHRlcgoKcHJpbnQoIltTMDJdIOWQr+WKqCBDaHJvbWUgKyDmiZPlvIDlkIjlkIzns7vnu58uLi4iKQpwcmludChmIiAgVVJMOiB7c2VsZi5fY3R4LmNvbnRyYWN0X3VybH0iKQphZGFwdGVyID0gQXBhQnJvd3NlckFkYXB0ZXIodXJsPXNlbGYuX2N0eC5jb250cmFjdF91cmwpCmFkYXB0ZXIub3Blbl91cmwoc2VsZi5fY3R4LmNvbnRyYWN0X3VybCkKc2VsZi5fYWRhcHRlciA9IGFkYXB0ZXIKcHJpbnQoIltPS10gQ2hyb21lIOW3suaJk+W8gOW5tuWvvOiIquWIsOWQiOWQjOezu+e7nyIpCg==\"\n}"
},
"EP_Gen": {
"EP_Gen_AFTERDELAY": "{\n \"val\": \"MA==\"\n}",
"EP_Gen_BEFOREDELAY": "{\n \"val\": \"MA==\"\n}",
"EP_Gen_NOTE": "{\n \"val\": \"U2VsZW5pdW3miZPlvIBDaHJvbWXmtY/op4jlmajlubblr7zoiKrliLDlkIjlkIzns7vnu58=\"\n}"
}
},
"NodeUI": {
"NodeElementID": "",
"NodeModel": "2",
"NodePropErr": false,
"NodePx": "515",
"NodePy": "350",
"NodeSubType": "EnumWidget_Code_Custom",
"NodeTag": "20260812200001",
"NodeTitle": "插入代码块#1"
}
},
{
"NodePanelData": {
"ExpandedGroups": [
],
"InputProperty": {
"mouse_x": 0,
"mouse_y": 0
},
"PubProperty": "",
"RetPins": [
]
},
"NodeProperty": {
"EP_CONTROL": {
"EP_CONTROL_IMPORT": "{\n \"PImport\": \"\",\n \"PBCode\": \"aW1wb3J0IHN5cywgb3MsIGpzb24sIHRpbWUKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCgpfQ09ERVNfRElSID0gUGF0aChyJ2Q6XFJQQVxBdXRvUnBhXGNvZGVzJykKaWYgc3RyKF9DT0RFU19ESVIpIG5vdCBpbiBzeXMucGF0aDoKICAgIHN5cy5wYXRoLmluc2VydCgwLCBzdHIoX0NPREVTX0RJUikpCgpmcm9tIHJwYV95aXNhaXFpLmNvbnRyYWN0X2Zsb3dfc3RlcHMgaW1wb3J0IENvbnRyYWN0Rmxvd0NvbnRleHQsIENvbnRyYWN0R29vZHNMaW5lCgpwcmludCgiPSIgKiA2MCkKcHJpbnQoIuWQiOWQjOW7uuWNlSBDT05UUkFDVF9DUkVBVEUgLSDliJ3lp4vljJYiKQpwcmludCgiPSIgKiA2MCkKCnNlbGYuX2N0eCA9IENvbnRyYWN0Rmxvd0NvbnRleHQoCiAgICBjb250cmFjdF91cmw9Imh0dHA6Ly9jb250cmFjdC10ZXN0Lmd6bXBjLmNvbTo4MDgwLyIsCiAgICB1c2VybmFtZT0idGVzdDAwMiIsIHBhc3N3b3JkPSIxIiwKICAgIHN1cHBsaWVyX25hbWU9Iua1i+ivleS+m+W6lOWVhiIsCiAgICBvcmRlcl9kYXRlPSIyMDI2LTA4LTEyIiwKICAgIHNvdXJjZV90eXBlPSJZWUMiLCB0ZW1wbGF0ZV90eXBlPSJOT05fRk9STUFUIiwKICAgIHRlbXBsYXRlX25hbWU9IumdnuagvOW8jy0t6YeH6LSt5Y2P6K6uIiwKICAgIGN1c3RvbWVyX2NvZGU9IkNVU1QtMDAxIiwgY3VzdG9tZXJfbmFtZT0i5rWL6K+V5L6b5bqU5ZWGIiwKICAgIGNvbnRyYWN0X2NhdGVnb3J5PSLph4fotK3ljY/orq4iLCBzZXR0bGVtZW50X3R5cGU9IuS7mOasviIsCiAgICBjb250cmFjdF9iYWNrZ3JvdW5kPSLoh6rliqjljJbmtYvor5XlkIjlkIzotbfojYkiLCBjb250cmFjdF9uYXR1cmU9IuS4u+WQiOWQjCIsCiAgICBhbW91bnRfY3VycmVuY3k9IuS6uuawkeW4gSIsIGFtb3VudD0iNTAwMDAuMDAiLAogICAgY29udHJhY3RfZW5kX2RhdGU9IjIwMjYtMTItMzEiLAogICAgaXNfbWFqb3JfY29udHJhY3Q9IuWQpiIsIGlzX3ByZXBheW1lbnQ9IuWQpiIsCiAgICBiZWxvbmdfeWVhcj0iMjAyNiIsIHBheW1lbnRfbWV0aG9kPSLotKbmnJ/mlK/ku5giLAogICAgcGF5bWVudF9kYXlzPSIzMCIsIGNvbnRyYWN0X3N0YXR1cz0i5q2j5byP5ZCI5ZCMIiwKICAgIGNvbnRhaW5zX2Jsb29kX3Byb2R1Y3RzPSLlkKYiLAogICAgc3VibWl0X21vZGU9ImRyeV9ydW4iLAogICAgZ29vZHNfbGluZXM9WwogICAgICAgIENvbnRyYWN0R29vZHNMaW5lKAogICAgICAgICAgICBvcGVyYXRpb25fY29kZT0iQUREIiwgZ29vZHNfY29kZT0iWVAtMDAxIiwKICAgICAgICAgICAgZ29vZHNfbmFtZT0i5rWL6K+V6I2v5ZOBQSIsIGFwcHJvdmFsX25vPSLlm73oja/lh4blrZdIMDAwMDAwMDEiLAogICAgICAgICAgICBzcGVjPSI1MG1nKjMw54mHIiwgdW5pdD0i55uSIiwgcXVhbnRpdHk9MTAuMCwKICAgICAgICApLAogICAgXSwKICAgIG1lcmdlZF9wZGZfcGF0aD1Ob25lLAopCgpwcmludChmIltPS10g5LiK5LiL5paH5bCx57uqOiBzb3VyY2U9e3NlbGYuX2N0eC5zb3VyY2VfdHlwZX0iKQpwcmludChmIltPS10g5qih5p2/OiB7c2VsZi5fY3R4LnRlbXBsYXRlX25hbWV9IikKcHJpbnQoZiJbT0tdIOi0p+WTgeihjOaVsDoge2xlbihzZWxmLl9jdHguZ29vZHNfbGluZXMpfSIpCg==\"\n}"
},
"EP_Gen": {
"EP_Gen_AFTERDELAY": "{\n \"val\": \"MA==\"\n}",
"EP_Gen_BEFOREDELAY": "{\n \"val\": \"MA==\"\n}",
"EP_Gen_NOTE": "{\n \"val\": \"6K6+572u546v5aKD5Y+Y6YeP5bm25p6E5bu6WVlD5rWL6K+V5LiK5LiL5paH\"\n}"
}
},
"NodeUI": {
"NodeElementID": "",
"NodeModel": "2",
"NodePropErr": false,
"NodePx": "515",
"NodePy": "230",
"NodeSubType": "EnumWidget_Code_Custom",
"NodeTag": "20260812200000",
"NodeTitle": "插入代码块#1"
}
},
{
"NodePanelData": {
"ExpandedGroups": [
],
"InputProperty": {
"mouse_x": 0,
"mouse_y": 0
},
"PubProperty": "",
"RetPins": [
]
}, },
"NodeProperty": "", "NodeProperty": "",
"NodeUI": { "NodeUI": {
@ -346,13 +72,13 @@
"NodePx": "330", "NodePx": "330",
"NodePy": "230", "NodePy": "230",
"NodeSubType": "EnumWidget_Begin", "NodeSubType": "EnumWidget_Begin",
"NodeTag": "20260812100000", "NodeTag": "20260813100000",
"NodeTitle": "开始" "NodeTitle": "开始"
} }
} }
], ],
"SeqTag": "Main", "SeqTag": "Main",
"ViewCenterPx": "1361.61", "ViewCenterPx": "600",
"ViewCenterPy": "613.591", "ViewCenterPy": "300",
"ViewScaling": "0.751315" "ViewScaling": "1"
} }

View File

@ -5,7 +5,7 @@
"ProInfo": { "ProInfo": {
"CodeCustomCount": "0", "CodeCustomCount": "0",
"ProAbsolutePath": "D:/RPA/AutoRpa", "ProAbsolutePath": "D:/RPA/AutoRpa",
"ProChange": "2026/08/13 13:38:45", "ProChange": "2026/08/13 14:24:41",
"ProColorRef": "4", "ProColorRef": "4",
"ProCreate": "2026/08/12 10:13:31", "ProCreate": "2026/08/12 10:13:31",
"ProDesc": "", "ProDesc": "",

View File

@ -1,6 +1,10 @@
# coding=utf-8 # coding=utf-8
""" """
构建 Main.seq - 合同建单流程(输入驱动 + 状态中心回调版本) 构建 Main.seq - 合同建单流程(输入驱动 + 状态中心回调版本)
说明:
Main.seq 是 iS-RPA Studio 的流程源文件,Studio 编译时据此生成 codes/Main.py。
请在关闭 Studio 的情况下运行本脚本生成 Main.seq,再重新打开项目编译。
""" """
import json import json
import base64 import base64
@ -11,7 +15,7 @@ def b64_apa(val):
def b64_raw(val): def b64_raw(val):
return base64.b64encode(str(val).encode()).decode() return base64.b64encode(str(val).encode()).decode()
# 单节点代码块:读取入参(input_arg / -c params / JSON 文件)→ 调用 run_contract_create # 单节点代码块:从 input_arg 读取业务 JSON → 调用 run_contract_create。
# run_contract_create 内部完成 start/complete/fail 回调、Selenium 起草与合同编号读取。 # run_contract_create 内部完成 start/complete/fail 回调、Selenium 起草与合同编号读取。
body = """\ body = """\
import sys, os, json import sys, os, json
@ -32,22 +36,17 @@ def _first(*values):
return "" return ""
raw = (self.input_arg or "").strip() raw = (self.input_arg or "").strip()
if raw: if not raw:
data = load_input_data(raw) raise ContractCreateError("缺少业务入参:请通过 -i/--input 传入 JSON 字符串或文件路径")
elif isinstance(params, dict) and params:
nested = params.get("inputJson") or params.get("inputArg") or params.get("input") data = load_input_data(raw)
data = load_input_data(str(nested)) if nested else dict(params)
else:
raise ContractCreateError("缺少业务入参:请通过 -i/--input 传入 JSON 字符串或文件路径,或通过 -c/--params 传入参数")
state_center_url = _first( state_center_url = _first(
data.get("stateCenterUrl"), data.get("stateCenterURL"), data.get("stateCenterUrl"), data.get("stateCenterURL"),
os.getenv("STATE_CENTER_URL"), params.get("stateCenterUrl"), os.getenv("STATE_CENTER_URL"), "http://127.0.0.1:8000",
"http://127.0.0.1:8000",
) )
agent_token = _first( agent_token = _first(
data.get("agentToken"), os.getenv("AGENT_TOKEN"), data.get("agentToken"), os.getenv("AGENT_TOKEN"), "dev-agent-token",
params.get("agentToken"), "dev-agent-token",
) )
print("=" * 60) print("=" * 60)
@ -64,97 +63,83 @@ result = run_contract_create(
print(json.dumps(result, ensure_ascii=False)) print(json.dumps(result, ensure_ascii=False))
""" """
steps = [
("读取入参并执行合同建单", body, "读取艺赛旗入参并执行 CONTRACT_CREATE(含状态中心回调)"),
]
nodes = []
lines = []
begin_tag = "20260813100000" begin_tag = "20260813100000"
nodes.append({ code_tag = "20260813200000"
"NodePanelData": { line_tag = "20260813300000"
"ExpandedGroups": [], "InputProperty": {"mouse_x": 0, "mouse_y": 0},
"PubProperty": "", "RetPins": []
},
"NodeProperty": "",
"NodeUI": {
"NodeElementID": "", "NodeModel": "2", "NodePropErr": False,
"NodePx": "300", "NodePy": "200",
"NodeSubType": "EnumWidget_Begin", "NodeTag": begin_tag,
"NodeTitle": "开始"
}
})
prev_tag = begin_tag
start_x = 500
start_y = 200
space_y = 120
for i, (title, body_text, note) in enumerate(steps):
tag = f"20260813{200000 + i:06d}"
py = start_y + i * space_y
pimport_b64 = b64_raw("")
pbody_b64 = b64_raw(body_text)
props = {
"EP_CONTROL": {
"EP_CONTROL_IMPORT": json.dumps({"PImport": pimport_b64, "PBCode": pbody_b64}, indent=4)
},
"EP_Gen": {
"EP_Gen_AFTERDELAY": b64_apa("0"),
"EP_Gen_BEFOREDELAY": b64_apa("0"),
"EP_Gen_NOTE": b64_apa(note)
}
}
nodes.append({
"NodePanelData": {
"ExpandedGroups": [], "InputProperty": {"mouse_x": 0, "mouse_y": 0},
"PubProperty": "", "RetPins": []
},
"NodeProperty": props,
"NodeUI": {
"NodeElementID": "", "NodeModel": "2", "NodePropErr": False,
"NodePx": str(start_x - 15), "NodePy": str(py),
"NodeSubType": "EnumWidget_Code_Custom", "NodeTag": tag,
"NodeTitle": title
}
})
lines.append({
"LineColor": "255, 255, 255",
"LineNote": "", "LineType": 0,
"LineSplit": {"Px": "", "Py": ""},
"LineEnd": {
"Pidx": f"{tag}/EPin_Flow_In",
"Px": str(start_x - 25),
"Py": str(py + 30)
},
"LineStart": {
"Pidx": f"{prev_tag}/EPin_Flow_Out",
"Px": str(start_x - 100) if i > 0 else "415",
"Py": str(start_y + 30) if i == 0 else str(start_y + (i - 1) * space_y + 30)
},
"LineTag": f"20260813{300000 + i:06d}"
})
prev_tag = tag
center_y = start_y + len(steps) * space_y // 2
main_seq = { main_seq = {
"LineList": lines, "LineList": [
"NodeList": nodes, {
"LineColor": "255, 255, 255",
"LineCommented": 0,
"LineEnd": {"Pidx": f"{code_tag}/EPin_Flow_In", "Px": "512", "Py": "300"},
"LineNote": "",
"LineSplit": {"Px": "", "Py": ""},
"LineStart": {"Pidx": f"{begin_tag}/EPin_Flow_Out", "Px": "457", "Py": "246"},
"LineTag": line_tag,
"LineType": 0,
}
],
"NodeList": [
{
"NodePanelData": {
"ExpandedGroups": [],
"InputProperty": {"mouse_x": 0, "mouse_y": 0},
"PubProperty": "",
"RetPins": [],
},
"NodeProperty": {
"EP_CONTROL": {
"EP_CONTROL_IMPORT": json.dumps(
{"PImport": b64_raw(""), "PBCode": b64_raw(body)},
indent=4,
)
},
"EP_Gen": {
"EP_Gen_AFTERDELAY": b64_apa("0"),
"EP_Gen_BEFOREDELAY": b64_apa("0"),
"EP_Gen_NOTE": b64_apa("读取入参并执行 CONTRACT_CREATE(含状态中心回调)"),
},
},
"NodeUI": {
"NodeElementID": "",
"NodeModel": "2",
"NodePropErr": False,
"NodePx": "515",
"NodePy": "270",
"NodeSubType": "EnumWidget_Code_Custom",
"NodeTag": code_tag,
"NodeTitle": "读取入参并执行合同建单",
},
},
{
"NodePanelData": {
"ExpandedGroups": [],
"InputProperty": {"mouse_x": 0, "mouse_y": 0},
"PubProperty": "",
"RetPins": [],
},
"NodeProperty": "",
"NodeUI": {
"NodeElementID": "",
"NodeModel": "2",
"NodePropErr": False,
"NodePx": "330",
"NodePy": "230",
"NodeSubType": "EnumWidget_Begin",
"NodeTag": begin_tag,
"NodeTitle": "开始",
},
},
],
"SeqTag": "Main", "SeqTag": "Main",
"ViewCenterPx": "600", "ViewCenterPx": "600",
"ViewCenterPy": str(center_y), "ViewCenterPy": "300",
"ViewScaling": "1" "ViewScaling": "1",
} }
with open(r"d:\RPA\AutoRpa\Main.seq", "w", encoding="utf-8") as f: with open(r"d:\RPA\AutoRpa\Main.seq", "w", encoding="utf-8") as f:
json.dump(main_seq, f, ensure_ascii=False, indent=4) json.dump(main_seq, f, ensure_ascii=False, indent=4)
for n in nodes: print("Main.seq 已生成(单节点输入驱动流程)")
print(f" [{n['NodeUI']['NodeSubType'].replace('EnumWidget_','').replace('_Code_Custom','CODE').replace('_Begin','START')}] {n['NodeUI']['NodeTitle']}") print("节点: 开始 -> 读取入参并执行合同建单")

View File

@ -1,5 +1,5 @@
# coding=utf-8 # coding=utf-8
# 编译日期:2026-08-13 09:38:51 # 编译日期:2026-08-13 14:30:00
# 版权所有:www.i-search.com.cn # 版权所有:www.i-search.com.cn
import ubpa.init_input as iinput import ubpa.init_input as iinput
from ubpa.base_util import StdOutHook, ExceptionHandler from ubpa.base_util import StdOutHook, ExceptionHandler
@ -41,49 +41,36 @@ class AutoRpa:
if self.input_arg is None: if self.input_arg is None:
sys.exit(0) sys.exit(0)
def _resolve_input_data(self, params): def Main(self):
"""优先 input_arg(JSON 字符串或文件路径),其次 -c 传入的 params 字典。"""
from rpa_yisaiqi.contract_create_node import ContractCreateError, load_input_data
raw = (self.input_arg or "").strip()
if raw:
return load_input_data(raw)
if isinstance(params, dict) and params:
nested = params.get("inputJson") or params.get("inputArg") or params.get("input")
if nested:
return load_input_data(str(nested))
return dict(params)
raise ContractCreateError("缺少业务入参:请通过 -i/--input 传入 JSON 字符串或文件路径,或通过 -c/--params 传入参数")
@staticmethod
def _first(*values):
for value in values:
if value is not None and str(value).strip():
return str(value).strip()
return ""
def Main(self, **params):
self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260813000000,Title:合同建单,Note:读取入参并执行 CONTRACT_CREATE')
import sys, os, json import sys, os, json
from pathlib import Path from pathlib import Path
_CODES_DIR = Path(r'd:\RPA\AutoRpa\codes') _CODES_DIR = Path(r'd:\RPA\AutoRpa\codes')
if str(_CODES_DIR) not in sys.path: if str(_CODES_DIR) not in sys.path:
sys.path.insert(0, str(_CODES_DIR)) sys.path.insert(0, str(_CODES_DIR))
from rpa_yisaiqi.contract_create_node import run_contract_create from rpa_yisaiqi.contract_create_node import (
ContractCreateError, load_input_data, run_contract_create,
data = self._resolve_input_data(params)
state_center_url = self._first(
data.get("stateCenterUrl"),
data.get("stateCenterURL"),
os.getenv("STATE_CENTER_URL"),
params.get("stateCenterUrl"),
"http://127.0.0.1:8000",
) )
agent_token = self._first(
data.get("agentToken"), def _first(*values):
os.getenv("AGENT_TOKEN"), for value in values:
params.get("agentToken"), if value is not None and str(value).strip():
"dev-agent-token", return str(value).strip()
return ""
raw = (self.input_arg or "").strip()
if not raw:
raise ContractCreateError("缺少业务入参:请通过 -i/--input 传入 JSON 字符串或文件路径")
data = load_input_data(raw)
state_center_url = _first(
data.get("stateCenterUrl"), data.get("stateCenterURL"),
os.getenv("STATE_CENTER_URL"), "http://127.0.0.1:8000",
)
agent_token = _first(
data.get("agentToken"), os.getenv("AGENT_TOKEN"), "dev-agent-token",
) )
print("=" * 60) print("=" * 60)

View File

@ -145,6 +145,9 @@ def build_flow_context(spec: ContractCreateInput, draft: ContractDraft) -> Contr
def _resolve_merged_pdf(draft: ContractDraft, spec: ContractCreateInput) -> str | None: def _resolve_merged_pdf(draft: ContractDraft, spec: ContractCreateInput) -> str | None:
if draft.source_type != "YYC": if draft.source_type != "YYC":
return None return None
if spec.submit_mode == "dry_run":
# dry_run 只跑到提交前,不校验也不上传 PDF
return None
paths = [str(p).strip() for p in draft.platform_pdf_paths if str(p).strip()] paths = [str(p).strip() for p in draft.platform_pdf_paths if str(p).strip()]
if not paths: if not paths:

View File

@ -0,0 +1,42 @@
{
"jobId": "TEST-CONTRACT-20260813-001",
"supplierName": "重庆亿昊药业有限公司",
"orderDate": "2026-08-12",
"sourceType": "YYC",
"templateType": "NON_FORMAT",
"templateName": "非格式--采购协议",
"customerCode": "DW0100046361",
"customerName": "重庆亿昊药业有限公司",
"contractCategory": "采购协议",
"settlementType": "付款",
"contractBackground": "自动化测试合同起草",
"contractNature": "主合同",
"amountCurrency": "人民币",
"amount": "50000.00",
"contractEndDate": "2026-12-31",
"isMajorContract": "否",
"isPrepayment": "否",
"belongYear": "2026",
"paymentMethod": "账期支付",
"paymentDays": "30",
"contractStatus": "正式合同",
"containsBloodProducts": "否",
"submitMode": "dry_run",
"orderNoList": [],
"platformPdfPaths": [],
"goodsLines": [
{
"operationCode": "ADD",
"goodsCode": "YP-001",
"goodsName": "测试药品A",
"approvalNo": "国药准字H00000001",
"spec": "50mg*30片",
"unit": "盒",
"quantity": 10,
"mdmCode": "",
"unitPrice": ""
}
],
"stateCenterUrl": "http://127.0.0.1:8000",
"agentToken": "dev-agent-token"
}