From 66a69a4968fc6836f5ad1b12f8d0ba39e6db3e88 Mon Sep 17 00:00:00 2001 From: xiang Date: Tue, 5 May 2026 17:28:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=B8=8B=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xiang/common/enums/ScheduleEnums.java | 10 ++ .../xiang/common/enums/YcCodeTypeEnum.java | 17 +++ .../schedule/BaseScheduleTaskTemplate.java | 3 +- .../common/pojo/code/YcCodeBaseResponse.java | 14 ++ .../common/pojo/code/YcCodeDataResp.java | 14 ++ .../xiang/common/pojo/code/YcCodeRequest.java | 24 +++ .../common/pojo/jntyzx/zlb/ZlbOrderInfo.java | 21 +-- .../xiang/common/service/CodeServiceImpl.java | 73 +++++++++ .../xiang/common/service/ICodeService.java | 14 ++ .../jntyzx/zlb/schedule/ZlbLoginTask.java | 138 ++++++++++++++++++ .../jntyzx/zlb/schedule/ZlbOrderTask.java | 137 +++++++++++++++++ .../jntyzx/zlb/schedule/ZlbSiteDayTask.java | 74 ++++++++++ .../jntyzx/zlb/schedule/ZlbSiteTask.java | 67 +++++++++ .../jntyzx/zlb/schedule/ZlbTaskConfig.java | 44 ++++++ .../zlb/schedule/ZlbTokenRefreshTask.java | 79 ++++++++++ .../jntyzx/zlb/service/ZlbServiceImpl.java | 12 +- 16 files changed, 728 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/xiang/common/enums/YcCodeTypeEnum.java create mode 100644 src/main/java/com/xiang/common/pojo/code/YcCodeBaseResponse.java create mode 100644 src/main/java/com/xiang/common/pojo/code/YcCodeDataResp.java create mode 100644 src/main/java/com/xiang/common/pojo/code/YcCodeRequest.java create mode 100644 src/main/java/com/xiang/common/service/CodeServiceImpl.java create mode 100644 src/main/java/com/xiang/common/service/ICodeService.java create mode 100644 src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbLoginTask.java create mode 100644 src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbOrderTask.java create mode 100644 src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbSiteDayTask.java create mode 100644 src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbSiteTask.java create mode 100644 src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbTokenRefreshTask.java diff --git a/src/main/java/com/xiang/common/enums/ScheduleEnums.java b/src/main/java/com/xiang/common/enums/ScheduleEnums.java index 684c88f..45daa45 100644 --- a/src/main/java/com/xiang/common/enums/ScheduleEnums.java +++ b/src/main/java/com/xiang/common/enums/ScheduleEnums.java @@ -7,8 +7,18 @@ import lombok.Getter; @AllArgsConstructor public enum ScheduleEnums { + /** + * 0:glados 1:芬玩岛 2:江体小程序 3:江体zlb 4:DDNS + */ DOMAIN_DYNAMIC_ANALYSIS_TASK(4, "domain", "domainDynamicAnalysisTask"), GLADOS_CHECK_IN_TASK(0, "glados", "gladosCheckInTask"), + + ZLB_LOGIN_TASK(3, "zlb", "zlbLoginTask"), + ZLB_TOKEN_CHECK_TASK(3, "zlb", "zlbTokenCheckTask"), + ZLB_SITE_QUERY_TASK(3, "zlb", "zlbSiteQueryTask"), + ZLB_SITE_DAY_TASK(3, "zlb", "zlbSiteDayTask"), + ZLB_ORDER_CREATE_TASK(3, "zlb", "zlbOrderCreateTask"), + ; private final Integer modeleCode; diff --git a/src/main/java/com/xiang/common/enums/YcCodeTypeEnum.java b/src/main/java/com/xiang/common/enums/YcCodeTypeEnum.java new file mode 100644 index 0000000..d43c581 --- /dev/null +++ b/src/main/java/com/xiang/common/enums/YcCodeTypeEnum.java @@ -0,0 +1,17 @@ +package com.xiang.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum YcCodeTypeEnum { + + YC_10118(10118, "中文字符 1~4位 plus 其他类型准确率不满足 可使用本类型"), + YC_6246(30100, "通用中文点选1") + + ; + private final Integer type; + private final String desc; + +} diff --git a/src/main/java/com/xiang/common/factory/schedule/BaseScheduleTaskTemplate.java b/src/main/java/com/xiang/common/factory/schedule/BaseScheduleTaskTemplate.java index 1d07da0..c2277af 100644 --- a/src/main/java/com/xiang/common/factory/schedule/BaseScheduleTaskTemplate.java +++ b/src/main/java/com/xiang/common/factory/schedule/BaseScheduleTaskTemplate.java @@ -9,6 +9,7 @@ import com.xiang.common.service.IScheduleRunLogService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Objects; @@ -112,7 +113,7 @@ public abstract class BaseScheduleTaskTemplate { * @param validatedParams 校验通过的参数 * @return 任务执行结果 */ - protected abstract TaskResult doExecute(Object validatedParams); + protected abstract TaskResult doExecute(Object validatedParams) throws Exception; /** * 记录成功结果 - 子类可选择性覆写 diff --git a/src/main/java/com/xiang/common/pojo/code/YcCodeBaseResponse.java b/src/main/java/com/xiang/common/pojo/code/YcCodeBaseResponse.java new file mode 100644 index 0000000..8afa6ad --- /dev/null +++ b/src/main/java/com/xiang/common/pojo/code/YcCodeBaseResponse.java @@ -0,0 +1,14 @@ +package com.xiang.common.pojo.code; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class YcCodeBaseResponse { + private String msg; + private Integer code; + private T data; +} diff --git a/src/main/java/com/xiang/common/pojo/code/YcCodeDataResp.java b/src/main/java/com/xiang/common/pojo/code/YcCodeDataResp.java new file mode 100644 index 0000000..d8937cf --- /dev/null +++ b/src/main/java/com/xiang/common/pojo/code/YcCodeDataResp.java @@ -0,0 +1,14 @@ +package com.xiang.common.pojo.code; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class YcCodeDataResp { + private Integer code; + private String data; + private Double time; +} diff --git a/src/main/java/com/xiang/common/pojo/code/YcCodeRequest.java b/src/main/java/com/xiang/common/pojo/code/YcCodeRequest.java new file mode 100644 index 0000000..de7142b --- /dev/null +++ b/src/main/java/com/xiang/common/pojo/code/YcCodeRequest.java @@ -0,0 +1,24 @@ +package com.xiang.common.pojo.code; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class YcCodeRequest { + /** + * 图片 + */ + private String image; + /** + * token + */ + private String token; + /** + * 接口类型 + */ + private Integer type; + private String extra; +} diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderInfo.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderInfo.java index 0fa2ce7..f5b844f 100644 --- a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderInfo.java +++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderInfo.java @@ -12,24 +12,25 @@ import java.util.List; */ @Data public class ZlbOrderInfo { - private String id; - private ZlbData data; + private String id; + private ZlbData data; @Data public static class ZlbData { - private Integer bgImageWidth; - private Integer bgImageHeight; - private String startTime; - private String stopTime; + private Integer bgImageWidth; + private Integer bgImageHeight; + private String startTime; + private String stopTime; private List trackList; @Data public static class TrackList { - private Integer x; - private Integer y; - private Integer t; - private String type; + private Integer x; + private Integer y; + private Integer t; + private String type; } } + private String siteOrderDetailsStr; } diff --git a/src/main/java/com/xiang/common/service/CodeServiceImpl.java b/src/main/java/com/xiang/common/service/CodeServiceImpl.java new file mode 100644 index 0000000..6b44543 --- /dev/null +++ b/src/main/java/com/xiang/common/service/CodeServiceImpl.java @@ -0,0 +1,73 @@ +package com.xiang.common.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.google.common.collect.Maps; +import com.xiang.common.enums.YcCodeTypeEnum; +import com.xiang.common.pojo.code.YcCodeBaseResponse; +import com.xiang.common.pojo.code.YcCodeDataResp; +import com.xiang.common.pojo.code.YcCodeRequest; +import com.xiang.common.utils.HttpService; +import lombok.extern.slf4j.Slf4j; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Objects; + +@Service +@Slf4j +public class CodeServiceImpl implements ICodeService { + + // 云码平台接口api + private static final String YUN_CODE_API_URL = "http://api.jfbym.com/api/YmServer/customApi"; + + @Override + public String templateCodeResolve(String image) { + YcCodeBaseResponse resp = baseCodeResolve(YcCodeTypeEnum.YC_10118.getType(), image, null); + if (Objects.isNull(resp)) { + return null; + } + Integer code = resp.getCode(); + if (200 == code) { + String data = resp.getData().getData(); + StringBuilder result = new StringBuilder(); + for (int i = 0; i < data.length(); i++) { + result.append(data.charAt(i)).append(","); + } + return result.substring(0, result.length() - 1); + } + return null; + + } + + @Override + public String codeResolve(String image, String extra) { + YcCodeBaseResponse resp = baseCodeResolve(YcCodeTypeEnum.YC_6246.getType(), image, extra); + if (Objects.isNull(resp)) { + return null; + } + Integer code = resp.getCode(); + if (200 == code) { + return resp.getData().getData(); + } + return null; + } + + @Override + public YcCodeBaseResponse baseCodeResolve(Integer type, String image, String extra) { + + HashMap header = Maps.newHashMap(); + header.put("Content-Type", "application/json"); + + YcCodeRequest ycCodeRequest = new YcCodeRequest(); + ycCodeRequest.setImage(image); + ycCodeRequest.setToken("9LQ1ATKVEeO8Arhq-HavXzpHvkzdZz_r7ydmqlYhp9c"); + ycCodeRequest.setType(type); + ycCodeRequest.setExtra(extra); + + String resp = HttpService.doPost(YUN_CODE_API_URL, header, JSON.toJSONString(ycCodeRequest)); + return JSON.parseObject(resp, new TypeReference>() { + }); + } +} diff --git a/src/main/java/com/xiang/common/service/ICodeService.java b/src/main/java/com/xiang/common/service/ICodeService.java new file mode 100644 index 0000000..b45de0f --- /dev/null +++ b/src/main/java/com/xiang/common/service/ICodeService.java @@ -0,0 +1,14 @@ +package com.xiang.common.service; + +import com.xiang.common.pojo.code.YcCodeBaseResponse; +import com.xiang.common.pojo.code.YcCodeDataResp; +import com.xiang.common.pojo.code.YcCodeRequest; + +public interface ICodeService { + + String templateCodeResolve(String image); + + String codeResolve(String image, String extra); + + YcCodeBaseResponse baseCodeResolve(Integer type, String image, String extra); +} diff --git a/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbLoginTask.java b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbLoginTask.java new file mode 100644 index 0000000..087dc00 --- /dev/null +++ b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbLoginTask.java @@ -0,0 +1,138 @@ +package com.xiang.service.module.jntyzx.zlb.schedule; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.xiang.common.enums.ScheduleEnums; +import com.xiang.common.factory.JntyzxDingTalkFactory; +import com.xiang.common.factory.schedule.BaseScheduleTaskTemplate; +import com.xiang.common.mapper.ZlbLoginInfoMapper; +import com.xiang.common.pojo.jntyzx.zlb.ZlbLoginInfo; +import com.xiang.common.pojo.jntyzx.zlb.ZlbTokenInfo; +import com.xiang.common.pojo.schedule.TaskResult; +import com.xiang.common.service.IScheduleOpeningConfigService; +import com.xiang.common.service.IScheduleRunLogService; +import com.xiang.service.module.jntyzx.zlb.service.ZlbTokenInfoService; +import lombok.extern.slf4j.Slf4j; +import okhttp3.*; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@Slf4j +@Component +public class ZlbLoginTask extends BaseScheduleTaskTemplate { + + private final ZlbLoginInfoMapper zlbLoginInfoMapper; + private final ZlbTokenInfoService zlbTokenInfoService; + private final JntyzxDingTalkFactory jntyzxDingTalkFactory; + + public ZlbLoginTask(IScheduleOpeningConfigService scheduleOpeningConfigService, + IScheduleRunLogService scheduleRunLogService, + ZlbLoginInfoMapper zlbLoginInfoMapper, + ZlbTokenInfoService zlbTokenInfoService, + JntyzxDingTalkFactory jntyzxDingTalkFactory) { + super(scheduleOpeningConfigService, scheduleRunLogService); + this.zlbLoginInfoMapper = zlbLoginInfoMapper; + this.zlbTokenInfoService = zlbTokenInfoService; + this.jntyzxDingTalkFactory = jntyzxDingTalkFactory; + } + + @Override + protected String getTaskName() { + return ScheduleEnums.ZLB_LOGIN_TASK.getTaskName(); + } + + @Override + protected Integer getModule() { + return ScheduleEnums.ZLB_LOGIN_TASK.getModeleCode(); + } + + @Override + protected String getModuleName() { + return ScheduleEnums.ZLB_LOGIN_TASK.getModule(); + } + + @Override + protected TaskResult doExecute(Object validatedParams) { + TaskResult taskResult = new TaskResult(); + taskResult.setSuccess(true); + + List zlbLoginInfos = zlbLoginInfoMapper.selectList(new QueryWrapper<>()); + if (CollectionUtils.isEmpty(zlbLoginInfos)) { + taskResult.setSummary("暂无用户信息"); + return taskResult; + } + + OkHttpClient client = new OkHttpClient.Builder() + .connectTimeout(60, TimeUnit.SECONDS) // 连接超时时间 + .readTimeout(60, TimeUnit.SECONDS) // 读取超时时间 + .writeTimeout(60, TimeUnit.SECONDS) // 写入超时时间 + .build(); + StringBuilder sb = new StringBuilder(); + for (ZlbLoginInfo zlbLoginInfo : zlbLoginInfos) { + String name = zlbLoginInfo.getName(); + try { + MediaType mediaType = MediaType.parse("application/json"); + RequestBody body = RequestBody.create(mediaType, "{\"appId\":\"2002207307\"}"); + Request request = new Request.Builder() + .url("https://portal.zjzwfw.gov.cn/uc/sso/ticket") + .method("POST", body) + .addHeader("Host", "portal.zjzwfw.gov.cn") + .addHeader("X-App-Id", "") + .addHeader("X-Timestamp", "1761122479") + .addHeader("User-Agent", "000001@ZLB_iphone_7.28.0") + .addHeader("guc-accountType", "person") +// .addHeader("aliyungf_tc", zlbLoginInfo.getAliyungfTc()) + .addHeader("Biz-Session-Id", zlbLoginInfo.getBizSessionId()) + .addHeader("guc-platform", "app") + .addHeader("X-Access-Id", "szzj") + .addHeader("X-Device-Id", zlbLoginInfo.getXDeviceId()) + .addHeader("X-Sign-Type", "SHA256") + .addHeader("guc-endpoint", "C") + .addHeader("X-Sign-Value", zlbLoginInfo.getXSignValue()) + .addHeader("Connection", "keep-alive") + .addHeader("token", zlbLoginInfo.getToken()) + .addHeader("Accept-Language", "zh-Hans-CN;q=1") + .addHeader("guc-gsid", zlbLoginInfo.getGucGsid()) + .addHeader("X-Site-Code", zlbLoginInfo.getXSiteCode()) + .addHeader("Accept", "*/*") + .addHeader("OS-Version", "18.6.2") + .addHeader("Cookie", zlbLoginInfo.getCookie()) + .addHeader("Content-Type", "application/json") + .build(); + Response response = client.newCall(request).execute(); + String string = response.body().string(); + log.info("{}获取ticketId接口返回:{}", name,string); + JSONObject jsonObject = JSON.parseObject(string + ); + JSONObject data = jsonObject.getJSONObject("data"); + String ticketId = data.getString("ticketId"); + Request.Builder builder = new Request.Builder().url("https://asian.hzsports.net/sportthirdserver/zjmanage/getTydjtLoginInFo4?ticketId=" + ticketId); + // 添加请求头 + builder.addHeader("token", "9a422ab8b25d4634ae8efbb965945b46"); + Response response1 = client.newCall(builder.build()).execute(); + JSONObject jsonObject1 = JSON.parseObject(response1.body().string()); + String token = jsonObject1.getString("data"); + log.info("{}token=== {}", name, token); + ZlbTokenInfo zlbTokenInfo = zlbTokenInfoService.queryByName(name); + zlbTokenInfo.setTokenId(token); + zlbTokenInfo.setUpdatedDate(new Date()); + zlbTokenInfoService.updateById(zlbTokenInfo); + } catch (Exception e) { + log.error("{}登录异常", name, e); + sb.append(name).append("用户登录异常.").append(e.getMessage()); + jntyzxDingTalkFactory.sendMsg("登录异常:" + name); + } + } + if (StringUtils.isNotBlank(sb)) { + taskResult.setSuccess(false); + taskResult.setSummary(sb.toString()); + } + return taskResult; + } +} diff --git a/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbOrderTask.java b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbOrderTask.java new file mode 100644 index 0000000..d524a30 --- /dev/null +++ b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbOrderTask.java @@ -0,0 +1,137 @@ +package com.xiang.service.module.jntyzx.zlb.schedule; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.xiang.common.enums.ScheduleEnums; +import com.xiang.common.factory.JntyzxDingTalkFactory; +import com.xiang.common.factory.schedule.BaseScheduleTaskTemplate; +import com.xiang.common.pojo.jntyzx.zlb.ZlbTokenInfo; +import com.xiang.common.pojo.jntyzx.zlb.ZlbUserInfo; +import com.xiang.common.pojo.schedule.TaskResult; +import com.xiang.common.service.IScheduleOpeningConfigService; +import com.xiang.common.service.IScheduleRunLogService; +import com.xiang.common.utils.DateUtils; +import com.xiang.common.utils.OkHttpUtil; +import com.xiang.service.module.jntyzx.zlb.constants.ZlbUrlConstants; +import com.xiang.service.module.jntyzx.zlb.service.ZlbService; +import com.xiang.service.module.jntyzx.zlb.service.ZlbTokenInfoService; +import com.xiang.service.module.jntyzx.zlb.service.ZlbUserInfoService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.IOException; +import java.time.Duration; +import java.time.LocalTime; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +@Component +@Slf4j +public class ZlbOrderTask extends BaseScheduleTaskTemplate { + + private final ZlbUserInfoService zlbUserInfoService; + private final ZlbService zlbService; + private final ZlbTokenInfoService zlbTokenInfoService; + private final JntyzxDingTalkFactory jntyzxDingTalkFactory; + private final RedisTemplate redisTemplate; + + public ZlbOrderTask(IScheduleOpeningConfigService scheduleOpeningConfigService, + IScheduleRunLogService scheduleRunLogService, + ZlbUserInfoService zlbUserInfoService, + ZlbService zlbService, + ZlbTokenInfoService zlbTokenInfoService, + JntyzxDingTalkFactory jntyzxDingTalkFactory, + RedisTemplate redisTemplate) { + super(scheduleOpeningConfigService, scheduleRunLogService); + this.zlbUserInfoService = zlbUserInfoService; + this.zlbService = zlbService; + this.zlbTokenInfoService = zlbTokenInfoService; + this.jntyzxDingTalkFactory = jntyzxDingTalkFactory; + this.redisTemplate = redisTemplate; + } + + @Override + protected String getTaskName() { + return ScheduleEnums.ZLB_ORDER_CREATE_TASK.getTaskName(); + } + + @Override + protected Integer getModule() { + return ScheduleEnums.ZLB_ORDER_CREATE_TASK.getModeleCode(); + } + + @Override + protected String getModuleName() { + return ScheduleEnums.ZLB_ORDER_CREATE_TASK.getModule(); + } + + @Override + protected TaskResult doExecute(Object validatedParams) throws Exception { + + TaskResult taskResult = new TaskResult(); + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(ZlbUserInfo::getIsBook, 0); + wrapper.eq(ZlbUserInfo::getName, "xiang"); + Date date = DateUtils.addDate(new Date(), 0); + String day = DateUtils.format(date, DateUtils.ENUM_FORMAT_YMD); + wrapper.eq(ZlbUserInfo::getWeek, DateUtils.getWeekDayTwo(day)); + ZlbUserInfo zlbUserInfo = zlbUserInfoService.getOne(wrapper); + if (zlbUserInfo == null) { + taskResult.setSuccess(false); + taskResult.setSummary("用户不存在"); + return taskResult; + } + OkHttpUtil client = OkHttpUtil.getInstance(); + //使用代理ip + String name = zlbUserInfo.getName(); + String placeName = zlbUserInfo.getPlaceName(); + String siteTimeName = zlbUserInfo.getSiteTimeName(); + //获取Token + ZlbTokenInfo zlbTokenInfo = zlbTokenInfoService.queryByName(name); + String tokenId = zlbTokenInfo.getTokenId(); + String secretKey = zlbService.getKey(tokenId, client); + String siteOrderDetailsStr = zlbService.buildSiteOrder(zlbUserInfo, secretKey, day); + Map headers = zlbService.getHeaders(zlbTokenInfo.getTokenId()); + String newOrderJson = zlbService.buildNewOrder(siteOrderDetailsStr, client); + ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); + //计算9点到现在的时间差 + //获取江体当前时间 + LocalTime currentTime = LocalTime.now(); + LocalTime targetTime = LocalTime.parse("09:00:11.800"); + Duration duration = Duration.between(currentTime, targetTime); + long milliseconds = duration.toMillis(); +// executorService.schedule(() -> { + String response = null; + try { + response = client.postJson(ZlbUrlConstants.newOrderUrl, headers, newOrderJson); + } catch (Exception e) { + throw new RuntimeException(e); + } + buildOrder(name, response, placeName, siteTimeName); +// }, milliseconds, TimeUnit.MILLISECONDS); + + return taskResult; + } + + private void buildOrder(String name, String response, String placeName, String siteTimeName) { + log.info("订单接口返回结果==> \n {}", response); + JSONObject jsonObject = JSONObject.parseObject(response); + if (jsonObject.getInteger("code") == 200) { + jntyzxDingTalkFactory.sendMsg(name + "订单接口下单返回成功请2分钟内付款√√√√√√场地号:" + placeName + "时间:" + siteTimeName); + JSONObject data = jsonObject.getJSONObject("data"); + String orderId = data.getString("orderId"); + log.info("{}订单{}创建成功", name, orderId); + String redisKey = ZlbUrlConstants.REDIS_PREFIX + "_" + orderId + "_" + name; + redisTemplate.opsForValue().set(redisKey, name); + redisTemplate.expire(redisKey, 120, TimeUnit.SECONDS); + } + } +} diff --git a/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbSiteDayTask.java b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbSiteDayTask.java new file mode 100644 index 0000000..1a17e02 --- /dev/null +++ b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbSiteDayTask.java @@ -0,0 +1,74 @@ +package com.xiang.service.module.jntyzx.zlb.schedule; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.xiang.common.enums.ScheduleEnums; +import com.xiang.common.factory.JntyzxDingTalkFactory; +import com.xiang.common.factory.schedule.BaseScheduleTaskTemplate; +import com.xiang.common.mapper.ZlbOrderInfoMapper; +import com.xiang.common.pojo.jntyzx.zlb.ZlbPayOrder; +import com.xiang.common.pojo.schedule.TaskResult; +import com.xiang.common.service.IScheduleOpeningConfigService; +import com.xiang.common.service.IScheduleRunLogService; +import com.xiang.common.utils.DateUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +@Component +@Slf4j +public class ZlbSiteDayTask extends BaseScheduleTaskTemplate { + private final ZlbOrderInfoMapper zlbOrderInfoMapper; + private final JntyzxDingTalkFactory jntyzxDingTalkFactory; + + public ZlbSiteDayTask(IScheduleOpeningConfigService scheduleOpeningConfigService, + IScheduleRunLogService scheduleRunLogService, + ZlbOrderInfoMapper zlbOrderInfoMapper, + JntyzxDingTalkFactory jntyzxDingTalkFactory) { + super(scheduleOpeningConfigService, scheduleRunLogService); + this.zlbOrderInfoMapper = zlbOrderInfoMapper; + this.jntyzxDingTalkFactory = jntyzxDingTalkFactory; + } + + @Override + protected String getTaskName() { + return ScheduleEnums.ZLB_SITE_DAY_TASK.getTaskName(); + } + + @Override + protected Integer getModule() { + return ScheduleEnums.ZLB_SITE_DAY_TASK.getModeleCode(); + } + + @Override + protected String getModuleName() { + return ScheduleEnums.ZLB_SITE_DAY_TASK.getModule(); + } + + @Override + protected TaskResult doExecute(Object validatedParams) { + TaskResult taskResult = new TaskResult(); + + //获取当前时间的后一天 + Date date = DateUtils.addDate(new Date(), 1); + String day = DateUtils.format(date, DateUtils.ENUM_FORMAT_YMD); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(ZlbPayOrder::getDay, day); + wrapper.orderByAsc(ZlbPayOrder::getTime); + List zlbPayOrders = zlbOrderInfoMapper.selectList(wrapper); + if (!zlbPayOrders.isEmpty()){ + StringBuilder sb = new StringBuilder(); + sb.append("预约日期:").append(day).append("\n"); + for (ZlbPayOrder zlbPayOrder : zlbPayOrders) { + sb.append("预约人:").append(zlbPayOrder.getName()).append("预约场地:").append(zlbPayOrder.getPlaceName()).append(",").append("预约时间:").append(zlbPayOrder.getTime()).append(",").append("\n"); + } + jntyzxDingTalkFactory.sendMsg(sb.toString()); + } + + taskResult.setSuccess(true); + return taskResult; + } +} diff --git a/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbSiteTask.java b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbSiteTask.java new file mode 100644 index 0000000..093796d --- /dev/null +++ b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbSiteTask.java @@ -0,0 +1,67 @@ +package com.xiang.service.module.jntyzx.zlb.schedule; + +import com.xiang.common.enums.ScheduleEnums; +import com.xiang.common.factory.schedule.BaseScheduleTaskTemplate; +import com.xiang.common.pojo.schedule.TaskResult; +import com.xiang.common.service.IScheduleOpeningConfigService; +import com.xiang.common.service.IScheduleRunLogService; +import com.xiang.common.utils.DateUtils; +import com.xiang.service.module.jntyzx.zlb.service.ZlbService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Date; + +@Component +@Slf4j +public class ZlbSiteTask extends BaseScheduleTaskTemplate { + + private final ZlbService zlbService; + + public ZlbSiteTask(IScheduleOpeningConfigService scheduleOpeningConfigService, IScheduleRunLogService scheduleRunLogService, ZlbService zlbService) { + super(scheduleOpeningConfigService, scheduleRunLogService); + this.zlbService = zlbService; + } + + @Override + protected String getTaskName() { + return ScheduleEnums.ZLB_SITE_QUERY_TASK.getTaskName(); + } + + @Override + protected Integer getModule() { + return ScheduleEnums.ZLB_SITE_QUERY_TASK.getModeleCode(); + } + + @Override + protected String getModuleName() { + return ScheduleEnums.ZLB_SITE_QUERY_TASK.getModule(); + } + + @Override + protected TaskResult doExecute(Object validatedParams) { + + TaskResult taskResult = new TaskResult(); + //获取当前时间的后一天 + Date date1 = DateUtils.addDate(new Date(), 2); + Date date2 = DateUtils.addDate(new Date(), 3); + Date date3 = DateUtils.addDate(new Date(), 4); + String day1 = DateUtils.format(date1, DateUtils.ENUM_FORMAT_YMD); + String day2 = DateUtils.format(date2, DateUtils.ENUM_FORMAT_YMD); + String day3 = DateUtils.format(date3, DateUtils.ENUM_FORMAT_YMD); + try { + zlbService.queryZLbSiteInfo(day1, 1); + zlbService.queryZLbSiteInfo(day2, 1); + zlbService.queryZLbSiteInfo(day3, 1); + } catch (Exception e) { + log.error("site task error", e); + taskResult.setSuccess(false); + taskResult.setSummary(e.getMessage()); + return taskResult; + } + taskResult.setSuccess(true); + taskResult.setSummary("site task success."); + return taskResult; + } +} diff --git a/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbTaskConfig.java b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbTaskConfig.java index 2803c55..8c3e1ac 100644 --- a/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbTaskConfig.java +++ b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbTaskConfig.java @@ -1,4 +1,48 @@ package com.xiang.service.module.jntyzx.zlb.schedule; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@Component +@RequiredArgsConstructor +@RestController public class ZlbTaskConfig { + + private final ZlbLoginTask zlbLoginTask; + private final ZlbTokenRefreshTask zlbTokenRefreshTask; + private final ZlbSiteTask zlbSiteTask; + private final ZlbSiteDayTask zlbSiteDayTask; + private final ZlbOrderTask zlbOrderTask; + + @Scheduled(cron = "0 0/30 * * * ?") + @GetMapping("/zlbLoginTask") + public void zlbLoginTask() { + zlbLoginTask.run(); + } + + @Scheduled(cron = "0 0 8 * * *") + @GetMapping("/zlbTokenRefresh") + public void zlbTokenRefresh() { + zlbTokenRefreshTask.run(); + } + + @GetMapping("/zlbSiteTask") + public void zlbSiteTask() { + zlbSiteTask.run(); + } + + @GetMapping("/zlbSiteDayTask") + public void zlbSiteDayTask() { + zlbSiteDayTask.run(); + } + + @GetMapping("/zlbOrderCreateTask") + public void zlbOrderCreateTask() { + zlbOrderTask.run(); + } + + } diff --git a/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbTokenRefreshTask.java b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbTokenRefreshTask.java new file mode 100644 index 0000000..17a360f --- /dev/null +++ b/src/main/java/com/xiang/service/module/jntyzx/zlb/schedule/ZlbTokenRefreshTask.java @@ -0,0 +1,79 @@ +package com.xiang.service.module.jntyzx.zlb.schedule; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.xiang.common.enums.ScheduleEnums; +import com.xiang.common.factory.JntyzxDingTalkFactory; +import com.xiang.common.factory.schedule.BaseScheduleTaskTemplate; +import com.xiang.common.pojo.jntyzx.zlb.ZlbTokenInfo; +import com.xiang.common.pojo.schedule.TaskResult; +import com.xiang.common.service.IScheduleOpeningConfigService; +import com.xiang.common.service.IScheduleRunLogService; +import com.xiang.service.module.jntyzx.zlb.service.ZlbTokenInfoService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +@Component +@Slf4j +public class ZlbTokenRefreshTask extends BaseScheduleTaskTemplate { + + private final ZlbTokenInfoService zlbTokenInfoService; + private final JntyzxDingTalkFactory jntyzxDingTalkFactory; + + public ZlbTokenRefreshTask(IScheduleOpeningConfigService scheduleOpeningConfigService, + IScheduleRunLogService scheduleRunLogService, + ZlbTokenInfoService zlbTokenInfoService, + JntyzxDingTalkFactory jntyzxDingTalkFactory) { + super(scheduleOpeningConfigService, scheduleRunLogService); + this.zlbTokenInfoService = zlbTokenInfoService; + this.jntyzxDingTalkFactory = jntyzxDingTalkFactory; + } + + @Override + protected String getTaskName() { + return ScheduleEnums.ZLB_TOKEN_CHECK_TASK.getTaskName(); + } + + @Override + protected Integer getModule() { + return ScheduleEnums.ZLB_TOKEN_CHECK_TASK.getModeleCode(); + } + + @Override + protected String getModuleName() { + return ScheduleEnums.ZLB_TOKEN_CHECK_TASK.getModule(); + } + + @Override + protected TaskResult doExecute(Object validatedParams) { + + TaskResult taskResult = new TaskResult(); + taskResult.setSuccess(true); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(ZlbTokenInfo::getIsDel, 0); + List list = zlbTokenInfoService.list(wrapper); + StringBuilder sb = new StringBuilder(); + for (ZlbTokenInfo zlbTokenInfo : list) { + String name = zlbTokenInfo.getName(); + Date updatedDate = zlbTokenInfo.getUpdatedDate(); + //判断update时间是不是当前时间相差多少小时 + if (new Date().getTime() -updatedDate.getTime() > 1000 * 60 * 60 * 30) { + //超过30小时,则重新获取token + sb.append(name).append(" token已超过30小时请及时更新×××××").append("\n"); + }else{ + sb.append(name).append(" token可以正常使用无需更新√√√√√").append("\n"); + } + } + jntyzxDingTalkFactory.sendMsg(sb.toString()); + if (StringUtils.isNotBlank(sb)) { + taskResult.setSummary(sb.toString()); + taskResult.setSuccess(false); + } + return taskResult; + } +} diff --git a/src/main/java/com/xiang/service/module/jntyzx/zlb/service/ZlbServiceImpl.java b/src/main/java/com/xiang/service/module/jntyzx/zlb/service/ZlbServiceImpl.java index 32fb669..787bd3c 100644 --- a/src/main/java/com/xiang/service/module/jntyzx/zlb/service/ZlbServiceImpl.java +++ b/src/main/java/com/xiang/service/module/jntyzx/zlb/service/ZlbServiceImpl.java @@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.xiang.common.factory.JntyzxDingTalkFactory; import com.xiang.common.pojo.jntyzx.zlb.*; +import com.xiang.common.service.ICodeService; import com.xiang.common.utils.AESECBUtils; import com.xiang.common.utils.DateUtils; import com.xiang.common.utils.OkHttpUtil; @@ -42,6 +43,8 @@ public class ZlbServiceImpl implements ZlbService { private ZlbUserInfoService zlbUserInfoService; @Autowired private RedisTemplate redisTemplate; + @Autowired + private ICodeService codeService; @Override @@ -62,7 +65,7 @@ public class ZlbServiceImpl implements ZlbService { jntyzxDingTalkFactory.sendMsg(type + "没有查到" + ymdDate + "的场地,开始补齐"); OkHttpUtil client = OkHttpUtil.getInstance(); LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(ZlbTokenInfo::getName, "Xiang"); + wrapper.eq(ZlbTokenInfo::getName, "xiang"); ZlbTokenInfo zlbTokenInfo = zlbTokenInfoService.getOne(wrapper); List zlbSiteInfoList = new ArrayList<>(); String tokenId = zlbTokenInfo.getTokenId(); @@ -358,8 +361,13 @@ public class ZlbServiceImpl implements ZlbService { public String buildNewOrder(String siteOrderDetailsStr, OkHttpUtil client) throws IOException { //获取图片验证码 String s = client.postJson(ZlbUrlConstants.captchaUrl, null, "{}"); + JSONObject jsonObject = JSON.parseObject(s); + String templateImage = JSON.toJSONString(jsonObject.get("templateImage")); + String templeCode = codeService.templateCodeResolve(templateImage); + String captcha = JSON.toJSONString(jsonObject.get("captcha")); + String backgroundImage = JSON.toJSONString(JSON.parseObject(captcha).get("backgroundImage")); + String track = codeService.codeResolve(backgroundImage, templeCode); //获取验证码轨迹 - String track = HttpRequest.post(ZlbUrlConstants.getCaptchaUrl).body(s).execute().body(); ZlbOrderInfo zlbOrderInfo = JSONObject.parseObject(track, ZlbOrderInfo.class); zlbOrderInfo.setSiteOrderDetailsStr(siteOrderDetailsStr); String jsonString = JSON.toJSONString(zlbOrderInfo);