{"repo": "chongwjing/shixitask", "files": {"dailytask/backend/src/main/java/com/lbya/backend/service/AiService.java": {"5bd89b16eea937ccaa76476db0538caccd5df00b": {"t": 1786068304.4835107, "n": 3804, "h": "cf2af0124ab28a43", "c": "package com.lbya.backend.service;\n\nimport org.springframework.ai.chat.model.ChatResponse;\nimport org.springframework.ai.chat.prompt.Prompt;\nimport org.springframework.ai.chat.messages.SystemMessage;\nimport org.springframework.ai.chat.messages.UserMessage;\nimport org.springframework.ai.openai.OpenAiChatModel;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.jdbc.core.JdbcTemplate;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.*;\n\n@Service\npublic class AiService {\n\n @Autowired(required = false)\n private OpenAiChatModel chatModel;\n\n @Autowired\n private JdbcTemplate jdbcTemplate;\n\n private static final String SYSTEM_PROMPT = \"\"\"\n 你是一个SQL专家。根据用户的问题,生成对应的MySQL SQL查询语句。\n 数据库表结构如下:\n - product(id, name, price, original_price, description, category, image, stock, sales, status, create_time)\n - orders(id, order_no, user_id, product_id, product_name, product_image, product_price, quantity, total_price, receiver_name, receiver_phone, receiver_address, status, create_time, update_time)\n - user(id, username, phone, role, status, create_time)\n - category(id, name, sort_order, status, create_time, update_time)\n 规则:1.只生成SELECT语句 2.最多50行LIMIT 3.只返回纯SQL 4.字段用下划线命名 5.不查password字段\n \"\"\";\n\n private static final String CHAT_SYSTEM_PROMPT = \"\"\"\n 你是花之恋鲜花电商平台的智能助手。你可以帮助用户回答关于鲜花、订单、商品等问题。\n 你应该用中文回答,语气友好专业。\n 如果用户问到具体的订单或商品数据,建议他们使用\"智能查询\"功能。\n \"\"\";\n\n @Transactional(readOnly = true)\n public Map query(String question) {\n if (chatModel == null) throw new RuntimeException(\"AI服务未配置,请设置DEEPSEEK_API_KEY环境变量\");\n String sql = generateSql(question);\n validateSql(sql);\n List> results = jdbcTemplate.queryForList(sql);\n if (results.size() > 50) results = results.subList(0, 50);\n Map data = new HashMap<>();\n data.put(\"sql\", sql);\n data.put(\"results\", results);\n data.put(\"columns\", results.isEmpty() ? Collections.emptyList() : new ArrayList<>(results.get(0).keySet()));\n return data;\n }\n\n private String generateSql(String question) {\n Prompt prompt = new Prompt(List.of(new SystemMessage(SYSTEM_PROMPT), new UserMessage(question)));\n ChatResponse response = chatModel.call(prompt);\n String sql = response.getResult().getOutput().getText().trim();\n sql = sql.replaceAll(\"```sql\\\\s*\", \"\").replaceAll(\"```\\\\s*\", \"\").trim();\n // 去除末尾分号(AI常生成带分号的SQL)\n if (sql.endsWith(\";\")) sql = sql.substring(0, sql.length() - 1).trim();\n return sql;\n }\n\n private void validateSql(String sql) {\n String upper = sql.toUpperCase().trim();\n if (!upper.startsWith(\"SELECT\")) throw new RuntimeException(\"仅允许SELECT查询\");\n if (sql.contains(\";\")) throw new RuntimeException(\"不允许分号\");\n if (sql.contains(\"--\") || sql.contains(\"/*\")) throw new RuntimeException(\"不允许注释\");\n for (String kw : new String[]{\"UNION\", \"DROP \", \"DELETE \", \"UPDATE \", \"INSERT \", \"ALTER \", \"CREATE \", \"TRUNCATE\", \"EXEC \", \"GRANT \", \"REVOKE \"}) {\n if (upper.contains(kw)) throw new RuntimeException(\"不允许的关键字: \" + kw.trim());\n }\n if (upper.contains(\"PASSWORD\") && upper.contains(\"USER\")) throw new RuntimeException(\"不允许查询密码\");\n }\n\n public String chat(String message) {\n if (chatModel == null) throw new RuntimeException(\"AI服务未配置,请设置DEEPSEEK_API_KEY环境变量\");\n Prompt prompt = new Prompt(List.of(new SystemMessage(CHAT_SYSTEM_PROMPT), new UserMessage(message)));\n ChatResponse response = chatModel.call(prompt);\n return response.getResult().getOutput().getText();\n }\n}\n"}}}}