package com.smtaiserver.smtaiserver.control;
|
|
import java.util.Date;
|
import java.util.HashSet;
|
import java.util.List;
|
import java.util.Map.Entry;
|
import java.util.Random;
|
import java.util.Set;
|
|
import org.apache.commons.text.similarity.JaccardSimilarity;
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
import org.springframework.web.servlet.ModelAndView;
|
|
import com.smtaiserver.smtaiserver.core.SMTAIServerApp;
|
import com.smtaiserver.smtaiserver.core.SMTAIServerRequest;
|
import com.smtaiserver.smtaiserver.database.SMTDatabase;
|
import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord;
|
import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecords;
|
import com.smtservlet.core.SMTRequest;
|
import com.smtservlet.util.Json;
|
import com.smtservlet.util.SMTHttpClient;
|
import com.smtservlet.util.SMTJsonWriter;
|
import com.smtservlet.util.SMTStatic;
|
|
public class SMTAIServerControl
|
{
|
private static Logger _logger = LogManager.getLogger(SMTAIServerControl.class);
|
|
public ModelAndView swaggerConfigurationUI(SMTRequest tranReq) throws Exception {
|
// SMTJsonWriter jsonWr = new SMTJsonWriter(false);
|
// jsonWr.addKeyValue("docExpansion", "none");
|
// jsonWr.addKeyValue("apisSorter", "alpha");
|
// jsonWr.addKeyValue("defaultModelRendering", "schema");
|
// jsonWr.beginArray("supportedSubmitMethods");
|
// {
|
// jsonWr.addKeyValue(null, "get");
|
// jsonWr.addKeyValue(null, "post");
|
// }
|
// jsonWr.endArray();
|
// jsonWr.addKeyValue("jsonEditor", false);
|
// jsonWr.addKeyValue("showRequestHeaders", true);
|
// return tranReq.returnJson(jsonWr);
|
|
String retText = "{\"deepLinking\":true,\"displayOperationId\":false,\"defaultModelsExpandDepth\":1,\"defaultModelExpandDepth\":1,\"defaultModelRendering\":\"example\",\"displayRequestDuration\":false,\"docExpansion\":\"none\",\"filter\":false,\"operationsSorter\":\"alpha\",\"showExtensions\":false,\"tagsSorter\":\"alpha\",\"validatorUrl\":\"\",\"apisSorter\":\"alpha\",\"jsonEditor\":false,\"showRequestHeaders\":false,\"supportedSubmitMethods\":[\"get\",\"put\",\"post\",\"delete\",\"options\",\"head\",\"patch\",\"trace\"]}";
|
return tranReq.returnText(retText);
|
}
|
|
public ModelAndView swaggerConfigurationSecurity(SMTRequest tranReq) throws Exception
|
{
|
return tranReq.returnJson(Json.object());
|
}
|
|
public ModelAndView swaggerResource(SMTRequest tranReq) throws Exception
|
{
|
Json json = SMTAIServerApp.getApp().readSwaggerApiDocJson();
|
List<Json> listGroups = json.getJson("hwngroups").asJsonList();
|
|
|
SMTJsonWriter jsonWr = new SMTJsonWriter(true);
|
|
if(listGroups.size() == 0)
|
{
|
jsonWr.beginMap(null);
|
{
|
jsonWr.addKeyValue("name", "default");
|
jsonWr.addKeyValue("url", "/v2/api-docs");
|
jsonWr.addKeyValue("location", "/v2/api-docs");
|
jsonWr.addKeyValue("swaggerVersion", "2.0");
|
}
|
jsonWr.endMap();
|
}
|
else
|
{
|
jsonWr.beginMap(null);
|
{
|
jsonWr.addKeyValue("name", "default");
|
jsonWr.addKeyValue("url", "/v2/api-docs");
|
jsonWr.addKeyValue("location", "/v2/api-docs");
|
jsonWr.addKeyValue("swaggerVersion", "2.0");
|
}
|
jsonWr.endMap();
|
|
for(Json jsonGroup : listGroups)
|
{
|
String groupName = jsonGroup.asString();
|
|
jsonWr.beginMap(null);
|
{
|
jsonWr.addKeyValue("name", groupName);
|
jsonWr.addKeyValue("url", "/v2/api-docs?group=" + groupName);
|
jsonWr.addKeyValue("location", "/v2/api-docs");
|
jsonWr.addKeyValue("swaggerVersion", "2.0");
|
}
|
jsonWr.endMap();
|
}
|
}
|
return tranReq.returnJson(jsonWr);
|
}
|
|
public ModelAndView swaggerDocs(SMTRequest tranReq) throws Exception
|
{
|
String groupName = (String) tranReq.convParamToString("group", false);
|
Json json = SMTAIServerApp.getApp().readSwaggerApiDocJson();
|
|
if(groupName == null)
|
groupName = "";
|
|
SMTJsonWriter jsonWr = new SMTJsonWriter(false);
|
jsonWr.addKeyRaw("swagger", json.getJson("swagger"));
|
jsonWr.addKeyRaw("info", json.getJson("info"));
|
jsonWr.beginMap("paths");
|
for(Entry<String, Json> jsonPort : json.getJson("paths").asJsonMap().entrySet())
|
{
|
String curGroupName = jsonPort.getValue().safeGetStr("hwngroup", "");
|
if(!curGroupName.equals(groupName))
|
continue;
|
|
jsonWr.addKeyRaw(jsonPort.getKey(), jsonPort.getValue());
|
}
|
jsonWr.endMap();
|
|
//Json json = Json.read(new File("D:/TTT_DOC/backup/swagger/swagger-test.json"));
|
return tranReq.returnJson(jsonWr);
|
}
|
|
public ModelAndView getSwaggerJson(SMTRequest tranReq) throws Exception
|
{
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.beginMap("swagger");
|
SMTAIServerApp.getApp().readSwaggerJson(jsonWr);
|
jsonWr.endMap();
|
|
return tranReq.returnJson(jsonWr);
|
}
|
|
public ModelAndView sendLoginSMS(SMTAIServerRequest tranReq) throws Exception
|
{
|
String phone = tranReq.convParamToString("phone", true);
|
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
DBRecords recs = db.querySQL("SELECT user_id FROM sys_user_info WHERE user_phone=?", new Object[] {
|
phone
|
});
|
if(recs.getRowCount() == 0)
|
return tranReq.returnJsonState(true, null, null);
|
|
Random random = new Random();
|
String smsCode = "";
|
for(int i = 0; i < 4; i ++)
|
{
|
smsCode += SMTStatic.toString(Math.abs(random.nextInt()) % 10);
|
}
|
|
SMTHttpClient web = new SMTHttpClient();
|
|
String ret = web.getHttpString("http://www.ztsms.cn:8800/sendXSms.do", new String[] {
|
"username", "eventech",
|
"password", "Abcd123456",
|
"mobile", phone,
|
"content", "验证码:" + smsCode + "【选型系统】",
|
"dstime","",
|
"productid","676767",
|
"xh",""
|
}, null);
|
|
if(!ret.startsWith("1,"))
|
return tranReq.returnJsonState(false, "验证码发送失败", null);
|
|
_logger.info("=========> sendSMSCode PHONE=" + phone + " sms=" + smsCode);
|
db.executeSQL("UPDATE sys_user_info SET sms_code=? WHERE user_phone=?", new Object[] {
|
smsCode + "\n" + SMTStatic.toString(new Date()),
|
phone
|
});
|
|
return tranReq.returnJsonState(true, null, null);
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
private ModelAndView loginUser(SMTDatabase db, DBRecord recUser, boolean updateLoginFlag, SMTAIServerRequest tranReq) throws Exception
|
{
|
String userId = recUser.getString("user_id");
|
|
tranReq.setLoginUserId(userId);
|
|
if(updateLoginFlag)
|
db.executeSQL("UPDATE sys_user_info SET web_login='Y' WHERE user_id=?", new Object[] {userId});
|
|
|
// 获取用户所属的agent_group
|
DBRecords recs = db.querySQL("SELECT DISTINCT group_id FROM sys_role_group R WHERE role_id in (SELECT role_id FROM sys_role_user WHERE user_id=?)",
|
new Object[] {userId});
|
Set<String> setAgentGroup = new HashSet<>();
|
for(DBRecord rec : recs.getRecords())
|
{
|
setAgentGroup.add(rec.getString("group_id"));
|
}
|
tranReq.setAgentGroupSet(setAgentGroup);
|
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.addKeyValue("hswatersession", tranReq.getSessionId());
|
jsonWr.addKeyValue("phone", recUser.getString("user_phone"));
|
jsonWr.addKeyValue("id", recUser.getString("user_id"));
|
jsonWr.addKeyValue("name", recUser.getString("user_name"));
|
jsonWr.addKeyValue("real_name", recUser.getString("real_name"));
|
jsonWr.addKeyValue("part", recUser.getString("user_part"));
|
jsonWr.addKeyValue("sex", recUser.getString("user_sex"));
|
jsonWr.addKeyValue("email", recUser.getString("user_email"));
|
jsonWr.addKeyValue("note", recUser.getString("note"));
|
jsonWr.addKeyValue("web_login", "Y".equals(recUser.getString("web_login")));
|
|
return tranReq.returnJson(jsonWr);
|
}
|
|
public ModelAndView loginSMS(SMTAIServerRequest tranReq) throws Exception
|
{
|
String phone = tranReq.convParamToString("phone", true);
|
String code = tranReq.convParamToString("code", true);
|
String client = tranReq.convParamToString("client", false);
|
if(SMTStatic.isNullOrEmpty(client))
|
client = "手机";
|
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
DBRecords recs = db.querySQL("SELECT * FROM sys_user_info WHERE user_phone=? AND sms_code IS NOT NULL AND user_state_code='Y'", new Object[] {
|
phone
|
});
|
if(recs.getRowCount() == 0)
|
return tranReq.returnJsonState(false, "登录失败", null);
|
|
DBRecord rec = recs.getRecord(0);
|
String[] sp = rec.getString("sms_code").split("\n");
|
if(sp.length == 2)
|
{
|
if(sp[0].equals(code))
|
{
|
db.executeSQL("UPDATE sys_user_info SET sms_code=NULL WHERE user_phone=?", new Object[] {phone});
|
|
if((new Date().getTime() - SMTStatic.toDate(sp[1]).getTime()) < 5 * 60 * 1000)
|
{
|
db.executeSQL("INSERT INTO sys_operate_log(op_id, op_type, op_time, op_user, op_note, client_ip,op_from)VALUES(?,?,?,?,?,?,?)", new Object[] {
|
SMTStatic.newUUID(),
|
"短信登录",
|
new Date(),
|
recs.getRecord(0).getString("user_id"),
|
"用户通过" + client + "用手机号登录",
|
tranReq.getClientAddr(),
|
client
|
});
|
|
return loginUser(db, rec, false, tranReq);
|
}
|
else
|
{
|
return tranReq.returnJsonState(false, "验证码超时", null);
|
}
|
}
|
|
}
|
|
return tranReq.returnJsonState(false, "登录失败", null);
|
|
}
|
finally
|
{
|
db.close();
|
}
|
|
}
|
|
public ModelAndView login(SMTAIServerRequest tranReq) throws Exception
|
{
|
String username = tranReq.convParamToString("user", true);
|
String password = tranReq.convParamToString("pass", true);
|
String client = tranReq.convParamToString("client", false);
|
|
if(SMTStatic.isNullOrEmpty(client))
|
client = "Web端";
|
|
boolean updateLoginFlag = false;
|
if("Web端".equals(client))
|
updateLoginFlag = true;
|
|
password = SMTStatic.convStrToMD5(password);
|
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
DBRecords recs = db.querySQL("SELECT * FROM sys_user_info WHERE user_name=? AND user_state_code='Y'", new Object[] {
|
username
|
});
|
if(recs.getRowCount() == 0)
|
return tranReq.returnJsonState(false, "登录失败", null);
|
|
String userPass = recs.getRecord(0).getString("user_pass");
|
if(!SMTStatic.isNullOrEmpty(userPass))
|
{
|
if(!userPass.equals(password))
|
return tranReq.returnJsonState(false, "登录失败", null);
|
}
|
|
db.executeSQL("INSERT INTO sys_operate_log(op_id, op_type, op_time, op_user, op_note, client_ip, op_from)VALUES(?,?,?,?,?,?, ?)", new Object[] {
|
SMTStatic.newUUID(),
|
"密码登录",
|
new Date(),
|
recs.getRecord(0).getString("user_id"),
|
"用户通过" + client + "用密码登录",
|
tranReq.getClientAddr(),
|
client
|
});
|
tranReq.setSessionAttribute("login_from", client);
|
|
return loginUser(db, recs.getRecord(0), updateLoginFlag, tranReq);
|
}
|
finally
|
{
|
db.close();
|
}
|
|
}
|
|
public ModelAndView getLLMList(SMTAIServerRequest tranReq) throws Exception
|
{
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.beginArray("llm_list");
|
{
|
jsonWr.beginMap(null);
|
{
|
jsonWr.addKeyValue("id", "chat-mm");
|
jsonWr.addKeyValue("title", "chat-mm模型");
|
}
|
jsonWr.endMap();
|
|
jsonWr.beginMap(null);
|
{
|
jsonWr.addKeyValue("id", "chat-3.5");
|
jsonWr.addKeyValue("title", "chat-3.5模型");
|
}
|
jsonWr.endMap();
|
}
|
jsonWr.endArray();
|
|
return tranReq.returnJson(jsonWr);
|
}
|
|
|
public ModelAndView logout(SMTAIServerRequest tranReq) throws Exception
|
{
|
tranReq.clearSession();
|
return tranReq.returnJsonState(true, null, null);
|
}
|
|
public ModelAndView getSceneGroupTree(SMTAIServerRequest tranReq) throws Exception
|
{
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
String userId = tranReq.getLoginUserId();
|
DBRecords recs;
|
|
if(SMTStatic.isNullOrEmpty(userId))
|
{
|
recs = db.querySQL("SELECT group_id, group_name, p_group_id, group_title, group_type FROM ai_scene_group ORDER BY group_name", null);
|
}
|
else
|
{
|
String sql =
|
"SELECT\r\n"
|
+ " group_id, group_name, p_group_id, group_title, group_type\r\n"
|
+ "FROM\r\n"
|
+ " ai_scene_group S\r\n"
|
+ "WHERE\r\n"
|
+ " S.group_id IN (\r\n"
|
+ " SELECT\r\n"
|
+ " G.group_id\r\n"
|
+ " FROM\r\n"
|
+ " sys_role_group G\r\n"
|
+ " INNER JOIN\r\n"
|
+ " sys_role_user R\r\n"
|
+ " ON\r\n"
|
+ " R.user_id=?\r\n"
|
+ " AND R.role_id=G.role_id\r\n"
|
+ " )\r\n"
|
+ "ORDER BY \r\n"
|
+ " group_name"
|
;
|
recs = db.querySQL(sql, new Object[] {userId});
|
}
|
|
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.beginArray("groups");
|
for(DBRecord rec : recs.getRecords())
|
{
|
jsonWr.beginMap(null);
|
{
|
jsonWr.addKeyValue("group_id", rec.getString("group_id"));
|
jsonWr.addKeyValue("group_name", rec.getString("group_name"));
|
jsonWr.addKeyValue("p_group_id", rec.getString("p_group_id"));
|
jsonWr.addKeyValue("group_title", rec.getString("group_title"));
|
jsonWr.addKeyValue("group_type", rec.getString("group_type"));
|
}
|
jsonWr.endMap();
|
}
|
jsonWr.endArray();
|
|
return tranReq.returnJson(jsonWr);
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
public ModelAndView getSceneSample(SMTAIServerRequest tranReq) throws Exception
|
{
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
String userId = tranReq.getLoginUserId();
|
DBRecords recs;
|
|
if(SMTStatic.isNullOrEmpty(userId))
|
{
|
recs = db.querySQL("SELECT group_id, sample_id, sample_title, sample_question FROM ai_scene_sample ORDER BY sample_id", null);
|
}
|
else
|
{
|
String sql =
|
"SELECT\r\n"
|
+ " group_id, sample_id, sample_title, sample_question\r\n"
|
+ "FROM\r\n"
|
+ " ai_scene_sample S\r\n"
|
+ "WHERE\r\n"
|
+ " S.sample_enable='Y'\r\n"
|
+ " AND S.group_id IN (\r\n"
|
+ " SELECT\r\n"
|
+ " G.group_id\r\n"
|
+ " FROM\r\n"
|
+ " sys_role_group G\r\n"
|
+ " INNER JOIN\r\n"
|
+ " sys_role_user R\r\n"
|
+ " ON\r\n"
|
+ " R.user_id=?\r\n"
|
+ " AND R.role_id=G.role_id\r\n"
|
+ " )\r\n"
|
+ "ORDER BY \r\n"
|
+ " sample_id\r\n"
|
;
|
recs = db.querySQL(sql, new Object[] {userId});
|
}
|
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.beginArray("samples");
|
for(DBRecord rec : recs.getRecords())
|
{
|
jsonWr.beginMap(null);
|
{
|
jsonWr.addKeyValue("group_id", rec.getString("group_id"));
|
jsonWr.addKeyValue("sample_id", rec.getString("sample_id"));
|
jsonWr.addKeyValue("sample_title", rec.getString("sample_title"));
|
jsonWr.addKeyValue("sample_question", rec.getString("sample_question"));
|
}
|
jsonWr.endMap();
|
}
|
jsonWr.endArray();
|
|
return tranReq.returnJson(jsonWr);
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
public ModelAndView createHistoryGroup(SMTAIServerRequest tranReq) throws Exception
|
{
|
String groupTitle = tranReq.convParamToString("group_title", true);
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
String groupId = SMTStatic.newUUID();
|
db.executeSQL("INSERT INTO chat_history_group(group_id, group_title, user_id, create_time)VALUES(?, ?, ?, ?)", new Object[] {
|
groupId,
|
groupTitle,
|
tranReq.getLoginUserId(),
|
new Date()
|
});
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.addKeyValue("history_group_id", groupId);
|
return tranReq.returnJson(jsonWr);
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
|
public ModelAndView queryHistoryDetail(SMTAIServerRequest tranReq) throws Exception
|
{
|
DBRecords recs;
|
String historyGroupId = tranReq.convParamToString("history_group_id", true);
|
Integer lastEnd = tranReq.convParamToInteger("last_end", false);
|
Integer lastCount = tranReq.convParamToInteger("last_count", false);
|
String[] idList = tranReq.convParamToStringArray("id_list", false);
|
|
if(lastEnd != null && lastCount == null)
|
throw new Exception("last_end and last_count must be setted in same time");
|
|
String idListSQL = "";
|
if(idList != null)
|
{
|
for(String id : idList)
|
{
|
if(idListSQL.length() > 0)
|
idListSQL += ",";
|
idListSQL += "'" + id.replace("'", "''") + "'";
|
}
|
idListSQL = " AND history_id in (" + idListSQL + ")";
|
}
|
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
recs = db.querySQL("SELECT group_id FROM chat_history_group WHERE user_id=? AND group_id=? ORDER BY create_time", new Object[] {
|
tranReq.getLoginUserId(),
|
historyGroupId
|
});
|
if(recs.getRowCount() == 0)
|
return tranReq.returnJsonState(false, "对话分组id不存在或不属于当前分组", null);
|
|
recs = db.querySQL("SELECT history_id,question,create_time,sample_id,answer_state FROM chat_history_detail WHERE group_id=? " + idListSQL + " ORDER BY create_time", new Object[] {historyGroupId});
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
|
int start = 0;
|
int end = recs.getRecords().size();
|
|
if(lastEnd != null)
|
{
|
int total = recs.getRecords().size();
|
end = total - lastEnd;
|
if(end > total)
|
end = total;
|
start = end - lastCount;
|
if(start < 0)
|
start = 0;
|
|
}
|
|
jsonWr.beginArray("details");
|
for(; start < end; start ++)
|
{
|
DBRecord rec = recs.getRecord(start);
|
jsonWr.beginMap(null);
|
{
|
jsonWr.addKeyValue("history_id", rec.getString("history_id"));
|
jsonWr.addKeyValue("sample_id", rec.getString("sample_id"));
|
jsonWr.addKeyValue("question", rec.getString("question"));
|
jsonWr.addKeyValue("create_time", rec.getString("create_time"));
|
jsonWr.addKeyValue("answer_state", rec.getString("answer_state"));
|
}
|
jsonWr.endMap();
|
}
|
|
jsonWr.endArray();
|
|
return tranReq.returnJson(jsonWr);
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
public ModelAndView getHistoryGroups(SMTAIServerRequest tranReq) throws Exception
|
{
|
if(tranReq.getLoginUserId() == null)
|
return tranReq.returnJsonState(false, "user not login", null);
|
|
DBRecords recs;
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
String sql =
|
"SELECT\r\n"
|
+ " A.*,\r\n"
|
+ " CASE\r\n"
|
+ " WHEN B.chat_count IS NULL THEN 0\r\n"
|
+ " ELSE B.chat_count\r\n"
|
+ " END AS chat_count,\r\n"
|
+ " case when chat_time is null then '1900-01-01'::timestamp else chat_time end as last_chat_time\r\n"
|
+ "FROM\r\n"
|
+ " (\r\n"
|
+ " SELECT\r\n"
|
+ " group_id,\r\n"
|
+ " group_title,\r\n"
|
+ " create_time\r\n"
|
+ " FROM\r\n"
|
+ " chat_history_group\r\n"
|
+ " WHERE\r\n"
|
+ " user_id =?\r\n"
|
+ " ) A\r\n"
|
+ "LEFT JOIN (\r\n"
|
+ " SELECT\r\n"
|
+ " group_id,\r\n"
|
+ " count(*) AS chat_count,\r\n"
|
+ " max(create_time) as chat_time\r\n"
|
+ " FROM\r\n"
|
+ " chat_history_detail\r\n"
|
+ " GROUP BY\r\n"
|
+ " group_id\r\n"
|
+ ") B\r\n"
|
+ "ON\r\n"
|
+ " A.group_id = B.group_id\r\n"
|
+ "ORDER BY\r\n"
|
+ " last_chat_time"
|
;
|
|
recs = db.querySQL(sql, new Object[] {
|
tranReq.getLoginUserId()
|
});
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.beginArray("groups");
|
for(DBRecord rec : recs.getRecords())
|
{
|
jsonWr.beginMap(null);
|
{
|
jsonWr.addKeyValue("group_id", rec.getString("group_id"));
|
jsonWr.addKeyValue("group_title", rec.getString("group_title"));
|
jsonWr.addKeyValue("chat_count", rec.getString("chat_count"));
|
jsonWr.addKeyValue("create_time", rec.getString("create_time"));
|
}
|
jsonWr.endMap();
|
}
|
jsonWr.endArray();
|
|
return tranReq.returnJson(jsonWr);
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
public ModelAndView getHistoryAnswer(SMTAIServerRequest tranReq) throws Exception
|
{
|
DBRecords recs;
|
String historyId = tranReq.convParamToString("history_id", true);
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
recs = db.querySQL("SELECT ask_json,answer_state FROM chat_history_detail WHERE history_id=?", new Object[] {
|
historyId
|
});
|
|
if(recs.getRowCount() == 0)
|
return tranReq.returnJsonState(false, "未发现回答内容", null);
|
|
String sjsonAnswer = recs.getRecord(0).getString(0);
|
|
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.addKeyValue("answer_state", recs.getRecord(0).getString(1));
|
|
if(SMTStatic.isNullOrEmpty(sjsonAnswer))
|
{
|
jsonWr.addKeyValue("answer", null);
|
}
|
else
|
{
|
jsonWr.addKeyRaw("answer", sjsonAnswer);
|
}
|
|
return tranReq.returnJson(jsonWr);
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
public ModelAndView setHistoryAnswerState(SMTAIServerRequest tranReq) throws Exception
|
{
|
String historyId = tranReq.convParamToString("history_id", true);
|
String answerState = tranReq.convParamToString("answer_state", false);
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
db.executeSQL("UPDATE chat_history_detail SET answer_state=? WHERE history_id=?", new Object[] {
|
answerState,
|
historyId
|
});
|
|
return tranReq.returnJsonState(true, null, null);
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
public ModelAndView reportHistoryProblem(SMTAIServerRequest tranReq) throws Exception
|
{
|
String historyId = tranReq.convParamToString("history_id", true);
|
String reportNotes = tranReq.convParamToString("report_note", false);
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
String sql =
|
" INSERT INTO chat_history_report("
|
+ " history_id, question, sample_id, create_time, llm_id, ask_json, run_ms, answer_state, trace_llm, chat_state, report_note, report_user"
|
+ " )SELECT "
|
+ " history_id, question, sample_id, create_time, llm_id, ask_json, run_ms, answer_state, trace_llm, chat_state, ?, ?"
|
+ " FROM chat_history_detail WHERE history_id=?"
|
;
|
db.executeSQL(sql, new Object[] {
|
reportNotes,
|
tranReq.getLoginUserId(),
|
historyId
|
});
|
|
return tranReq.returnJsonState(true, null, null);
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
public ModelAndView deleteHistoryGroup(SMTAIServerRequest tranReq) throws Exception
|
{
|
DBRecords recs;
|
String historyGroupId = tranReq.convParamToString("history_group_id", true);
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
recs = db.querySQL("SELECT group_id FROM chat_history_group WHERE group_id=? and user_id=?", new Object[] {
|
historyGroupId,
|
tranReq.getLoginUserId()
|
});
|
|
if(recs.getRowCount() == 0)
|
return tranReq.returnJsonState(false, "未发现要删除的历史", null);
|
|
db.beginTran();
|
try
|
{
|
db.executeSQL("DELETE FROM chat_history_group WHERE group_id=?", new Object[] {
|
historyGroupId
|
});
|
// 不删除明细
|
// db.executeSQL("DELETE FROM chat_history_detail WHERE group_id=?", new Object[] {
|
// historyGroupId
|
// });
|
db.commitTran();
|
}
|
catch(Exception ex)
|
{
|
db.rollbackTran();
|
throw ex;
|
}
|
return tranReq.returnJsonState(true, null, null);
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
public ModelAndView getSysNotifyList(SMTAIServerRequest tranReq) throws Exception
|
{
|
DBRecords recs;
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
recs = db.querySQL("SELECT notify_id,notify_message,notify_type,notify_time FROM sys_notify_info ORDER BY notify_time", null);
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.beginArray("messages");
|
for(DBRecord rec : recs.getRecords())
|
{
|
jsonWr.beginMap(null);
|
{
|
jsonWr.addKeyValue("notify_id", rec.getString("notify_id"));
|
jsonWr.addKeyValue("notify_message", rec.getString("notify_message"));
|
jsonWr.addKeyValue("notify_type", rec.getString("notify_type"));
|
jsonWr.addKeyValue("notify_time", rec.getString("notify_time"));
|
}
|
jsonWr.endMap();
|
}
|
jsonWr.endArray();
|
|
return tranReq.returnJson(jsonWr);
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
public ModelAndView getUserTemplateList(SMTAIServerRequest tranReq) throws Exception
|
{
|
DBRecords recs;
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
recs = db.querySQL("SELECT template_id, template_title, template_type, template_value, create_time, template_group FROM ai_user_template ORDER BY create_time", null);
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.beginArray("templates");
|
for(DBRecord rec : recs.getRecords())
|
{
|
jsonWr.beginMap(null);
|
{
|
jsonWr.addKeyValue("template_id", rec.getString("template_id"));
|
jsonWr.addKeyValue("template_title", rec.getString("template_title"));
|
jsonWr.addKeyValue("template_group", rec.getString("template_group"));
|
jsonWr.addKeyValue("template_type", rec.getString("template_type"));
|
jsonWr.addKeyValue("template_value", rec.getString("template_value"));
|
jsonWr.addKeyValue("create_time", rec.getString("create_time"));
|
}
|
jsonWr.endMap();
|
}
|
jsonWr.endArray();
|
|
return tranReq.returnJson(jsonWr);
|
}
|
finally
|
{
|
db.close();
|
}
|
}
|
|
public ModelAndView getSystemVersion(SMTAIServerRequest tranReq) throws Exception
|
{
|
String verison = SMTStatic.readTextStream(this.getClass().getResourceAsStream("/version.txt"));
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.addKeyValue("version", verison);
|
return tranReq.returnJson(jsonWr);
|
}
|
|
|
public ModelAndView setHistoryGroupTitle(SMTAIServerRequest tranReq) throws Exception
|
{
|
String historyGroupId = tranReq.convParamToString("history_group_id", true);
|
String title = tranReq.convParamToString("title", true);
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
db.executeSQL("UPDATE chat_history_group SET group_title=? WHERE group_id=?", new Object[] {
|
title,
|
historyGroupId
|
});
|
}
|
finally
|
{
|
db.close();
|
}
|
|
return tranReq.returnJsonState(true, null, null);
|
}
|
|
public ModelAndView querySimilarityHistory(SMTAIServerRequest tranReq) throws Exception
|
{
|
String question = tranReq.convParamToString("question", true);
|
String groupType = tranReq.convParamToString("group_type", false);
|
if(SMTStatic.isNullOrEmpty(groupType))
|
groupType = "业务场景";
|
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
String sql =
|
"SELECT DISTINCT question, ratio FROM ("
|
+ "SELECT question, ratio\n"
|
+ "FROM (SELECT question, group_id, ratio FROM\n"
|
+ "(SELECT question, group_id, similarity(?, question) as ratio FROM chat_history_detail WHERE chat_state='OK' AND group_type=?) T)A\n" //question, group_type
|
+ "INNER JOIN chat_history_group B\n"
|
+ "ON A.group_id=B.group_id AND B.user_id=?\n" // user
|
+ "UNION ALL\n"
|
+ "SELECT question, ratio FROM\n"
|
+ "(SELECT sample_question as question, similarity(?, sample_question) as ratio, group_id FROM ai_scene_sample WHERE sample_enable='Y')A\n" // question
|
+ "INNER JOIN ai_scene_group B\n"
|
+ "ON A.group_id=B.group_id AND B.group_type=?\n" // group_type
|
+ ") T\n"
|
+ "UNION ALL\n"
|
+ "SELECT question, ratio FROM\n"
|
+ "(SELECT sample_question as question, similarity(?, sample_question) as ratio FROM ai_user_sample WHERE sample_user=? AND group_type=?)A\n" //question, user, group_type
|
+ " WHERE ratio > 0.1\n"
|
+ "ORDER BY ratio DESC\n"
|
+ "LIMIT 5"
|
;
|
DBRecords recs = db.querySQL(sql, new Object[] {
|
question,
|
groupType,
|
tranReq.getLoginUserId(),
|
question,
|
groupType,
|
question,
|
tranReq.getLoginUserId(),
|
groupType
|
});
|
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.beginArray("values");
|
for(DBRecord rec : recs.getRecords())
|
{
|
jsonWr.beginMap(null);
|
{
|
jsonWr.addKeyValue("question", rec.getString("question"));
|
}
|
jsonWr.endMap();
|
}
|
jsonWr.endArray();
|
|
return tranReq.returnJson(jsonWr);
|
}
|
finally
|
{
|
db.close();
|
}
|
|
}
|
|
public ModelAndView querySimilarityScenePrompt(SMTAIServerRequest tranReq) throws Exception
|
{
|
String question = tranReq.convParamToString("question", true).toLowerCase();
|
String sceneId = tranReq.convParamToString("scene_id", true);
|
|
JaccardSimilarity jaccardSimilarity = new JaccardSimilarity();
|
SMTDatabase db = SMTAIServerApp.getApp().allocDatabase();
|
try
|
{
|
DBRecords recs = db.querySQL("SELECT prompt_text FROM ai_scene_prompts WHERE scene_id=?", new Object[] {sceneId});
|
|
SMTJsonWriter jsonWr = tranReq.newReturnJsonWriter(true, null, null);
|
jsonWr.beginArray("values");
|
for(DBRecord rec : recs.getRecords())
|
{
|
String prompt = rec.getString("prompt_text").toLowerCase();
|
if(question.indexOf(prompt) >= 0 || prompt.indexOf(question) >= 0 || jaccardSimilarity.apply(prompt, question) > 0.3)
|
{
|
jsonWr.addKeyValue(null, prompt);
|
}
|
}
|
jsonWr.endArray();
|
|
return tranReq.returnJson(jsonWr);
|
}
|
finally
|
{
|
db.close();
|
}
|
|
}
|
}
|