|
@@ -0,0 +1,129 @@
|
|
|
+package org.dromara.ai.handler;
|
|
|
+
|
|
|
+import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import org.dromara.ai.domain.deepseek.DeepSeekHttpResponseData;
|
|
|
+import org.dromara.ai.util.DeepSeekAIUtil;
|
|
|
+import org.springframework.jdbc.core.JdbcTemplate;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Component
|
|
|
+public class AIHandlerImpl implements AIHandler {
|
|
|
+ private final ObjectMapper objectMapper;
|
|
|
+ private final JdbcTemplate jdbcTemplate;
|
|
|
+ @Override
|
|
|
+ public List<String> getTableNames(String context) {
|
|
|
+ return List.of();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getSQL(String context, List<String> tableNames) {
|
|
|
+ //todo:获取表的结构
|
|
|
+ String struct = "CREATE TABLE `fa_kuyou_user_order` (\n" +
|
|
|
+ " `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,\n" +
|
|
|
+ " `user_id` int(11) NULL DEFAULT NULL COMMENT '用户ID',\n" +
|
|
|
+ " `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',\n" +
|
|
|
+ " `phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系方式',\n" +
|
|
|
+ " `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '详细地址',\n" +
|
|
|
+ " `order_num` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '订单号',\n" +
|
|
|
+ " `order_price` float(11, 2) NOT NULL DEFAULT 0.00 COMMENT '订单价格',\n" +
|
|
|
+ " `status` tinyint(3) UNSIGNED NULL DEFAULT 0 COMMENT '状态:0=待审核,1=已审核,2=待发货,3=待收货,4=已收货,5=退款中,6=退款完成,7=交易取消,8=交易完成',\n" +
|
|
|
+ " `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',\n" +
|
|
|
+ " `pay_status` tinyint(3) UNSIGNED NULL DEFAULT 0 COMMENT '支付状态:0=支付中,1=支付成功,2=支付失败',\n" +
|
|
|
+ " `pay_time` datetime(0) NULL DEFAULT NULL COMMENT '付款时间',\n" +
|
|
|
+ " `diver_type` enum('1','2') CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '1' COMMENT '配送类型:1=专业配送,2=到店自取',\n" +
|
|
|
+ " `store_id` int(11) NULL DEFAULT NULL COMMENT '门店ID',\n" +
|
|
|
+ " `diver_id` int(11) NULL DEFAULT NULL COMMENT '司机ID',\n" +
|
|
|
+ " `diver_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '司机姓名',\n" +
|
|
|
+ " `diver_phone` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '司机电话',\n" +
|
|
|
+ " `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',\n" +
|
|
|
+ " `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',\n" +
|
|
|
+ " `delete_time` datetime(0) NULL DEFAULT NULL COMMENT '删除时间',\n" +
|
|
|
+ " `hide` int(11) NOT NULL DEFAULT 0,\n" +
|
|
|
+ " `note` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注',\n" +
|
|
|
+ " `confirm_delivery_time` datetime(0) NULL DEFAULT NULL COMMENT '确认收货时间',\n" +
|
|
|
+ " `factory_user_id` int(10) NOT NULL DEFAULT 0,\n" +
|
|
|
+ " `order_status` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n" +
|
|
|
+ " `tenant_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n" +
|
|
|
+ " `create_dept` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n" +
|
|
|
+ " `create_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n" +
|
|
|
+ " `update_by` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,\n" +
|
|
|
+ " PRIMARY KEY (`id`) USING BTREE,\n" +
|
|
|
+ " INDEX `order_num`(`order_num`) USING BTREE\n" +
|
|
|
+ ") ENGINE = InnoDB AUTO_INCREMENT = 1909434245425213445 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '订单表' ROW_FORMAT = Dynamic;";
|
|
|
+ String prompt = new StringBuilder("用户需求:\n")
|
|
|
+ .append(context)
|
|
|
+ .append("涉及的表和结构如下:\n")
|
|
|
+ .append(struct)
|
|
|
+ .append("\n")
|
|
|
+ .append("当前的时间是:")
|
|
|
+ .append(LocalDateTime.now())
|
|
|
+ .append("\n")
|
|
|
+ .append("请根据用户需求,生成对应的完整的可用的查询数据SQL语句,最大数据量限制为一千条,返回json格式的字符串{“sql”:“”}").toString();
|
|
|
+ String response = sendMessage(prompt);
|
|
|
+ String sql = null;
|
|
|
+ try {
|
|
|
+ Map map = objectMapper.readValue(response, Map.class);
|
|
|
+ sql = (String) map.get("sql");
|
|
|
+ System.out.println("sql = " + sql);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ System.err.println("response = " + response);
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ return sql;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getData(String content, String sql) {
|
|
|
+ System.out.println("sql = \n" + sql);
|
|
|
+ List<Map<String,Object>> maps = jdbcTemplate.queryForList(sql);
|
|
|
+ StringBuilder dataStringBuilder = new StringBuilder();
|
|
|
+ StringBuilder titleStringBuilder = new StringBuilder();
|
|
|
+ for (int i = 0; i < maps.size(); i++) {
|
|
|
+ Map<String, Object> map = maps.get(i);
|
|
|
+ Set<String> set = map.keySet();
|
|
|
+ for (String k : set) {
|
|
|
+ Object v = map.get(k);
|
|
|
+ dataStringBuilder.append(v).append(",");
|
|
|
+ if (1 == i){
|
|
|
+ titleStringBuilder.append(k).append(",");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dataStringBuilder.append("\n");
|
|
|
+ }
|
|
|
+ return titleStringBuilder + "\n" + dataStringBuilder;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Object dataHandler(String context, String data) {
|
|
|
+ System.out.println("data = \n" + data);
|
|
|
+ String prompt = new StringBuilder("用户需求:\n").append(context)
|
|
|
+ .append("涉及的数据如下:\n").append(data)
|
|
|
+ .append("\n")
|
|
|
+ .append("请根据用户需求和数据给出结论(中文的),并选择表格或者图表(折线图、柱状图、饼图、热力图)将数据展示出来,表格状态为1;图标状态为2,表格或者图表使用svg格式的xml,以json的格式返回.{'conclusion':'','data':'','status':0}").toString();
|
|
|
+// .append("请根据用户需求和数据给出结论(中文的),并选择表格或者图表(折线图、柱状图、饼图、热力图)将数据展示出来,表格状态为1,markdown格式的字符串;图标状态为2,echarts的配置对象json格式的字符串,以json的格式返回.{'conclusion':'','data':'','status':0}").toString();
|
|
|
+ String mes = sendMessage(prompt);
|
|
|
+ System.out.println("mes = " + mes);
|
|
|
+ Map map = null;
|
|
|
+ try {
|
|
|
+ map = objectMapper.readValue(mes, Map.class);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ System.err.println("LLM处理数据返回的数据格式错误:");
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String sendMessage(String prompt) {
|
|
|
+ DeepSeekHttpResponseData deepSeekHttpResponseData = DeepSeekAIUtil.doChat(DeepSeekAIUtil.createDefaultRequestData(prompt));
|
|
|
+ return deepSeekHttpResponseData.getChoices().get(0).getMessage().getContent();
|
|
|
+ }
|
|
|
+}
|