diff --git a/JSD-7868-需求文档.docx b/JSD-7868-需求文档.docx
new file mode 100644
index 0000000..dfd52d4
Binary files /dev/null and b/JSD-7868-需求文档.docx differ
diff --git a/README.md b/README.md
index 14a5085..19dd69b 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,6 @@
# open-JSD-7868
-JSD-7868 开源任务代码
\ No newline at end of file
+JSD-7868 开源任务代码\
+免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\
+仅作为开发者学习参考使用!禁止用于任何商业用途!\
+为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。
\ No newline at end of file
diff --git a/conf.properties b/conf.properties
new file mode 100644
index 0000000..9d95ddc
--- /dev/null
+++ b/conf.properties
@@ -0,0 +1,7 @@
+#\u6570\u636Eurl
+url=https://xxxxx/report/v1/report-data
+method=POST
+tokenUrl=https://xxxxx/sm/session
+userid=xxxxx
+value=xxxxx
+prefix=https://xxxxx
diff --git a/plugin.xml b/plugin.xml
new file mode 100644
index 0000000..3eeb2dd
--- /dev/null
+++ b/plugin.xml
@@ -0,0 +1,30 @@
+
+ com.fr.plugin.xxxxx.factory
+
+ yes
+ 1.32
+ 10.0
+ 2018-07-31
+ fr.open
+
+ -->
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/xxxxx/factory/EncodeDBAccessProvider.java b/src/main/java/com/fr/plugin/xxxxx/factory/EncodeDBAccessProvider.java
new file mode 100644
index 0000000..802275a
--- /dev/null
+++ b/src/main/java/com/fr/plugin/xxxxx/factory/EncodeDBAccessProvider.java
@@ -0,0 +1,43 @@
+package com.fr.plugin.xxxxx.factory;
+
+import com.fr.db.fun.impl.AbstractDBAccessProvider;
+import com.fr.plugin.xxxxx.factory.dao.EncodeDao;
+import com.fr.plugin.xxxxx.factory.entity.XxxxxEncodeEntity;
+import com.fr.stable.db.accessor.DBAccessor;
+import com.fr.stable.db.dao.BaseDAO;
+import com.fr.stable.db.dao.DAOProvider;
+
+/**
+ * @Author fr.open
+ * @Date 2020/5/24
+ **/
+public class EncodeDBAccessProvider extends AbstractDBAccessProvider {
+
+ private static DBAccessor dbAccessor = null;
+
+ public static DBAccessor getDbAccessor() {
+ return dbAccessor;
+ }
+
+ @Override
+ public DAOProvider[] registerDAO() {
+ return new DAOProvider[]{
+ new DAOProvider() {
+ @Override
+ public Class getEntityClass() {
+ return XxxxxEncodeEntity.class;
+ }
+
+ @Override
+ public Class extends BaseDAO> getDAOClass() {
+ return EncodeDao.class;
+ }
+ }
+ };
+ }
+
+ @Override
+ public void onDBAvailable(DBAccessor dbAccessor) {
+ EncodeDBAccessProvider.dbAccessor = dbAccessor;
+ }
+}
diff --git a/src/main/java/com/fr/plugin/xxxxx/factory/SsoRequestHandlerBridge.java b/src/main/java/com/fr/plugin/xxxxx/factory/SsoRequestHandlerBridge.java
new file mode 100644
index 0000000..87d588a
--- /dev/null
+++ b/src/main/java/com/fr/plugin/xxxxx/factory/SsoRequestHandlerBridge.java
@@ -0,0 +1,18 @@
+package com.fr.plugin.xxxxx.factory;
+
+import com.fr.decision.fun.HttpHandler;
+import com.fr.decision.fun.impl.AbstractHttpHandlerProvider;
+import com.fr.plugin.xxxxx.factory.handler.EncodeHttpHandler;
+
+/**
+ * @author fr.open
+ * @since 2020/08/28
+ */
+public class SsoRequestHandlerBridge extends AbstractHttpHandlerProvider {
+ @Override
+ public HttpHandler[] registerHandlers() {
+ return new HttpHandler[]{
+ new EncodeHttpHandler(),
+ };
+ }
+}
diff --git a/src/main/java/com/fr/plugin/xxxxx/factory/SsoRequestURLAliasBridge.java b/src/main/java/com/fr/plugin/xxxxx/factory/SsoRequestURLAliasBridge.java
new file mode 100644
index 0000000..9a6627d
--- /dev/null
+++ b/src/main/java/com/fr/plugin/xxxxx/factory/SsoRequestURLAliasBridge.java
@@ -0,0 +1,18 @@
+package com.fr.plugin.xxxxx.factory;
+
+import com.fr.decision.fun.impl.AbstractURLAliasProvider;
+import com.fr.decision.webservice.url.alias.URLAlias;
+import com.fr.decision.webservice.url.alias.URLAliasFactory;
+
+/**
+ * @author fr.open
+ * @since 2020/08/28
+ */
+public class SsoRequestURLAliasBridge extends AbstractURLAliasProvider {
+ @Override
+ public URLAlias[] registerAlias() {
+ return new URLAlias[]{
+ URLAliasFactory.createPluginAlias("/encode", "/encode", false),
+ };
+ }
+}
diff --git a/src/main/java/com/fr/plugin/xxxxx/factory/dao/EncodeDao.java b/src/main/java/com/fr/plugin/xxxxx/factory/dao/EncodeDao.java
new file mode 100644
index 0000000..f24f3c8
--- /dev/null
+++ b/src/main/java/com/fr/plugin/xxxxx/factory/dao/EncodeDao.java
@@ -0,0 +1,21 @@
+package com.fr.plugin.xxxxx.factory.dao;
+
+import com.fr.plugin.xxxxx.factory.entity.XxxxxEncodeEntity;
+import com.fr.stable.db.dao.BaseDAO;
+import com.fr.stable.db.session.DAOSession;
+
+/**
+ * @Author fr.open
+ * @Date 2021/5/5
+ * @Description
+ **/
+public class EncodeDao extends BaseDAO {
+ public EncodeDao(DAOSession daoSession) {
+ super(daoSession);
+ }
+
+ @Override
+ protected Class getEntityClass() {
+ return XxxxxEncodeEntity.class;
+ }
+}
diff --git a/src/main/java/com/fr/plugin/xxxxx/factory/entity/Token.java b/src/main/java/com/fr/plugin/xxxxx/factory/entity/Token.java
new file mode 100644
index 0000000..04c2d35
--- /dev/null
+++ b/src/main/java/com/fr/plugin/xxxxx/factory/entity/Token.java
@@ -0,0 +1,34 @@
+package com.fr.plugin.xxxxx.factory.entity;
+
+/**
+ * @Author fr.open
+ * @Date 2020/11/13
+ * @Description
+ **/
+public class Token {
+
+ private String token;
+
+ private Long timeout;
+
+ public Token(String token, long timeout) {
+ this.timeout = timeout;
+ this.token = token;
+ }
+
+ public String getToken() {
+ return token;
+ }
+
+ public void setToken(String token) {
+ this.token = token;
+ }
+
+ public Long getTimeout() {
+ return timeout;
+ }
+
+ public void setTimeout(Long timeout) {
+ this.timeout = timeout;
+ }
+}
diff --git a/src/main/java/com/fr/plugin/xxxxx/factory/entity/XxxxxEncodeEntity.java b/src/main/java/com/fr/plugin/xxxxx/factory/entity/XxxxxEncodeEntity.java
new file mode 100644
index 0000000..ea1cd4e
--- /dev/null
+++ b/src/main/java/com/fr/plugin/xxxxx/factory/entity/XxxxxEncodeEntity.java
@@ -0,0 +1,39 @@
+package com.fr.plugin.xxxxx.factory.entity;
+
+import com.fr.stable.db.entity.BaseEntity;
+import com.fr.third.javax.persistence.Column;
+import com.fr.third.javax.persistence.Entity;
+import com.fr.third.javax.persistence.Table;
+
+/**
+ * @Author fr.open
+ * @Date 2021/5/5
+ * @Description
+ **/
+@Entity
+@Table(name = "plugin_xxxxx_encode")
+public class XxxxxEncodeEntity extends BaseEntity {
+
+ private static final long serialVersionUID = 8781741191091741666L;
+
+ @Column(name = "prop", length = 500)
+ private String prop;
+ @Column(name = "encode", length = 500)
+ private String encode;
+
+ public String getProp() {
+ return prop;
+ }
+
+ public void setProp(String prop) {
+ this.prop = prop;
+ }
+
+ public String getEncode() {
+ return encode;
+ }
+
+ public void setEncode(String encode) {
+ this.encode = encode;
+ }
+}
diff --git a/src/main/java/com/fr/plugin/xxxxx/factory/handler/EncodeHttpHandler.java b/src/main/java/com/fr/plugin/xxxxx/factory/handler/EncodeHttpHandler.java
new file mode 100644
index 0000000..5273fb0
--- /dev/null
+++ b/src/main/java/com/fr/plugin/xxxxx/factory/handler/EncodeHttpHandler.java
@@ -0,0 +1,43 @@
+package com.fr.plugin.xxxxx.factory.handler;
+
+import com.fr.decision.fun.impl.BaseHttpHandler;
+import com.fr.json.JSONObject;
+import com.fr.plugin.xxxxx.factory.util.GCMUtils;
+import com.fr.third.springframework.web.bind.annotation.RequestMethod;
+import com.fr.web.utils.WebUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @Author fr.open
+ * @Date 2021/5/5
+ * @Description
+ **/
+public class EncodeHttpHandler extends BaseHttpHandler {
+
+ @Override
+ public RequestMethod getMethod() {
+ return RequestMethod.GET;
+ }
+
+ @Override
+ public String getPath() {
+ return "/encode";
+ }
+
+ @Override
+ public boolean isPublic() {
+ return false;
+ }
+
+ @Override
+ public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception {
+ res.setContentType("application/json;charset=UTF-8");
+ String key = req.getParameter("encode");
+ JSONObject object = new JSONObject();
+ object.put("body", GCMUtils.encode(key));
+ object.put("time", System.currentTimeMillis());
+ WebUtils.printAsJSON(res, object);
+ }
+}
diff --git a/src/main/java/com/fr/plugin/xxxxx/factory/loader/DataFactoryLoader.java b/src/main/java/com/fr/plugin/xxxxx/factory/loader/DataFactoryLoader.java
new file mode 100644
index 0000000..190637f
--- /dev/null
+++ b/src/main/java/com/fr/plugin/xxxxx/factory/loader/DataFactoryLoader.java
@@ -0,0 +1,100 @@
+package com.fr.plugin.xxxxx.factory.loader;
+
+import com.fr.json.JSONObject;
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.xxxxx.factory.util.DataUtil;
+import com.fr.plugin.xxxxx.factory.util.HttpUtil;
+import com.fr.plugin.xxxxx.factory.util.TokenFactory;
+import com.fr.plugin.transform.FunctionRecorder;
+import com.fr.script.Calculator;
+import com.fr.stable.ParameterProvider;
+import com.fr.stable.StringUtils;
+import com.fr.third.org.apache.commons.lang3.time.StopWatch;
+import com.tptj.plugin.hg.impl.AbstractLoader;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Author fr.open
+ * @Date 2020/12/4
+ * @Description
+ **/
+@FunctionRecorder
+public class DataFactoryLoader extends AbstractLoader {
+ @Override
+ public Object load(Calculator calculator, ParameterProvider[] parameterProviders, String others) {
+ StopWatch stopWatch = StopWatch.createStarted();
+ JSONObject param = new JSONObject(others);//DataUtil.getJSON(others);
+ if (param.isEmpty()) {
+ return null;
+ }
+ if (!param.has("method") || StringUtils.isBlank(param.getString("method"))) {
+ ;
+ param.put("method", DataUtil.getProp("method"));
+ }
+ if (!param.has("tokenUrl") || StringUtils.isBlank(param.getString("tokenUrl"))) {
+ param.put("tokenUrl", DataUtil.getProp("tokenUrl"));
+ } else {
+ if (!param.getString("tokenUrl").startsWith("http")) {
+ param.put("tokenUrl", DataUtil.getProp("prefix") + param.getString("tokenUrl"));
+ }
+ }
+ if (!param.has("userid") || StringUtils.isBlank(param.getString("userid"))) {
+ param.put("userid", DataUtil.getProp("userid"));
+ }
+ if (!param.has("value") || StringUtils.isBlank(param.getString("value"))) {
+ param.put("value", DataUtil.getProp("value"));
+ }
+ if (!param.has("url") || StringUtils.isBlank(param.getString("url"))) {
+ param.put("url", DataUtil.getProp("url"));
+ } else {
+ if (!param.getString("url").startsWith("http")) {
+ param.put("url", DataUtil.getProp("prefix") + param.getString("url"));
+ }
+ }
+ String res = StringUtils.EMPTY;
+ String token = TokenFactory.getToken(param.getString("tokenUrl"), param.getString("userid"), param.getString("value"));
+ if (StringUtils.isBlank(token)) {
+ FineLoggerFactory.getLogger().error("get token is null");
+ return null;
+ }
+ FineLoggerFactory.getLogger().info("get token is {} by url {}", token, param.getString("tokenUrl"));
+ Map headerMap = param.getJSONObject("header") == null ? null : DataUtil.parseHeader(param.getJSONObject("header"));
+ headerMap.put("openid", token);
+ FineLoggerFactory.getLogger().info("header is {}", headerMap);
+ Map paraMap = param.getJSONObject("para") == null ? null : DataUtil.parseHeader(param.getJSONObject("para"));
+ FineLoggerFactory.getLogger().info("para is {}", paraMap);
+ JSONObject body = param.getJSONObject("data") == null ? new JSONObject() : param.getJSONObject("data");
+ FineLoggerFactory.getLogger().info("data is {}", body);
+ if (param.getString("method").equalsIgnoreCase("GET")) {
+ res = HttpUtil.sendGet(param.getString("url"), paraMap, headerMap, null);
+ } else if (param.getString("method").equalsIgnoreCase("POST")) {
+ res = HttpUtil.doJSONPost(param.getString("url"), headerMap, body, paraMap, null);
+ }
+ FineLoggerFactory.getLogger().info("the url {} response data is {}", param.getString("url"), res);
+ stopWatch.stop();
+ FineLoggerFactory.getLogger().error("load openApi data cost {}", stopWatch.getTime(TimeUnit.SECONDS));
+ return res;
+ }
+
+ @Override
+ public String getName() {
+ return "openApi";
+ }
+
+ @Override
+ public String getDefaultConfig() {
+ return "{\n" +
+ " \"url\": \"\",\n" +
+ " \"data\": {\n" +
+ " },\n" +
+ " \"para\": {},\n" +
+ " \"header\": {},\n" +
+ " \"method\": \"POST\",\n" +
+ " \"tokenUrl\": \"https://xxxxx/sm/session\",\n" +
+ " \"userid\": \"\",\n" +
+ " \"value\": \"\"\n" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/fr/plugin/xxxxx/factory/loader/PageDataFactoryLoader.java b/src/main/java/com/fr/plugin/xxxxx/factory/loader/PageDataFactoryLoader.java
new file mode 100644
index 0000000..94ba3df
--- /dev/null
+++ b/src/main/java/com/fr/plugin/xxxxx/factory/loader/PageDataFactoryLoader.java
@@ -0,0 +1,123 @@
+package com.fr.plugin.xxxxx.factory.loader;
+
+import com.fr.json.JSONObject;
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.xxxxx.factory.util.DataUtil;
+import com.fr.plugin.xxxxx.factory.util.HttpUtil;
+import com.fr.plugin.xxxxx.factory.util.TokenFactory;
+import com.fr.script.Calculator;
+import com.fr.stable.ParameterProvider;
+import com.fr.stable.StringUtils;
+import com.fr.third.org.apache.commons.lang3.time.StopWatch;
+import com.tptj.plugin.hg.impl.AbstractLoader;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Author fr.open
+ * @Date 2020/12/4
+ * @Description
+ **/
+public class PageDataFactoryLoader extends AbstractLoader {
+
+ @Override
+ public Object load(Calculator calculator, ParameterProvider[] parameterProviders, String others) {
+ StopWatch stopWatch = StopWatch.createStarted();
+ JSONObject param = new JSONObject(others);//DataUtil.getJSON(others);
+ if(param.isEmpty()){
+ return null;
+ }
+ if (!param.has("method") || StringUtils.isBlank(param.getString("method"))) {
+ ;
+ param.put("method", DataUtil.getProp("method"));
+ }
+ if (!param.has("tokenUrl") || StringUtils.isBlank(param.getString("tokenUrl"))) {
+ param.put("tokenUrl", DataUtil.getProp("tokenUrl"));
+ } else {
+ if (!param.getString("tokenUrl").startsWith("http")) {
+ param.put("tokenUrl", DataUtil.getProp("prefix") + param.getString("tokenUrl"));
+ }
+ }
+ if (!param.has("userid") || StringUtils.isBlank(param.getString("userid"))) {
+ param.put("userid", DataUtil.getProp("userid"));
+ }
+ if (!param.has("value") || StringUtils.isBlank(param.getString("value"))) {
+ param.put("value", DataUtil.getProp("value"));
+ }
+ if (!param.has("url") || StringUtils.isBlank(param.getString("url"))) {
+ param.put("url", DataUtil.getProp("url"));
+ } else {
+ if (!param.getString("url").startsWith("http")) {
+ param.put("url", DataUtil.getProp("prefix") + param.getString("url"));
+ }
+ }
+ String res = StringUtils.EMPTY;
+ String token = TokenFactory.getToken(param.getString("tokenUrl"), param.getString("userid"), param.getString("value"));
+ if (StringUtils.isBlank(token)) {
+ FineLoggerFactory.getLogger().error("get token is null");
+ return null;
+ }
+ FineLoggerFactory.getLogger().info("get token is {} by url {}", token, param.getString("tokenUrl"));
+ Map headerMap = param.getJSONObject("header") == null ? null : DataUtil.parseHeader(param.getJSONObject("header"));
+ headerMap.put("openid", token);
+ FineLoggerFactory.getLogger().info("header is {}", headerMap);
+ Map paraMap = param.getJSONObject("para") == null ? null : DataUtil.parseHeader(param.getJSONObject("para"));
+ FineLoggerFactory.getLogger().info("para is {}", paraMap);
+ JSONObject body = param.getJSONObject("data") == null ? new JSONObject() : param.getJSONObject("data");
+ FineLoggerFactory.getLogger().info("data is {}", body);
+ if (param.getString("method").equalsIgnoreCase("GET")) {
+ res = HttpUtil.sendGet(param.getString("url"), paraMap, headerMap, null);
+ } else if (param.getString("method").equalsIgnoreCase("POST")) {
+ res = HttpUtil.doJSONPost(param.getString("url"), headerMap, body, paraMap, null);
+ }
+ JSONObject data = JSONObject.create();
+ //获取分页
+ if (StringUtils.isNotBlank(res)) {
+ JSONObject object = new JSONObject(res);
+ data = object;
+ while (object.has("hasNextPage") && object.getBoolean("hasNextPage")) {
+ int page = object.getInt("currentPage");
+ FineLoggerFactory.getLogger().info("the url {} current page is {} has next page", param.getString("url"), ++page);
+ if (param.getString("method").equalsIgnoreCase("GET")) {
+ JSONObject p = param.getJSONObject("header").getJSONObject("params");
+ p = p == null ? JSONObject.create() : p;
+ p.put("pageIndex", page);
+ headerMap.put("params", p.toString());
+ res = HttpUtil.sendGet(param.getString("url"), paraMap, headerMap, null);
+ } else if (param.getString("method").equalsIgnoreCase("POST")) {
+ body.put("pageIndex", page);
+ res = HttpUtil.doJSONPost(param.getString("url"), headerMap, body, paraMap, null);
+ }
+ JSONObject temp = new JSONObject(res);
+ data.getJsonArray("data").addAll(temp.getJSONArray("data"));
+ object = temp;
+ }
+ }
+ FineLoggerFactory.getLogger().info("the url {} response data is {}", param.getString("url"), data);
+ stopWatch.stop();
+ FineLoggerFactory.getLogger().error("load page openApi data cost {}",stopWatch.getTime(TimeUnit.SECONDS));
+ return data;
+ }
+
+
+ @Override
+ public String getName() {
+ return "openApi分页";
+ }
+
+ @Override
+ public String getDefaultConfig() {
+ return "{\n" +
+ " \"url\": \"\",\n" +
+ " \"data\": {\n" +
+ " },\n" +
+ " \"para\": {},\n" +
+ " \"header\": {},\n" +
+ " \"method\": \"POST\",\n" +
+ " \"tokenUrl\": \"https://xxxxx/sm/session\",\n" +
+ " \"userid\": \"\",\n" +
+ " \"value\": \"\"\n" +
+ "}";
+ }
+}
diff --git a/src/main/java/com/fr/plugin/xxxxx/factory/resolver/GroupResolver.java b/src/main/java/com/fr/plugin/xxxxx/factory/resolver/GroupResolver.java
new file mode 100644
index 0000000..fa80767
--- /dev/null
+++ b/src/main/java/com/fr/plugin/xxxxx/factory/resolver/GroupResolver.java
@@ -0,0 +1,103 @@
+package com.fr.plugin.xxxxx.factory.resolver;
+
+import com.fr.json.JSONArray;
+import com.fr.json.JSONObject;
+import com.fr.plugin.xxxxx.factory.util.DataUtil;
+import com.fr.stable.StringUtils;
+import com.tptj.plugin.hg.impl.AbstractResolver;
+import com.tptj.plugin.hg.stable.SimpleDataModel;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Author fr.open
+ * @Date 2021/1/27
+ * @Description
+ **/
+public class GroupResolver extends AbstractResolver {
+ @Override
+ public SimpleDataModel parse(Object data, String others) {
+ SimpleDataModel dataModel = new SimpleDataModel();
+ List