From ec437bb088c23c0e9299373c419a82cbd86c84e0 Mon Sep 17 00:00:00 2001 From: Zhujx Date: Fri, 6 Jun 2025 16:01:37 +0800 Subject: [PATCH] feat:first commit --- .gitignore | 40 +++ facade/pom.xml | 52 ++++ .../common/enums/DingTalkUrlEnum.java | 30 ++ .../dingTalk/common/enums/HttpMethod.java | 19 ++ .../dingTalk/service/DingTalkService.java | 118 ++++++++ pom.xml | 96 +++++++ script/pom.xml | 55 ++++ .../com/xiang/ServiceScriptApplication.java | 17 ++ .../com/xiang/common/GladosConstants.java | 12 + .../main/java/com/xiang/common/Result.java | 51 ++++ .../java/com/xiang/common/URLConstants.java | 45 +++ .../common/factory/xb/QueryThreadFactory.java | 28 ++ .../xiang/controller/GLaDOSController.java | 29 ++ .../com/xiang/controller/IndexController.java | 31 ++ .../xiang/controller/JntyzxController.java | 27 ++ .../com/xiang/controller/XBController.java | 59 ++++ .../com/xiang/entity/pojo/GladosRunLog.java | 47 +++ .../main/java/com/xiang/entity/pojo/User.java | 22 ++ .../com/xiang/entity/pojo/xb/FundInfo.java | 25 ++ .../com/xiang/entity/pojo/xb/FundMessage.java | 40 +++ .../com/xiang/entity/pojo/xb/XbFundCount.java | 42 +++ .../com/xiang/entity/pojo/xb/XbFundList.java | 34 +++ .../entity/request/GladosCheckInReq.java | 16 ++ .../request/xb/fund/QueryFundInfoReq.java | 13 + .../request/xb/fund/QueryFundListReq.java | 20 ++ .../request/xb/fund/QueryXbFundListReq.java | 12 + .../xiang/entity/response/GLaDOSResponse.java | 21 ++ .../response/jntyzx/JntyzxResponse.java | 20 ++ .../venue/query/QueryVenueResponse.java | 16 ++ .../jntyzx/venue/query/SitePositionList.java | 56 ++++ .../response/jntyzx/venue/query/TimeList.java | 32 +++ .../jntyzx/venue/query/VenueList.java | 20 ++ .../entity/response/xbyj/fund/FundInfo.java | 46 +++ .../entity/response/xbyj/fund/FundList.java | 27 ++ .../xbyj/fund/QueryFundInfoResponse.java | 17 ++ .../xbyj/fund/QueryFundListResponse.java | 18 ++ .../com/xiang/repository/GladosMapper.java | 30 ++ .../com/xiang/repository/XBFundMapper.java | 31 ++ .../com/xiang/schedule/GladosCheckInJob.java | 28 ++ .../xiang/schedule/jntyzx/QueryVenueJob.java | 24 ++ .../com/xiang/schedule/xb/FundCountJob.java | 104 +++++++ .../xiang/schedule/xb/FundInfoQueryJob.java | 272 ++++++++++++++++++ .../java/com/xiang/service/FundService.java | 42 +++ .../com/xiang/service/FundServiceImpl.java | 112 ++++++++ .../java/com/xiang/service/GLaDOSService.java | 13 + .../com/xiang/service/GLaDOSServiceImpl.java | 119 ++++++++ .../java/com/xiang/service/JntyzxService.java | 13 + .../com/xiang/service/JntyzxServiceImpl.java | 100 +++++++ .../main/java/com/xiang/utils/HttpUtils.java | 143 +++++++++ .../src/main/resources/application-local.yml | 6 + .../src/main/resources/application-prod.yml | 6 + script/src/main/resources/application.yml | 24 ++ script/src/main/resources/logback-spring.xml | 102 +++++++ .../main/resources/mapper/GladosMapper.xml | 32 +++ .../main/resources/mapper/XBFundMapper.xml | 59 ++++ 55 files changed, 2513 insertions(+) create mode 100644 .gitignore create mode 100644 facade/pom.xml create mode 100644 facade/src/main/java/com/xiang/dingTalk/common/enums/DingTalkUrlEnum.java create mode 100644 facade/src/main/java/com/xiang/dingTalk/common/enums/HttpMethod.java create mode 100644 facade/src/main/java/com/xiang/dingTalk/service/DingTalkService.java create mode 100644 pom.xml create mode 100644 script/pom.xml create mode 100644 script/src/main/java/com/xiang/ServiceScriptApplication.java create mode 100644 script/src/main/java/com/xiang/common/GladosConstants.java create mode 100644 script/src/main/java/com/xiang/common/Result.java create mode 100644 script/src/main/java/com/xiang/common/URLConstants.java create mode 100644 script/src/main/java/com/xiang/common/factory/xb/QueryThreadFactory.java create mode 100644 script/src/main/java/com/xiang/controller/GLaDOSController.java create mode 100644 script/src/main/java/com/xiang/controller/IndexController.java create mode 100644 script/src/main/java/com/xiang/controller/JntyzxController.java create mode 100644 script/src/main/java/com/xiang/controller/XBController.java create mode 100644 script/src/main/java/com/xiang/entity/pojo/GladosRunLog.java create mode 100644 script/src/main/java/com/xiang/entity/pojo/User.java create mode 100644 script/src/main/java/com/xiang/entity/pojo/xb/FundInfo.java create mode 100644 script/src/main/java/com/xiang/entity/pojo/xb/FundMessage.java create mode 100644 script/src/main/java/com/xiang/entity/pojo/xb/XbFundCount.java create mode 100644 script/src/main/java/com/xiang/entity/pojo/xb/XbFundList.java create mode 100644 script/src/main/java/com/xiang/entity/request/GladosCheckInReq.java create mode 100644 script/src/main/java/com/xiang/entity/request/xb/fund/QueryFundInfoReq.java create mode 100644 script/src/main/java/com/xiang/entity/request/xb/fund/QueryFundListReq.java create mode 100644 script/src/main/java/com/xiang/entity/request/xb/fund/QueryXbFundListReq.java create mode 100644 script/src/main/java/com/xiang/entity/response/GLaDOSResponse.java create mode 100644 script/src/main/java/com/xiang/entity/response/jntyzx/JntyzxResponse.java create mode 100644 script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/QueryVenueResponse.java create mode 100644 script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/SitePositionList.java create mode 100644 script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/TimeList.java create mode 100644 script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/VenueList.java create mode 100644 script/src/main/java/com/xiang/entity/response/xbyj/fund/FundInfo.java create mode 100644 script/src/main/java/com/xiang/entity/response/xbyj/fund/FundList.java create mode 100644 script/src/main/java/com/xiang/entity/response/xbyj/fund/QueryFundInfoResponse.java create mode 100644 script/src/main/java/com/xiang/entity/response/xbyj/fund/QueryFundListResponse.java create mode 100644 script/src/main/java/com/xiang/repository/GladosMapper.java create mode 100644 script/src/main/java/com/xiang/repository/XBFundMapper.java create mode 100644 script/src/main/java/com/xiang/schedule/GladosCheckInJob.java create mode 100644 script/src/main/java/com/xiang/schedule/jntyzx/QueryVenueJob.java create mode 100644 script/src/main/java/com/xiang/schedule/xb/FundCountJob.java create mode 100644 script/src/main/java/com/xiang/schedule/xb/FundInfoQueryJob.java create mode 100644 script/src/main/java/com/xiang/service/FundService.java create mode 100644 script/src/main/java/com/xiang/service/FundServiceImpl.java create mode 100644 script/src/main/java/com/xiang/service/GLaDOSService.java create mode 100644 script/src/main/java/com/xiang/service/GLaDOSServiceImpl.java create mode 100644 script/src/main/java/com/xiang/service/JntyzxService.java create mode 100644 script/src/main/java/com/xiang/service/JntyzxServiceImpl.java create mode 100644 script/src/main/java/com/xiang/utils/HttpUtils.java create mode 100644 script/src/main/resources/application-local.yml create mode 100644 script/src/main/resources/application-prod.yml create mode 100644 script/src/main/resources/application.yml create mode 100644 script/src/main/resources/logback-spring.xml create mode 100644 script/src/main/resources/mapper/GladosMapper.xml create mode 100644 script/src/main/resources/mapper/XBFundMapper.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..409ee51 --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store + +logs/ \ No newline at end of file diff --git a/facade/pom.xml b/facade/pom.xml new file mode 100644 index 0000000..9592149 --- /dev/null +++ b/facade/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + com.xiang + xservice-scirpt + 1.0-SNAPSHOT + + + facade + + + 1.8 + 8 + 8 + UTF-8 + + + + + + + + + + + + + com.aliyun + alibaba-dingtalk-service-sdk + 2.0.0 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + exec + + + + + + + \ No newline at end of file diff --git a/facade/src/main/java/com/xiang/dingTalk/common/enums/DingTalkUrlEnum.java b/facade/src/main/java/com/xiang/dingTalk/common/enums/DingTalkUrlEnum.java new file mode 100644 index 0000000..2c4ea94 --- /dev/null +++ b/facade/src/main/java/com/xiang/dingTalk/common/enums/DingTalkUrlEnum.java @@ -0,0 +1,30 @@ +package com.xiang.dingTalk.common.enums; + +import lombok.Getter; + +/** + * @Author: xiang + * @Date: 2025-05-09 15:54 + */ +@Getter +public enum DingTalkUrlEnum { + + /** + * 钉钉接口枚举 + */ + DING_TALK_GET_ENTERPRISE_INTER_TOKEN("https://oapi.dingtalk.com/gettoken", "获取企业内部应用Token"), + DING_TALK_ASYNC_SEND_MESSAGE("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2", "异步发送工作通知"), + DING_TALK_CHAR_MESSAGE("https://oapi.dingtalk.com/chat/send", "发送消息到企业群旧版SDK"), + ; + + + + final String url; + + final String desc; + + DingTalkUrlEnum(String url, String desc) { + this.url = url; + this.desc = desc; + } +} diff --git a/facade/src/main/java/com/xiang/dingTalk/common/enums/HttpMethod.java b/facade/src/main/java/com/xiang/dingTalk/common/enums/HttpMethod.java new file mode 100644 index 0000000..ae76264 --- /dev/null +++ b/facade/src/main/java/com/xiang/dingTalk/common/enums/HttpMethod.java @@ -0,0 +1,19 @@ +package com.xiang.dingTalk.common.enums; + +import lombok.Getter; + +/** + * @Author: xiang + * @Date: 2025-05-09 16:00 + */ +@Getter +public enum HttpMethod { + + GET("get"), + ; + final String method; + + HttpMethod(String method) { + this.method = method; + } +} diff --git a/facade/src/main/java/com/xiang/dingTalk/service/DingTalkService.java b/facade/src/main/java/com/xiang/dingTalk/service/DingTalkService.java new file mode 100644 index 0000000..e11f988 --- /dev/null +++ b/facade/src/main/java/com/xiang/dingTalk/service/DingTalkService.java @@ -0,0 +1,118 @@ +package com.xiang.dingTalk.service; + +import com.alibaba.fastjson2.JSONObject; +import com.dingtalk.api.DefaultDingTalkClient; +import com.dingtalk.api.DingTalkClient; +import com.dingtalk.api.request.OapiChatSendRequest; +import com.dingtalk.api.request.OapiGettokenRequest; +import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request; +import com.dingtalk.api.response.OapiChatSendResponse; +import com.dingtalk.api.response.OapiGettokenResponse; +import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response; +import com.xiang.dingTalk.common.enums.DingTalkUrlEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @Author: xiang + * @Date: 2025-05-09 15:06 + */ + +@Slf4j +@Service +public class DingTalkService { + + /** + * 应用凭证id + * https://open-dev.dingtalk.com/fe/ai?hash=%23%2Fapp%2F3fa4c9a7-27f2-4d6f-bbe7-41d2a17b5c11%2Fbaseinfo#/app/3fa4c9a7-27f2-4d6f-bbe7-41d2a17b5c11/baseinfo + */ + private static final String APP_ID = "3fa4c9a7-27f2-4d6f-bbe7-41d2a17b5c11"; + + /** + * 原企业内部应用AgentID + */ + private static final String AGENT_ID = "3829551658"; + + /** + * 组织ID + * + */ + private static final String CORP_ID = "dingf2c4425cd179a26ef2c783f7214b6d69"; + + private static final String CLIENT_ID = "dingcc9fikz1c0e5wb9v"; + + private static final String CLIENT_SECRET = "wyapsH6y8P1K_wuTPKGKwG0mquj1uth9Dxn6HcRpta3sh8Syukl0C8nOmR1PeBzs"; + + private static final String GRANT_TYPE = "client_credentials"; + + private static final String USER_ID = "450841600726084717"; + + private static final String MSG_TYPE = "text"; + + // userID 450841600726084717 + + // chatID chatd16d8daeea33b36b73588c676d508096 + + /** + * 发送消息到企业群 + * @return + */ + public String sendChatMessage(String chatId, String message) throws Exception{ + String token = getToken(); + DefaultDingTalkClient client = new DefaultDingTalkClient(DingTalkUrlEnum.DING_TALK_CHAR_MESSAGE.getUrl()); + OapiChatSendRequest req = new OapiChatSendRequest(); + req.setChatid(chatId); + OapiChatSendRequest.Msg msg = new OapiChatSendRequest.Msg(); + OapiChatSendRequest.Text text = new OapiChatSendRequest.Text(); + text.setContent(message); + msg.setText(text); + msg.setMsgtype("text"); + req.setMsg(msg); + OapiChatSendResponse rsp = client.execute(req, token); + log.info("[DingTalk] send chat message, req:{}, token:{}, response:{}", JSONObject.toJSONString(req), token, JSONObject.toJSONString(rsp)); + return rsp.getMessageId(); + } + + /** + * 异步发送工作同志--文本类型 + * @param userId + * @param message + * @return + * @throws Exception + */ + public String asyncSendMessage(String userId, String message) throws Exception { + String token = getToken(); + DingTalkClient client = new DefaultDingTalkClient(DingTalkUrlEnum.DING_TALK_ASYNC_SEND_MESSAGE.getUrl()); + OapiMessageCorpconversationAsyncsendV2Request req = new OapiMessageCorpconversationAsyncsendV2Request(); + req.setAgentId(Long.parseLong(AGENT_ID)); + req.setUseridList(userId); + req.setToAllUser(false); + OapiMessageCorpconversationAsyncsendV2Request.Msg obj1 = new OapiMessageCorpconversationAsyncsendV2Request.Msg(); + obj1.setMsgtype(MSG_TYPE); + OapiMessageCorpconversationAsyncsendV2Request.Text obj2 = new OapiMessageCorpconversationAsyncsendV2Request.Text(); + obj2.setContent(message); + obj1.setText(obj2); + req.setMsg(obj1); + log.info("send Ding Talk message, userId:{}, message:{}", userId, message); + OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(req, token); + log.info("send Ding Talk message response, taskId:{}", JSONObject.toJSONString(rsp)); + return rsp.getTaskId().toString(); + } + + + /** + * 获取企业内部应用token + * + * @return + * @throws Exception + */ + public String getToken() throws Exception { + DingTalkClient client = new DefaultDingTalkClient(DingTalkUrlEnum.DING_TALK_GET_ENTERPRISE_INTER_TOKEN.getUrl()); + OapiGettokenRequest req = new OapiGettokenRequest(); + req.setAppkey(CLIENT_ID); + req.setAppsecret(CLIENT_SECRET); + req.setHttpMethod("GET"); + OapiGettokenResponse rsp = client.execute(req); + return rsp.getAccessToken(); + } +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..fa2ce12 --- /dev/null +++ b/pom.xml @@ -0,0 +1,96 @@ + + + 4.0.0 + + com.xiang + xservice-scirpt + 1.0-SNAPSHOT + pom + + facade + script + + + + 1.8 + 8 + 8 + UTF-8 + 2.7.18 + + + + + org.springframework.boot + spring-boot-starter + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring.boot.version} + + + org.projectlombok + lombok + 1.18.32 + + + + com.alibaba.fastjson2 + fastjson2 + 2.0.51 + + + + org.apache.httpcomponents + httpclient + 4.5.13 + + + + mysql + mysql-connector-java + 8.0.33 + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.3.1 + + + + com.google.guava + guava + 32.0.1-android + + + org.apache.commons + commons-collections4 + 4.2 + + + org.apache.commons + commons-lang3 + 3.15.0 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + ${java.version} + ${java.version} + + + + + + \ No newline at end of file diff --git a/script/pom.xml b/script/pom.xml new file mode 100644 index 0000000..2eacea8 --- /dev/null +++ b/script/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + com.xiang + xservice-scirpt + 1.0-SNAPSHOT + ../pom.xml + + + com.xiang + 1.0-SNAPSHOT + jar + script + + + 1.8 + UTF-8 + + + + + com.xiang + facade + 1.0-SNAPSHOT + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.3.0.RELEASE + + exec + + com.xiang.ServiceScriptApplication + ZIP + + + + + repackage + + + + + + + + + \ No newline at end of file diff --git a/script/src/main/java/com/xiang/ServiceScriptApplication.java b/script/src/main/java/com/xiang/ServiceScriptApplication.java new file mode 100644 index 0000000..835c988 --- /dev/null +++ b/script/src/main/java/com/xiang/ServiceScriptApplication.java @@ -0,0 +1,17 @@ +package com.xiang; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * @Author: xiang + * @Date: 2024-10-23 10:56 + */ +@SpringBootApplication +@EnableScheduling +public class ServiceScriptApplication { + public static void main(String[] args) { + SpringApplication.run(ServiceScriptApplication.class, args); + } +} \ No newline at end of file diff --git a/script/src/main/java/com/xiang/common/GladosConstants.java b/script/src/main/java/com/xiang/common/GladosConstants.java new file mode 100644 index 0000000..4cb66bf --- /dev/null +++ b/script/src/main/java/com/xiang/common/GladosConstants.java @@ -0,0 +1,12 @@ +package com.xiang.common; + +/** + * @Author: xiang + * @Date: 2025-05-08 15:27 + */ +public class GladosConstants { + + public static final String GLADOS_COOKIE = "SL_G_WPT_TO=en; SL_GWPT_Show_Hide_tmp=1; SL_wptGlobTipTmp=1; koa:sess=eyJ1c2VySWQiOjU1OTg1MywiX2V4cGlyZSI6MTc3MjYwNDkyNjI4OCwiX21heEFnZSI6MjU5MjAwMDAwMDB9; koa:sess.sig=OdaqjpLkIp19lXn0lFuOsHX7vEM"; + + public static final String GLADOS_CHECK_IN_BODY = "{\"token\":\"glados.one\"}"; +} diff --git a/script/src/main/java/com/xiang/common/Result.java b/script/src/main/java/com/xiang/common/Result.java new file mode 100644 index 0000000..304b435 --- /dev/null +++ b/script/src/main/java/com/xiang/common/Result.java @@ -0,0 +1,51 @@ +package com.xiang.common; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Collections; +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-05-09 14:09 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Result { + + private String code; + + private String message; + + private List data; + + public static Result success(String message) { + return new Result("200", message, null); + } + + + public static Result success(String message, List data) { + return new Result("200", message, data); + } + public static Result success(String message, T data) { + return new Result("200", message, Collections.singletonList(data)); + } + + public static Result error(String message) { + return new Result("500", message, null); + } + + public static Result error(String message, T data) { + return new Result("500", message, Collections.singletonList(data)); + } + public static Result error(String message, List data) { + return new Result("500", message, data); + } + + public static Result error(String code, String message) { + return new Result(code, message, null); + } +} diff --git a/script/src/main/java/com/xiang/common/URLConstants.java b/script/src/main/java/com/xiang/common/URLConstants.java new file mode 100644 index 0000000..cf661ca --- /dev/null +++ b/script/src/main/java/com/xiang/common/URLConstants.java @@ -0,0 +1,45 @@ +package com.xiang.common; + +/** + * @Author: xiang + * @Date: 2025-05-08 14:59 + */ +public class URLConstants { + + public static final String GLADOS_URL_PREFIX = "https://www.glados.one"; + + /** + * 签到 + */ + public static final String GLADOS_CHECK_IN_URL = GLADOS_URL_PREFIX + "/api/user/checkin"; + + + /** + * ==================== + * =====江南体育中心===== + * ==================== + */ + + /** + * 江南体育中心请求前缀 + */ + public static final String JNTYZX_URL_PREFIX = "https://"; + /** + * 查询当天的场地 + */ + public static final String JNTYZX_QUERY_TODAY_VENUE = "https://jntyzx.cn:8443/GYM-JN/multi/Subscribe/getSubscribeByToday?gid=03&isWeekend=1"; + + /** + * ==================== + * =======小蓓养基====== + * ==================== + */ + public static final String XB_URL_PREFIX = "https://api.xiaobeiyangji.com/yangji-api/api"; + /** + * 查询基金详情 + */ + public static final String XB_QUERY_FUND_INFO = XB_URL_PREFIX + "/get-fund-rating-heat-v310"; + + public static final String XB_QUERY_LIST = XB_URL_PREFIX + "/get-gains"; + +} diff --git a/script/src/main/java/com/xiang/common/factory/xb/QueryThreadFactory.java b/script/src/main/java/com/xiang/common/factory/xb/QueryThreadFactory.java new file mode 100644 index 0000000..9d734a9 --- /dev/null +++ b/script/src/main/java/com/xiang/common/factory/xb/QueryThreadFactory.java @@ -0,0 +1,28 @@ +package com.xiang.common.factory.xb; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @Author: xiang + * @Date: 2025-05-15 08:54 + */ +public class QueryThreadFactory implements ThreadFactory { + + private final String threadName; + private final boolean daemon; + + private final AtomicInteger threadNum = new AtomicInteger(); + + public QueryThreadFactory(String threadName, boolean daemon) { + this.threadName = threadName; + this.daemon = daemon; + } + + @Override + public Thread newThread(Runnable r) { + Thread thread = new Thread(r, this.threadName + "[#" + threadNum.incrementAndGet() + "]"); + thread.setDaemon(this.daemon); + return thread; + } +} diff --git a/script/src/main/java/com/xiang/controller/GLaDOSController.java b/script/src/main/java/com/xiang/controller/GLaDOSController.java new file mode 100644 index 0000000..9676c07 --- /dev/null +++ b/script/src/main/java/com/xiang/controller/GLaDOSController.java @@ -0,0 +1,29 @@ +package com.xiang.controller; + +import com.xiang.common.Result; +import com.xiang.entity.request.GladosCheckInReq; +import com.xiang.service.GLaDOSService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Author: xiang + * @Date: 2025-05-08 14:57 + */ +@RestController +@RequestMapping("/system/glados") +@RequiredArgsConstructor +public class GLaDOSController { + + + private final GLaDOSService glaDOSService; + + @PostMapping("/checkIn") + public Result checkIn(@RequestBody GladosCheckInReq request) { + return Result.success(glaDOSService.checkIn()); + } + +} diff --git a/script/src/main/java/com/xiang/controller/IndexController.java b/script/src/main/java/com/xiang/controller/IndexController.java new file mode 100644 index 0000000..84c6c9c --- /dev/null +++ b/script/src/main/java/com/xiang/controller/IndexController.java @@ -0,0 +1,31 @@ +package com.xiang.controller; + +import com.xiang.common.Result; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Author: xiang + * @Date: 2025-05-13 10:08 + */ +@RestController +@RequestMapping("/system/demo") +public class IndexController { + + @Value("${spring.profiles.active}") + private String env; + + @Value("${server.port}") + private String port; + + @Value("${spring.datasource.url}") + private String url; + + @GetMapping("/index") + public Result index() { + String msg = "已激活环境:" + env + ",web端口启用:" + port + "使用datasource:" + url; + return Result.success(msg); + } +} diff --git a/script/src/main/java/com/xiang/controller/JntyzxController.java b/script/src/main/java/com/xiang/controller/JntyzxController.java new file mode 100644 index 0000000..57ce34e --- /dev/null +++ b/script/src/main/java/com/xiang/controller/JntyzxController.java @@ -0,0 +1,27 @@ +package com.xiang.controller; + +import com.xiang.common.Result; +import com.xiang.service.JntyzxService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Author: xiang + * @Date: 2025-05-14 15:13 + */ +@RestController +@RequestMapping("/system/jntyzx") +@RequiredArgsConstructor +public class JntyzxController { + + private final JntyzxService jntyzxService; + + @PostMapping("/queryVenue") + public Result queryVenue() throws Exception { + jntyzxService.queryAvailable(); + return Result.success("success"); + } + +} diff --git a/script/src/main/java/com/xiang/controller/XBController.java b/script/src/main/java/com/xiang/controller/XBController.java new file mode 100644 index 0000000..7f9b61e --- /dev/null +++ b/script/src/main/java/com/xiang/controller/XBController.java @@ -0,0 +1,59 @@ +package com.xiang.controller; + +import com.google.common.collect.Lists; +import com.xiang.common.Result; +import com.xiang.entity.pojo.xb.XbFundList; +import com.xiang.entity.request.xb.fund.QueryFundInfoReq; +import com.xiang.entity.request.xb.fund.QueryFundListReq; +import com.xiang.entity.request.xb.fund.QueryXbFundListReq; +import com.xiang.entity.response.xbyj.fund.FundInfo; +import com.xiang.entity.response.xbyj.fund.FundList; +import com.xiang.service.FundService; +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Objects; + +/** + * @Author: xiang + * @Date: 2025-05-14 16:26 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/system/xb") +public class XBController { + + private final FundService fundService; + + @PostMapping("/queryFundList") + public Result queryFundList(@RequestBody QueryXbFundListReq req) { + List result = fundService.queryFundList(req.getType()); + if (CollectionUtils.isEmpty(result)) { + return Result.error("基金列表信息为空!"); + } + return Result.success("success", result); + } + + @PostMapping("/queryList") + public Result queryList(@RequestBody QueryFundListReq req) { + List result = fundService.queryTodayList(req.getDate(), req.getDataResources(), req.getDataSourceSwitch(), req.getCodeArr()); + if (CollectionUtils.isEmpty(result)) { + return Result.error("基金列表信息为空!"); + } + return Result.success("success", result); + } + + @PostMapping("/queryFundInfo") + public Result queryFundInfo(@RequestBody QueryFundInfoReq req) { + FundInfo fundInfo = fundService.queryFundInfo(req.getCode()); + if (Objects.nonNull(fundInfo)) { + return Result.success("success", Lists.newArrayList(fundInfo)); + } + return Result.error("查询基金信息为空!"); + } +} diff --git a/script/src/main/java/com/xiang/entity/pojo/GladosRunLog.java b/script/src/main/java/com/xiang/entity/pojo/GladosRunLog.java new file mode 100644 index 0000000..d69fd77 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/pojo/GladosRunLog.java @@ -0,0 +1,47 @@ +package com.xiang.entity.pojo; + +import lombok.Builder; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @Author: xiang + * @Date: 2025-05-09 13:56 + */ +@Data +@Builder +public class GladosRunLog { + + private static final long serialVersionUID = 1L; + + private Integer id; + + /** + * 用户id + */ + private Integer userId; + /** + * 用户 + */ + private String user; + + /** + * 请求的时间 + */ + private LocalDateTime time; + + /** + * 是否成功(0: 失败 1:成功) + */ + private Integer status; + + + private Integer code; + + /** + * 返回的响应 + */ + private String response; + +} diff --git a/script/src/main/java/com/xiang/entity/pojo/User.java b/script/src/main/java/com/xiang/entity/pojo/User.java new file mode 100644 index 0000000..7508a82 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/pojo/User.java @@ -0,0 +1,22 @@ +package com.xiang.entity.pojo; + +import lombok.Data; + +/** + * @Author: xiang + * @Date: 2025-05-09 13:49 + */ +@Data +public class User { + + private Integer id; + + private String user; + + private String email; + + private String cookie; + + private Integer status; + +} diff --git a/script/src/main/java/com/xiang/entity/pojo/xb/FundInfo.java b/script/src/main/java/com/xiang/entity/pojo/xb/FundInfo.java new file mode 100644 index 0000000..4f97a5b --- /dev/null +++ b/script/src/main/java/com/xiang/entity/pojo/xb/FundInfo.java @@ -0,0 +1,25 @@ +package com.xiang.entity.pojo.xb; + +import lombok.Builder; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @Author: xiang + * @Date: 2025-05-15 09:05 + */ +@Data +@Builder +public class FundInfo { + + private Long id; + + private String code; + + private String name; + + private String change; + + private LocalDateTime updateTime; +} diff --git a/script/src/main/java/com/xiang/entity/pojo/xb/FundMessage.java b/script/src/main/java/com/xiang/entity/pojo/xb/FundMessage.java new file mode 100644 index 0000000..3089191 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/pojo/xb/FundMessage.java @@ -0,0 +1,40 @@ +package com.xiang.entity.pojo.xb; + +import lombok.Builder; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @Author: xiang + * @Date: 2025-05-14 17:13 + */ +@Data +@Builder +public class FundMessage { + + /** + * 基金名称 + */ + private String name; + + /** + * 基金代码 + */ + private String code; + + /** + * 更新时间 + */ + private String update; + + /** + * 变化率 + */ + private BigDecimal change; + + /** + * 更新日期 + */ + private String date; +} diff --git a/script/src/main/java/com/xiang/entity/pojo/xb/XbFundCount.java b/script/src/main/java/com/xiang/entity/pojo/xb/XbFundCount.java new file mode 100644 index 0000000..c49d345 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/pojo/xb/XbFundCount.java @@ -0,0 +1,42 @@ +package com.xiang.entity.pojo.xb; + +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @Author: xiang + * @Date: 2025-05-21 14:06 + */ +@Data +public class XbFundCount { + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * l_id + */ + private Long lId; + + /** + * code + */ + private String code; + + /** + * name + */ + private String name; + + /** + * change + */ + private BigDecimal change; + + /** + * update_time + */ + private LocalDateTime updateTime; +} diff --git a/script/src/main/java/com/xiang/entity/pojo/xb/XbFundList.java b/script/src/main/java/com/xiang/entity/pojo/xb/XbFundList.java new file mode 100644 index 0000000..ff8e9a0 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/pojo/xb/XbFundList.java @@ -0,0 +1,34 @@ +package com.xiang.entity.pojo.xb; + +import lombok.Data; + +/** + * @Author: xiang + * @Date: 2025-05-21 13:53 + */ +@Data +public class XbFundList { + private static final long serialVersionUID = 1L; + + private Long id; + + /** + * code + */ + private String code; + + /** + * name + */ + private String name; + + /** + * status + */ + private Integer status; + + /** + * 1:A, 2:港,3:美 + */ + private Integer type; +} diff --git a/script/src/main/java/com/xiang/entity/request/GladosCheckInReq.java b/script/src/main/java/com/xiang/entity/request/GladosCheckInReq.java new file mode 100644 index 0000000..a156eda --- /dev/null +++ b/script/src/main/java/com/xiang/entity/request/GladosCheckInReq.java @@ -0,0 +1,16 @@ +package com.xiang.entity.request; + +import lombok.Data; + +/** + * @Author: xiang + * @Date: 2025-05-08 15:22 + */ +@Data +public class GladosCheckInReq { + + /** + * cookie + */ + private String cookie; +} diff --git a/script/src/main/java/com/xiang/entity/request/xb/fund/QueryFundInfoReq.java b/script/src/main/java/com/xiang/entity/request/xb/fund/QueryFundInfoReq.java new file mode 100644 index 0000000..d4676bd --- /dev/null +++ b/script/src/main/java/com/xiang/entity/request/xb/fund/QueryFundInfoReq.java @@ -0,0 +1,13 @@ +package com.xiang.entity.request.xb.fund; + +import lombok.Data; + +/** + * @Author: xiang + * @Date: 2025-05-14 16:27 + */ +@Data +public class QueryFundInfoReq { + + private String code; +} diff --git a/script/src/main/java/com/xiang/entity/request/xb/fund/QueryFundListReq.java b/script/src/main/java/com/xiang/entity/request/xb/fund/QueryFundListReq.java new file mode 100644 index 0000000..d379e38 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/request/xb/fund/QueryFundListReq.java @@ -0,0 +1,20 @@ +package com.xiang.entity.request.xb.fund; + +import lombok.Data; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-05-14 16:39 + */ +@Data +public class QueryFundListReq { + private List codeArr; + + private String date; + + private String dataResources; + + private Boolean dataSourceSwitch; +} diff --git a/script/src/main/java/com/xiang/entity/request/xb/fund/QueryXbFundListReq.java b/script/src/main/java/com/xiang/entity/request/xb/fund/QueryXbFundListReq.java new file mode 100644 index 0000000..4df3623 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/request/xb/fund/QueryXbFundListReq.java @@ -0,0 +1,12 @@ +package com.xiang.entity.request.xb.fund; + +import lombok.Data; + +/** + * @Author: xiang + * @Date: 2025-05-21 13:58 + */ +@Data +public class QueryXbFundListReq { + private Integer type; +} diff --git a/script/src/main/java/com/xiang/entity/response/GLaDOSResponse.java b/script/src/main/java/com/xiang/entity/response/GLaDOSResponse.java new file mode 100644 index 0000000..1b31644 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/response/GLaDOSResponse.java @@ -0,0 +1,21 @@ +package com.xiang.entity.response; + +import lombok.Data; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-05-08 14:55 + */ +@Data +public class GLaDOSResponse { + + private Long code; + + private Integer points; + + private String message; + + private List list; +} diff --git a/script/src/main/java/com/xiang/entity/response/jntyzx/JntyzxResponse.java b/script/src/main/java/com/xiang/entity/response/jntyzx/JntyzxResponse.java new file mode 100644 index 0000000..e1aa31f --- /dev/null +++ b/script/src/main/java/com/xiang/entity/response/jntyzx/JntyzxResponse.java @@ -0,0 +1,20 @@ +package com.xiang.entity.response.jntyzx; + +import lombok.Data; + +/** + * @Author: xiang + * @Date: 2025-05-14 14:38 + */ +@Data +public class JntyzxResponse { + private Boolean success; + + private String message; + + private Integer code; + + private T result; + + private Long timestamp; +} diff --git a/script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/QueryVenueResponse.java b/script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/QueryVenueResponse.java new file mode 100644 index 0000000..ebb6d53 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/QueryVenueResponse.java @@ -0,0 +1,16 @@ +package com.xiang.entity.response.jntyzx.venue.query; + +import lombok.Data; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-05-14 14:37 + */ +@Data +public class QueryVenueResponse { + private List timeList; + + private List venue; +} diff --git a/script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/SitePositionList.java b/script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/SitePositionList.java new file mode 100644 index 0000000..f78f528 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/SitePositionList.java @@ -0,0 +1,56 @@ +package com.xiang.entity.response.jntyzx.venue.query; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @Author: xiang + * @Date: 2025-05-14 14:45 + */ +@Data +public class SitePositionList { + private Long id; + + private String ballCourtId; + + private String sjName; + + private String scheduleId; + + private String placeName; + + private Integer placeId; + + private Integer type; + + private String className; + + private String classCode; + + private BigDecimal money; + + private String contacts; + + private String contactNumber; + + private String memberNumber; + + private String appointments; + + private String operator; + + private String endTime; + + private String beginTime; + + private Integer specOneTimes; + + private String ctypeCode; + + private String isWhole; + + private Long orderId; + + private Integer votesnum; +} diff --git a/script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/TimeList.java b/script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/TimeList.java new file mode 100644 index 0000000..9b279dd --- /dev/null +++ b/script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/TimeList.java @@ -0,0 +1,32 @@ +package com.xiang.entity.response.jntyzx.venue.query; + +import lombok.Data; + +/** + * @Author: xiang + * @Date: 2025-05-14 14:39 + */ +@Data +public class TimeList { + private Long id; + private String name; + + private String beginTime; + + private String endTime; + + private String type; + + private String isenable; + + private String operator; + + private String createtime; + + private String remarks; + + private String default01; + private String default02; + private String default03; + private String votesnum; +} diff --git a/script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/VenueList.java b/script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/VenueList.java new file mode 100644 index 0000000..b5f83e8 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/response/jntyzx/venue/query/VenueList.java @@ -0,0 +1,20 @@ +package com.xiang.entity.response.jntyzx.venue.query; + +import lombok.Data; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-05-14 14:39 + */ +@Data +public class VenueList { + + private Integer placeId; + + private String placeName; + + private List sitePosition; + +} diff --git a/script/src/main/java/com/xiang/entity/response/xbyj/fund/FundInfo.java b/script/src/main/java/com/xiang/entity/response/xbyj/fund/FundInfo.java new file mode 100644 index 0000000..55c30f8 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/response/xbyj/fund/FundInfo.java @@ -0,0 +1,46 @@ +package com.xiang.entity.response.xbyj.fund; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @Author: xiang + * @Date: 2025-05-14 16:20 + */ +@Data +public class FundInfo { + @JSONField(name = "_id") + private String id; + + private String code; + + private String name; + + private Long ratingPeople; + + private Long view; + + private Long evaluateGood; + + private Long evaluateBad; + + private Long heat; + + private Long ratingPeopleReal; + + private BigDecimal rating; + + @JSONField(name = "_createTime") + private String createTime; + + @JSONField(name = "_updateTime") + private String updateTime; + + private String isNewId; + + private Boolean isRating; + + private Long ratingPeopleTotal; +} diff --git a/script/src/main/java/com/xiang/entity/response/xbyj/fund/FundList.java b/script/src/main/java/com/xiang/entity/response/xbyj/fund/FundList.java new file mode 100644 index 0000000..6351408 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/response/xbyj/fund/FundList.java @@ -0,0 +1,27 @@ +package com.xiang.entity.response.xbyj.fund; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * @Author: xiang + * @Date: 2025-05-14 16:37 + */ +@Data +public class FundList { + + @JSONField(name = "_id") + private String id; + + private BigDecimal change; + + private String code; + + private String date; + + private BigDecimal quote; + + private String update; +} diff --git a/script/src/main/java/com/xiang/entity/response/xbyj/fund/QueryFundInfoResponse.java b/script/src/main/java/com/xiang/entity/response/xbyj/fund/QueryFundInfoResponse.java new file mode 100644 index 0000000..4cff4f7 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/response/xbyj/fund/QueryFundInfoResponse.java @@ -0,0 +1,17 @@ +package com.xiang.entity.response.xbyj.fund; + +import lombok.Data; + +/** + * @Author: xiang + * @Date: 2025-05-14 16:20 + */ +@Data +public class QueryFundInfoResponse { + + private FundInfo data; + + private String msg; + + private Integer code; +} diff --git a/script/src/main/java/com/xiang/entity/response/xbyj/fund/QueryFundListResponse.java b/script/src/main/java/com/xiang/entity/response/xbyj/fund/QueryFundListResponse.java new file mode 100644 index 0000000..352a328 --- /dev/null +++ b/script/src/main/java/com/xiang/entity/response/xbyj/fund/QueryFundListResponse.java @@ -0,0 +1,18 @@ +package com.xiang.entity.response.xbyj.fund; + +import lombok.Data; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-05-14 16:36 + */ +@Data +public class QueryFundListResponse { + private List data; + + private String msg; + + private Integer code; +} diff --git a/script/src/main/java/com/xiang/repository/GladosMapper.java b/script/src/main/java/com/xiang/repository/GladosMapper.java new file mode 100644 index 0000000..3aabb5e --- /dev/null +++ b/script/src/main/java/com/xiang/repository/GladosMapper.java @@ -0,0 +1,30 @@ +package com.xiang.repository; + +import com.xiang.entity.pojo.GladosRunLog; +import com.xiang.entity.pojo.User; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-05-09 13:49 + */ +@Mapper +@Repository +public interface GladosMapper { + + /** + * 查找所有可用的用户 + * @return + */ + List listAllUser(); + + /** + * 脚本运行记录 + * @param gladosRunLog + * @return + */ + int insertScriptRunLog(GladosRunLog gladosRunLog); +} diff --git a/script/src/main/java/com/xiang/repository/XBFundMapper.java b/script/src/main/java/com/xiang/repository/XBFundMapper.java new file mode 100644 index 0000000..7d31b71 --- /dev/null +++ b/script/src/main/java/com/xiang/repository/XBFundMapper.java @@ -0,0 +1,31 @@ +package com.xiang.repository; + +import com.xiang.entity.pojo.xb.FundInfo; +import com.xiang.entity.pojo.xb.XbFundCount; +import com.xiang.entity.pojo.xb.XbFundList; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-05-15 09:26 + */ +@Repository +@Mapper +public interface XBFundMapper { + + List queryListIn2Min(); + + int batchSave(List list); + + List queryFundList(@Param("type") Integer type); + + int addCounts(List list); + + List queryFundInWeek(); + + +} diff --git a/script/src/main/java/com/xiang/schedule/GladosCheckInJob.java b/script/src/main/java/com/xiang/schedule/GladosCheckInJob.java new file mode 100644 index 0000000..b7d5bd4 --- /dev/null +++ b/script/src/main/java/com/xiang/schedule/GladosCheckInJob.java @@ -0,0 +1,28 @@ +package com.xiang.schedule; + +import com.xiang.service.GLaDOSService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +/** + * @Author: xiang + * @Date: 2025-05-08 15:24 + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class GladosCheckInJob { + + private final GLaDOSService glaDOSService; + + @Scheduled(cron = "0 0 8,16 1/1 * ?") +// @Scheduled(cron = "0 0/1 * * * ?") + public void checkInJon() { + log.info("[job] Glados Check In Job start, time:{}", LocalDateTime.now()); + glaDOSService.checkIn(); + } +} diff --git a/script/src/main/java/com/xiang/schedule/jntyzx/QueryVenueJob.java b/script/src/main/java/com/xiang/schedule/jntyzx/QueryVenueJob.java new file mode 100644 index 0000000..46da6b6 --- /dev/null +++ b/script/src/main/java/com/xiang/schedule/jntyzx/QueryVenueJob.java @@ -0,0 +1,24 @@ +package com.xiang.schedule.jntyzx; + +import com.xiang.service.JntyzxService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @Author: xiang + * @Date: 2025-05-14 15:34 + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class QueryVenueJob { + private final JntyzxService jntyzxService; + +// @Scheduled(cron = "0 0 14 1/1 * ?") + public void query() throws Exception{ + log.info("[查询场地] 查询当天场地定时任务启动!"); + jntyzxService.queryAvailable(); + log.info("[查询场地] 查询当天场地定时任务结束!"); + } +} diff --git a/script/src/main/java/com/xiang/schedule/xb/FundCountJob.java b/script/src/main/java/com/xiang/schedule/xb/FundCountJob.java new file mode 100644 index 0000000..59b9ae9 --- /dev/null +++ b/script/src/main/java/com/xiang/schedule/xb/FundCountJob.java @@ -0,0 +1,104 @@ +package com.xiang.schedule.xb; + +import com.alibaba.fastjson2.JSONObject; +import com.google.common.collect.Lists; +import com.xiang.dingTalk.service.DingTalkService; +import com.xiang.entity.pojo.xb.XbFundCount; +import com.xiang.entity.pojo.xb.XbFundList; +import com.xiang.entity.response.xbyj.fund.FundList; +import com.xiang.service.FundService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @Author: xiang + * @Date: 2025-05-21 13:59 + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class FundCountJob { + + private final FundService fundService; + private final DingTalkService dingTalkService; + @Value("${DingTalk.chatId}") + private String chatId; + @Scheduled(cron = "0 0 22 * * ?") + public void countFundJob() { + // 周六周日过滤 + if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || + Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) { + return; + } + log.info("==========================[基金统计] 基金统计定时任务启动!=========================="); + List lists = fundService.queryFundList(null); + if (CollectionUtils.isEmpty(lists)) { + return; + } + List counts = Lists.newCopyOnWriteArrayList(); + String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + lists.parallelStream().forEach(xbFundList -> { + List fund = fundService.queryTodayList(date, "2", Boolean.TRUE, Collections.singletonList(xbFundList.getCode())); + if (CollectionUtils.isNotEmpty(fund)) { + XbFundCount xbFundCount = new XbFundCount(); + xbFundCount.setLId(xbFundList.getId()); + xbFundCount.setCode(xbFundList.getCode()); + xbFundCount.setName(xbFundList.getName()); + xbFundCount.setChange(fund.get(0).getChange()); + xbFundCount.setUpdateTime(LocalDateTime.now()); + counts.add(xbFundCount); + } + }); + if (CollectionUtils.isNotEmpty(counts)) { + log.info("[基金统计] 基金统计记录,需要插入的数据:{}", JSONObject.toJSONString(counts)); + fundService.addCounts(counts); + } + log.info("==========================[基金统计] 基金统计定时任务结束!=========================="); + } + + @Scheduled(cron = "0 40 14 * * ? ") + public void countFundInWeek() throws Exception { + log.info("==========================[基金统计] 基金本周涨跌幅消息发送定时任务启动!=========================="); + List xbFundCounts = fundService.queryFundCountInWeek(); + if (CollectionUtils.isEmpty(xbFundCounts)) { + return; + } + StringBuilder sb = new StringBuilder(); + Map> map = xbFundCounts.stream().collect(Collectors.groupingBy(XbFundCount::getCode)); + map.forEach((k, v) -> { + List fundCounts = map.get(k); + if (CollectionUtils.isNotEmpty(fundCounts)) { + return; + } + List decimals = fundCounts.stream().map(XbFundCount::getChange).collect(Collectors.toList()); + BigDecimal sum = BigDecimal.ZERO; + for (BigDecimal decimal : decimals) { + sum = sum.add(decimal); + } + BigDecimal avg = sum.divide(BigDecimal.valueOf(decimals.size()), 2, RoundingMode.HALF_UP); + sb.append("【").append(fundCounts.get(0).getName()).append("】本周平均涨跌幅为:").append(avg).append("\n"); + }); + if (StringUtils.isNotBlank(sb)) { + dingTalkService.sendChatMessage(chatId, sb.toString()); + } + log.info("==========================[基金统计] 基金本周涨跌幅消息发送定时任务结束!=========================="); + } + +} diff --git a/script/src/main/java/com/xiang/schedule/xb/FundInfoQueryJob.java b/script/src/main/java/com/xiang/schedule/xb/FundInfoQueryJob.java new file mode 100644 index 0000000..d80843d --- /dev/null +++ b/script/src/main/java/com/xiang/schedule/xb/FundInfoQueryJob.java @@ -0,0 +1,272 @@ +package com.xiang.schedule.xb; + +import com.alibaba.fastjson2.JSONObject; +import com.google.common.collect.Lists; +import com.xiang.common.factory.xb.QueryThreadFactory; +import com.xiang.dingTalk.service.DingTalkService; +import com.xiang.entity.pojo.xb.FundMessage; +import com.xiang.entity.pojo.xb.XbFundList; +import com.xiang.entity.response.xbyj.fund.FundInfo; +import com.xiang.entity.response.xbyj.fund.FundList; +import com.xiang.repository.XBFundMapper; +import com.xiang.service.FundService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @Author: xiang + * @Date: 2025-05-14 17:15 + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class FundInfoQueryJob { + + private final FundService fundService; + private final DingTalkService dingTalkService; + private final XBFundMapper xbFundMapper; + private final ExecutorService es = + new ThreadPoolExecutor( + 10, + 20, + 1000, + TimeUnit.MILLISECONDS, + new LinkedBlockingQueue<>(), + new QueryThreadFactory("xb-query-thread", Boolean.TRUE), + new ThreadPoolExecutor.AbortPolicy()); + @Value("${xiaobei.codeArr}") + private String codeArr; + @Value("${DingTalk.chatId}") + private String chatId; + + /** + * 基金增长定时任务查询 + * 半个小时一次 9点开始到3.30结束 + */ + @Scheduled(cron = "0 1,31 9,10,11,13,14 * * ? ") + public void queryFundJob() throws Exception { + // 周六周日过滤 + if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || + Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) { + return; + } + log.info("==========================[基金查询] 基金查询定时任务启动!=========================="); + List result = queryFund(1); + if (CollectionUtils.isEmpty(result)) { + return; + } + log.info("查询的基金涨跌幅数据:{}", JSONObject.toJSONString(result)); + result = result.stream().sorted(Comparator.comparing(FundMessage::getChange)).collect(Collectors.toList()); + StringBuilder sb = new StringBuilder("今天的A股行情:"); + for (FundMessage fundMessage : result) { + sb.append("基金名称:") + .append(fundMessage.getName()) + .append("于") + .append(fundMessage.getUpdate()) + .append("更新涨跌幅:") + .append(fundMessage.getChange() + .multiply(new BigDecimal("100")) + .setScale(2, RoundingMode.HALF_UP).toString()) + .append("%\n"); + } + dingTalkService.sendChatMessage(chatId, sb.toString()); + log.info("==========================[基金查询] 基金查询定时任务结束!=========================="); + } + /** + * 基金增长定时任务查询 + * 半个小时一次 9点开始到3.30结束 + */ + @Scheduled(cron = "0 0 9 * * ? ") + public void queryFundJob3() throws Exception { + // 周六周日过滤 + if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || + Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) { + return; + } + log.info("==========================[基金查询] 基金查询定时任务启动!=========================="); + List result = queryFund(3); + if (CollectionUtils.isEmpty(result)) { + return; + } + log.info("查询的美股基金涨跌幅数据:{}", JSONObject.toJSONString(result)); + result = result.stream().sorted(Comparator.comparing(FundMessage::getChange)).collect(Collectors.toList()); + StringBuilder sb = new StringBuilder("今天的美股行情:\n"); + for (FundMessage fundMessage : result) { + sb.append("基金名称:") + .append(fundMessage.getName()) + .append("于") + .append(fundMessage.getUpdate()) + .append("更新涨跌幅:") + .append(fundMessage.getChange() + .multiply(new BigDecimal("100")) + .setScale(2, RoundingMode.HALF_UP).toString()) + .append("%\n"); + } + dingTalkService.sendChatMessage(chatId, sb.toString()); + log.info("==========================[基金查询] 基金查询定时任务结束!=========================="); + } + /** + * 基金增长定时任务查询 + * 半个小时一次 9点开始到3.30结束 + */ + @Scheduled(cron = "0 1,31 9,10,11,13,14,15 * * ? ") + public void queryFundJob2() throws Exception { + // 周六周日过滤 + if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || + Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) { + return; + } + log.info("==========================[基金查询] 基金查询定时任务启动!=========================="); + List result = queryFund(2); + if (CollectionUtils.isEmpty(result)) { + return; + } + log.info("查询的港股基金涨跌幅数据:{}", JSONObject.toJSONString(result)); + result = result.stream().sorted(Comparator.comparing(FundMessage::getChange)).collect(Collectors.toList()); + StringBuilder sb = new StringBuilder("今天的美股行情:\n"); + for (FundMessage fundMessage : result) { + sb.append("基金名称:") + .append(fundMessage.getName()) + .append("于") + .append(fundMessage.getUpdate()) + .append("更新涨跌幅:") + .append(fundMessage.getChange() + .multiply(new BigDecimal("100")) + .setScale(2, RoundingMode.HALF_UP).toString()) + .append("%\n"); + } + dingTalkService.sendChatMessage(chatId, sb.toString()); + log.info("==========================[基金查询] 基金查询定时任务结束!=========================="); + } + + /** + * 基金涨跌幅5分钟超过2%重点通知 + */ + @Scheduled(cron = "0 0/5 * * * ? ") + public void queryFundEmergencyJob() throws Exception { + // 周六周日过滤 + if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || + Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) { + return; + } + List fundInfos = xbFundMapper.queryListIn2Min(); + if (CollectionUtils.isEmpty(fundInfos)) { + return; + } + Map> map = fundInfos.stream().collect(Collectors.groupingBy(com.xiang.entity.pojo.xb.FundInfo::getCode)); + StringBuffer sb = new StringBuffer(); + map.entrySet().parallelStream().forEach(entry -> { + List infos = entry.getValue(); + BigDecimal sum = new BigDecimal("0"); + for (int i = 0; i < infos.size() - 1; i++) { + BigDecimal subtract = new BigDecimal(infos.get(i + 1).getChange()).subtract(new BigDecimal(infos.get(i).getChange())); + sum = sum.add(subtract); + } + BigDecimal avg = sum.divide(new BigDecimal(String.valueOf(infos.size())), 2, RoundingMode.HALF_UP); + if (avg.abs().compareTo(new BigDecimal("2")) > 0) { + sb.append("基金").append(entry.getValue().get(0).getName()).append("5分钟的平均涨跌幅超过2%,涨跌幅达到").append(avg).append("\n"); + } + }); + if (StringUtils.isNotBlank(sb)) { + dingTalkService.sendChatMessage(chatId, sb.toString()); + } + } + + /** + * 基金每分钟涨幅记录 + */ + @Scheduled(cron = "0 0/1 9,10,11,13,14 * * ?") + public void queryFundInfoInMinJob() { + // 周六周日过滤 + if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) || + Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) { + return; + } + List fundMessageList = queryFund(null); + if (CollectionUtils.isEmpty(fundMessageList)) { + return; + } + List futures = Lists.newArrayList(); + List fundInfoList = Lists.newCopyOnWriteArrayList(); + fundMessageList.parallelStream().forEach(fundMessage -> { + CompletableFuture future = CompletableFuture.runAsync(() -> { + FundInfo fundInfo = fundService.queryFundInfo(fundMessage.getCode()); + + com.xiang.entity.pojo.xb.FundInfo info = com.xiang.entity.pojo.xb.FundInfo.builder() + .code(fundMessage.getCode()) + .name(fundInfo.getName()) + .change(fundMessage.getChange().multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).toString()) + .updateTime(getTimeFromStr(fundMessage.getDate(), fundMessage.getUpdate())) + .build(); + fundInfoList.add(info); + }, es); + futures.add(future); + }); + + CompletableFuture[] futureArr = futures + .toArray(futures.toArray(new CompletableFuture[0])); + CompletableFuture.allOf(futureArr).join(); + + if (CollectionUtils.isNotEmpty(fundInfoList)) { + log.info("[基金查询] 每分钟基金涨跌幅查询记录,需要插入的数据:{}", JSONObject.toJSONString(fundInfoList)); + xbFundMapper.batchSave(fundInfoList); + } + } + + private List queryFund(Integer type) { + String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + List code = Lists.newArrayList(); + List lists = xbFundMapper.queryFundList(type); + if (CollectionUtils.isEmpty(lists)) { + if (Objects.equals(type, 1)) { + code = Arrays.stream(codeArr.split(", ")).collect(Collectors.toList()); + } + } else { + code = lists.stream().map(XbFundList::getCode).collect(Collectors.toList()); + } + List fundLists = fundService.queryTodayList(date, "2", Boolean.TRUE, code); + if (CollectionUtils.isEmpty(fundLists)) { + return Lists.newArrayList(); + } + List result = Lists.newCopyOnWriteArrayList(); + fundLists.parallelStream().forEach(fundList -> { + FundInfo fundInfo = fundService.queryFundInfo(fundList.getCode()); + if (Objects.nonNull(fundInfo)) { + FundMessage fund = FundMessage.builder().name(fundInfo.getName()).date(fundList.getDate()) + .code(fundList.getCode()).change(fundList.getChange()).update(fundList.getUpdate()).build(); + result.add(fund); + } + }); + return result; + } + + private LocalDateTime getTimeFromStr(String date, String time) { + String dateTimeStr = date + " " + time; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return LocalDateTime.parse(dateTimeStr, formatter); + } + +} diff --git a/script/src/main/java/com/xiang/service/FundService.java b/script/src/main/java/com/xiang/service/FundService.java new file mode 100644 index 0000000..1ce441c --- /dev/null +++ b/script/src/main/java/com/xiang/service/FundService.java @@ -0,0 +1,42 @@ +package com.xiang.service; + +import com.xiang.entity.pojo.xb.XbFundCount; +import com.xiang.entity.pojo.xb.XbFundList; +import com.xiang.entity.response.xbyj.fund.FundInfo; +import com.xiang.entity.response.xbyj.fund.FundList; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2025-05-14 15:41 + */ +public interface FundService { + + /** + * 查询列表情况 + */ + List queryTodayList(String date, String dataResources, Boolean dataSourceSwitch, List codeArr); + + /** + * 查询基金详情 + * @param code 基金代码 + * @return + */ + FundInfo queryFundInfo(String code); + + + /** + * 查询基金列表 + * @return + */ + List queryFundList(Integer type); + + int addCounts(List list); + + /** + * 查询一周内基金统计 + * @return + */ + List queryFundCountInWeek(); +} diff --git a/script/src/main/java/com/xiang/service/FundServiceImpl.java b/script/src/main/java/com/xiang/service/FundServiceImpl.java new file mode 100644 index 0000000..483c597 --- /dev/null +++ b/script/src/main/java/com/xiang/service/FundServiceImpl.java @@ -0,0 +1,112 @@ +package com.xiang.service; + +import com.alibaba.fastjson2.JSONObject; +import com.google.common.collect.Lists; +import com.xiang.common.URLConstants; +import com.xiang.entity.pojo.xb.XbFundCount; +import com.xiang.entity.pojo.xb.XbFundList; +import com.xiang.entity.response.xbyj.fund.FundInfo; +import com.xiang.entity.response.xbyj.fund.FundList; +import com.xiang.entity.response.xbyj.fund.QueryFundInfoResponse; +import com.xiang.entity.response.xbyj.fund.QueryFundListResponse; +import com.xiang.repository.XBFundMapper; +import com.xiang.utils.HttpUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @Author: xiang + * @Date: 2025-05-14 15:42 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class FundServiceImpl implements FundService{ + + private final HttpUtils httpUtils; + + private final XBFundMapper xbFundMapper; + + @Value("${xiaobei.unionId}") + private String unionId; + + @Value("${xiaobei.codeArr}") + private String codeArrStr; + + private static final Integer SUCCESS_200 = 200; + private static final Integer SUCCESS_0= 0; + + @Override + public List queryTodayList(String date, String dataResources, Boolean dataSourceSwitch, List codeArr) { + if (CollectionUtils.isEmpty(codeArr)) { + String[] split = codeArrStr.split(", "); + codeArr = Arrays.stream(split).collect(Collectors.toList()); + } + + JSONObject json = new JSONObject(); + json.put("date", date); + json.put("unionId", unionId); + json.put("dataResources", dataResources); + json.put("dataSourceSwitch", dataSourceSwitch); + json.put("codeArr", codeArr); + + String resp = ""; + try { + resp = httpUtils.doPost(URLConstants.XB_QUERY_LIST, null, JSONObject.toJSONString(json)); + log.info("[基金列表查询] 查询成功, 请求地址:{}, 请求参数:{}, 请求结果:{}", URLConstants.XB_QUERY_LIST, JSONObject.toJSONString(json), resp); + if (StringUtils.isNotBlank(resp)) { + QueryFundListResponse response = JSONObject.parseObject(resp, QueryFundListResponse.class); + if (Objects.nonNull(response)) { + if (Objects.equals(SUCCESS_0, response.getCode())) { + return response.getData(); + } + } + } + } catch (Exception e) { + log.error("[查询基金列表],请求失败, 请求参数:{}, 请求结果:{}", JSONObject.toJSONString(json), resp); + } + return Lists.newArrayList(); + } + + @Override + public FundInfo queryFundInfo(String code) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", code); + jsonObject.put("unionId", unionId); + String resp = httpUtils.doPost(URLConstants.XB_QUERY_FUND_INFO, null, JSONObject.toJSONString(jsonObject)); + if (StringUtils.isNotBlank(resp)) { + log.info("[小蓓养基] 基金详情查询:请求参数:{}, 请求结果:{}", JSONObject.toJSONString(jsonObject), resp); + QueryFundInfoResponse response = JSONObject.parseObject(resp, QueryFundInfoResponse.class); + if (Objects.nonNull(response)) { + if (Objects.equals(response.getCode(), SUCCESS_200)) { + return response.getData(); + } + } + } + return null; + } + + @Override + public List queryFundList(Integer type) { + return xbFundMapper.queryFundList(type); + } + + @Override + public int addCounts(List list) { + return xbFundMapper.addCounts(list); + } + + @Override + public List queryFundCountInWeek() { + return xbFundMapper.queryFundInWeek(); + } +} diff --git a/script/src/main/java/com/xiang/service/GLaDOSService.java b/script/src/main/java/com/xiang/service/GLaDOSService.java new file mode 100644 index 0000000..510e5a4 --- /dev/null +++ b/script/src/main/java/com/xiang/service/GLaDOSService.java @@ -0,0 +1,13 @@ +package com.xiang.service; + +/** + * @Author: xiang + * @Date: 2025-05-08 14:38 + */ +public interface GLaDOSService { + + /** + * 签到 + */ + String checkIn(); +} diff --git a/script/src/main/java/com/xiang/service/GLaDOSServiceImpl.java b/script/src/main/java/com/xiang/service/GLaDOSServiceImpl.java new file mode 100644 index 0000000..31cd42a --- /dev/null +++ b/script/src/main/java/com/xiang/service/GLaDOSServiceImpl.java @@ -0,0 +1,119 @@ +package com.xiang.service; + +import com.alibaba.fastjson2.JSONObject; +import com.google.common.collect.Maps; +import com.xiang.common.GladosConstants; +import com.xiang.common.URLConstants; +import com.xiang.dingTalk.service.DingTalkService; +import com.xiang.entity.pojo.GladosRunLog; +import com.xiang.entity.pojo.User; +import com.xiang.entity.response.GLaDOSResponse; +import com.xiang.repository.GladosMapper; +import com.xiang.utils.HttpUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * @Author: xiang + * @Date: 2025-05-08 14:38 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class GLaDOSServiceImpl implements GLaDOSService{ + + private final HttpUtils httpUtils; + + private final GladosMapper gladosMapper; + + private final DingTalkService dingTalkService; + + @Value("${DingTalk.userList}") + private String userList; + + @Value("${DingTalk.chatId}") + private String chatId; + + /** + * 签到 + */ + @Override + public String checkIn() { + + List users = gladosMapper.listAllUser(); + if (CollectionUtils.isEmpty(users)) { + return "user is empty"; + } + StringBuffer sb = new StringBuffer(); + users.parallelStream().forEach(user -> { + try { + checkIn(user, sb); + } catch (Exception e) { + log.error("签到失败,", e); + } + }); + return sb.toString(); + } + + private void checkIn(User user, StringBuffer sb) { + + Map header = Maps.newHashMap(); + header.put("Cookie", user.getCookie()); + + String response = null; + + try { + response = httpUtils.doPost(URLConstants.GLADOS_CHECK_IN_URL, header, GladosConstants.GLADOS_CHECK_IN_BODY); + } catch (Exception e) { + log.error("http do post error, header:{}, jsonParams:{}", JSONObject.toJSONString(header), GladosConstants.GLADOS_CHECK_IN_BODY, e); + } + if (StringUtils.isEmpty(response)) { + log.error("http do post error, header:{}, jsonParams:{}", JSONObject.toJSONString(header), GladosConstants.GLADOS_CHECK_IN_BODY); + } + GLaDOSResponse gLaDOSResponse =JSONObject.parseObject(response, GLaDOSResponse.class); + if (Objects.nonNull(gLaDOSResponse)) { + log.info("http do post success, response:{}", response); + if (0 == gLaDOSResponse.getCode() && Objects.nonNull(gLaDOSResponse.getPoints())) { + log.info("签到成功, 签到积分:{}, 签到消息:{}", gLaDOSResponse.getPoints(), gLaDOSResponse.getMessage()); + sb.append(user.getEmail()).append("签到成功,获得积分:").append(gLaDOSResponse.getPoints()).append("\n"); + try { + dingTalkService.sendChatMessage(chatId, "[时间:" + LocalDateTime.now() + "] 用户: " + + user.getEmail() + "签到成功,获得积分:" + gLaDOSResponse.getPoints()); + } catch (Exception e) { + log.error("发送钉钉消息失败", e); + } + } + if (1 == gLaDOSResponse.getCode()) { + log.warn("签到失败,重复签到,用户:{}, 签到消息:{}", user.getEmail(), gLaDOSResponse.getMessage()); + sb.append(user).append("签到失败,重复签到,用户:").append(user).append(",签到消息:").append(gLaDOSResponse.getMessage()); + } + if (-2 == gLaDOSResponse.getCode()) { + log.warn("签到失败,用户:{}, cookie过期:{}", user.getEmail(), gLaDOSResponse.getMessage()); + String message = "[时间:" + LocalDateTime.now() + "] 用户: " + user.getEmail() + ",签到消息: " + gLaDOSResponse.getMessage(); + try { + dingTalkService.sendChatMessage(chatId, message); + } catch (Exception e) { + log.error("发送钉钉消息失败", e); + } + } + if (gLaDOSResponse.getCode() != 1) { + log.warn("签到异常,返回的消息:{}", gLaDOSResponse.getMessage()); + sb.append(user.getEmail()).append("签到异常,返回的消息:").append(gLaDOSResponse.getMessage()).append("\n"); + } + GladosRunLog build = GladosRunLog.builder().time(LocalDateTime.now()).status(1).code(Integer.valueOf(gLaDOSResponse.getCode().toString())).response(response).user(user.getEmail()).userId(user.getId()).build(); + gladosMapper.insertScriptRunLog(build); + return; + } + GladosRunLog build = GladosRunLog.builder().time(LocalDateTime.now()).status(0).response(response).user(user.getEmail()).userId(user.getId()).build(); + gladosMapper.insertScriptRunLog(build); + } +} diff --git a/script/src/main/java/com/xiang/service/JntyzxService.java b/script/src/main/java/com/xiang/service/JntyzxService.java new file mode 100644 index 0000000..ce9c404 --- /dev/null +++ b/script/src/main/java/com/xiang/service/JntyzxService.java @@ -0,0 +1,13 @@ +package com.xiang.service; + +/** + * @Author: xiang + * @Date: 2025-05-14 14:06 + */ +public interface JntyzxService { + + /** + * 查询可用场地 + */ + void queryAvailable() throws Exception; +} diff --git a/script/src/main/java/com/xiang/service/JntyzxServiceImpl.java b/script/src/main/java/com/xiang/service/JntyzxServiceImpl.java new file mode 100644 index 0000000..5817cc9 --- /dev/null +++ b/script/src/main/java/com/xiang/service/JntyzxServiceImpl.java @@ -0,0 +1,100 @@ +package com.xiang.service; + +import com.alibaba.fastjson2.JSONObject; +import com.google.common.collect.Maps; +import com.xiang.common.URLConstants; +import com.xiang.dingTalk.service.DingTalkService; +import com.xiang.entity.response.jntyzx.JntyzxResponse; +import com.xiang.entity.response.jntyzx.venue.query.QueryVenueResponse; +import com.xiang.entity.response.jntyzx.venue.query.SitePositionList; +import com.xiang.entity.response.jntyzx.venue.query.VenueList; +import com.xiang.utils.HttpUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @Author: xiang + * @Date: 2025-05-14 14:07 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class JntyzxServiceImpl implements JntyzxService{ + + private final HttpUtils httpUtils; + + private final DingTalkService dingTalkService; + + @Value("${DingTalk.chatId}") + private String chatId; + + @Override + public void queryAvailable() throws Exception { + String url = URLConstants.JNTYZX_QUERY_TODAY_VENUE; + Map header = Maps.newHashMap(); + header.put("X-Access-Token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NDcyMTAwNzQsInVzZXJuYW1lIjoid3hfb3Blbl9pZF9vMjFNWDR5N3doWENHanZVVEdQNkNUejJIYkQ4In0.0h_cAH_e5cCXDQlQN40jZDBgtfrzQWAmgl3YPQf0d-M"); + String resp = null; + try { + resp = httpUtils.doGet(url, header, null); + } catch (Exception e) { + log.error("[doGet] 江南体育中心查询当天场地 请求失败, url:{}", url); + } + if (StringUtils.isEmpty(resp)) { + log.warn("[查询场地] 江南体育中心查询当天场地 请求结果为空, url:{}, resp:{}", url, resp); + } + JntyzxResponse response = JSONObject.parseObject(resp, JntyzxResponse.class); + String message = ""; + if (Objects.nonNull(response)) { + if (response.getSuccess()) { + log.info("[查询场地] 江南体育中心查询当天场地 请求地址:{}, 请求结果:{}", url, resp); + JSONObject object = (JSONObject) response.getResult(); + if (Objects.nonNull(object)) { + QueryVenueResponse result = object.toJavaObject(QueryVenueResponse.class); + if (Objects.nonNull(result)) { + List venueLists = result.getVenue(); + if (!CollectionUtils.isEmpty(venueLists)) { + StringBuilder sb = new StringBuilder(); + for (VenueList venue : venueLists) { + List positionList = venue.getSitePosition(); + positionList = positionList.stream().filter(this::filterTime).collect(Collectors.toList()); + for (SitePositionList sitePositionList : positionList) { + sb.append(venue.getPlaceName()).append(":").append(sitePositionList.getSjName()).append(":预定人:").append(sitePositionList.getContacts()).append(",电话:").append(sitePositionList.getContactNumber()).append("\n"); + } + } + message = sb.toString(); + } + } + } + } + } + if (StringUtils.isNotBlank(message)) { + dingTalkService.sendChatMessage(chatId, message); + } + } + + + private Boolean filterTime(SitePositionList sitePositionList) { + if (StringUtils.equals("18:00-19:00", sitePositionList.getSjName())) { + return Boolean.TRUE; + } + if (StringUtils.equals("19:00-20:00", sitePositionList.getSjName())) { + return Boolean.TRUE; + } + if (StringUtils.equals("20:00-21:00", sitePositionList.getSjName())) { + return Boolean.TRUE; + } + if (StringUtils.equals("21:00-22:00", sitePositionList.getSjName())) { + return Boolean.TRUE; + } + return Boolean.FALSE; + } +} diff --git a/script/src/main/java/com/xiang/utils/HttpUtils.java b/script/src/main/java/com/xiang/utils/HttpUtils.java new file mode 100644 index 0000000..51f9881 --- /dev/null +++ b/script/src/main/java/com/xiang/utils/HttpUtils.java @@ -0,0 +1,143 @@ +package com.xiang.utils; + +import com.alibaba.fastjson2.JSONObject; +import com.xiang.common.URLConstants; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.MapUtils; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.stereotype.Component; + +import java.io.Closeable; +import java.io.IOException; +import java.util.Map; +import java.util.Set; + +/** + * @Author: xiang + * @Date: 2025-05-08 14:39 + */ +@Slf4j +@Component +public class HttpUtils { + + private int socketTimeOut = 60 * 1000; + private int connectTimeout = 60 * 1000; + private int connectionRequestTimeout = 15 * 1000; + private int defaultMaxPerRoute = 500; + private int maxTotal = 2000; + + public String doPost(String url, Map header, String jsonParams) { + RequestConfig requestConfig = RequestConfig.custom() + // 设置连接超时时间 + .setConnectTimeout(connectTimeout) + // 设置Socket超时时间 + .setSocketTimeout(socketTimeOut) + .setConnectionRequestTimeout(connectionRequestTimeout) + .build(); + //创建httpClient对象 + CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build(); + CloseableHttpResponse response = null; + String result = ""; + try { + // 创建http请求 + HttpPost httpPost = new HttpPost(url); + httpPost.addHeader("Content-Type", "application/json"); + // 创建请求内容 + StringEntity entity = new StringEntity(jsonParams, "utf-8"); + entity.setContentType("application/json"); + httpPost.setEntity(entity); + // 设置请求头 + if (null != header && !header.isEmpty()) { + Set> entries = header.entrySet(); + for (Map.Entry e : entries) { + httpPost.setHeader(e.getKey(), e.getValue()); + } + } + response = httpClient.execute(httpPost); + result = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + log.error("doPost异常", e); + } finally { + //关闭资源 + closeResource(response, httpClient); + } + return result; + } + + public String doGet(String url, Map header, Map param) { + RequestConfig requestConfig = RequestConfig.custom() + // 设置连接超时时间 + .setConnectTimeout(connectTimeout) + // 设置Socket超时时间 + .setSocketTimeout(socketTimeOut) + .setConnectionRequestTimeout(connectionRequestTimeout) + .build(); + CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build(); + CloseableHttpResponse response; + String result = ""; + try { + String request = ""; + if (MapUtils.isNotEmpty(param)) { + StringBuilder req = new StringBuilder("?"); + for (Map.Entry entry : param.entrySet()) { + req.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); + } + request = req.substring(0, req.length() - 1); + } + + HttpGet httpGet = new HttpGet(url + request); + httpGet.addHeader("Content-Type", "application/json"); + if (MapUtils.isNotEmpty(header)) { + for (Map.Entry entry : header.entrySet()) { + httpGet.setHeader(entry.getKey(), entry.getValue()); + } + } + log.info("doGet请求:请求地址:{}", url + request); + response = httpClient.execute(httpGet); + result = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + log.error("doGet异常:", e); + } + return result; + } + + /** + * @Description 关闭资源 + */ + private void closeResource(Closeable... resources) { + try { + for (Closeable resource : resources) { + if (resource != null) { + resource.close(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { +// HttpUtils httpUtils = new HttpUtils(); +// Map map = new HashMap<>(); +// map.put("Cookie", "SL_G_WPT_TO=en; SL_GWPT_Show_Hide_tmp=1; SL_wptGlobTipTmp=1; koa:sess=eyJ1c2VySWQiOjU1OTg1MywiX2V4cGlyZSI6MTc3MjYwNDkyNjI4OCwiX21heEFnZSI6MjU5MjAwMDAwMDB9; koa:sess.sig=OdaqjpLkIp19lXn0lFuOsHX7vEM"); +// String response = httpUtils.doPost("https://www.glados.one/api/user/checkin", map, "{\"token\":\"glados.one\"}"); +// System.out.println(response); + HttpUtils httpUtils = new HttpUtils(); +// Map header = Maps.newHashMap(); +// header.put("X-Access-Token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NDcyMTAwNzQsInVzZXJuYW1lIjoid3hfb3Blbl9pZF9vMjFNWDR5N3doWENHanZVVEdQNkNUejJIYkQ4In0.0h_cAH_e5cCXDQlQN40jZDBgtfrzQWAmgl3YPQf0d-M"); +// System.out.println(httpUtils.doGet("https://jntyzx.cn:8443/GYM-JN/multi/Subscribe/getSubscribeByToday?gid=03&isWeekend=1", header, null)); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("code", "012414"); + jsonObject.put("unionId", "o896o5y8bJZYMh2gdKhDdmUKc0Wk"); + String resp = httpUtils.doPost(URLConstants.XB_QUERY_FUND_INFO, null, JSONObject.toJSONString(jsonObject)); + System.out.println(resp); + } +} diff --git a/script/src/main/resources/application-local.yml b/script/src/main/resources/application-local.yml new file mode 100644 index 0000000..3324d40 --- /dev/null +++ b/script/src/main/resources/application-local.yml @@ -0,0 +1,6 @@ +spring: + datasource: + url: jdbc:mysql:///xservice-script?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver \ No newline at end of file diff --git a/script/src/main/resources/application-prod.yml b/script/src/main/resources/application-prod.yml new file mode 100644 index 0000000..7cd791c --- /dev/null +++ b/script/src/main/resources/application-prod.yml @@ -0,0 +1,6 @@ +spring: + datasource: + url: jdbc:mysql://172.28.159.213:3306/xservice-script?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true + username: root + password: 123456 + driver-class-name: com.mysql.cj.jdbc.Driver \ No newline at end of file diff --git a/script/src/main/resources/application.yml b/script/src/main/resources/application.yml new file mode 100644 index 0000000..031afce --- /dev/null +++ b/script/src/main/resources/application.yml @@ -0,0 +1,24 @@ +mybatis: + mapper-locations: + - classpath*:mapper/*.xml + configuration: + map-underscore-to-camel-case: true + +DingTalk: + # 钉钉消息用户,用逗号隔开 + userList: "450841600726084717" + # 钉钉消息群ID,需要调用/chat/create api创建群返回 + chatId: "chatd16d8daeea33b36b73588c676d508096" + +xiaobei: + unionId: o896o5y8bJZYMh2gdKhDdmUKc0Wk + codeArr: "010364, 022150, 013224, 008960, 013841, 015528, 012414, 020412, 014662, 016814, 014422, 015596, 007844, + 023521, 016496, 016387, 021608, 008282, 012769, 021580, 017811, 007467, 017516, 018125, 016531, 021091, + 021688, 021536, 019571, 168204, 020741, 013594" + +server: + port: 8080 + +spring: + profiles: + active: local \ No newline at end of file diff --git a/script/src/main/resources/logback-spring.xml b/script/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..d222df7 --- /dev/null +++ b/script/src/main/resources/logback-spring.xml @@ -0,0 +1,102 @@ + + + + + + ${APP_NAME} + + + + + + + + + + + + + + %boldGreen(%contextName): %boldCyan(%d{yyyy-MM-dd HH:mm:ss:SSS}) %highlight([%c]) %boldMagenta([%t]) %boldCyan([%L]) %highlight([traceId:%X{traceId:-},spanId:%X{spanId:-},localIp:%X{localIp:-}]) %boldGreen([%p]) - %msg%n + + + UTF-8 + + + + + + + + ${LOG_HOME}/debug-%d{yyyy-MM-dd}.log + + ${LOG_MAX_HISTORY} + + + + %contextName: %d{yyyy-MM-dd HH:mm:ss.SSS} [%c][%t][%L][%p] [traceId:%X{traceId:-},spanId:%X{spanId:-},localIp:%X{localIp:-}] - %msg%n + UTF-8 + + + + debug + ACCEPT + DENY + + + + + + + + ${LOG_HOME}/info-%d{yyyy-MM-dd}.log + + ${LOG_MAX_HISTORY} + + + + %contextName: %d{yyyy-MM-dd HH:mm:ss.SSS} [%c][%t][%L][%p] [traceId:%X{traceId:-},spanId:%X{spanId:-},localIp:%X{localIp:-}] - %msg%n + UTF-8 + + + + + info + ACCEPT + DENY + + + + + + + + ${LOG_HOME}/error-%d{yyyy-MM-dd}.log + + ${LOG_MAX_HISTORY} + + + + %contextName: %d{yyyy-MM-dd HH:mm:ss.SSS} [%c][%t][%L][%p] [traceId:%X{traceId:-},spanId:%X{spanId:-},localIp:%X{localIp:-}] - %msg%n + UTF-8 + + + + error + ACCEPT + DENY + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/script/src/main/resources/mapper/GladosMapper.xml b/script/src/main/resources/mapper/GladosMapper.xml new file mode 100644 index 0000000..8b50ffb --- /dev/null +++ b/script/src/main/resources/mapper/GladosMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + id, user, + email, + cookie, + status + + + + insert into scirpt_glados_run(time, status, response, user, user_id, code) values (#{time}, #{status}, #{response}, #{user}, #{userId}, #{code}) + + + + + + \ No newline at end of file diff --git a/script/src/main/resources/mapper/XBFundMapper.xml b/script/src/main/resources/mapper/XBFundMapper.xml new file mode 100644 index 0000000..a73efe1 --- /dev/null +++ b/script/src/main/resources/mapper/XBFundMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + id, code, + name, + `change`, + update_time + + + insert into xb_fund_info(code, name, `change`, update_time) values + + (#{item.code}, #{item.name}, #{item.change}, #{item.updateTime}) + + + + insert into xb_fund_count(l_id, code, name, `change`, update_time) values + + (#{item.lId}, #{item.code}, #{item.name}, #{item.change}, #{item.updateTime}) + + + + + + + + + \ No newline at end of file