Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
deep-ask
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
deepseek
deep-ask
Commits
071edf96
Commit
071edf96
authored
3 months ago
by
luojun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
deepseek优化
parent
124ca54a
Changes
18
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
278 additions
and
113 deletions
+278
-113
DeepSeekAiListener.java
src/main/java/admin/listener/DeepSeekAiListener.java
+24
-48
WebSocketModel.java
src/main/java/admin/model/WebSocketModel.java
+48
-0
ChatgptRoleRecords.java
...java/admin/modules/chatgpt/domain/ChatgptRoleRecords.java
+8
-0
ChatgptRoleSession.java
...java/admin/modules/chatgpt/domain/ChatgptRoleSession.java
+2
-0
ChatgptRoleRecordsService.java
...in/modules/chatgpt/service/ChatgptRoleRecordsService.java
+11
-0
ChatgptRoleSessionService.java
...in/modules/chatgpt/service/ChatgptRoleSessionService.java
+2
-0
ChatgptRoleRecordsDto.java
...in/modules/chatgpt/service/dto/ChatgptRoleRecordsDto.java
+12
-0
ChatgptRoleSessionDto.java
...in/modules/chatgpt/service/dto/ChatgptRoleSessionDto.java
+3
-0
ChatgptRoleRecordsServiceImpl.java
...s/chatgpt/service/impl/ChatgptRoleRecordsServiceImpl.java
+29
-0
ChatgptRoleSessionServiceImpl.java
...s/chatgpt/service/impl/ChatgptRoleSessionServiceImpl.java
+11
-0
PythonResp.java
src/main/java/admin/resp/PythonResp.java
+28
-0
ChatgptRoleRecordsController.java
src/main/java/admin/rest/ChatgptRoleRecordsController.java
+48
-4
OpenApiController.java
src/main/java/admin/rest/OpenApiController.java
+2
-1
VoiceWebSocketServer.java
src/main/java/admin/server/VoiceWebSocketServer.java
+35
-47
PythonOpenApiClient.java
src/main/java/admin/service/PythonOpenApiClient.java
+2
-1
PythonOpenApiClientImpl.java
...main/java/admin/service/impl/PythonOpenApiClientImpl.java
+3
-2
HttpUtil.java
src/main/java/admin/util/HttpUtil.java
+1
-1
ResponseEnum.java
src/main/java/admin/util/ResponseEnum.java
+9
-9
No files found.
src/main/java/admin/listener/DeepSeekAiListener.java
View file @
071edf96
...
...
@@ -3,11 +3,13 @@ package admin.listener;
import
admin.model.MaxKbChatReq
;
import
admin.model.WebSocketModel
;
import
admin.model.maxdb.req.MaxdbReq
;
import
admin.model.maxdb.resp.MaxdbStreamResponse
;
import
admin.modules.chatgpt.domain.ChatgptRoleRecords
;
import
admin.modules.chatgpt.service.ChatgptRoleRecordsService
;
import
admin.util.*
;
import
admin.util.DateUtil
;
import
admin.util.ScreenEnum
;
import
admin.util.WebConnectUtil
;
import
admin.util.WebSocketUtil
;
import
com.alibaba.fastjson.JSON
;
import
com.google.gson.Gson
;
import
lombok.SneakyThrows
;
...
...
@@ -21,7 +23,6 @@ import javax.websocket.Session;
import
java.io.IOException
;
import
java.net.SocketException
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
/**
* @author lj
...
...
@@ -43,34 +44,25 @@ public class DeepSeekAiListener extends EventSourceListener {
@Override
public
void
onOpen
(
EventSource
eventSource
,
Response
response
)
{
super
.
onOpen
(
eventSource
,
response
);
//1.中科慧居简介直接发送
sendStartTranslate
(
maxKbChatReq
.
getSession
());
sendStartMessage
(
maxKbChatReq
.
getSession
());
log
.
info
(
"DeepSeek建立sse连接...onOpen"
);
}
private
void
sendStartTranslate
(
Session
session
)
{
/**
* 发送中添加start标签,用于展示知识库中的信息
* @param session websocket中session
*/
private
void
sendStartMessage
(
Session
session
)
{
if
(
maxKbChatReq
.
getShowType
()!=
null
){
sendStartMessage
(
session
);
WebSocketModel
webSocketModel
=
WebSocketModel
.
createByMaxKbChatReq
(
maxKbChatReq
,
"start"
,
"text"
,
""
);
try
{
session
.
getBasicRemote
().
sendText
(
JSON
.
toJSONString
(
webSocketModel
));
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
e
);
}
}
}
private
void
sendStartMessage
(
Session
session
)
{
WebSocketModel
webSocketModel
=
new
WebSocketModel
();
webSocketModel
.
setAction
(
"start"
);
webSocketModel
.
setType
(
"text"
);
webSocketModel
.
setShowType
(
maxKbChatReq
.
getShowType
().
getType
());
webSocketModel
.
setName
(
maxKbChatReq
.
getUserName
());
webSocketModel
.
setTitle
(
maxKbChatReq
.
getShowType
().
getDesc
());
webSocketModel
.
setImgs
(
maxKbChatReq
.
getShowType
().
getImgs
());
webSocketModel
.
setNote
(
maxKbChatReq
.
getShowType
().
getNote
());
webSocketModel
.
setPosition
(
maxKbChatReq
.
getShowType
().
getPosition
());
webSocketModel
.
setContent
(
""
);
try
{
session
.
getBasicRemote
().
sendText
(
JSON
.
toJSONString
(
webSocketModel
));
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
e
);
}
}
@Override
...
...
@@ -82,14 +74,8 @@ public class DeepSeekAiListener extends EventSourceListener {
MaxdbStreamResponse
completionResponse
=
gson
.
fromJson
(
data
,
MaxdbStreamResponse
.
class
);
if
(
completionResponse
.
getIsEnd
())
{
log
.
info
(
"DeepSeek返回数据结束了...onEvent"
);
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"action"
,
"done"
);
map
.
put
(
"type"
,
"text"
);
map
.
put
(
"showType"
,
maxKbChatReq
.
getShowType
().
getType
());
map
.
put
(
"imgs"
,
maxKbChatReq
.
getShowType
().
getImgs
());
map
.
put
(
"title"
,
maxKbChatReq
.
getShowType
().
getDesc
());
map
.
put
(
"content"
,
completionResponse
.
getContent
());
String
msg
=
JSON
.
toJSONString
(
map
);
WebSocketModel
webSocketModel
=
WebSocketModel
.
createByMaxKbChatReq
(
maxKbChatReq
,
"done"
,
"text"
,
completionResponse
.
getContent
());
String
msg
=
JSON
.
toJSONString
(
webSocketModel
);
maxKbChatReq
.
getSession
().
getBasicRemote
().
sendText
(
msg
);
if
(
maxKbChatReq
.
getClient
().
equals
(
WebSocketUtil
.
H5
)){
List
<
Session
>
webMap
=
WebConnectUtil
.
getWebMap
(
maxKbChatReq
.
getUserName
());
...
...
@@ -103,27 +89,17 @@ public class DeepSeekAiListener extends EventSourceListener {
});
}
}
// introduce();
//存储聊天记录
ChatgptRoleRecords
chatgptRoleRecords
=
new
ChatgptRoleRecords
();
chatgptRoleRecords
.
setMessage
(
this
.
stringBuffer
.
toString
());
chatgptRoleRecords
.
setReceiverId
(
ScreenEnum
.
getByUserName
(
maxKbChatReq
.
getUserName
()));
chatgptRoleRecords
.
setSessionId
(
Integer
.
valueOf
(
maxKbChatReq
.
getSessionId
()));
chatgptRoleRecords
.
setSenderId
(
10001
);
chatgptRoleRecords
.
setIsAsk
(
0
);
chatgptRoleRecords
.
setCreateTime
(
DateUtil
.
getNowTimestamp
());
chatgptRoleRecordsService
.
save
(
chatgptRoleRecords
);
chatgptRoleRecordsService
.
saveRecords
(
this
.
stringBuffer
.
toString
(),
ScreenEnum
.
getByUserName
(
maxKbChatReq
.
getUserName
()),
Integer
.
valueOf
(
maxKbChatReq
.
getSessionId
()),
10001
,
0
);
return
;
}
if
(
completionResponse
.
getContent
()!=
null
){
System
.
out
.
print
(
completionResponse
.
getContent
());
this
.
stringBuffer
.
append
(
completionResponse
.
getContent
());
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"action"
,
"reply"
);
map
.
put
(
"type"
,
"text"
);
map
.
put
(
"content"
,
completionResponse
.
getContent
());
String
msg
=
JSON
.
toJSONString
(
map
);
WebSocketModel
webSocketModel
=
WebSocketModel
.
createBaseMode
(
"reply"
,
"text"
,
completionResponse
.
getContent
());
String
msg
=
JSON
.
toJSONString
(
webSocketModel
);
maxKbChatReq
.
getSession
().
getBasicRemote
().
sendText
(
msg
);
if
(
maxKbChatReq
.
getClient
().
equals
(
WebSocketUtil
.
H5
)){
List
<
Session
>
webMap
=
WebConnectUtil
.
getWebMap
(
maxKbChatReq
.
getUserName
());
...
...
@@ -156,7 +132,7 @@ public class DeepSeekAiListener extends EventSourceListener {
for
(
Session
session
:
webMap
)
{
if
(!
set
.
contains
(
session
.
getId
())){
set
.
add
(
session
.
getId
());
sendStart
Translat
e
(
session
);
sendStart
Messag
e
(
session
);
}
}
}
...
...
This diff is collapsed.
Click to expand it.
src/main/java/admin/model/WebSocketModel.java
View file @
071edf96
...
...
@@ -50,4 +50,52 @@ public class WebSocketModel {
* 人员职位
*/
private
String
position
;
/**
* 图片路径
*/
private
String
chartUrl
;
/**
* 数据集
*/
private
String
dataList
;
public
static
WebSocketModel
createBaseMode
(
String
action
,
String
type
,
String
content
){
WebSocketModel
webSocketModel
=
new
WebSocketModel
();
webSocketModel
.
setType
(
type
);
webSocketModel
.
setAction
(
action
);
webSocketModel
.
setContent
(
content
);
return
webSocketModel
;
}
public
static
WebSocketModel
createByMaxKbChatReq
(
MaxKbChatReq
maxKbChatReq
,
String
action
,
String
type
,
String
content
){
WebSocketModel
webSocketModel
=
new
WebSocketModel
();
webSocketModel
.
setAction
(
action
);
webSocketModel
.
setType
(
type
);
webSocketModel
.
setShowType
(
maxKbChatReq
.
getShowType
()!=
null
?
maxKbChatReq
.
getShowType
().
getType
():
null
);
webSocketModel
.
setName
(
maxKbChatReq
.
getUserName
());
webSocketModel
.
setTitle
(
maxKbChatReq
.
getShowType
()!=
null
?
maxKbChatReq
.
getShowType
().
getDesc
():
null
);
webSocketModel
.
setImgs
(
maxKbChatReq
.
getShowType
()!=
null
?
maxKbChatReq
.
getShowType
().
getImgs
():
null
);
webSocketModel
.
setNote
(
maxKbChatReq
.
getShowType
()!=
null
?
maxKbChatReq
.
getShowType
().
getNote
():
null
);
webSocketModel
.
setPosition
(
maxKbChatReq
.
getShowType
()!=
null
?
maxKbChatReq
.
getShowType
().
getPosition
():
null
);
webSocketModel
.
setContent
(
content
);
return
webSocketModel
;
}
public
static
WebSocketModel
createSessionMode
(
String
action
,
String
type
,
String
content
,
String
sessionId
)
{
WebSocketModel
baseMode
=
createBaseMode
(
action
,
type
,
content
);
baseMode
.
setSessionId
(
sessionId
);
return
baseMode
;
}
public
static
WebSocketModel
createChartMode
(
String
action
,
String
type
,
String
content
,
String
chartUrl
)
{
WebSocketModel
baseMode
=
createBaseMode
(
action
,
type
,
content
);
baseMode
.
setChartUrl
(
chartUrl
);
return
baseMode
;
}
public
static
WebSocketModel
createDataList
(
String
action
,
String
type
,
String
content
)
{
WebSocketModel
baseMode
=
createBaseMode
(
action
,
type
,
content
);
baseMode
.
setDataList
(
content
);
return
baseMode
;
}
}
This diff is collapsed.
Click to expand it.
src/main/java/admin/modules/chatgpt/domain/ChatgptRoleRecords.java
View file @
071edf96
...
...
@@ -50,6 +50,14 @@ public class ChatgptRoleRecords implements Serializable {
@TableField
(
fill
=
FieldFill
.
INSERT
)
private
Timestamp
createTime
;
@ApiModelProperty
(
value
=
"1-收藏 0-不收藏"
)
private
Integer
isCollect
;
@ApiModelProperty
(
value
=
"1-数据集,2-ai生成的url"
)
private
Integer
type
;
@ApiModelProperty
(
value
=
"内容"
)
private
String
content
;
public
void
copyFrom
(
ChatgptRoleRecords
source
){
BeanUtil
.
copyProperties
(
source
,
this
,
CopyOptions
.
create
().
setIgnoreNullValue
(
true
));
}
...
...
This diff is collapsed.
Click to expand it.
src/main/java/admin/modules/chatgpt/domain/ChatgptRoleSession.java
View file @
071edf96
...
...
@@ -50,6 +50,8 @@ public class ChatgptRoleSession implements Serializable {
@TableField
(
fill
=
FieldFill
.
INSERT_UPDATE
)
private
Timestamp
updateTime
;
@ApiModelProperty
(
value
=
"1-收藏 0-不收藏"
)
private
Integer
isCollect
;
public
void
copyFrom
(
ChatgptRoleSession
source
){
BeanUtil
.
copyProperties
(
source
,
this
,
CopyOptions
.
create
().
setIgnoreNullValue
(
true
));
}
...
...
This diff is collapsed.
Click to expand it.
src/main/java/admin/modules/chatgpt/service/ChatgptRoleRecordsService.java
View file @
071edf96
...
...
@@ -85,4 +85,15 @@ public interface ChatgptRoleRecordsService extends CommonService<ChatgptRoleReco
String
queryMaxSessionId
();
List
<
ChatgptRoleRecordsDto
>
queryTenRecords
(
Integer
userId
);
/**
* 创建聊天记录
*/
void
saveRecords
(
String
message
,
Integer
receiverId
,
Integer
sessionId
,
Integer
senderId
,
Integer
isAsk
);
/**
* 创建聊天记录
*/
void
saveContent
(
String
message
,
Integer
receiverId
,
Integer
sessionId
,
Integer
senderId
,
Integer
isAsk
,
Integer
type
,
String
content
);
}
This diff is collapsed.
Click to expand it.
src/main/java/admin/modules/chatgpt/service/ChatgptRoleSessionService.java
View file @
071edf96
...
...
@@ -48,6 +48,8 @@ public interface ChatgptRoleSessionService extends CommonService<ChatgptRoleSess
@Async
Integer
updateUpdateTime
(
Integer
id
);
void
saveRecord
(
Integer
id
,
String
name
,
Integer
roleDescId
,
Integer
userId
);
/**
* 导出数据
* @param all 待导出的数据
...
...
This diff is collapsed.
Click to expand it.
src/main/java/admin/modules/chatgpt/service/dto/ChatgptRoleRecordsDto.java
View file @
071edf96
...
...
@@ -47,4 +47,16 @@ public class ChatgptRoleRecordsDto implements Serializable {
* 问答 1-问 0-答
*/
private
Integer
isAsk
;
/** 是否收藏 1-收藏 */
private
Integer
isCollect
;
/**
* 1-数据集
* 2-ai生成的url
*/
private
Integer
type
;
/**
* 内容
*/
private
String
content
;
}
This diff is collapsed.
Click to expand it.
src/main/java/admin/modules/chatgpt/service/dto/ChatgptRoleSessionDto.java
View file @
071edf96
...
...
@@ -46,4 +46,7 @@ public class ChatgptRoleSessionDto implements Serializable {
/** 更新时间 */
private
Timestamp
updateTime
;
/** 是否收藏 1-收藏 */
private
Integer
isCollect
;
}
This diff is collapsed.
Click to expand it.
src/main/java/admin/modules/chatgpt/service/impl/ChatgptRoleRecordsServiceImpl.java
View file @
071edf96
...
...
@@ -10,9 +10,12 @@ import admin.modules.chatgpt.service.dto.ChatgptRoleRecordsQueryCriteria;
import
admin.modules.chatgpt.service.mapper.ChatgptRoleRecordsMapper
;
import
admin.util.ConvertUtil
;
import
admin.util.DateUtil
;
import
admin.util.PageUtil
;
import
admin.util.ScreenEnum
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
lombok.AllArgsConstructor
;
import
org.jetbrains.annotations.NotNull
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Propagation
;
...
...
@@ -120,6 +123,32 @@ public class ChatgptRoleRecordsServiceImpl extends CommonServiceImpl<ChatgptRole
return
ConvertUtil
.
convertList
(
chatgptRoleRecordsDtos
,
ChatgptRoleRecordsDto
.
class
);
}
@Override
public
void
saveRecords
(
String
message
,
Integer
receiverId
,
Integer
sessionId
,
Integer
senderId
,
Integer
isAsk
)
{
ChatgptRoleRecords
chatgptRoleRecords
=
createRecords
(
message
,
receiverId
,
sessionId
,
senderId
,
isAsk
);
save
(
chatgptRoleRecords
);
}
@NotNull
private
static
ChatgptRoleRecords
createRecords
(
String
message
,
Integer
receiverId
,
Integer
sessionId
,
Integer
senderId
,
Integer
isAsk
)
{
ChatgptRoleRecords
chatgptRoleRecords
=
new
ChatgptRoleRecords
();
chatgptRoleRecords
.
setMessage
(
message
);
chatgptRoleRecords
.
setReceiverId
(
receiverId
);
chatgptRoleRecords
.
setSessionId
(
sessionId
);
chatgptRoleRecords
.
setSenderId
(
senderId
);
chatgptRoleRecords
.
setIsAsk
(
isAsk
);
chatgptRoleRecords
.
setCreateTime
(
DateUtil
.
getNowTimestamp
());
return
chatgptRoleRecords
;
}
@Override
public
void
saveContent
(
String
message
,
Integer
receiverId
,
Integer
sessionId
,
Integer
senderId
,
Integer
isAsk
,
Integer
type
,
String
content
)
{
ChatgptRoleRecords
chatgptRoleRecords
=
createRecords
(
message
,
receiverId
,
sessionId
,
senderId
,
isAsk
);
chatgptRoleRecords
.
setType
(
type
);
chatgptRoleRecords
.
setContent
(
content
);
save
(
chatgptRoleRecords
);
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
Integer
removeById
(
Integer
id
){
...
...
This diff is collapsed.
Click to expand it.
src/main/java/admin/modules/chatgpt/service/impl/ChatgptRoleSessionServiceImpl.java
View file @
071edf96
...
...
@@ -10,6 +10,7 @@ import admin.modules.chatgpt.service.dto.ChatgptRoleSessionQueryCriteria;
import
admin.modules.chatgpt.service.mapper.ChatgptRoleSessionMapper
;
import
admin.util.ConvertUtil
;
import
admin.util.PageUtil
;
import
admin.util.ScreenEnum
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
lombok.AllArgsConstructor
;
import
org.springframework.data.domain.Pageable
;
...
...
@@ -86,6 +87,16 @@ public class ChatgptRoleSessionServiceImpl extends CommonServiceImpl<ChatgptRole
return
chatgptRoleSessionMapper
.
updateUpdateTime
(
id
);
}
@Override
public
void
saveRecord
(
Integer
id
,
String
name
,
Integer
roleDescId
,
Integer
userId
)
{
ChatgptRoleSession
chatgptRoleSession
=
new
ChatgptRoleSession
();
chatgptRoleSession
.
setId
(
id
);
chatgptRoleSession
.
setName
(
name
);
chatgptRoleSession
.
setRoleDescId
(
roleDescId
);
chatgptRoleSession
.
setUserId
(
userId
);
save
(
chatgptRoleSession
);
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
int
removeById
(
Integer
id
){
...
...
This diff is collapsed.
Click to expand it.
src/main/java/admin/resp/PythonResp.java
0 → 100644
View file @
071edf96
package
admin
.
resp
;
import
lombok.Data
;
/**
* @author lj
* @date 2025/3/25 11:17
*/
@Data
public
class
PythonResp
{
/**
* 文件地址
*/
private
String
file
;
/**
* 数据
*/
private
String
data
;
/**
* 数据集
*/
private
String
dataList
;
/**
* type 1返回总结和原始数据集
* 2 返回总结和文件地址
*/
private
Integer
type
;
}
This diff is collapsed.
Click to expand it.
src/main/java/admin/rest/ChatgptRoleRecordsController.java
View file @
071edf96
...
...
@@ -2,13 +2,17 @@ package admin.rest;
import
admin.base.PageInfo
;
import
admin.modules.chatgpt.domain.ChatgptRoleRecords
;
import
admin.modules.chatgpt.domain.ChatgptRoleSession
;
import
admin.modules.chatgpt.service.ChatgptRoleRecordsService
;
import
admin.modules.chatgpt.service.ChatgptRoleSessionService
;
import
admin.modules.chatgpt.service.dto.ChatgptRoleRecordsDto
;
import
admin.modules.chatgpt.service.dto.ChatgptRoleRecordsQueryCriteria
;
import
admin.modules.chatgpt.service.dto.ChatgptRoleSessionDto
;
import
admin.modules.chatgpt.service.dto.ChatgptRoleSessionQueryCriteria
;
import
admin.resp.ApiResponse
;
import
admin.util.ScreenEnum
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.RequiredArgsConstructor
;
...
...
@@ -38,20 +42,60 @@ public class ChatgptRoleRecordsController {
@ApiOperation
(
"会话查询对话记录"
)
@GetMapping
(
value
=
"sessionList"
)
public
ApiResponse
<
Object
>
querySessionList
(
ChatgptRoleRecordsQueryCriteria
query
,
Pageable
pageable
)
{
return
ApiResponse
.
buildSuccess
(
chatgptRoleRecordsService
.
queryAll
(
query
,
pageable
));
public
ApiResponse
<
Object
>
querySessionList
(
ChatgptRoleRecordsQueryCriteria
query
)
{
List
<
ChatgptRoleRecordsDto
>
chatgptRoleRecordsDtoPageInfo
=
chatgptRoleRecordsService
.
queryAll
(
query
);
return
ApiResponse
.
buildSuccess
(
chatgptRoleRecordsDtoPageInfo
);
}
@ApiOperation
(
"查询会话"
)
@GetMapping
(
value
=
"list"
)
public
ApiResponse
<
Object
>
query
(
ChatgptRoleSessionQueryCriteria
query
,
Pageable
pageable
){
public
ApiResponse
<
Object
>
query
(
ChatgptRoleSessionQueryCriteria
query
){
Integer
byUserName
=
ScreenEnum
.
getByUserName
(
query
.
getName
());
query
.
setUserId
(
byUserName
);
return
ApiResponse
.
buildSuccess
(
chatgptRoleSessionService
.
queryAll
(
query
,
pageable
));
List
<
ChatgptRoleSessionDto
>
chatgptRoleSessionDtos
=
chatgptRoleSessionService
.
queryAll
(
query
);
return
ApiResponse
.
buildSuccess
(
chatgptRoleSessionDtos
!=
null
?
chatgptRoleSessionDtos
.
stream
().
sorted
(
Comparator
.
comparing
(
ChatgptRoleSessionDto:
:
getId
).
reversed
()).
collect
(
Collectors
.
toList
())
:
chatgptRoleSessionDtos
);
}
@ApiOperation
(
"收藏会话"
)
@GetMapping
(
value
=
"collect/list"
)
public
ApiResponse
<
Object
>
collectList
(
String
content
,
String
sessionId
){
List
<
ChatgptRoleRecords
>
list
=
chatgptRoleRecordsService
.
lambdaQuery
()
.
eq
(
ChatgptRoleRecords:
:
getMessage
,
content
)
.
eq
(
ChatgptRoleRecords:
:
getSessionId
,
sessionId
).
list
();
list
.
forEach
(
i
->
i
.
setIsCollect
(
1
));
chatgptRoleRecordsService
.
updateBatchById
(
list
);
return
ApiResponse
.
buildSuccess
();
}
@ApiOperation
(
"取消收藏会话"
)
@GetMapping
(
value
=
"cancel/collect/list"
)
public
ApiResponse
<
Object
>
cancelCollectList
(
Integer
id
){
ChatgptRoleRecordsDto
byId
=
chatgptRoleRecordsService
.
findById
(
id
);
if
(
byId
==
null
)
return
ApiResponse
.
buildFailure
(
"99"
,
"会话不存在"
);
byId
.
setIsCollect
(
0
);
chatgptRoleRecordsService
.
updateById
(
byId
);
return
ApiResponse
.
buildSuccess
();
}
@ApiOperation
(
"查询收藏会话"
)
@GetMapping
(
value
=
"query/collect/list"
)
public
ApiResponse
<
Object
>
queryCollectList
(
@RequestParam
String
userName
){
Integer
userId
=
ScreenEnum
.
getByUserName
(
userName
);
List
<
ChatgptRoleRecords
>
list
=
chatgptRoleRecordsService
.
lambdaQuery
().
eq
(
ChatgptRoleRecords:
:
getIsCollect
,
1
).
and
(
i
->
i
.
eq
(
ChatgptRoleRecords:
:
getSenderId
,
userId
).
or
().
eq
(
ChatgptRoleRecords:
:
getReceiverId
,
userId
)).
list
();
return
ApiResponse
.
buildSuccess
(
list
.
stream
().
sorted
(
Comparator
.
comparing
(
ChatgptRoleRecords:
:
getId
).
reversed
()).
collect
(
Collectors
.
toList
()));
}
@ApiOperation
(
"删除会话"
)
@GetMapping
(
value
=
"delete"
)
public
ApiResponse
<
Object
>
delete
(
Integer
sessionId
){
chatgptRoleSessionService
.
removeById
(
sessionId
);
List
<
ChatgptRoleRecords
>
list
=
chatgptRoleRecordsService
.
lambdaQuery
().
eq
(
ChatgptRoleRecords:
:
getSessionId
,
sessionId
).
list
();
chatgptRoleRecordsService
.
removeBatchByIds
(
list
);
return
ApiResponse
.
buildSuccess
();
}
@ApiOperation
(
"大屏临时查询十条会话记录"
)
@GetMapping
(
value
=
"queryTenRecords"
)
public
ApiResponse
<
Object
>
queryTenRecords
(
@RequestParam
String
userName
)
{
...
...
This diff is collapsed.
Click to expand it.
src/main/java/admin/rest/OpenApiController.java
View file @
071edf96
...
...
@@ -4,6 +4,7 @@ import admin.model.MaxKbChatReq;
import
admin.model.SendSseModel
;
import
admin.model.python.PythonApiReq
;
import
admin.resp.ApiResponse
;
import
admin.resp.PythonResp
;
import
admin.service.DeepSeekOpenApiService
;
import
admin.service.MaxkbOpenApiService
;
import
admin.service.OpenConnectService
;
...
...
@@ -31,7 +32,7 @@ public class OpenApiController {
@GetMapping
(
"testAnalysis"
)
public
ApiResponse
<
Object
>
testAnalysis
(
PythonApiReq
pythonApiReq
){
String
analysisData
=
pythonOpenApiClient
.
getAnalysisData
(
pythonApiReq
);
PythonResp
analysisData
=
pythonOpenApiClient
.
getAnalysisData
(
pythonApiReq
);
return
ApiResponse
.
buildSuccess
(
analysisData
);
}
...
...
This diff is collapsed.
Click to expand it.
src/main/java/admin/server/VoiceWebSocketServer.java
View file @
071edf96
...
...
@@ -8,6 +8,7 @@ import admin.modules.chatgpt.domain.ChatgptRoleRecords;
import
admin.modules.chatgpt.domain.ChatgptRoleSession
;
import
admin.modules.chatgpt.service.ChatgptRoleRecordsService
;
import
admin.modules.chatgpt.service.ChatgptRoleSessionService
;
import
admin.resp.PythonResp
;
import
admin.service.MaxkbOpenApiService
;
import
admin.service.PythonOpenApiClient
;
import
admin.util.*
;
...
...
@@ -18,6 +19,7 @@ import okhttp3.HttpUrl;
import
okhttp3.OkHttpClient
;
import
okhttp3.Request
;
import
okhttp3.ResponseBody
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
...
...
@@ -98,13 +100,8 @@ public class VoiceWebSocketServer {
}
//5.获取最新的会话id
String
maxSessionId
=
chatgptRoleRecordsService
.
queryMaxSessionId
();
WebSocketModel
webSocketModel
=
new
WebSocketModel
();
webSocketModel
.
setType
(
"text"
);
webSocketModel
.
setAction
(
"replaySessionId"
);
webSocketModel
.
setContent
(
maxSessionId
);
webSocketModel
.
setSessionId
(
maxSessionId
);
//6.返回给前端最新的sessionId
String
msg
=
JSON
.
toJSONString
(
webSocketModel
);
String
msg
=
JSON
.
toJSONString
(
WebSocketModel
.
createSessionMode
(
"replaySessionId"
,
"text"
,
maxSessionId
,
maxSessionId
)
);
try
{
session
.
getBasicRemote
().
sendText
(
msg
);
}
catch
(
IOException
e
)
{
...
...
@@ -126,6 +123,7 @@ public class VoiceWebSocketServer {
//存储不同的连接
if
(
mark
.
equals
(
WebSocketUtil
.
H5
)){
H5ConnectUtil
.
remove
(
name
);
log
.
info
(
"webOnClose关闭调用{}"
,
name
);
popUpEvent
(
name
,
"webOnClose"
);
}
else
{
WebConnectUtil
.
remove
(
sessionId
);
...
...
@@ -161,34 +159,14 @@ public class VoiceWebSocketServer {
//1.如果问题不存在则创建问题
ChatgptRoleSession
byId
=
chatgptRoleSessionService
.
getById
(
webSocketModel
.
getSessionId
());
if
(
byId
==
null
&&
"sendText"
.
equals
(
webSocketModel
.
getAction
()))
{
ChatgptRoleSession
chatgptRoleSession
=
new
ChatgptRoleSession
();
chatgptRoleSession
.
setId
(
Integer
.
valueOf
(
webSocketModel
.
getSessionId
()));
chatgptRoleSession
.
setName
(
webSocketModel
.
getData
());
chatgptRoleSession
.
setRoleDescId
(
10001
);
chatgptRoleSession
.
setUserId
(
ScreenEnum
.
getByUserName
(
webSocketModel
.
getName
()));
chatgptRoleSessionService
.
save
(
chatgptRoleSession
);
//创建问题记录
ChatgptRoleRecords
chatgptRoleRecords
=
new
ChatgptRoleRecords
();
chatgptRoleRecords
.
setMessage
(
webSocketModel
.
getData
());
chatgptRoleRecords
.
setReceiverId
(
10001
);
chatgptRoleRecords
.
setSessionId
(
Integer
.
valueOf
(
webSocketModel
.
getSessionId
()));
chatgptRoleRecords
.
setSenderId
(
ScreenEnum
.
getByUserName
(
webSocketModel
.
getName
()));
chatgptRoleRecords
.
setCreateTime
(
DateUtil
.
getNowTimestamp
());
chatgptRoleRecords
.
setIsAsk
(
1
);
chatgptRoleRecordsService
.
save
(
chatgptRoleRecords
);
chatgptRoleSessionService
.
saveRecord
(
Integer
.
valueOf
(
webSocketModel
.
getSessionId
()),
webSocketModel
.
getData
(),
10001
,
ScreenEnum
.
getByUserName
(
webSocketModel
.
getName
()));
//如果是H5则发送给大屏消息
sendMsgToWeb
(
memberId
,
webSocketModel
.
getData
());
}
else
if
(
byId
!=
null
&&
"sendText"
.
equals
(
webSocketModel
.
getAction
()))
{
ChatgptRoleRecords
chatgptRoleRecords
=
new
ChatgptRoleRecords
();
chatgptRoleRecords
.
setMessage
(
webSocketModel
.
getData
());
chatgptRoleRecords
.
setReceiverId
(
10001
);
chatgptRoleRecords
.
setSessionId
(
Integer
.
valueOf
(
webSocketModel
.
getSessionId
()));
chatgptRoleRecords
.
setSenderId
(
ScreenEnum
.
getByUserName
(
webSocketModel
.
getName
()));
chatgptRoleRecords
.
setIsAsk
(
1
);
chatgptRoleRecords
.
setCreateTime
(
DateUtil
.
getNowTimestamp
());
chatgptRoleRecordsService
.
save
(
chatgptRoleRecords
);
chatgptRoleRecordsService
.
saveRecords
(
webSocketModel
.
getData
(),
10001
,
Integer
.
valueOf
(
webSocketModel
.
getSessionId
()),
ScreenEnum
.
getByUserName
(
webSocketModel
.
getName
()),
1
);
//如果是H5则发送给大屏消息
sendMsgToWeb
(
memberId
,
webSocketModel
.
getData
());
...
...
@@ -200,32 +178,42 @@ public class VoiceWebSocketServer {
if
(
msg
!=
null
&&
!
msg
.
isEmpty
())
{
ResponseEnum
showType
=
getShowType
(
msg
);
SendSseModel
sendSseModel
=
new
SendSseModel
(
msg
,
webSocketModel
.
getSessionId
(),
session
,
webSocketModel
.
getName
(),
memberId
.
split
(
"__"
)[
0
].
equals
(
WebSocketUtil
.
H5
),
showType
);
log
.
info
(
"文字聊天发送:{}"
,
sendSseModel
);
maxkbOpenApiService
.
talk
(
sendSseModel
);
}
// 心跳
}
else
if
(
"heartbeat"
.
equals
(
webSocketModel
.
getAction
())){
WebSocketModel
webSocketModel1
=
new
WebSocketModel
();
webSocketModel1
.
setAction
(
"heartbeat_ack"
);
webSocketModel1
.
setType
(
"text"
);
webSocketModel1
.
setContent
(
""
);
String
msg
=
JSON
.
toJSONString
(
webSocketModel1
);
String
msg
=
JSON
.
toJSONString
(
WebSocketModel
.
createBaseMode
(
"heartbeat_ack"
,
"text"
,
""
));
sendMessage
(
session
,
msg
);
}
else
if
(
"startAnalysis"
.
equals
(
webSocketModel
.
getAction
())){
if
(
byId
==
null
){
chatgptRoleSessionService
.
saveRecord
(
Integer
.
valueOf
(
webSocketModel
.
getSessionId
()),
webSocketModel
.
getData
(),
10001
,
ScreenEnum
.
getByUserName
(
webSocketModel
.
getName
()));
//创建问题记录
chatgptRoleRecordsService
.
saveRecords
(
webSocketModel
.
getData
(),
10001
,
Integer
.
valueOf
(
webSocketModel
.
getSessionId
()),
ScreenEnum
.
getByUserName
(
webSocketModel
.
getName
()),
1
);
}
PythonApiReq
pythonApiReq
=
new
PythonApiReq
();
pythonApiReq
.
setQuestion
(
webSocketModel
.
getData
());
String
analysisData
=
pythonOpenApiClient
.
getAnalysisData
(
pythonApiReq
);
char
[]
charArray
=
analysisData
.
toCharArray
();
for
(
int
i
=
0
;
i
<
charArray
.
length
;
i
++){
WebSocketModel
webSocketModel1
=
new
WebSocketModel
();
webSocketModel1
.
setAction
(
"reply"
);
webSocketModel1
.
setType
(
"text"
);
webSocketModel1
.
setContent
(
String
.
valueOf
(
charArray
[
i
]));
sendMessage
(
session
,
JSONObject
.
toJSONString
(
webSocketModel1
));
PythonResp
analysisData
=
pythonOpenApiClient
.
getAnalysisData
(
pythonApiReq
);
if
(
analysisData
.
getType
().
equals
(
1
))
{
//左边内容
sendMessage
(
session
,
JSONObject
.
toJSONString
(
WebSocketModel
.
createDataList
(
"reply"
,
"text"
,
analysisData
.
getData
())));
//右边内容
sendMessage
(
session
,
JSONObject
.
toJSONString
(
WebSocketModel
.
createBaseMode
(
"rightReply"
,
"text"
,
analysisData
.
getDataList
())));
//结束标识
sendMessage
(
session
,
JSONObject
.
toJSONString
(
WebSocketModel
.
createBaseMode
(
"done"
,
"text"
,
""
)));
//存储会话记录
chatgptRoleRecordsService
.
saveContent
(
analysisData
.
getData
(),
ScreenEnum
.
getByUserName
(
memberId
.
split
(
"__"
)[
1
])
,
Integer
.
valueOf
(
webSocketModel
.
getSessionId
()),
10001
,
0
,
analysisData
.
getDataList
()!=
null
?
1
:
0
,
analysisData
.
getDataList
());
}
else
if
(
analysisData
.
getType
().
equals
(
2
)){
//左边内容
sendMessage
(
session
,
JSONObject
.
toJSONString
(
WebSocketModel
.
createChartMode
(
"reply"
,
"text"
,
analysisData
.
getData
(),
StringUtils
.
isNotBlank
(
analysisData
.
getFile
())
?
"http://newscreen.justh5.com/bg/"
+
analysisData
.
getFile
()
:
null
)));
//结束标识
sendMessage
(
session
,
JSONObject
.
toJSONString
(
WebSocketModel
.
createChartMode
(
"done"
,
"chart"
,
analysisData
.
getData
(),
StringUtils
.
isNotBlank
(
analysisData
.
getFile
())
?
"http://newscreen.justh5.com/bg/"
+
analysisData
.
getFile
()
:
null
)));
//存储会话记录
chatgptRoleRecordsService
.
saveContent
(
analysisData
.
getData
(),
ScreenEnum
.
getByUserName
(
memberId
.
split
(
"__"
)[
1
]),
Integer
.
valueOf
(
webSocketModel
.
getSessionId
()),
10001
,
0
,
StringUtils
.
isNotBlank
(
analysisData
.
getFile
())?
2
:
0
,
StringUtils
.
isNotBlank
(
analysisData
.
getFile
())?
"http://newscreen.justh5.com/bg/"
+
analysisData
.
getFile
():
null
);
}
WebSocketModel
endWebSocket
=
new
WebSocketModel
();
endWebSocket
.
setAction
(
"done"
);
endWebSocket
.
setType
(
"text"
);
sendMessage
(
session
,
JSONObject
.
toJSONString
(
endWebSocket
));
}
}
...
...
This diff is collapsed.
Click to expand it.
src/main/java/admin/service/PythonOpenApiClient.java
View file @
071edf96
package
admin
.
service
;
import
admin.model.python.PythonApiReq
;
import
admin.resp.PythonResp
;
import
java.util.List
;
...
...
@@ -15,7 +16,7 @@ public interface PythonOpenApiClient {
* @param pythonApiReq
* @return
*/
String
getAnalysisData
(
PythonApiReq
pythonApiReq
);
PythonResp
getAnalysisData
(
PythonApiReq
pythonApiReq
);
/**
* 获取相似问题
...
...
This diff is collapsed.
Click to expand it.
src/main/java/admin/service/impl/PythonOpenApiClientImpl.java
View file @
071edf96
package
admin
.
service
.
impl
;
import
admin.model.python.PythonApiReq
;
import
admin.resp.PythonResp
;
import
admin.service.PythonOpenApiClient
;
import
admin.util.HttpUtil
;
import
com.alibaba.fastjson.JSONObject
;
...
...
@@ -19,8 +20,8 @@ import java.util.List;
@Slf4j
public
class
PythonOpenApiClientImpl
implements
PythonOpenApiClient
{
@Override
public
String
getAnalysisData
(
PythonApiReq
pythonApiReq
)
{
return
HttpUtil
.
post
(
"http://py.justh5.com/aiapi/sqlqa/"
,
pythonApiReq
);
public
PythonResp
getAnalysisData
(
PythonApiReq
pythonApiReq
)
{
return
JSONObject
.
parseObject
(
HttpUtil
.
post
(
"http://py.justh5.com/aiapi/sqlqa/"
,
pythonApiReq
),
PythonResp
.
class
);
}
@Override
...
...
This diff is collapsed.
Click to expand it.
src/main/java/admin/util/HttpUtil.java
View file @
071edf96
...
...
@@ -39,7 +39,7 @@ public class HttpUtil {
public
static
String
post
(
String
url
,
Object
data
){
OkHttpClient
okHttpClient
=
new
OkHttpClient
().
newBuilder
().
connectTimeout
(
Duration
.
ofSeconds
(
30
)).
build
();
OkHttpClient
okHttpClient
=
new
OkHttpClient
().
newBuilder
().
readTimeout
(
Duration
.
ofMinutes
(
1
)).
connectTimeout
(
Duration
.
ofMinutes
(
1
)).
build
();
Request
request
=
null
;
try
{
request
=
new
Request
.
Builder
()
...
...
This diff is collapsed.
Click to expand it.
src/main/java/admin/util/ResponseEnum.java
View file @
071edf96
...
...
@@ -33,15 +33,15 @@ public enum ResponseEnum{
ZK_PLATFORM
(
8
,
"运营平台"
,
Arrays
.
asList
(
"https://bj-img.justh5.com/newBigScreen/software/yypt1.png"
,
"https://bj-img.justh5.com/newBigScreen/software/yypt2.png"
,
"https://bj-img.justh5.com/newBigScreen/software/yypt3.png"
,
"https://bj-img.justh5.com/newBigScreen/software/yypt4.png"
),
null
,
null
),
ZK_SMALL_PROGRAM
(
8
,
"客户端小程序"
,
Arrays
.
asList
(
"https://bj-img.justh5.com/newBigScreen/software/khdxcx1.png"
,
"https://bj-img.justh5.com/newBigScreen/software/khdxcx2.png"
,
"https://bj-img.justh5.com/newBigScreen/software/khdxcx3.png"
,
"https://bj-img.justh5.com/newBigScreen/software/khdxcx4.png"
),
null
,
null
),
ZK_POS
(
8
,
"手持机收费终端"
,
Arrays
.
asList
(
"https://bj-img.justh5.com/newBigScreen/software/sjzd1.png"
,
"https://bj-img.justh5.com/newBigScreen/software/sjzd2.png"
,
"https://bj-img.justh5.com/newBigScreen/software/sjzd3.png"
,
"https://bj-img.justh5.com/newBigScreen/software/sjzd4.png"
),
null
,
null
),
ZK_TB
(
9
,
"汤波"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/tb.png"
),
"创始人&董事长"
,
"中科慧居创始人;中科院研究生、MBA、中科院第一届创新创业班成员;动静态一体智能交通研究院副院长、中海地产项目经理、智能家居项目负责人;注册一级建造师、物联网领域资深专家;20多项国家专利发明人、2015年互联网+创新创业大赛全国总决赛最佳创业项目奖、2021年嘉兴市创业领军人才、2022年度科创中国长三角G60创业榜单30强。"
),
ZK_LL
(
9
,
"李乐"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/ll.png"
),
"联合创始人"
,
"中国科学院硕士研究生;人力资源经济师;原世界500强企业人力资源总监;十余年人力资源管理经验,具备系统的专业知识和丰富的实战经历。"
),
ZK_LBL
(
9
,
"吕泊岚"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/lbl.png"
),
"联合创始人"
,
"美国纽约伯克利大学海归,CFA;之江创业基金合伙人;中科慧居创始合伙人;沣墒资本管理合伙人;中科智泊科技董事长;畅尔装备监事。"
),
ZK_SWW
(
9
,
"孙巍巍"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/sww.png"
),
"联合创始人"
,
"原百度IDG事业部智慧停车行业总经理; 原精英路通常务副总经理;中交一公局停车行业运营总监; 两项国家行业标准参与制定者;省级科技进步一等奖。"
),
ZK_LZL
(
9
,
"刘照琳"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/lzl.png"
),
"联合创始人"
,
"英国巴斯大学硕士研究生;原世界五百强企业产品总监,具备丰富的设计及项目管理经验;熟悉3DSMAX、Rhino、SketchUp、AutoCAD等软件应用。"
),
ZK_ZH
(
9
,
"钟华"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/zh.png"
),
"特聘专家顾问"
,
"中国科学院大学软件研究所所长;博士生导师;中科院软件工程技术研究开发中心主任;中国软件行业协会常务理事;中国计算机协会理事。"
),
ZK_LHQ
(
9
,
"李海青"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/lhq.png"
),
"技术专家"
,
"中科院自动化所研究员;博士,师从谭铁牛院士;虹膜识别和人脸识别算法资深技术专家;中科虹霸、中科虹星人工智能算法首席技术负责人。"
),
ZK_FT
(
9
,
"冯涛"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/ft.png"
),
"技术专家"
,
"北京科技大学博士、副教授;第21届北京市优秀青年工程师;专注于物联网、人工智能、机器人领域的研究;获得多项科技奖项与发明专利。"
),
ZK_LRH
(
9
,
"刘瑞华"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/lhr.png"
),
"人工智能专家"
,
"中科院生态研究中心所博士;福布斯中国北美华人top60;美国希尔研究院创始合伙人;国家公派出国奖学金;中国科学院国际交流奖学金。"
);
ZK_TB
(
9
,
"汤波"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/tb
1
.png"
),
"创始人&董事长"
,
"中科慧居创始人;中科院研究生、MBA、中科院第一届创新创业班成员;动静态一体智能交通研究院副院长、中海地产项目经理、智能家居项目负责人;注册一级建造师、物联网领域资深专家;20多项国家专利发明人、2015年互联网+创新创业大赛全国总决赛最佳创业项目奖、2021年嘉兴市创业领军人才、2022年度科创中国长三角G60创业榜单30强。"
),
ZK_LL
(
9
,
"李乐"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/ll
1
.png"
),
"联合创始人"
,
"中国科学院硕士研究生;人力资源经济师;原世界500强企业人力资源总监;十余年人力资源管理经验,具备系统的专业知识和丰富的实战经历。"
),
ZK_LBL
(
9
,
"吕泊岚"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/lbl
1
.png"
),
"联合创始人"
,
"美国纽约伯克利大学海归,CFA;之江创业基金合伙人;中科慧居创始合伙人;沣墒资本管理合伙人;中科智泊科技董事长;畅尔装备监事。"
),
ZK_SWW
(
9
,
"孙巍巍"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/sww
1
.png"
),
"联合创始人"
,
"原百度IDG事业部智慧停车行业总经理; 原精英路通常务副总经理;中交一公局停车行业运营总监; 两项国家行业标准参与制定者;省级科技进步一等奖。"
),
ZK_LZL
(
9
,
"刘照琳"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/lzl
1
.png"
),
"联合创始人"
,
"英国巴斯大学硕士研究生;原世界五百强企业产品总监,具备丰富的设计及项目管理经验;熟悉3DSMAX、Rhino、SketchUp、AutoCAD等软件应用。"
),
ZK_ZH
(
9
,
"钟华"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/zh
1
.png"
),
"特聘专家顾问"
,
"中国科学院大学软件研究所所长;博士生导师;中科院软件工程技术研究开发中心主任;中国软件行业协会常务理事;中国计算机协会理事。"
),
ZK_LHQ
(
9
,
"李海青"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/lhq
1
.png"
),
"技术专家"
,
"中科院自动化所研究员;博士,师从谭铁牛院士;虹膜识别和人脸识别算法资深技术专家;中科虹霸、中科虹星人工智能算法首席技术负责人。"
),
ZK_FT
(
9
,
"冯涛"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/ft
1
.png"
),
"技术专家"
,
"北京科技大学博士、副教授;第21届北京市优秀青年工程师;专注于物联网、人工智能、机器人领域的研究;获得多项科技奖项与发明专利。"
),
ZK_LRH
(
9
,
"刘瑞华"
,
Collections
.
singletonList
(
"https://bj-img.justh5.com/newBigScreen/person/lhr
1
.png"
),
"人工智能专家"
,
"中科院生态研究中心所博士;福布斯中国北美华人top60;美国希尔研究院创始合伙人;国家公派出国奖学金;中国科学院国际交流奖学金。"
);
int
type
;
String
desc
;
List
<
String
>
imgs
;
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment