-
### 背景:在不同数据库迁移的项目中,往往会遇到SQL语法不兼容的情况。### 问题:如果存在大量代码需要改写的情况,靠人工处理会很耗时,且容易出错。能不能通过工具实现代码语法的大批量自动转换?### 方案:可以使用开源代码解析器 ZGLanguage 对SQL代码进行大批量自动转换### 案例演示:# 假设 ORACLE START WITH CONNECT 语法代码( start_with_connect.sql ):SELECT * FROM tree START WITH id = 1 CONNECT BY NOCYCLE PRIOR id = parentid ;# 配置转换规则可以将以上代码直接转换成如下代码(改写成with recursive语法):with recursive wr_tree as ( SELECT id, parentid, 1 as level from tree where id = 1 union SELECT tree.id, tree.parentid, level + 1 from tree, wr_tree where tree.parentid = wr_tree.id ) SELECT * from wr_tree order by id ;# 转换规则( STATR_WITH_CONNECT_SQL_REPLACE.syn )如下所示:__DEF_FUZZY__ Y __DEF_DEBUG__ N __DEF_CASE_SENSITIVE__ N __DEF_LINE_COMMENT__ -- __DEF_LINES_COMMENT__ /* */ __DEF_STR__ __IF_KW__ <1,100> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz [0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_ __DEF_PATH__ __START_WITH_CONNECT__ 1 : sel @ %__IF_KW__ | select : cc @ | * : frm @ | from : srctab @ | __NAME__ : sta @ %__IF_KW__ | start : wth @ %__IF_KW__ | with : swp @ | __NAME__ : dy1 @ | = : int @ | __INT__ : str @ + __STRING__ : cnn @ %__IF_KW__ | connect : by @ %__IF_KW__ | by : ncy @ %__IF_KW__ CAN_SKIP | nocycle : prr1 @ %__IF_KW__ CAN_SKIP | prior : col1 @ | __NAME__ : dy @ | = : col2 @ | __NAME__ : end @ | ; ----------------------------------------------------------------------- 1 : sel @ | with : sel @ | recursive : sel @ | wr_ : srctab @ \ __NAME__ : sel @ STRING | as : sel @ | __\n__ : sel @ | ( : sel @ | __\n__ : sel @ | select : col1 @ / __NAME__ : col2 @ \ , : col2 @ / __NAME__ : sel @ STRING \ , 1 as level from : srctab @ / __NAME__ : sta @ / where : swp @ / __NAME__ : dy1 @ / = : int @ / __INT__ : str @ / __STRING__ : sel @ | __\n__ : sel @ | union : sel @ | __\n__ : sel @ | select : srctab @ / __NAME__ : srctab @ \ . : col1 @ \ __NAME__ : col2 @ \ , : srctab @ / __NAME__ : srctab @ \ . : col2 @ \ __NAME__ : sel @ STRING \ , level + 1 from : srctab @ / __NAME__ : srctab @ \ , : sel @ / wr_ : srctab @ \ __NAME__ : sta @ / where : srctab @ / __NAME__ : srctab @ \ . : col2 @ \ __NAME__ : dy1 @ / = : sel @ / wr_ : srctab @ \ __NAME__ : srctab @ \ . : col1 @ \ __NAME__ : sel @ | __\n__ : sel @ STRING | ) : sel @ | __\n__ : sel @ | select : sel @ | * : sel @ STRING | from : sel @ | wr_ : srctab @ \ __NAME__ : sel @ / order : sel @ / by : col1 @ / __NAME__ : end @ | ; __DEF_STR__ __NAME__ <1,100> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_?? [0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_?? [NO] create insert update delete truncate drop merge table select inner left join on from where group order partition by having union all with as set between and or like in is not null case when then pivot lateral view __DEF_STR__ __INT__ <1,100> [1,100]0123456789 __DEF_SUB_PATH__ __STRING__ 1 : x1 | ' : x2 | __ANY__ : x3 | '
-
### 背景:在不同数据库迁移的项目中,往往会遇到SQL语法不兼容的情况。比如有的数据库支持PIVOT函数,有的不支持。遇到这种情况,就必须对PIVOT函数进行改写。### 问题:如果存在大量代码需要改写的情况,靠人工处理会很耗时,且容易出错。能不能通过工具实现代码语法的大批量自动转换?### 方案:可以使用开源代码解析器 ZGLanguage 对SQL代码进行大批量自动转换### 案例演示:# 存在 SQL PIVOT函数 如下所示:SELECT * FROM table2222 PIVOT ( SUM(sales) AS ss1, SUM(cogs) AS sc FOR (yr, qtr) IN ( (2001, 'Q1'), (2001, 'Q2'), (2001, 'Q3'), (2001, 'Q4') ) ) tmp ;# 使用开源软件 ZGLanguage 转换规则,执行转换,可得到结果:SELECT * FROM ( select ###,###,### SUM(case when yr=2001 and qtr='Q1' then sales else null end ) AS "2001_Q1_ss1", SUM(case when yr=2001 and qtr='Q2' then sales else null end ) AS "2001_Q2_ss1", SUM(case when yr=2001 and qtr='Q3' then sales else null end ) AS "2001_Q3_ss1", SUM(case when yr=2001 and qtr='Q4' then sales else null end ) AS "2001_Q4_ss1", SUM(case when yr=2001 and qtr='Q1' then cogs else null end ) AS "2001_Q1_sc", SUM(case when yr=2001 and qtr='Q2' then cogs else null end ) AS "2001_Q2_sc", SUM(case when yr=2001 and qtr='Q3' then cogs else null end ) AS "2001_Q3_sc", SUM(case when yr=2001 and qtr='Q4' then cogs else null end ) AS "2001_Q4_sc" from table2222 where (yr, qtr) IN ( (2001, 'Q1') , (2001, 'Q2') , (2001, 'Q3') , (2001, 'Q4') ) group by ###,###,### ) tmp ;# 转换规则如下所示 :__DEF_FUZZY__ Y __DEF_DEBUG__ N __DEF_CASE_SENSITIVE__ N __DEF_LINE_COMMENT__ -- __DEF_LINES_COMMENT__ /* */ __DEF_STR__ __IF_KW__ <1,100> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz [0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_ __DEF_PATH__ __FROM_PIVOT_2_1__ 1 : frm @ %__IF_KW__ | from : tab @ | __TABLE_NAME__ : ssl @ + __SUB_SELECT__ : pvt @ | pivot : x1 @ | ( N : fun @ | __NAME__ __//__ sum .... : fs @ | ( : col1 @ | __NAME__ : fe @ | ) : as1 @ %__IF_KW__ CAN_SKIP | as : colas @ | __NAME__ e : dh1 @ | , 1 : for2 @ %__IF_KW__ | for : y1 @ | __COLS_4_FOR__ : in2 @ | in : y5 @ | ( N : y3 @ | __VALUE_4_IN__ e : dh7 @ | , 1 : y6 @ | ) : x2 @ | ) ------------------------------------------------------------------ 1 : frm @ | from : tab @ | __TABLE_NAME__ : ssl @ | __SUB_SELECT__ : pvt @ | pivot : x1 @ | ( N : fun @ | __NAME__ : fs @ | ( : col1 @ | __NAME__ : fe @ | ) : as1 @ | as : colas @ | __NAME__ e : dh1 @ | , 1 : for2 @ | for : y1 @ | __COLS_4_FOR__ : in2 @ | in : y5 @ | ( N : y3 @ | __\b__ : y1 @ | __COLS_4_FOR__ : y3 @ | __VALUE_4_IN__ e : dh7 @ | , 1 : y6 @ | ) 1 : for2 @ | where : y1 @ | __COLS_4_FOR__ : in2 @ | in : y5 @ | ( N : y3 @ | __VALUE_4_IN__ e : dh7 @ | , 1 : y6 @ | ) : x2 @ | ) __DEF_PATH__ __FROM_PIVOT_2_2__ 1 : frm @ %__IF_KW__ | from : tab @ | __TABLE_NAME__ : ssl @ + __SUB_SELECT__ : pvt @ | pivot : x1 @ | ( N : fun @ | __NAME__ : fs @ | ( : col1 @ | __NAME__ : fe @ | ) : as1 @ %__IF_KW__ CAN_SKIP | as : colas @ | __NAME__ e : dh1 @ | , 1 : for2 @ %__IF_KW__ | for : y1 @ | __COLS_4_FOR__ : in2 @ | in : y5 @ | ( N : y3 @ | __COLS_VALUES__ e : dh7 @ | , 1 : y6 @ | ) 1 : where @ | where : y11 @ | __COLS_4_FOR__ : in21 @ | in : y51 @ | ( N : y31 @ | __VALUE_4_IN__ e : dh71 @ | , 1 : y61 @ | ) : x2 @ | ) ------------------------------------------------------------------ 1 : frm @ | from : tab @ | __TABLE_NAME__ : ssl @ | __SUB_SELECT__ : pvt @ | pivot : x1 @ | ( N : fun @ | __NAME__ : fs @ | ( : col1 @ | __NAME__ : fe @ | ) : as1 @ | as : colas @ | __NAME__ * : y3 @ | __COLS_VALUES__ e : y3 @ | , 1 : where @ | where : y11 @ | __COLS_4_FOR__ : in21 @ | in : y51 @ | ( N : y31 @ | __VALUE_4_IN__ e : dh71 @ | , 1 : y61 @ | ) : x2 @ | ) __DEF_PATH__ __FROM_PIVOT_2_3__ 1 : frm @ %__IF_KW__ | from : tab @ | __TABLE_NAME__ : ssl @ + __SUB_SELECT__ : pvt @ | pivot : x1 @ | ( N : fun @ | __NAME__ : fs @ | ( : col1 @ | __NAME__ : fe @ | ) : as1 @ %__IF_KW__ CAN_SKIP | as : colas @ | __NAME__ : cw @ | __CASE_WHEN__ : as2 @ | as : y2 @ | __VALUE_2_COL__ e : y3 @ | , 1 : where @ | where : y11 @ | __COLS_4_FOR__ : in21 @ | in : y51 @ | ( N : y31 @ | __VALUE_4_IN__ e : dh71 @ | , 1 : y61 @ | ) : x2 @ | ) -------------------------------------------------------------- 1 : frm @ | from : x1 @ | ( : x1 @ STRING | select ###,###,### N : fun @ | __NAME__ : fs @ | ( : cw @ | __CASE_WHEN__ : col1 @ | __NAME__ : col1 @ STRING | else null end : fe @ | ) : as1 @ | as : y2 @ | __VALUE_2_COL__ : colas @ \ __NAME__ : colas @ \ " e : y3 @ | , 1 : pvt @ | from : tab @ | __TABLE_NAME__ : ssl @ | __SUB_SELECT__ 1 : where @ | where : y11 @ | __COLS_4_FOR__ : in21 @ | in : y51 @ | ( N : y31 @ | __VALUE_4_IN__ e : dh71 @ | , 1 : y61 @ | ) : x1 @ STRING | group by ###,###,### : x2 @ | ) __DEF_SUB_PATH__ __VALUE_2_COL__ N : x1 @ | __INT__ + : x2 @ | ' : x3 @ | __ANY__ : x4 @ | ' ------------------------------------------------------------------ 1 : x1 @ | " : x3 @ | " N : x1 @ \ __INT__ : x3 @ \ __ANY__ : x1 @ \ _ : x3 @ \ _ __DEF_SUB_PATH__ __CASE_WHEN__ N : x1 @ | __NAME__ : x2 @ | = : x3 @ | __INT__ : x4 @ + __STRING__ e : x5 @ | and ------------------------------------------------------------------ 1 : x1 @ STRING | case when N : x1 @ | __NAME__ : x2 @ | = : x3 @ | __INT__ : x4 @ | __STRING__ e : x5 @ | and 1 : x1 @ | then __DEF_SUB_PATH__ __COLS_VALUES__ 1 : x1 @ | ( N : x2 @ | __NAME__ e : x3 @ | , 1 : x4 @ | ) : y1 @ | ( N : y2 @ | __INT__ : y3 @ + __STRING__ e : y4 @ | , 1 : y5 @ | ) ---------------------------------------------------------------------- N : x2 @ | __NAME__ : x2 @ / = : y2 @ / __INT__ : y3 @ / __STRING__ e : x2 @ | and 1 : x2 @ | as N : y2 @ | __INT__ : y3 @ | __STRING__ __DEF_SUB_PATH__ __COLS_4_FOR__ 1 : x1 @ | ( N : x2 @ | __NAME__ e : x3 @ | , 1 : x4 @ | ) __DEF_SUB_PATH__ __VALUE_4_IN__ 1 : x1 @ | ( N : x2 @ | __INT__ : x3 @ + __STRING__ e : x4 @ | , 1 : x5 @ | ) __DEF_SUB_PATH__ __TABLE_NAME__ 1 : srctab @ | __NAME__ + : schema @ | __NAME__ : pp @ | . : srctab2 @ | __NAME__ __DEF_SUB_PATH__ __SUB_SELECT__ 1 : x1 @ | __SUB__ __DEF_PATH__ __SUB__ 1 : x1 @ | ( N : x2 @ | __ALL_STR__ : x3 @ + __SUB__ 1 : x4 @ | ) __DEF_STR__ __ALL_STR__ <1,20000> [1,20000]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*-_+={}[]\|:;'"<,>.?/ __DEF_STR__ __NAME__ <1,100> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_?? [0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_?? [NO] create insert update delete truncate drop merge table select inner left join on from where group order partition by having union all with as set between and or like in is not null case when then pivot lateral view __DEF_STR__ __FLOAT__ <1,100> [1,50]0123456789 [1,1]. [1,50]0123456789 __DEF_STR__ __INT__ <1,100> [1,100]0123456789 __DEF_SUB_PATH__ __STRING__ 1 : x1 | ' : x2 | __ANY__ : x3 | ' ### 转换规则详细说明:以上PIVOT函数的转换规则比较复杂,不能一次性转换完毕,这里分成3次转换完成:ZGLanguage -e PIVOT_UNPIVOT_SQL_REPLACE.syn -r pivot_unpivot.code -o 1_mid_result.zgl ZGLanguage -e PIVOT_UNPIVOT_SQL_REPLACE.syn -r 1_mid_result.zgl -o 2_mid_result.zgl ZGLanguage -e PIVOT_UNPIVOT_SQL_REPLACE.syn -r 2_mid_result.zgl -o result.zgl # 第1次转换规则 “__FROM_PIVOT_2_1__” 对源代码进行转换, (A) 值“(yr, qtr)” 和 枚举值 “Q1,Q2,Q3,Q4” 的一一映射关系 (B) 新增:where结构(由 FOR 结构转换得到) 得到如下结果:SELECT * FROM table2222 PIVOT ( SUM ( sales ) AS ss1 , SUM ( cogs ) AS sc FOR (yr, qtr) IN ( (yr, qtr) (2001, 'Q1') , (yr, qtr) (2001, 'Q2') , (yr, qtr) (2001, 'Q3') , (yr, qtr) (2001, 'Q4') ) where (yr, qtr) IN ( (2001, 'Q1') , (2001, 'Q2') , (2001, 'Q3') , (2001, 'Q4') ) ) tmp ;# 第2次转换规则 “__FROM_PIVOT_2_2__” 对 “__FROM_PIVOT_2_1__” 的转换结果(以上)再次进行转换。 完成: (A) 聚合函数“SUM字段” 和 “(yr, qtr)字段” 的笛卡尔积映射 (B) 提取枚举值准备生成新的字段别名 得到如下结果:SELECT * FROM table2222 PIVOT ( SUM(sales) AS ss1 yr = 2001 and qtr = 'Q1' as 2001 'Q1' , SUM(sales) AS ss1 yr = 2001 and qtr = 'Q2' as 2001 'Q2' , SUM(sales) AS ss1 yr = 2001 and qtr = 'Q3' as 2001 'Q3' , SUM(sales) AS ss1 yr = 2001 and qtr = 'Q4' as 2001 'Q4' , SUM(cogs) AS sc yr = 2001 and qtr = 'Q1' as 2001 'Q1' , SUM(cogs) AS sc yr = 2001 and qtr = 'Q2' as 2001 'Q2' , SUM(cogs) AS sc yr = 2001 and qtr = 'Q3' as 2001 'Q3' , SUM(cogs) AS sc yr = 2001 and qtr = 'Q4' as 2001 'Q4' where (yr, qtr) IN ( (2001, 'Q1') , (2001, 'Q2') , (2001, 'Q3') , (2001, 'Q4') ) ) tmp ;# 第3次转换规则 “__FROM_PIVOT_2_3__” 对 “__FROM_PIVOT_2_2__” 的转换结果(以上)再次进行转换。 完成: (A) 对SUM开头的字段内容进行新增、位移、合并等操作,形成语法正确的字段逻辑 (B) 剔除PIVOT关键字,移动表名到 where 语句上方 (C) 拼接新的字段名称 (D) 新增待人工补充部分: select ###,###,### group by ###,###,### 得到最终结果:SELECT * FROM ( select ###,###,### SUM(case when yr=2001 and qtr='Q1' then sales else null end) AS "2001_Q1_ss1", SUM(case when yr=2001 and qtr='Q2' then sales else null end) AS "2001_Q2_ss1", SUM(case when yr=2001 and qtr='Q3' then sales else null end) AS "2001_Q3_ss1", SUM(case when yr=2001 and qtr='Q4' then sales else null end) AS "2001_Q4_ss1", SUM(case when yr=2001 and qtr='Q1' then cogs else null end) AS "2001_Q1_sc", SUM(case when yr=2001 and qtr='Q2' then cogs else null end) AS "2001_Q2_sc", SUM(case when yr=2001 and qtr='Q3' then cogs else null end) AS "2001_Q3_sc", SUM(case when yr=2001 and qtr='Q4' then cogs else null end) AS "2001_Q4_sc" from table2222 where (yr, qtr) IN ( (2001, 'Q1') , (2001, 'Q2') , (2001, 'Q3') , (2001, 'Q4') ) group by ###,###,### ) tmp ; ### 新增待补充部分 ###,###,### 说明:1、通过简单的配置,不能直接转换成完全可用的SQL代码,有些代码部分依然需要人工补充2、需要人工补充的部分,已经通过 ###,###,### 明显地标注出来3、通过工具已经完成了大部分的转换工作,可以极大减轻人工参与的工作量,规避人工修改失误的风险源代码下载: cid:link_0
-
import { http } from "@kit.NetworkKit";// 定义车票信息接口export interface TrainInfo { trainNumber: string; // 车次 trainType: string; // 车型 departureTime: string; // 发车时间 arrivalTime: string; // 到达时间 duration: string; // 历时 tickets: TicketInfo[]; // 余票信息}// 定义余票信息接口export interface TicketInfo { seatType: string; // 座位类型 price: number; // 价格 stockInfo: string; // 余票信息}// 定义温馨提示接口export interface TipInfo { content: string; // 提示内容}// 定义解析结果接口export interface ParseResult { trains: TrainInfo[]; tips: TipInfo[];}export class NetWorkService { private token: string = ''; private httpClient = http.createHttp(); async getAuthToken(): Promise<boolean> { const requestBody = { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "domain": { "name": "hid_bcwyicen9qp1qc8" }, "name": "ch", "password": "ch123456" } } }, "scope": { "domain": { "id": "7cd1794261ec444aace6ca7042addf04", "name": "hid_bcwyicen9qp1qc8" }, "project": { "id": "6a4e7e844b8941ba952cbf9805a97469", "name": "cn-north-4" } } } }; try { let response = await this.httpClient.request( 'https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens', { method: http.RequestMethod.POST, header: { 'Content-Type': 'application/json' }, extraData: requestBody } ); console.log("响应==>", JSON.stringify(response)); if (response.responseCode === 201) { const headers = response.header as Record<string, string>; this.token = headers?.['x-subject-token'] || ''; console.log('token==>', this.token); return true; } else { console.log('获取token失败,响应码:', response.responseCode); return false; } } catch (error) { console.error('获取token失败==》', error); return false; } } // 解析SSE流数据 private parseSSEData(sseData: string): any[] { const events: any[] = []; const lines = sseData.split('\n'); let currentEvent: any = null; for (let i = 0; i < lines.length; i++) { console.log('lines数据:', lines[i]) const line = lines[i].trim(); if (line.startsWith('data:')) { // console.log('line:', line) const jsonStr = line.substring(5).trim(); if (jsonStr) { try { const eventData = JSON.parse(jsonStr); events.push(eventData); } catch (e) { console.error('解析JSON失败:', e, '原始数据:', jsonStr); } } } } return events; } // 提取有用的消息内容 - 流式更新版本 extractMessagesStream(events: any[], onProgress?: (content: string) => void): string { let fullContent = ''; for (const event of events) { if (event.event === 'message' && event.content) { fullContent += event.content; // 如果有进度回调,实时调用 if (onProgress) { onProgress(fullContent); } } } return fullContent; } // 解析车票数据的方法 parseTrainData(result: string): ParseResult { const trains: TrainInfo[] = []; const tips: TipInfo[] = []; // 清理日志前缀,提取实际内容 const lines = result.split('\n') .map(line => { // 移除日志前缀 (时间戳、进程ID等) const match = line.match(/I\s+(.*)$/); return match ? match[1].trim() : line.trim(); }) .filter(line => line.length > 0); let currentTrain: TrainInfo | null = null; let inTicketsSection = false; let inTipsSection = false; for (const line of lines) { // 跳过标题行 if (line.includes('以下是') || line.includes('【车次信息】') || line.includes('(按发车时间排序)') || line.includes('需要帮您预订')) { continue; } // 检测温馨提示开始 if (line.includes('【温馨提示】')) { inTipsSection = true; inTicketsSection = false; continue; } // 处理温馨提示 if (inTipsSection) { if (line.match(/^\d+\.\s/)) { tips.push({ content: line }); } continue; } // 检测新车次开始 (格式: "1. G6357次 高铁") const trainMatch = line.match(/^(\d+)\.\s+([A-Z0-9]+)次\s+([^\s]+)/); if (trainMatch) { // 保存上一个车次 if (currentTrain) { trains.push(currentTrain); } currentTrain = { trainNumber: trainMatch[2], trainType: trainMatch[3], departureTime: '', arrivalTime: '', duration: '', tickets: [] }; inTicketsSection = false; continue; } if (!currentTrain) continue; // 解析发车到达时间 (格式: "▶ 发车:16:08 → 到达:16:28") const timeMatch = line.match(/▶\s*发车:([0-9:]+)\s*→\s*到达:([0-9:]+)/); if (timeMatch) { currentTrain.departureTime = timeMatch[1]; currentTrain.arrivalTime = timeMatch[2]; continue; } // 解析历时 (格式: "▶ 历时:20分钟") const durationMatch = line.match(/▶\s*历时:([0-9]+分钟)/); if (durationMatch) { currentTrain.duration = durationMatch[1]; continue; } // 开始余票部分 if (line.includes('▶ 余票:')) { inTicketsSection = true; continue; } // 解析余票信息 (格式: "- 商务座 ¥54(剩余7张)") if (inTicketsSection && line.startsWith('-')) { const ticketMatch = line.match(/-\s+([^\s]+)\s+¥(\d+)\s*(([^)]+))/); if (ticketMatch) { currentTrain.tickets.push({ seatType: ticketMatch[1], price: parseInt(ticketMatch[2]), stockInfo: ticketMatch[3] }); } } // 如果遇到空行或新车次开始,结束当前余票部分 if (line === '' && inTicketsSection) { inTicketsSection = false; } } // 添加最后一个车次 if (currentTrain) { trains.push(currentTrain); } return { trains, tips }; } async sendInfo(outCity: string, goCity: string, day: string, onProgress?: (content: string) => void): Promise<string> { if (!this.token) { console.error('token不存在,请先获取token'); return '请先获取认证token'; } let requestBody = { inputs: { query: `帮我查询${day}从${outCity}站到${goCity}站的火车高铁票信息,要求有时间车次票价,几等座剩余情况` } }; try { let response = await this.httpClient.request( 'https://123.249.99.67/v1/6a4e7e844b8941ba952cbf9805a97469/agents/cc158d0d-941a-46ed-a795-dde14e44bd20/conversations/fbeb7a0f-3db2-4bc5-8fb5-dd496944910b?version=1761735459481', { method: http.RequestMethod.POST, header: { 'Content-Type': 'application/json', 'X-Auth-Token': this.token }, extraData: requestBody } ); if (response.responseCode === 200 && response.result) { // 解析SSE数据 const events = this.parseSSEData(response.result as string); // 提取消息内容,支持流式更新 const message = this.extractMessagesStream(events, onProgress); return message || '未获取到车票信息'; } else { return `请求失败,状态码: ${response.responseCode}`; } } catch (e) { console.error('发送信息失败:', e); return '网络请求失败'; } }}
-
上回在鲲鹏平台上搭建了合规模型的代码和SO库,同时利用port advisoring工具进行依赖库扫描并建仓。除此之外,在测试节点上还有测试要完成。这是整体迁移的部分,合规模型依赖软件包。 这些软件包从而何来,为何存在于合规模型? 要说明这个问题,要从合规模型的业务场景说起。合规模型是用于JJ银行法审合同阶段,由于智能法审功能需要依赖专家经验,尤其这几个环节:合同识别、合同比对、合同关联审核、合同模版生成。合同识别是对这类合同进行自动判别,是文本语义分析环节。得到合同文本内容后,需要对合同历史版本进行比对,分析差异。接着对评审点进行审核,这是对评审点词条进行核对,如果评审点内容跟法务库里的词条产生冲突或不符,则产生合同异常信息。如果没有异常信息,对这类合同生成一个合同模版并留白。 在这一系列动作之前,还有打标签的环节。 这些业务场景如此复杂,证明了智能法审的功能比如牵涉很多功能点,处理多模态数据,比如图片、扫描件、电子文档、影印件........这些数据处理,会引入功能繁杂的软件依赖包。 例如合同比对,当时曾测试了两种方案,采用MICROS的插件,这是专门针对office软件的插件,比对效果非常好,就是目前MICROS软件里的比对功能专业插件,但缺点是不能定制改写,只适合office系列软件文档。随着GCH要求,银行逐步采用wps等办公软件,这个插件不兼容。 如何将这些插件软件包进行鲲鹏迁移,我们下次接着聊。
-
华为云开发者日·南京站来啦!参加“通过鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移”体验项目提出你的建议或使用体验有机会获得开发者盲盒礼包惊喜不容错过,快叫上小伙伴一起来参加吧~【体验项目】通过鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移【活动时间】2024年10月25日-10月31【参与方式】直接在此活动帖下方回帖提建议/提建议即可比如对产品功能的改进建议、对活动流程的感想、对现场活动的感悟等等PS:不要少于30字哦~【获奖规则】奖项设置有效回复楼层评选条件获奖名额激励礼品优质建议奖20对产品功能有改进价值的建议1名开发者盲盒礼品价值50-100元积极反馈奖20优质建议奖轮空的情况下进行抽取每满20层抽取1名开发者盲盒礼品价值50元【活动规则】1、本帖的回帖建议不少于30字,仅限于对“通过鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移”体验项目,其他项目建议不参与此次活动,否则将视为无效内容。2、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况;以上奖品均为实物奖品,具体发放视出库情况而定;3、活动预计于结束后七天内完成奖项公示,并于结束后15个工作日内完成邮寄。【温馨提示】1、请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。如一个实名认证对应多个账号,只有一个账号可领取奖励,若同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。2、所有获得奖品的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
-
华为云开发者日·武汉站来啦!参加“通过鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移”体验项目提出你的建议或使用体验有机会获得开发者盲盒礼包惊喜不容错过,快叫上小伙伴一起来参加吧~【体验项目】通过鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移【活动时间】2024年10月16日-10月20日【参与方式】直接在此活动帖下方回帖提建议/提建议即可比如对产品功能的改进建议、对活动流程的感想、对现场活动的感悟等等PS:不要少于30字哦~【获奖规则】奖项设置有效回复楼层评选条件获奖名额激励礼品优质建议奖20对产品功能有改进价值的建议1名开发者盲盒礼品价值50-100元积极反馈奖20优质建议奖轮空的情况下进行抽取每满20层抽取1名开发者盲盒礼品价值50元【活动规则】1、本帖的回帖建议不少于30字,仅限于对“通过鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移”体验项目,其他项目建议不参与此次活动,否则将视为无效内容。2、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况;以上奖品均为实物奖品,具体发放视出库情况而定;3、活动预计于结束后七天内完成奖项公示,并于结束后15个工作日内完成邮寄。【温馨提示】1、请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。如一个实名认证对应多个账号,只有一个账号可领取奖励,若同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。2、所有获得奖品的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
-
华为云开发者日·上海站来啦!参加“通过鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移”体验项目提出你的建议或使用体验有机会获得开发者盲盒礼包惊喜不容错过,快叫上小伙伴一起来参加吧~【体验项目】通过鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移【活动时间】2024年8月30日-9月6日【参与方式】直接在此活动帖下方回帖提建议/提建议即可比如对产品功能的改进建议、对活动流程的感想、对现场活动的感悟等等PS:不要少于30字哦~【获奖规则】奖项设置有效回复楼层评选条件获奖名额激励礼品优质建议奖20对产品功能有改进价值的建议1名开发者盲盒礼品价值50-100元积极反馈奖20优质建议奖轮空的情况下进行抽取抽取1名开发者盲盒礼品价值50元【活动规则】1、本帖的回帖建议不少于30字,仅限于对“通过鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移”体验项目,其他项目建议不参与此次活动,否则将视为无效内容。2、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况;以上奖品均为实物奖品,具体发放视出库情况而定;3、活动预计于结束后七天内完成奖项公示,并于结束后15个工作日内完成邮寄。【温馨提示】1、请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。如一个实名认证对应多个账号,只有一个账号可领取奖励,若同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。2、所有获得奖品的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
-
华为云开发者日·广州站来啦!参加“通过鲲鹏DevKit代码迁移工具快速完成X86软件包重构”项目,提出你的建议有机会获得开发者盲盒礼包惊喜不容错过,快叫上小伙伴一起来吧【体验项目】通过鲲鹏DevKit代码迁移工具快速完成X86软件包重构【活动时间】2024年5月23日-5月31日【参与方式】直接在此活动帖下方回帖提建议即可比如对产品功能的改进建议、对活动流程的感想、对现场活动的感悟等等PS:不要少于30字哦~【获奖规则】奖项设置有效回复楼层评选条件获奖名额激励礼品优质建议奖20对产品功能有改进价值的建议1名开发者盲盒礼品价值50-100元积极反馈奖20优质建议奖轮空的情况下进行抽取抽取1名开发者盲盒礼品价值50元【活动规则】1、本帖的回帖建议不少于30字,仅限于对“通过鲲鹏DevKit代码迁移工具快速完成X86软件包重构”体验项目,其他项目建议不参与此次活动,否则将视为无效内容。2、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况;以上奖品均为实物奖品,具体发放视出库情况而定;3、活动预计于结束后七天内完成奖项公示,并于结束后15个工作日内完成邮寄。【温馨提示】1、请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。如一个实名认证对应多个账号,只有一个账号可领取奖励,若同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。2、所有获得奖品的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
-
在MDC610使用LLVM交叉编译IPOPt库时发现,IPopt需要使用gfortran编译器,当前的交叉编译工具中并没有gfortran编译器,请问这个怎么解决
-
示例drop table if exists tmp_ta; create temp table tmp_ta( gender char, type char, price text, number text, sequence int ); insert into tmp_ta values('M','O', 1,20, 1); insert into tmp_ta values('M','M', 2,40, 2); insert into tmp_ta values('F','O', 3,30, 3); insert into tmp_ta values('F','M', 4,50, 4); insert into tmp_ta values('M','M', 4,60, 5); insert into tmp_ta values('F','O',4,40, 6);获得效果gendertypepricenumberjsonb_stringsequenceFO330{"3": "30"}3FM450{"3": "30", "4": "50"}4FO440{"3": "30", "4": "40"}6MO120{"1": "20"}1MM240{"1": "20", "2": "40"}2MM460{"1": "20", "2": "40", "4": "60"}5采用SQL示例select gender, type, price, number ,jsonb_object_agg(price,number) over(partition by gender order by sequence),sequence from tmp_ta;对应效果说明jsonb_object_agg聚合函数配合over进行移动聚合,可以实现相关json的key去重、以及累加聚合;若需要实现机械json聚合(不根据key去重),可以采用jsonb_agg及jsonb_build_object拼接select gender, type, price, number ,jsonb_agg(jsonb_build_object(price,number)) over(partition by gender order by sequence),sequence from tmp_ta;
-
出现这种问题,不知道哪里出差错了,请各位大佬帮忙看看,能不能解决一下
-
(ulab环境)进行ABC的应用包迁移到ulab环境,原环境中roma页面一直处于刷新状态,无法进行打包,导出,导致无法进行迁移
-
进行ABC的应用包迁移到ulab环境,安装到ulab环境之后,项目在库下面,原因是因为安装的资产包,改成源码包在进行安装,无法安装,这种情况该如何处理麻烦尽快解决,比较急迁移环境,谢谢顾庆耀/18068848554/guqingyao@chinasoftinc.com
-
华为云开发者日·2023年度创享峰会来啦!参加“使用DevKit快速完成C&C++程序源码迁移”,提出你的建议有机会获得开发者盲盒礼包惊喜不容错过,快叫上小伙伴一起来吧【体验项目】使用DevKit快速完成C&C++程序源码迁移【活动时间】2023年12月20日-12月31日【参与方式】直接在此活动帖下方回帖提建议即可比如对产品功能的改进建议、对操作流程的感想、对现场活动的感悟等等PS:不要少于30字哦~【获奖规则】奖项设置有效回复楼层评选条件获奖名额激励礼品优质建议奖20对产品功能有改进价值的建议1名开发者盲盒礼品价值50-100元积极反馈奖20优质建议奖轮空的情况下进行抽取抽取1名开发者盲盒礼品价值50元【活动规则】1、本帖的回帖建议不少于30字,仅限于对“使用DevKit快速完成C&C++程序源码迁移”体验项目,其他项目建议不参与此次活动,否则将视为无效内容。2、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况;以上奖品均为实物奖品,具体发放视出库情况而定;3、活动预计于结束后七天内完成奖项公示,并于结束后15个工作日内完成邮寄。【温馨提示】1、请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。如一个实名认证对应多个账号,只有一个账号可领取奖励,若同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。2、所有获得奖品的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
-
华为云开发者日·2023年度创享峰会来啦!参加“通过鲲鹏DevKit代码迁移工具快速完成X86软件包重构”,提出你的建议有机会获得开发者盲盒礼包惊喜不容错过,快叫上小伙伴一起来吧【体验项目】通过鲲鹏DevKit代码迁移工具快速完成X86软件包重构【活动时间】2023年12月20日-12月31日【参与方式】直接在此活动帖下方回帖提建议即可比如对产品功能的改进建议、对操作流程的感想、对现场活动的感悟等等PS:不要少于30字哦~【获奖规则】奖项设置有效回复楼层评选条件获奖名额激励礼品优质建议奖20对产品功能有改进价值的建议1名开发者盲盒礼品价值50-100元积极反馈奖20优质建议奖轮空的情况下进行抽取抽取1名开发者盲盒礼品价值50元【活动规则】1、本帖的回帖建议不少于30字,仅限于对“通过鲲鹏DevKit代码迁移工具快速完成X86软件包重构”体验项目,其他项目建议不参与此次活动,否则将视为无效内容。2、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况;以上奖品均为实物奖品,具体发放视出库情况而定;3、活动预计于结束后七天内完成奖项公示,并于结束后15个工作日内完成邮寄。【温馨提示】1、请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。如一个实名认证对应多个账号,只有一个账号可领取奖励,若同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。2、所有获得奖品的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
上滑加载中
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签