5D3420315FA54219AB2427B0C674AD66auto
This commit is contained in:
parent
5bf598de05
commit
98d889f15c
336
Main.seq
336
Main.seq
|
|
@ -1,7 +1,331 @@
|
||||||
{
|
{
|
||||||
"LineList": [
|
"LineList": [
|
||||||
|
{
|
||||||
|
"LineColor": "255, 255, 255",
|
||||||
|
"LineCommented": 0,
|
||||||
|
"LineEnd": {
|
||||||
|
"Pidx": "20260812200005/EPin_Flow_In",
|
||||||
|
"Px": "512",
|
||||||
|
"Py": "870"
|
||||||
|
},
|
||||||
|
"LineNote": "",
|
||||||
|
"LineSplit": {
|
||||||
|
"Px": "",
|
||||||
|
"Py": ""
|
||||||
|
},
|
||||||
|
"LineStart": {
|
||||||
|
"Pidx": "20260812200004/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",
|
||||||
|
"Py": "246"
|
||||||
|
},
|
||||||
|
"LineTag": "20260812300000",
|
||||||
|
"LineType": 0
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"NodeList": [
|
"NodeList": [
|
||||||
|
{
|
||||||
|
"NodePanelData": {
|
||||||
|
"ExpandedGroups": [
|
||||||
|
],
|
||||||
|
"InputProperty": {
|
||||||
|
"mouse_x": 0,
|
||||||
|
"mouse_y": 0
|
||||||
|
},
|
||||||
|
"PubProperty": "",
|
||||||
|
"RetPins": [
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"NodeProperty": {
|
||||||
|
"EP_CONTROL": {
|
||||||
|
"EP_CONTROL_IMPORT": "{\n \"PImport\": \"c3lzLCBvcywganNvbiwgcGF0aGxpYiwgdGltZQ==\",\n \"PBCode\": \"ZnJvbSBycGFfeWlzYWlxaS5jb250cmFjdF9mbG93X3N0ZXBzIGltcG9ydCAoCiAgICBmaWxsX2NvbnRyYWN0X2dvb2RzX2xpbmVzLCBmaWxsX2NvbnRyYWN0X3BheW1lbnRfaW5mbywKICAgIHVwbG9hZF9jb250cmFjdF9kb2N1bWVudF9pZl9uZWVkZWQsIHN1Ym1pdF9jb250cmFjdF9mb3JfYXBwcm92YWwsCiAgICByZWFkX2NvbnRyYWN0X251bWJlcgopCgphZGFwdGVyID0gc2VsZi5fYWRhcHRlcgoKcHJpbnQoIltTMDldIOWhq+WGmei0p+WTgeaYjue7hi4uLiIpCmZpbGxfY29udHJhY3RfZ29vZHNfbGluZXMoYWRhcHRlciwgc2VsZi5fY3R4KQpwcmludChmIltPS10g6LSn5ZOBOiB7bGVuKHNlbGYuX2N0eC5nb29kc19saW5lcyl9IOihjCIpCnByaW50KCJbUzEwXSDloavlhpnku5jmrL7kv6Hmga8uLi4iKQpmaWxsX2NvbnRyYWN0X3BheW1lbnRfaW5mbyhhZGFwdGVyLCBzZWxmLl9jdHgpCnByaW50KGYiW09LXSDku5jmrL7mlrnlvI89e3NlbGYuX2N0eC5wYXltZW50X21ldGhvZH0iKQoKaWYgc2VsZi5fY3R4LnNvdXJjZV90eXBlID09ICJZWUMiOgogICAgcHJpbnQoIltTMTFdIOWQiOW5tlBERiBbWVlD5LiT5bGeXS4uLiAo5Y2VUERGLCDot7Pov4flkIjlubYpIikKICAgIHByaW50KCJbUzEyXSDkuIrkvKBQREbpmYTku7YgW1lZQ+S4k+Wxnl0uLi4gKGRyeV9ydW4g6Lez6L+HKSIpCgpwcmludCgpCnByaW50KCJbUzEzXSDmj5DkuqTlrqHmibkuLi4iKQppZiBub3Qgc3VibWl0X2NvbnRyYWN0X2Zvcl9hcHByb3ZhbChhZGFwdGVyLCBzZWxmLl9jdHgpOgogICAgcHJpbnQoIltEUlktUlVOXSDmvJTnu4PmqKHlvI/vvIzot7Pov4flrp7pmYXmj5DkuqQiKQogICAgcHJpbnQoIj0iICogNjApCiAgICBwcmludCgi5ZCI5ZCM5bu65Y2V5rWB56iL5ryU57uD5a6M5oiQIikKICAgIHByaW50KCI9IiAqIDYwKQplbHNlOgogICAgcHJpbnQoIltTMTRdIOivu+WPluWQiOWQjOe8luWPty4uLiIpCiAgICBjb250cmFjdF9ubyA9IHJlYWRfY29udHJhY3RfbnVtYmVyKGFkYXB0ZXIpCiAgICBwcmludChmIltPS10g5ZCI5ZCM57yW5Y+3OiB7Y29udHJhY3Rfbm99IikKICAgIHByaW50KCI9IiAqIDYwKQogICAgcHJpbnQoZiJbQ09NUExFVEVEXSDlkIjlkIzliJvlu7rmiJDlip86IHtjb250cmFjdF9ub30iKQogICAgcHJpbnQoIj0iICogNjApCg==\"\n}"
|
||||||
|
},
|
||||||
|
"EP_Gen": {
|
||||||
|
"EP_Gen_AFTERDELAY": "{\n \"val\": \"MA==\"\n}",
|
||||||
|
"EP_Gen_BEFOREDELAY": "{\n \"val\": \"MA==\"\n}",
|
||||||
|
"EP_Gen_NOTE": "{\n \"val\": \"5aGr5YaZ6LSn5ZOB5piO57uG44CB5LuY5qy+5L+h5oGv5bm25o+Q5Lqk\"\n}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NodeUI": {
|
||||||
|
"NodeElementID": "",
|
||||||
|
"NodeModel": "2",
|
||||||
|
"NodePropErr": false,
|
||||||
|
"NodePx": "515",
|
||||||
|
"NodePy": "830",
|
||||||
|
"NodeSubType": "EnumWidget_Code_Custom",
|
||||||
|
"NodeTag": "20260812200005",
|
||||||
|
"NodeTitle": "插入代码块#1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"NodePanelData": {
|
||||||
|
"ExpandedGroups": [
|
||||||
|
],
|
||||||
|
"InputProperty": {
|
||||||
|
"mouse_x": 0,
|
||||||
|
"mouse_y": 0
|
||||||
|
},
|
||||||
|
"PubProperty": "",
|
||||||
|
"RetPins": [
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"NodeProperty": {
|
||||||
|
"EP_CONTROL": {
|
||||||
|
"EP_CONTROL_IMPORT": "{\n \"PImport\": \"c3lzLCBvcywganNvbiwgcGF0aGxpYiwgdGltZQ==\",\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\": \"c3lzLCBvcywganNvbiwgcGF0aGxpYiwgdGltZQ==\",\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\": \"c3lzLCBvcywganNvbiwgcGF0aGxpYiwgdGltZQ==\",\n \"PBCode\": \"ZnJvbSBycGFfeWlzYWlxaS5jb250cmFjdF9mbG93X3N0ZXBzIGltcG9ydCBsb2dpbl9jb250cmFjdF9zeXN0ZW0sIGVudGVyX2NvbnRyYWN0X2NyZWF0ZQpmcm9tIHJwYV95aXNhaXFpLmFwYV9icm93c2VyX2FkYXB0ZXIgaW1wb3J0IEFwYUJyb3dzZXJBZGFwdGVyCgphZGFwdGVyID0gQXBhQnJvd3NlckFkYXB0ZXIoKQphZGFwdGVyLl9icm93c2VyID0gc2VsZi5fYnJvd3NlcgphZGFwdGVyLl9pc19vcGVuID0gVHJ1ZQoKcHJpbnQoIltTMDNdIOeZu+W9leWQiOWQjOezu+e7ny4uLiIpCmxvZ2luX2NvbnRyYWN0X3N5c3RlbShhZGFwdGVyLCBzZWxmLl9jdHgpCnByaW50KCJbT0tdIOeZu+W9leWujOaIkCIpCnByaW50KCJbUzA0XSDov5vlhaXlkIjlkIzotbfojYkuLi4iKQplbnRlcl9jb250cmFjdF9jcmVhdGUoYWRhcHRlcikKcHJpbnQoIltPS10g5bey6L+b5YWl5ZCI5ZCM6LW36I2J6aG16Z2iIikKc2VsZi5fYWRhcHRlciA9IGFkYXB0ZXIK\"\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\": \"c3lzLCBvcywganNvbiwgcGF0aGxpYiwgdGltZQ==\",\n \"PBCode\": \"ZnJvbSB1YnBhLmlvYmplY3QuYnJvd3NlciBpbXBvcnQgQnJvd3Nlcgpmcm9tIHJwYV95aXNhaXFpLmNvbnRyYWN0X2Zsb3dfc3RlcHMgaW1wb3J0IG9wZW5fY29udHJhY3Rfc3lzdGVtCgpwcmludCgiW1MwMl0g5omT5byAIEVkZ2Ug5rWP6KeI5ZmoLi4uIikKcHJpbnQoZiIgIFVSTDoge3NlbGYuX2N0eC5jb250cmFjdF91cmx9IikKYnJvd3NlciA9IEJyb3dzZXIoQnJvd3Nlci5BcHBOYW1lLmVkZ2UpCmJyb3dzZXIub3Blbih1cmw9c2VsZi5fY3R4LmNvbnRyYWN0X3VybCwgdGltZW91dD0zMCkKc2VsZi5fYnJvd3NlciA9IGJyb3dzZXIKcHJpbnQoIltPS10g5rWP6KeI5Zmo5bey5omT5byAIikK\"\n}"
|
||||||
|
},
|
||||||
|
"EP_Gen": {
|
||||||
|
"EP_Gen_AFTERDELAY": "{\n \"val\": \"MA==\"\n}",
|
||||||
|
"EP_Gen_BEFOREDELAY": "{\n \"val\": \"MA==\"\n}",
|
||||||
|
"EP_Gen_NOTE": "{\n \"val\": \"5omT5byARWRnZea1j+iniOWZqOW5tuWvvOiIquWIsOWQiOWQjOezu+e7nw==\"\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\": \"c3lzLCBvcywganNvbiwgcGF0aGxpYiwgdGltZQ==\",\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": {
|
"NodePanelData": {
|
||||||
"ExpandedGroups": [
|
"ExpandedGroups": [
|
||||||
|
|
@ -19,16 +343,16 @@
|
||||||
"NodeElementID": "",
|
"NodeElementID": "",
|
||||||
"NodeModel": "2",
|
"NodeModel": "2",
|
||||||
"NodePropErr": false,
|
"NodePropErr": false,
|
||||||
"NodePx": "2050",
|
"NodePx": "330",
|
||||||
"NodePy": "2341",
|
"NodePy": "230",
|
||||||
"NodeSubType": "EnumWidget_Begin",
|
"NodeSubType": "EnumWidget_Begin",
|
||||||
"NodeTag": "2026081210133159517",
|
"NodeTag": "20260812100000",
|
||||||
"NodeTitle": "开始"
|
"NodeTitle": "开始"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"SeqTag": "Main",
|
"SeqTag": "Main",
|
||||||
"ViewCenterPx": "2503",
|
"ViewCenterPx": "866.266",
|
||||||
"ViewCenterPy": "2830",
|
"ViewCenterPy": "755.823",
|
||||||
"ViewScaling": "1"
|
"ViewScaling": "1.331"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@
|
||||||
"ProInfo": {
|
"ProInfo": {
|
||||||
"CodeCustomCount": "0",
|
"CodeCustomCount": "0",
|
||||||
"ProAbsolutePath": "D:/RPA/AutoRpa",
|
"ProAbsolutePath": "D:/RPA/AutoRpa",
|
||||||
"ProChange": "2026/08/12 11:13:33",
|
"ProChange": "2026/08/12 13:57:25",
|
||||||
"ProColorRef": "",
|
"ProColorRef": "4",
|
||||||
"ProCreate": "2026/08/12 10:13:31",
|
"ProCreate": "2026/08/12 10:13:31",
|
||||||
"ProDesc": "",
|
"ProDesc": "",
|
||||||
"ProDocVersion": "1.0.0.4",
|
"ProDocVersion": "1.0.0.4",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,278 @@
|
||||||
|
# coding=utf-8
|
||||||
|
"""
|
||||||
|
构建 Main.seq - 合同建单流程(多节点可视化 + 真实浏览器)
|
||||||
|
"""
|
||||||
|
import json
|
||||||
|
import base64
|
||||||
|
|
||||||
|
def b64_apa(val):
|
||||||
|
"""将值编码为 APA val 格式"""
|
||||||
|
return json.dumps({"val": base64.b64encode(str(val).encode()).decode()}, indent=4)
|
||||||
|
|
||||||
|
def b64_raw(val):
|
||||||
|
"""纯 base64 编码"""
|
||||||
|
return base64.b64encode(str(val).encode()).decode()
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# 各步骤代码
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# S01: 初始化环境
|
||||||
|
s01_body = """\
|
||||||
|
import sys, os, json, time
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
_CODES_DIR = Path(r'd:\\RPA\\AutoRpa\\codes')
|
||||||
|
if str(_CODES_DIR) not in sys.path:
|
||||||
|
sys.path.insert(0, str(_CODES_DIR))
|
||||||
|
|
||||||
|
from rpa_yisaiqi.contract_flow_steps import ContractFlowContext, ContractGoodsLine
|
||||||
|
|
||||||
|
print("=" * 60)
|
||||||
|
print("合同建单 CONTRACT_CREATE - 初始化")
|
||||||
|
print("=" * 60)
|
||||||
|
|
||||||
|
self._ctx = ContractFlowContext(
|
||||||
|
contract_url="http://contract-test.gzmpc.com:8080/",
|
||||||
|
username="test002", password="1",
|
||||||
|
supplier_name="测试供应商",
|
||||||
|
order_date="2026-08-12",
|
||||||
|
source_type="YYC", template_type="NON_FORMAT",
|
||||||
|
template_name="非格式--采购协议",
|
||||||
|
customer_code="CUST-001", customer_name="测试供应商",
|
||||||
|
contract_category="采购协议", settlement_type="付款",
|
||||||
|
contract_background="自动化测试合同起草", contract_nature="主合同",
|
||||||
|
amount_currency="人民币", amount="50000.00",
|
||||||
|
contract_end_date="2026-12-31",
|
||||||
|
is_major_contract="否", is_prepayment="否",
|
||||||
|
belong_year="2026", payment_method="账期支付",
|
||||||
|
payment_days="30", contract_status="正式合同",
|
||||||
|
contains_blood_products="否",
|
||||||
|
submit_mode="dry_run",
|
||||||
|
goods_lines=[
|
||||||
|
ContractGoodsLine(
|
||||||
|
operation_code="ADD", goods_code="YP-001",
|
||||||
|
goods_name="测试药品A", approval_no="国药准字H00000001",
|
||||||
|
spec="50mg*30片", unit="盒", quantity=10.0,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
merged_pdf_path=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
print(f"[OK] 上下文就绪: source={self._ctx.source_type}")
|
||||||
|
print(f"[OK] 模板: {self._ctx.template_name}")
|
||||||
|
print(f"[OK] 货品行数: {len(self._ctx.goods_lines)}")
|
||||||
|
"""
|
||||||
|
|
||||||
|
# S02: 打开浏览器
|
||||||
|
s02_body = """\
|
||||||
|
from ubpa.iobject.browser import Browser
|
||||||
|
from rpa_yisaiqi.contract_flow_steps import open_contract_system
|
||||||
|
|
||||||
|
print("[S02] 打开 Edge 浏览器...")
|
||||||
|
print(f" URL: {self._ctx.contract_url}")
|
||||||
|
browser = Browser(Browser.AppName.edge)
|
||||||
|
browser.open(url=self._ctx.contract_url, timeout=30)
|
||||||
|
self._browser = browser
|
||||||
|
print("[OK] 浏览器已打开")
|
||||||
|
"""
|
||||||
|
|
||||||
|
# S03: 登录 + 进入起草
|
||||||
|
s03_body = """\
|
||||||
|
from rpa_yisaiqi.contract_flow_steps import login_contract_system, enter_contract_create
|
||||||
|
from rpa_yisaiqi.apa_browser_adapter import ApaBrowserAdapter
|
||||||
|
|
||||||
|
adapter = ApaBrowserAdapter()
|
||||||
|
adapter._browser = self._browser
|
||||||
|
adapter._is_open = True
|
||||||
|
|
||||||
|
print("[S03] 登录合同系统...")
|
||||||
|
login_contract_system(adapter, self._ctx)
|
||||||
|
print("[OK] 登录完成")
|
||||||
|
print("[S04] 进入合同起草...")
|
||||||
|
enter_contract_create(adapter)
|
||||||
|
print("[OK] 已进入合同起草页面")
|
||||||
|
self._adapter = adapter
|
||||||
|
"""
|
||||||
|
|
||||||
|
# S04: 选择模板 + 签约方信息
|
||||||
|
s04_body = """\
|
||||||
|
from rpa_yisaiqi.contract_flow_steps import select_contract_template, fill_contract_signatory_info
|
||||||
|
|
||||||
|
adapter = self._adapter
|
||||||
|
|
||||||
|
print("[S05] 选择合同模板...")
|
||||||
|
select_contract_template(adapter, self._ctx)
|
||||||
|
print(f"[OK] 模板: {self._ctx.template_name}")
|
||||||
|
print("[S06] 填写签约方信息...")
|
||||||
|
fill_contract_signatory_info(adapter, self._ctx)
|
||||||
|
print(f"[OK] 签约方: {self._ctx.customer_name}")
|
||||||
|
"""
|
||||||
|
|
||||||
|
# S05: 基础表单 + 金额日期
|
||||||
|
s05_body = """\
|
||||||
|
from rpa_yisaiqi.contract_flow_steps import fill_contract_basic_info, fill_contract_amount_and_dates
|
||||||
|
|
||||||
|
adapter = self._adapter
|
||||||
|
|
||||||
|
print("[S07] 填写基础表单...")
|
||||||
|
fill_contract_basic_info(adapter, self._ctx)
|
||||||
|
print(f"[OK] 类别={self._ctx.contract_category}, 结算={self._ctx.settlement_type}")
|
||||||
|
print("[S08] 填写金额与日期...")
|
||||||
|
fill_contract_amount_and_dates(adapter, self._ctx)
|
||||||
|
print(f"[OK] 金额={self._ctx.amount}, 结束日期={self._ctx.contract_end_date}")
|
||||||
|
"""
|
||||||
|
|
||||||
|
# S06: 货品明细 + 付款信息 + 提交
|
||||||
|
s06_body = """\
|
||||||
|
from rpa_yisaiqi.contract_flow_steps import (
|
||||||
|
fill_contract_goods_lines, fill_contract_payment_info,
|
||||||
|
upload_contract_document_if_needed, submit_contract_for_approval,
|
||||||
|
read_contract_number
|
||||||
|
)
|
||||||
|
|
||||||
|
adapter = self._adapter
|
||||||
|
|
||||||
|
print("[S09] 填写货品明细...")
|
||||||
|
fill_contract_goods_lines(adapter, self._ctx)
|
||||||
|
print(f"[OK] 货品: {len(self._ctx.goods_lines)} 行")
|
||||||
|
print("[S10] 填写付款信息...")
|
||||||
|
fill_contract_payment_info(adapter, self._ctx)
|
||||||
|
print(f"[OK] 付款方式={self._ctx.payment_method}")
|
||||||
|
|
||||||
|
if self._ctx.source_type == "YYC":
|
||||||
|
print("[S11] 合并PDF [YYC专属]... (单PDF, 跳过合并)")
|
||||||
|
print("[S12] 上传PDF附件 [YYC专属]... (dry_run 跳过)")
|
||||||
|
|
||||||
|
print()
|
||||||
|
print("[S13] 提交审批...")
|
||||||
|
if not submit_contract_for_approval(adapter, self._ctx):
|
||||||
|
print("[DRY-RUN] 演练模式,跳过实际提交")
|
||||||
|
print("=" * 60)
|
||||||
|
print("合同建单流程演练完成")
|
||||||
|
print("=" * 60)
|
||||||
|
else:
|
||||||
|
print("[S14] 读取合同编号...")
|
||||||
|
contract_no = read_contract_number(adapter)
|
||||||
|
print(f"[OK] 合同编号: {contract_no}")
|
||||||
|
print("=" * 60)
|
||||||
|
print(f"[COMPLETED] 合同创建成功: {contract_no}")
|
||||||
|
print("=" * 60)
|
||||||
|
"""
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# 节点定义
|
||||||
|
# ============================================================
|
||||||
|
steps = [
|
||||||
|
("S01", "S01 初始化 & 上下文构建", s01_body, "设置环境变量并构建YYC测试上下文"),
|
||||||
|
("S02", "S02 打开Edge浏览器", s02_body, "打开Edge浏览器并导航到合同系统"),
|
||||||
|
("S03", "S03-S04 登录 & 进入起草", s03_body, "登录系统并进入合同起草页面"),
|
||||||
|
("S04", "S05-S06 模板选择 & 签约方", s04_body, "选择模板并填写签约方信息"),
|
||||||
|
("S05", "S07-S08 基础表单 & 金额日期", s05_body, "填写合同类别、金额、日期"),
|
||||||
|
("S06", "S09-S15 货品/付款/提交", s06_body, "填写货品明细、付款信息并提交"),
|
||||||
|
]
|
||||||
|
|
||||||
|
def make_code_import_props(pimport, pbody):
|
||||||
|
"""创建 EP_CONTROL_IMPORT 的 JSON 字符串"""
|
||||||
|
inner = json.dumps({
|
||||||
|
"PImport": pimport,
|
||||||
|
"PBCode": pbody
|
||||||
|
}, indent=4, ensure_ascii=False)
|
||||||
|
return inner
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# 构建 Main.seq
|
||||||
|
# ============================================================
|
||||||
|
nodes = []
|
||||||
|
lines = []
|
||||||
|
|
||||||
|
# 开始节点
|
||||||
|
begin_tag = "20260812100000"
|
||||||
|
nodes.append({
|
||||||
|
"NodePanelData": {
|
||||||
|
"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, (sid, title, body, note) in enumerate(steps):
|
||||||
|
tag = f"20260812{200000 + i:06d}"
|
||||||
|
py = start_y + i * space_y
|
||||||
|
|
||||||
|
# Encode as raw base64 for PBCode/PImport
|
||||||
|
pimport_b64 = b64_raw("sys, os, json, pathlib, time")
|
||||||
|
pbody_b64 = b64_raw(body)
|
||||||
|
|
||||||
|
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"20260812{300000 + i:06d}"
|
||||||
|
})
|
||||||
|
|
||||||
|
prev_tag = tag
|
||||||
|
|
||||||
|
center_y = start_y + len(steps) * space_y // 2
|
||||||
|
|
||||||
|
main_seq = {
|
||||||
|
"LineList": lines,
|
||||||
|
"NodeList": nodes,
|
||||||
|
"SeqTag": "Main",
|
||||||
|
"ViewCenterPx": "600",
|
||||||
|
"ViewCenterPy": str(center_y),
|
||||||
|
"ViewScaling": "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
with open(r"d:\RPA\AutoRpa\Main.seq", "w", encoding="utf-8") as f:
|
||||||
|
json.dump(main_seq, f, ensure_ascii=False, indent=4)
|
||||||
|
|
||||||
|
print(f"Main.seq 已生成: {len(nodes)} 节点, {len(lines)} 连线")
|
||||||
|
for n in nodes:
|
||||||
|
print(f" [{n['NodeUI']['NodeSubType'].replace('EnumWidget_','').replace('_Code_Custom','CODE').replace('_Begin','START')}] {n['NodeUI']['NodeTitle']}")
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
# coding=utf-8
|
||||||
|
# 编译日期:2026-08-12 11:59:19
|
||||||
|
# 版权所有:www.i-search.com.cn
|
||||||
|
import ubpa.init_input as iinput
|
||||||
|
from ubpa.base_util import StdOutHook, ExceptionHandler
|
||||||
|
import time
|
||||||
|
import pdb
|
||||||
|
from ubpa.ilog import ILog
|
||||||
|
import getopt
|
||||||
|
from sys import argv
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import datetime as is_datetime
|
||||||
|
import pandas
|
||||||
|
from ubpa.base_img import *
|
||||||
|
import ubpa.iplatform as iplatform
|
||||||
|
|
||||||
|
class AutoRpa:
|
||||||
|
|
||||||
|
def __init__(self,**kwargs):
|
||||||
|
self.__logger = ILog(__file__)
|
||||||
|
self.path = set_img_res_path(__file__)
|
||||||
|
self.robot_no = ''
|
||||||
|
self.proc_no = ''
|
||||||
|
self.job_no = ''
|
||||||
|
self.input_arg = ''
|
||||||
|
if('robot_no' in kwargs.keys()):
|
||||||
|
self.robot_no = kwargs['robot_no']
|
||||||
|
if('proc_no' in kwargs.keys()):
|
||||||
|
self.proc_no = kwargs['proc_no']
|
||||||
|
if('job_no' in kwargs.keys()):
|
||||||
|
self.job_no = kwargs['job_no']
|
||||||
|
ILog.JOB_NO, ILog.OLD_STDOUT = self.job_no, sys.stdout
|
||||||
|
sys.stdout = StdOutHook(self.job_no, sys.stdout)
|
||||||
|
ExceptionHandler.JOB_NO, ExceptionHandler.OLD_STDERR = self.job_no, sys.stderr
|
||||||
|
sys.excepthook = ExceptionHandler.handle_exception
|
||||||
|
if('input_arg' in kwargs.keys()):
|
||||||
|
self.input_arg = kwargs['input_arg']
|
||||||
|
if(len(self.input_arg) <= 0):
|
||||||
|
self.input_arg = iinput.load_init(__file__)
|
||||||
|
if self.input_arg is None:
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
def Main(self):
|
||||||
|
#插入代码块#1
|
||||||
|
self.__logger.dlogs(job_no=self.job_no,logmsg='Flow:Main,StepNodeTag:20260812200000,Title:插入代码块#1,Note:合同建单完整流程 - Edge浏览器自动化')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
ILog.begin_init()
|
||||||
|
robot_no = ''
|
||||||
|
proc_no = ''
|
||||||
|
job_no = ''
|
||||||
|
input_arg = ''
|
||||||
|
params = {}
|
||||||
|
fn = "Main"
|
||||||
|
flow_params={'Main':[]}
|
||||||
|
try:
|
||||||
|
argv = sys.argv[1:]
|
||||||
|
opts, args = getopt.getopt(argv,"hr:p:j:i:c:",["robot = ","proc = ","job = ","input = ","params = "])
|
||||||
|
except getopt.GetoptError:
|
||||||
|
print ('robot.py -r <robot> -p <proc> -j <job>')
|
||||||
|
for opt, arg in opts:
|
||||||
|
if opt == '-h':
|
||||||
|
print ('robot.py -r <robot> -p <proc> -j <job>')
|
||||||
|
elif opt in ("-r", "--robot"):
|
||||||
|
robot_no = arg
|
||||||
|
elif opt in ("-p", "--proc"):
|
||||||
|
proc_no = arg
|
||||||
|
elif opt in ("-j", "--job"):
|
||||||
|
job_no = arg
|
||||||
|
elif opt in ("-i", "--input"):
|
||||||
|
input_arg = arg
|
||||||
|
elif opt in ("-c", "--params"):
|
||||||
|
cParam: dict = iinput.parseConnectorParam(arg)
|
||||||
|
params = cParam.pop("Params", params)
|
||||||
|
fn = cParam.pop("FlowName", fn)
|
||||||
|
pro = AutoRpa(robot_no=robot_no,proc_no=proc_no,job_no=job_no,input_arg=input_arg)
|
||||||
|
iplatform.Return(MainResult=getattr(pro, fn)(**params), job_no=job_no, fn=fn, flow_return_params=flow_params.get(fn,[]))
|
||||||
|
|
@ -0,0 +1,184 @@
|
||||||
|
# coding=utf-8
|
||||||
|
"""
|
||||||
|
APA (艺赛旗) BrowserAdapter 实现
|
||||||
|
将 contract_flow_steps.BrowserAdapter 协议映射到 ubpa/iedge 浏览器 API
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
import json
|
||||||
|
import time
|
||||||
|
import base64
|
||||||
|
|
||||||
|
|
||||||
|
def _make_apa_attr_map(css_selector: str) -> str:
|
||||||
|
"""将 CSS 选择器转换为 APA attrMap JSON 格式"""
|
||||||
|
hierarchy = {
|
||||||
|
"hasReachedRelativeAncestor": "false",
|
||||||
|
"nodeHierarchyInfo": [
|
||||||
|
{
|
||||||
|
"isPresentInSelector": 1,
|
||||||
|
"otherAttributes": {},
|
||||||
|
"selectorInfo": {
|
||||||
|
"attributes": {
|
||||||
|
"css-selector": css_selector,
|
||||||
|
"tag": "",
|
||||||
|
"xpath": ""
|
||||||
|
},
|
||||||
|
"index": 0,
|
||||||
|
"tagName": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
return json.dumps(hierarchy, ensure_ascii=False)
|
||||||
|
|
||||||
|
|
||||||
|
class ApaBrowserAdapter:
|
||||||
|
"""APA Studio Edge 浏览器适配器,实现 BrowserAdapter 协议"""
|
||||||
|
|
||||||
|
def __init__(self, url: str = ""):
|
||||||
|
from ubpa.iobject.browser import Browser
|
||||||
|
self._browser = Browser(Browser.AppName.edge)
|
||||||
|
self._url = url
|
||||||
|
self._is_open = False
|
||||||
|
|
||||||
|
def _ensure_open(self):
|
||||||
|
if not self._is_open:
|
||||||
|
from ubpa.iobject.browser import Browser
|
||||||
|
self._browser.open(url=self._url, timeout=30)
|
||||||
|
self._is_open = True
|
||||||
|
|
||||||
|
# ---- BrowserAdapter 协议实现 ----
|
||||||
|
|
||||||
|
def open_url(self, url: str) -> None:
|
||||||
|
self._url = url
|
||||||
|
self._ensure_open()
|
||||||
|
|
||||||
|
def fill_first(self, selectors: list[str], value: str) -> None:
|
||||||
|
self._ensure_open()
|
||||||
|
import ubpa.iedge as iedge
|
||||||
|
last_error = None
|
||||||
|
for sel in selectors:
|
||||||
|
try:
|
||||||
|
attr_map = _make_apa_attr_map(sel)
|
||||||
|
iedge.set_element_val(
|
||||||
|
attrMap=attr_map, title="*", url="*",
|
||||||
|
text=str(value), waitfor=5, program="msedge.exe"
|
||||||
|
)
|
||||||
|
time.sleep(0.3)
|
||||||
|
return
|
||||||
|
except Exception as e:
|
||||||
|
last_error = e
|
||||||
|
continue
|
||||||
|
raise RuntimeError(
|
||||||
|
f"fill_first failed for all selectors {selectors}: {last_error}"
|
||||||
|
)
|
||||||
|
|
||||||
|
def click_first(self, selectors: list[str]) -> None:
|
||||||
|
self._ensure_open()
|
||||||
|
import ubpa.iedge as iedge
|
||||||
|
last_error = None
|
||||||
|
for sel in selectors:
|
||||||
|
try:
|
||||||
|
attr_map = _make_apa_attr_map(sel)
|
||||||
|
iedge.do_click_pos(
|
||||||
|
attrMap=attr_map, title="*", url="*",
|
||||||
|
waitfor=5, program="msedge.exe"
|
||||||
|
)
|
||||||
|
time.sleep(0.5)
|
||||||
|
return
|
||||||
|
except Exception as e:
|
||||||
|
last_error = e
|
||||||
|
continue
|
||||||
|
raise RuntimeError(
|
||||||
|
f"click_first failed for all selectors {selectors}: {last_error}"
|
||||||
|
)
|
||||||
|
|
||||||
|
def wait_for_text(self, text: str, timeout_seconds: int = 15) -> None:
|
||||||
|
import ubpa.iedge as iedge
|
||||||
|
elapsed = 0
|
||||||
|
interval = 1
|
||||||
|
while elapsed < timeout_seconds:
|
||||||
|
try:
|
||||||
|
# 尝试获取页面文本匹配
|
||||||
|
result = iedge.get_element_val(
|
||||||
|
attrMap=_make_apa_attr_map(f"text={text}"),
|
||||||
|
title="*", url="*", waitfor=3, program="msedge.exe"
|
||||||
|
)
|
||||||
|
if result:
|
||||||
|
return
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
time.sleep(interval)
|
||||||
|
elapsed += interval
|
||||||
|
raise TimeoutError(f"wait_for_text '{text}' timed out after {timeout_seconds}s")
|
||||||
|
|
||||||
|
def select_first(self, selectors: list[str], value: str) -> None:
|
||||||
|
self._ensure_open()
|
||||||
|
import ubpa.iedge as iedge
|
||||||
|
last_error = None
|
||||||
|
for sel in selectors:
|
||||||
|
try:
|
||||||
|
attr_map = _make_apa_attr_map(sel)
|
||||||
|
iedge.set_element_selected_item(
|
||||||
|
attrMap=attr_map, title="*", url="*",
|
||||||
|
itemText=value, itemMode="text",
|
||||||
|
waitfor=5, program="msedge.exe"
|
||||||
|
)
|
||||||
|
time.sleep(0.3)
|
||||||
|
return
|
||||||
|
except Exception as e:
|
||||||
|
last_error = e
|
||||||
|
continue
|
||||||
|
raise RuntimeError(
|
||||||
|
f"select_first failed for all selectors {selectors}: {last_error}"
|
||||||
|
)
|
||||||
|
|
||||||
|
def upload_file_first(self, selectors: list[str], file_path: str) -> None:
|
||||||
|
self._ensure_open()
|
||||||
|
import ubpa.iedge as iedge
|
||||||
|
last_error = None
|
||||||
|
for sel in selectors:
|
||||||
|
try:
|
||||||
|
attr_map = _make_apa_attr_map(sel)
|
||||||
|
iedge.set_element_val(
|
||||||
|
attrMap=attr_map, title="*", url="*",
|
||||||
|
text=file_path, waitfor=5, program="msedge.exe"
|
||||||
|
)
|
||||||
|
time.sleep(1)
|
||||||
|
return
|
||||||
|
except Exception as e:
|
||||||
|
last_error = e
|
||||||
|
continue
|
||||||
|
raise RuntimeError(
|
||||||
|
f"upload_file_first failed for all selectors {selectors}: {last_error}"
|
||||||
|
)
|
||||||
|
|
||||||
|
def read_first(self, selectors: list[str], value_name: str = "") -> str:
|
||||||
|
self._ensure_open()
|
||||||
|
import ubpa.iedge as iedge
|
||||||
|
last_error = None
|
||||||
|
for sel in selectors:
|
||||||
|
try:
|
||||||
|
attr_map = _make_apa_attr_map(sel)
|
||||||
|
result = iedge.get_element_val(
|
||||||
|
attrMap=attr_map, title="*", url="*",
|
||||||
|
waitfor=5, program="msedge.exe"
|
||||||
|
)
|
||||||
|
if result:
|
||||||
|
return str(result)
|
||||||
|
except Exception as e:
|
||||||
|
last_error = e
|
||||||
|
continue
|
||||||
|
raise RuntimeError(
|
||||||
|
f"read_first failed for all selectors {selectors}: {last_error}"
|
||||||
|
)
|
||||||
|
|
||||||
|
def screenshot(self, name: str) -> str:
|
||||||
|
import os
|
||||||
|
save_dir = os.path.join(os.path.dirname(__file__), "screenshots")
|
||||||
|
os.makedirs(save_dir, exist_ok=True)
|
||||||
|
path = os.path.join(save_dir, f"{name}.png")
|
||||||
|
# APA browser screenshot capability - placeholder
|
||||||
|
print(f" [screenshot] {name} -> {path}")
|
||||||
|
return path
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
[]
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
# coding=utf-8
|
||||||
|
"""验证 Main.seq 并展示流程"""
|
||||||
|
import json
|
||||||
|
|
||||||
|
data = json.load(open(r'd:\RPA\AutoRpa\Main.seq', 'r', encoding='utf-8'))
|
||||||
|
nodes = data['NodeList']
|
||||||
|
lines = data['LineList']
|
||||||
|
|
||||||
|
print(f"节点总数: {len(nodes)}")
|
||||||
|
print(f"连线总数: {len(lines)}")
|
||||||
|
print()
|
||||||
|
print("=" * 70)
|
||||||
|
print(" 合同建单 (CONTRACT_CREATE) 流程图")
|
||||||
|
print("=" * 70)
|
||||||
|
print()
|
||||||
|
|
||||||
|
for i, n in enumerate(nodes):
|
||||||
|
ui = n['NodeUI']
|
||||||
|
subtype = ui['NodeSubType'].replace('EnumWidget_Begin', 'START').replace('EnumWidget_Code_Custom', 'CODE')
|
||||||
|
title = ui['NodeTitle']
|
||||||
|
print(f" [{subtype:6s}] {title}")
|
||||||
|
|
||||||
|
print()
|
||||||
|
print("=" * 70)
|
||||||
|
print(" 连线关系 (按序执行)")
|
||||||
|
print("=" * 70)
|
||||||
|
for i, l in enumerate(lines):
|
||||||
|
fr = l['LineStart']['Pidx'].split('/')[0][-6:]
|
||||||
|
to = l['LineEnd']['Pidx'].split('/')[0][-6:]
|
||||||
|
fr_node = next((n for n in nodes if n['NodeUI']['NodeTag'].endswith(fr)), None)
|
||||||
|
to_node = next((n for n in nodes if n['NodeUI']['NodeTag'].endswith(to)), None)
|
||||||
|
fr_title = fr_node['NodeUI']['NodeTitle'] if fr_node else fr
|
||||||
|
to_title = to_node['NodeUI']['NodeTitle'] if to_node else to
|
||||||
|
print(f" [{fr_title}] --> [{to_title}]")
|
||||||
|
|
||||||
|
print()
|
||||||
|
print("=" * 70)
|
||||||
|
print(" 运行说明")
|
||||||
|
print("=" * 70)
|
||||||
|
print(" 1. 在 APA Studio 中按 Ctrl+R 运行流程")
|
||||||
|
print(" 2. S01 节点会初始化所有模块和上下文")
|
||||||
|
print(" 3. S02-S15 节点依次执行合同建单各步骤")
|
||||||
|
print(" 4. 输出面板显示每步执行状态")
|
||||||
Loading…
Reference in New Issue