ns = params_kw.copy() source_upappid = ns.get('source_upappid', '') target_upappid = ns.get('target_upappid', '') if not source_upappid: return json.dumps({'widgettype':'Error','options':{'text':'缺少源上位系统ID'}}, ensure_ascii=False) if not target_upappid: return json.dumps({'widgettype':'Error','options':{'text':'请选择目标上位系统'}}, ensure_ascii=False) if source_upappid == target_upappid: return json.dumps({'widgettype':'Error','options':{'text':'源和目标上位系统不能相同'}}, ensure_ascii=False) db = DBPools() dbname = get_module_dbname('uapi') async with db.sqlorContext(dbname) as sor: # 查询源上位系统的所有API sql = 'select * from uapi where upappid = ${upappid}$' source_uapis = await sor.sqlExe(sql, {'upappid': source_upappid}) if not source_uapis: return json.dumps({'widgettype':'Error','options':{'text':'源上位系统中没有API记录'}}, ensure_ascii=False) # 查询目标上位系统已有的API名称 existing_sql = 'select name from uapi where upappid = ${upappid}$' existing_recs = await sor.sqlExe(existing_sql, {'upappid': target_upappid}) existing_names = {r['name'] for r in existing_recs} copied = 0 skipped = 0 for api in source_uapis: if api['name'] in existing_names: skipped += 1 continue new_id = getID() await sor.sqlExe( '''insert into uapi (id,upappid,name,title,description,need_auth,stream,path,httpmethod,chunk_match,headers,params,data,response,ioid,callbackurl) values (${id}$,${upappid}$,${name}$,${title}$,${description}$,${need_auth}$,${stream}$,${path}$,${httpmethod}$,${chunk_match}$,${headers}$,${params}$,${data}$,${response}$,${ioid}$,${callbackurl}$)''', { 'id': new_id, 'upappid': target_upappid, 'name': api.get('name', ''), 'title': api.get('title', ''), 'description': api.get('description', ''), 'need_auth': api.get('need_auth', '0'), 'stream': api.get('stream', ''), 'path': api.get('path', ''), 'httpmethod': api.get('httpmethod', 'GET'), 'chunk_match': api.get('chunk_match', ''), 'headers': api.get('headers', ''), 'params': api.get('params', ''), 'data': api.get('data', ''), 'response': api.get('response', ''), 'ioid': api.get('ioid', ''), 'callbackurl': api.get('callbackurl', '') } ) copied += 1 msg = f'成功复制 {copied} 条API记录' if skipped > 0: msg += f',跳过 {skipped} 条(API名称已存在)' return json.dumps({'widgettype':'Message','options':{'text':msg}}, ensure_ascii=False)