From 35c3d6fb4284eccae884b9f17a0712e9c54343c6 Mon Sep 17 00:00:00 2001 From: TangCheng <tangchengmail@163.com> Date: 星期三, 05 三月 2025 17:49:32 +0800 Subject: [PATCH] Merge branch 'weixin' of http://47.103.154.90:83/r/WI/Service.V1.0 into weixin --- /dev/null | 74 --------- JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTAIWeixinControl.java | 330 +++++++++++++++++++--------------------- JAVA/SMTAIServer/src/main/resources/requestmap/weixin.json | 17 ++ 3 files changed, 174 insertions(+), 247 deletions(-) diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTAIWeixinControl.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTAIWeixinControl.java index b750cc5..2c2b918 100644 --- a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTAIWeixinControl.java +++ b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/control/SMTAIWeixinControl.java @@ -7,8 +7,6 @@ import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecords; import com.smtaiserver.smtaiserver.javaai.ast.ASTDBMap; import com.smtaiserver.smtaiserver.javaai.llm.core.SMTLLMConnect; -import com.smtaiserver.smtaiserver.vo.MediaVo; -import com.smtaiserver.smtaiserver.vo.WechatMessageVO; import com.smtservlet.core.SMTRequest; import com.smtservlet.util.Json; import com.smtservlet.util.SMTJsonWriter; @@ -20,18 +18,14 @@ import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; -import org.springframework.boot.configurationprocessor.json.JSONException; import org.springframework.boot.configurationprocessor.json.JSONObject; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.servlet.ModelAndView; -import javax.annotation.Resource; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; -import javax.xml.crypto.Data; import java.io.IOException; import java.io.OutputStream; import java.io.StringWriter; @@ -42,7 +36,6 @@ import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; import static java.util.Arrays.sort; @@ -52,11 +45,10 @@ private static final String TO_USER_NAME = "ToUserName"; private static final String CONTENT = "Content"; private static Logger _logger = LogManager.getLogger(SMTAIServerControl.class); - - private Object _lockToken = new Object(); - private String _tokenValue = null; - private long _tokenTicket = 0; - + + private Object _lockToken = new Object(); + private String _tokenValue = null; + private long _tokenTicket = 0; /** 寰俊楠岃瘉 */ public ModelAndView weChatNotify(SMTAIServerRequest tranReq) throws Exception { @@ -72,39 +64,53 @@ if (requestMap.isEmpty()) { return null; } - + // wechatMessage.setFromUserName(requestMap.get(TO_USER_NAME)); + // wechatMessage.setToUserName(requestMap.get(FROM_USER_NAME)); + // wechatMessage.setCreateTime(System.currentTimeMillis() / 1000); + String xmltemp = + "<xml>\n" + + " <ToUserName><![CDATA[{{{toUser}}}]]></ToUserName>\n" + + " <FromUserName><![CDATA[{{{fromUser}}}]]></FromUserName>\n" + + " <CreateTime>{{{CreateTime}}}</CreateTime>\n" + + " <MsgType><![CDATA[text]]></MsgType>\n" + + " <Content><![CDATA[鎴戞鍦ㄦ�濊�冨摝~璇风◢绛夆�︹�]></Content>\n" + + "</xml>"; + long l = System.currentTimeMillis() / 1000; + String createTimeStr = String.valueOf(l); // 灏� long 杞崲涓� String + // 鏇挎崲鍗犱綅绗� + String result = + xmltemp + .replace("{{{toUser}}}", requestMap.get(TO_USER_NAME)) + .replace("{{{fromUser}}}", requestMap.get(FROM_USER_NAME)) + .replace("{{{CreateTime}}}", createTimeStr); String reqContent = requestMap.get(CONTENT); - WechatMessageVO wechatMessage = new WechatMessageVO(); - wechatMessage.setFromUserName(requestMap.get(TO_USER_NAME)); - wechatMessage.setToUserName(requestMap.get(FROM_USER_NAME)); // 璁剧疆娑堟伅绫诲瀷 - switch (reqContent) { - case "鏂囧瓧": - wechatMessage.setMsgType("text"); - break; - case "鍥剧墖": - wechatMessage.setMsgType("image"); - break; - case "璇煶": - wechatMessage.setMsgType("voice"); - break; - case "瑙嗛": - wechatMessage.setMsgType("video"); - break; - case "闊充箰": - wechatMessage.setMsgType("music"); - break; - case "鍥炬枃": - wechatMessage.setMsgType("news"); - break; - default: - wechatMessage.setMsgType("text"); - break; - } + // switch (reqContent) { + // case "鏂囧瓧": + // wechatMessage.setMsgType("text"); + // break; + // case "鍥剧墖": + // wechatMessage.setMsgType("image"); + // break; + // case "璇煶": + // wechatMessage.setMsgType("voice"); + // break; + // case "瑙嗛": + // wechatMessage.setMsgType("video"); + // break; + // case "闊充箰": + // wechatMessage.setMsgType("music"); + // break; + // case "鍥炬枃": + // wechatMessage.setMsgType("news"); + // break; + // default: + // wechatMessage.setMsgType("text"); + // break; + // } - wechatMessage.setCreateTime(System.currentTimeMillis() / 1000); - MediaVo media = new MediaVo(); - wechatMessage.setContent("鎴戞鍦ㄦ�濊�冨摝~璇风◢绛夆�︹��"); + // MediaVo media = new MediaVo(); + // wechatMessage.setContent("鎴戞鍦ㄦ�濊�冨摝~璇风◢绛夆�︹��"); // 寮傛璋冪敤 aiReplyToTheUserASecondTime CompletableFuture.runAsync( () -> { @@ -158,102 +164,112 @@ try { // 灏� WechatMessageVO 瀵硅薄杞崲涓� XML - JAXBContext jaxbContext = JAXBContext.newInstance(WechatMessageVO.class); - Marshaller marshaller = jaxbContext.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); - StringWriter sw = new StringWriter(); - marshaller.marshal(wechatMessage, sw); - _logger.info("寰俊娑堟伅杩斿弬锛�" + sw); + // JAXBContext jaxbContext = JAXBContext.newInstance(WechatMessageVO.class); + // Marshaller marshaller = jaxbContext.createMarshaller(); + // marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); + // StringWriter sw = new StringWriter(); + // marshaller.marshal(wechatMessage, sw); + _logger.info("寰俊娑堟伅杩斿弬锛�" + xmltemp); // 杩斿洖 XML 瀛楃涓� - return tranReq.returnText(sw.toString()); - } catch (JAXBException e) { + return tranReq.returnText(xmltemp.toString()); + } catch (Exception e) { throw new RuntimeException(e); } } - /** ai鍥炲 - * @throws Exception */ - private String callAIForAnswerQuestion(String question, SMTAIServerRequest tranReq) throws Exception - { - String callFunc = - "query_water_fee:\n" - + " 鍔熻兘锛歕n" - + " 鏌ヨ鐢ㄦ埛鐢ㄦ按閲忓拰姘磋垂淇℃伅\n" - + " 鍙傛暟:\n" - + " question:鐢ㄦ埛闂\n" - + " user_name:鐢ㄦ埛鍚峔n" - + " value_title:'鐢ㄦ按閲�'鎴�'姘磋垂'\n" - + " value_name:鐢ㄦ按閲忥細volume, 姘磋垂:amount\n" - + " start_time:鏌ヨ璧峰鏃ユ湡锛屾牸寮忥細骞�-鏈�-鏃n" - + " end_time:鏌ヨ缁撴潫鏃堕棿锛屾牸寮忥細骞�-鏈�-鏃n" - ; - - String prompt = ((String) SMTAIServerApp.getApp().getGlobalConfig("prompt.agent_tools")) - .replace("{{{AGENT_TOOL_DEFINE_LIST}}}", callFunc); - - SMTLLMConnect llm = SMTAIServerApp.getApp().allocLLMConnect(null); - String answer = llm.callWithMessage(new String[] {prompt}, question, tranReq); - tranReq.traceLLMDebug(answer); - Json oASTList = SMTStatic.convLLMAnswerToJson(answer, true); - if(oASTList != null && oASTList.isArray()) - { - List<Json> jsonASTList = oASTList.asJsonList(); - if(jsonASTList.size() > 0) - { - Json jsonAST = jsonASTList.get(0); - if("query_water_fee".equals(jsonAST.safeGetStr("call", null))) - { - jsonAST = jsonAST.getJson("args"); - try(ASTDBMap dbMap = new ASTDBMap()) - { - SMTDatabase db = dbMap.getDatabase("DS_74_CHENGTOU"); - DBRecords recs = db.querySQL( - " SELECT ROUND(SUM(" + jsonAST.getJson("value_name").asString() + ")::NUMERIC(10, 2), 2) AS TOTAL" - + " FROM chengtou_data.bill_data WHERE billing_date BETWEEN ? AND ?" - , new Object[] { - SMTStatic.toDate(jsonAST.getJson("start_time").asString()), - SMTStatic.toDate(jsonAST.getJson("end_time").asString()) - }); - - if(recs.getRowCount() == 0) - return "浠�" + jsonAST.getJson("start_time").asString() + "鍒�" + jsonAST.getJson("end_time").asString() + "鐨�" + jsonAST.getJson("value_title").asString() + "鏈煡鍒颁换浣曟暟鎹�"; - - return "浠�" + jsonAST.getJson("start_time").asString() + "鍒�" + jsonAST.getJson("end_time").asString() + "鐨�" + jsonAST.getJson("value_title").asString() - + "鎬昏" + recs.getRecord(0).getString(0); - } - - } - } - } - answer = llm.callWithMessage(null, question, tranReq); - - return answer; + /** + * ai鍥炲 + * + * @throws Exception + */ + private String callAIForAnswerQuestion(String question, SMTAIServerRequest tranReq) + throws Exception { + String callFunc = + "query_water_fee:\n" + + " 鍔熻兘锛歕n" + + " 鏌ヨ鐢ㄦ埛鐢ㄦ按閲忓拰姘磋垂淇℃伅\n" + + " 鍙傛暟:\n" + + " question:鐢ㄦ埛闂\n" + + " user_name:鐢ㄦ埛鍚峔n" + + " value_title:'鐢ㄦ按閲�'鎴�'姘磋垂'\n" + + " value_name:鐢ㄦ按閲忥細volume, 姘磋垂:amount\n" + + " start_time:鏌ヨ璧峰鏃ユ湡锛屾牸寮忥細骞�-鏈�-鏃n" + + " end_time:鏌ヨ缁撴潫鏃堕棿锛屾牸寮忥細骞�-鏈�-鏃n"; + + String prompt = + ((String) SMTAIServerApp.getApp().getGlobalConfig("prompt.agent_tools")) + .replace("{{{AGENT_TOOL_DEFINE_LIST}}}", callFunc); + + SMTLLMConnect llm = SMTAIServerApp.getApp().allocLLMConnect(null); + String answer = llm.callWithMessage(new String[] {prompt}, question, tranReq); + tranReq.traceLLMDebug(answer); + List<Json> jsonASTList = SMTStatic.convLLMAnswerToJson(answer, true).asJsonList(); + if (jsonASTList.size() > 0) { + Json jsonAST = jsonASTList.get(0); + if ("query_water_fee".equals(jsonAST.safeGetStr("call", null))) { + jsonAST = jsonAST.getJson("args"); + try (ASTDBMap dbMap = new ASTDBMap()) { + SMTDatabase db = dbMap.getDatabase("DS_74_CHENGTOU"); + DBRecords recs = + db.querySQL( + " SELECT ROUND(SUM(" + + jsonAST.getJson("value_name").asString() + + ")::NUMERIC(10, 2), 2) AS TOTAL" + + " FROM chengtou_data.bill_data WHERE billing_date BETWEEN ? AND ?", + new Object[] { + SMTStatic.toDate(jsonAST.getJson("start_time").asString()), + SMTStatic.toDate(jsonAST.getJson("end_time").asString()) + }); + + if (recs.getRowCount() == 0) + return "浠�" + + jsonAST.getJson("start_time").asString() + + "鍒�" + + jsonAST.getJson("end_time").asString() + + "鐨�" + + jsonAST.getJson("value_title").asString() + + "鏈煡鍒颁换浣曟暟鎹�"; + + return "浠�" + + jsonAST.getJson("start_time").asString() + + "鍒�" + + jsonAST.getJson("end_time").asString() + + "鐨�" + + jsonAST.getJson("value_title").asString() + + "鎬昏" + + recs.getRecord(0).getString(0); + } + } + } + answer = llm.callWithMessage(null, question, tranReq); + + return answer; } /** 浜屾鍥炲 */ public ModelAndView aiReplyToTheUserASecondTime(String answer, String fromUserName) throws Exception { String accessToken = getAccessToken(); - + SMTJsonWriter jsonWr = new SMTJsonWriter(false); jsonWr.addKeyValue("touser", fromUserName); jsonWr.addKeyValue("msgtype", "text"); jsonWr.beginMap("text"); { - jsonWr.addKeyValue("content", answer); + jsonWr.addKeyValue("content", answer); } jsonWr.endMap(); -// JSONObject jsonObject = new JSONObject(); -// jsonObject.put("touser", fromUserName); -// jsonObject.put("msgtype", "text"); -// JSONObject jsonObject1 = new JSONObject(); -// jsonObject1.put("content", answer); -// jsonObject.put("text", jsonObject1); -// _logger.info("jsonObject: {}", jsonObject); + // JSONObject jsonObject = new JSONObject(); + // jsonObject.put("touser", fromUserName); + // jsonObject.put("msgtype", "text"); + // JSONObject jsonObject1 = new JSONObject(); + // jsonObject1.put("content", answer); + // jsonObject.put("text", jsonObject1); + // _logger.info("jsonObject: {}", jsonObject); String url = String.format( "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s", accessToken); - //Map<String, Object> stringObjectMap = jsonObjectToMap(jsonWr.getRootJson()); + // Map<String, Object> stringObjectMap = jsonObjectToMap(jsonWr.getRootJson()); String s = sendPost(url, jsonWr.getRootJson()); _logger.info("涓婁紶缁撴灉: {}", s); return null; @@ -279,63 +295,31 @@ return tranReq.returnText(""); } - public String getAccessToken() throws Exception - { - synchronized(this._lockToken) - { - if(_tokenValue == null || (System.currentTimeMillis() - _tokenTicket) > 3600 * 1000) - { - HashMap<String, String> weixinParam = getWeixinParam(); - String url = - "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" - + weixinParam.get("appId") - + "&secret=" - + weixinParam.get("secret"); - String response = HttpUtil.get(url); - JSONObject jsonObject = new JSONObject(response); - if (jsonObject.has("access_token")) { - String accessToken = jsonObject.getString("access_token"); - - _tokenValue = accessToken; - } - else - { - throw new Exception("can't get weixin token"); - } - _tokenTicket = System.currentTimeMillis(); - } - return _tokenValue; - } + public String getAccessToken() throws Exception { + synchronized (this._lockToken) { + if (_tokenValue == null || (System.currentTimeMillis() - _tokenTicket) > 3600 * 1000) { + HashMap<String, String> weixinParam = getWeixinParam(); + String url = + "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + + weixinParam.get("appId") + + "&secret=" + + weixinParam.get("secret"); + String response = HttpUtil.get(url); + JSONObject jsonObject = new JSONObject(response); + if (jsonObject.has("access_token")) { + String accessToken = jsonObject.getString("access_token"); + + _tokenValue = accessToken; + } else { + throw new Exception("can't get weixin token"); + } + _tokenTicket = System.currentTimeMillis(); + } + return _tokenValue; + } } -// public static Map<String, Object> jsonObjectToMap(JSONObject jsonObject) throws JSONException { -// Map<String, Object> map = new HashMap<>(); -// Iterator<String> keys = jsonObject.keys(); -// -// while (keys.hasNext()) { -// String key = keys.next(); -// Object value = jsonObject.get(key); -// -// // 濡傛灉鍊兼槸 JSONObject锛岄�掑綊杞崲涓� Map -// if (value instanceof JSONObject) { -// value = jsonObjectToMap((JSONObject) value); -// } -// -// map.put(key, value); -// } -// -// return map; -// } - - - /** - * 楠岃瘉绛惧悕util - * - * @param signature - * @param timestamp - * @param nonce - * @return - */ + /** 楠岃瘉绛惧悕util */ public static boolean checkSignature(String signature, String timestamp, String nonce) throws Exception { HashMap<String, String> weixinParam = getWeixinParam(); @@ -425,7 +409,7 @@ public static String sendPost(String urlString, Json jsonParam) throws Exception { // 灏嗗弬鏁拌浆鎹负 JSON 鏍煎紡瀛楃涓� - // JSONObject jsonParams = new JSONObject(params); + // JSONObject jsonParams = new JSONObject(params); String payload = jsonParam.toString(); // 鍒涘缓杩炴帴 URL url = new URL(urlString); diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/Item.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/Item.java deleted file mode 100644 index 1d83387..0000000 --- a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/Item.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.smtaiserver.smtaiserver.vo; - -public class Item { - - private String title; - private String description; - private String picUrl; - private String url; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } -} diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/MediaVo.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/MediaVo.java deleted file mode 100644 index 0c82b70..0000000 --- a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/MediaVo.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.smtaiserver.smtaiserver.vo; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlTransient; - -import lombok.Setter; - -public class MediaVo { - @XmlElement(name = "MediaId") - private String mediaId; - - @XmlElement(name = "item") - private Item item; - - @XmlElement(name = "Title") - private String title; - - @XmlElement(name = "Description") - private String description; - - @XmlElement(name = "MusicUrl") - private String musicUrl; - - @XmlElement(name = "HQMusicUrl") - private String hQMusicUrl; - - @XmlElement(name = "ThumbMediaId") - private String thumbMediaId; - @XmlTransient - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } -} diff --git a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/WechatMessageVO.java b/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/WechatMessageVO.java deleted file mode 100644 index 029a635..0000000 --- a/JAVA/SMTAIServer/src/main/java/com/smtaiserver/smtaiserver/vo/WechatMessageVO.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.smtaiserver.smtaiserver.vo; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import lombok.Setter; - -@XmlRootElement(name = "xml") -public class WechatMessageVO { - /** 鎺ユ敹鏂瑰笎鍙凤紙鏀跺埌鐨凮penID锛� */ - @XmlElement(name = "ToUserName") - private String toUserName; - - /** 寮�鍙戣�呭井淇″彿 */ - @XmlElement(name = "FromUserName") - private String fromUserName; - - /** 娑堟伅鍒涘缓鏃堕棿 锛堟暣鍨嬶級 */ - @XmlElement(name = "CreateTime") - private long createTime; - - /** 娑堟伅绫诲瀷 */ - @XmlElement(name = "MsgType") - private String msgType; - - /** 娑堟伅绫诲瀷 */ - @XmlElement(name = "Content") - private String content; - - /** 鍥剧墖娑堟伅 */ - @XmlElement(name = "Image") - private MediaVo image; - - /** 闊抽 */ - @XmlElement(name = "Voice") - private MediaVo voice; - - /** 瑙嗛 */ - @XmlElement(name = "Video") - private MediaVo video; - - /** 闊充箰 */ - @XmlElement(name = "Music") - private MediaVo music; - - /** 鍥炬枃 */ - @XmlElement(name = "Articles") - private MediaVo articles; - - - public void setToUserName(String toUserName) { - this.toUserName = toUserName; - } - - - public void setFromUserName(String fromUserName) { - this.fromUserName = fromUserName; - } - - - public void setCreateTime(long createTime) { - this.createTime = createTime; - } - - - public void setMsgType(String msgType) { - this.msgType = msgType; - } - - - public void setContent(String content) { - this.content = content; - } - -} diff --git a/JAVA/SMTAIServer/src/main/resources/requestmap/weixin.json b/JAVA/SMTAIServer/src/main/resources/requestmap/weixin.json index d529fa2..76e0036 100644 --- a/JAVA/SMTAIServer/src/main/resources/requestmap/weixin.json +++ b/JAVA/SMTAIServer/src/main/resources/requestmap/weixin.json @@ -15,5 +15,22 @@ ] } ] + }, + "weixin/test_control": { + "map": { + "class": "#SMTAIWeixinControl", + "method": "" + }, + "no_shrio": true, + "swaggers": [ + { + "tags": [ + "寰俊鍏紬鍙蜂富娴嬭瘯鎺ュ彛" + ], + "title": "娴嬭瘯鎺ュ彛", + "parameters": [ + ] + } + ] } } \ No newline at end of file -- Gitblit v1.9.3