package com.smtaiserver.smtaiserver.javaai.qwen.extcall; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Node; import com.smtaiserver.smtaiserver.core.SMTAIServerRequest; import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord; import com.smtaiserver.smtaiserver.javaai.SMTJavaAIError; import com.smtaiserver.smtaiserver.javaai.SMTJavaAISession; import com.smtservlet.util.Json; import com.smtservlet.util.SMTJsonWriter; import com.smtservlet.util.SMTStatic; public abstract class SMTQwenExtCall { protected static abstract class ExtCallArg { protected String _name; protected String _default; public abstract void loadArgToMap(Json callExtJson, SMTAIServerRequest tranReq, Map r_mapId2Value) throws Exception; public void initInstance(Element xmlArg) throws Exception { _name = SMTStatic.getXmlAttr(xmlArg, "name"); _default = SMTStatic.getXmlAttr(xmlArg, "default", null); } public String getArgId() { return _name; } } protected static class ExtCallArgRequest extends ExtCallArg { @Override public void loadArgToMap(Json callExtJson, SMTAIServerRequest tranReq, Map r_mapId2Value) throws Exception { String value = callExtJson.safeGetStr(_name, null); if(value == null) { if(_default == null) throw new Exception("argument is not seted : " + _name); value = _default; } r_mapId2Value.put(_name, value); } } protected static class ExtCallArgCalcBaseTime extends ExtCallArg { private String _base_start_time; private String _base_end_time; private String _comp_start_time; public void initInstance(Element xmlArg) throws Exception { super.initInstance(xmlArg); _base_start_time = SMTStatic.getXmlAttr(xmlArg, "base_start_time"); _base_end_time = SMTStatic.getXmlAttr(xmlArg, "base_end_time"); _comp_start_time = SMTStatic.getXmlAttr(xmlArg, "comp_start_time"); } @Override public void loadArgToMap(Json callExtJson, SMTAIServerRequest tranReq, Map r_mapId2Value) { Date dateBaseStartTime = SMTStatic.toDate(r_mapId2Value.get(_base_start_time)); Date dateBaseEndTime = SMTStatic.toDate(r_mapId2Value.get(_base_end_time)); Date dateCompStartTime = SMTStatic.toDate(r_mapId2Value.get(_comp_start_time)); long subSecond = (dateBaseEndTime.getTime() - dateBaseStartTime.getTime()) / 1000; String value = SMTStatic.toString(SMTStatic.calculateTime(dateCompStartTime, SMTStatic.SMTCalcTime.ADD_SECOND, (int)subSecond)); r_mapId2Value.put(_name, value); } } protected static class ExtCallArgTodayCalc extends ExtCallArg { private SMTStatic.SMTCalcTime _calcOP; private int _calcValue; @Override public void initInstance(Element xmlArg) throws Exception { super.initInstance(xmlArg); _calcOP = SMTStatic.SMTCalcTime.valueOf(SMTStatic.getXmlAttr(xmlArg, "op", "ADD_MINUTE")); _calcValue = SMTStatic.toInt(SMTStatic.getXmlAttr(xmlArg, "value", "0")); } @Override public void loadArgToMap(Json callExtJson, SMTAIServerRequest tranReq, Map r_mapId2Value) { String value = SMTStatic.toString(SMTStatic.calculateTime(new Date(), SMTStatic.SMTCalcTime.ZERO_TIME, 0, _calcOP, _calcValue)); r_mapId2Value.put(_name, value); } } //////////////////////////////////////////////////////////////////////////// protected String _callId; protected List _listCallArg = new ArrayList<>(); protected String _callConfig; protected abstract SMTJavaAIError invokeByArgs(Map mapId2Value, SMTJavaAISession session, Json callExtJson, SMTJsonWriter jsonWr, SMTAIServerRequest tranReq) throws Exception; public SMTJavaAIError invoke(SMTJavaAISession session, Json callExtJson, SMTJsonWriter jsonWr, SMTAIServerRequest tranReq) throws Exception { // 获取参数 Map mapId2Value = loadArguments(callExtJson, tranReq); SMTJavaAIError error = invokeByArgs(mapId2Value, session, callExtJson, jsonWr, tranReq); return error; } protected Map loadArguments(Json callExtJson, SMTAIServerRequest tranReq) throws Exception { Map mapId2Value = new HashMap<>(); for(ExtCallArg callArg : _listCallArg) { callArg.loadArgToMap(callExtJson, tranReq, mapId2Value); } return mapId2Value; } public String getCallId() { return _callId; } public void initInstance(DBRecord rec) throws Exception { _callId = rec.getString("call_id"); _callConfig = rec.getString("call_config"); Document doc = SMTStatic.convStrToXmlDoc("" + rec.getString("call_argument") + ""); for(Node nodeArg : doc.selectNodes("ROOT/REQUEST_ARGS/ARG")) { ExtCallArg callArg = new ExtCallArgRequest(); callArg.initInstance((Element)nodeArg); _listCallArg.add(callArg); } for(Node nodeArg : doc.selectNodes("ROOT/CALC_ARGS/ARG")) { ExtCallArg callArg; String type = SMTStatic.getXmlAttr((Element)nodeArg, "type"); if("calc_base_time".equals(type)) { callArg = new ExtCallArgCalcBaseTime(); } else if("today_calc".equals(type)) { callArg = new ExtCallArgTodayCalc(); } else { throw new Exception("can't find call ext : " + type); } callArg.initInstance((Element)nodeArg); _listCallArg.add(callArg); } } }