diff --git a/pom.xml b/pom.xml
index af9e3d0..e0ef867 100644
--- a/pom.xml
+++ b/pom.xml
@@ -104,6 +104,11 @@
mapstruct
1.5.5.Final
+
+ cn.hutool
+ hutool-all
+ 5.8.9
+
@@ -111,6 +116,11 @@
httpclient
4.5.13
+
+ com.squareup.okhttp3
+ okhttp
+ 4.12.0
+
com.google.guava
@@ -129,6 +139,11 @@
+
+ com.alibaba
+ fastjson
+ 1.2.83
+
com.alibaba.fastjson2
fastjson2
@@ -145,6 +160,37 @@
alibaba-dingtalk-service-sdk
2.0.0
+
+
+
+ com.aliyun
+ alidns20150109
+ 3.4.7
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ 2.3.0.RELEASE
+
+ exec
+
+ com.xiang.Application
+ ZIP
+
+
+
+
+ repackage
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/xiang/Application.java b/src/main/java/com/xiang/Application.java
index 92972dd..be158b5 100644
--- a/src/main/java/com/xiang/Application.java
+++ b/src/main/java/com/xiang/Application.java
@@ -4,8 +4,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
+@EnableScheduling
public class Application {
private static final Logger log = LoggerFactory.getLogger(Application.class);
diff --git a/src/main/java/com/xiang/ApplicationInit.java b/src/main/java/com/xiang/ApplicationInit.java
new file mode 100644
index 0000000..34c512e
--- /dev/null
+++ b/src/main/java/com/xiang/ApplicationInit.java
@@ -0,0 +1,77 @@
+package com.xiang;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.xiang.common.enums.RedisKeyConstant;
+import com.xiang.common.enums.ScheduleEnums;
+import com.xiang.common.pojo.schedule.ScheduleOpeningConfigDO;
+import com.xiang.common.service.IScheduleOpeningConfigService;
+import com.xiang.common.utils.RedisService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-05-08 14:32
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class ApplicationInit implements ApplicationRunner {
+
+ private final IScheduleOpeningConfigService scheduleOpeningConfigService;
+ private final RedisService redisService;
+
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+
+ log.info("开始加载任务配置!");
+ loadScheduleTask();
+ log.info("任务配置加载完成!");
+
+ log.info("redis key 加载开始!");
+ loadRedisKey();
+ log.info("redis key 加载结束!");
+ }
+
+ private void loadScheduleTask() {
+ List allSchedules = scheduleOpeningConfigService.getAll();
+ Map map = Maps.newHashMap();
+ if (CollectionUtils.isNotEmpty(allSchedules)) {
+ map.putAll(allSchedules.stream().collect(Collectors.toMap(ScheduleOpeningConfigDO::getBeanName, Function.identity(), (a, b) -> a)));
+ }
+ ScheduleEnums[] enums = ScheduleEnums.values();
+ if (ArrayUtils.isEmpty(enums)) {
+ log.info("暂无需要配置的");
+ return;
+ }
+ List list = Lists.newArrayList();
+ for (ScheduleEnums scheduleEnum : enums) {
+ if (map.containsKey(scheduleEnum.getTaskName())) {
+ continue;
+ }
+ ScheduleOpeningConfigDO scheduleOpeningConfigDO = new ScheduleOpeningConfigDO();
+ scheduleOpeningConfigDO.setModule(scheduleEnum.getModuleCode());
+ scheduleOpeningConfigDO.setBeanName(scheduleEnum.getTaskName());
+ scheduleOpeningConfigDO.setStatus(1);
+ list.add(scheduleOpeningConfigDO);
+ }
+ if (CollectionUtils.isNotEmpty(list)) {
+ scheduleOpeningConfigService.saveBatch(list);
+ }
+ }
+
+ private void loadRedisKey() {
+ redisService.set(RedisKeyConstant.JNTYZX_SUBSCRIBE_TIME_KEY, "18:00");
+ }
+}
diff --git a/src/main/java/com/xiang/common/config/AliyunDnsPropertyConfig.java b/src/main/java/com/xiang/common/config/AliyunDnsPropertyConfig.java
new file mode 100644
index 0000000..e092887
--- /dev/null
+++ b/src/main/java/com/xiang/common/config/AliyunDnsPropertyConfig.java
@@ -0,0 +1,17 @@
+package com.xiang.common.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@ConfigurationProperties(prefix = "aliyun.dns")
+@Data
+public class AliyunDnsPropertyConfig {
+
+ private List RR;
+
+ private String rootDomain;
+}
diff --git a/src/main/java/com/xiang/common/config/RedisConfig.java b/src/main/java/com/xiang/common/config/RedisConfig.java
index 60f5a5a..2d007f6 100644
--- a/src/main/java/com/xiang/common/config/RedisConfig.java
+++ b/src/main/java/com/xiang/common/config/RedisConfig.java
@@ -3,17 +3,21 @@ package com.xiang.common.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.xiang.common.utils.RedisService;
-import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.connection.RedisPassword;
+import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
+import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
+import java.time.Duration;
+
@Configuration
public class RedisConfig {
@Bean
@@ -37,7 +41,6 @@ public class RedisConfig {
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
-
template.afterPropertiesSet();
return template;
}
@@ -46,4 +49,18 @@ public class RedisConfig {
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
return new StringRedisTemplate(factory);
}
+
+ @Bean
+ public RedisConnectionFactory redisConnectionFactory(RedisProperties props) {
+ RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
+ config.setHostName(props.getHost());
+ config.setPort(Integer.parseInt(props.getPort()));
+ config.setPassword(RedisPassword.of(props.getPassword()));
+ config.setDatabase(props.getDatabase());
+
+ LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
+ .commandTimeout(Duration.ofSeconds(3))
+ .build();
+ return new LettuceConnectionFactory(config, clientConfig);
+ }
}
diff --git a/src/main/java/com/xiang/common/config/RedisProperties.java b/src/main/java/com/xiang/common/config/RedisProperties.java
index 294b887..05f1dc8 100644
--- a/src/main/java/com/xiang/common/config/RedisProperties.java
+++ b/src/main/java/com/xiang/common/config/RedisProperties.java
@@ -14,7 +14,7 @@ public class RedisProperties {
private String host;
private String port;
private String password;
- private Integer database = 0;
+ private Integer database;
public String getAddress() {
return "redis://" + host + ":" + port;
diff --git a/src/main/java/com/xiang/common/enums/DateFormatEnum.java b/src/main/java/com/xiang/common/enums/DateFormatEnum.java
new file mode 100644
index 0000000..d157410
--- /dev/null
+++ b/src/main/java/com/xiang/common/enums/DateFormatEnum.java
@@ -0,0 +1,38 @@
+package com.xiang.common.enums;
+
+/**
+ * @author clover
+ * @Date 2020/9/15 20:11
+ */
+public enum DateFormatEnum {
+ COMMON("ECS_DISK", "yyyy-MM-dd'T'HH:mm:ss'Z'"),
+ COMMON1("ENUM_FORMAT", "yyyy-MM-dd HH:mm:ss"),
+ ENUM_FORMAT_OTS("ENUM_FORMAT_OTS", "yyyy-MM-ddHH:mm:ss"),
+ ASCM_ONE_FORMAT("ASCM_ONE_FORMAT", "yyyy-MM-dd'T'HH:mm'Z'"),
+ ASCM_TWO_FORMAT("ASCM_TWO_FORMAT", "yyyy-MM-dd'T'HH:mm:ss'Z'"),
+ ASCM_THREE_FORMAT("ASCM_THREE_FORMAT", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"),
+ ASCM_FOUR_FORMAT("ASCM_FOUR_FORMAT", "yyyy-MM-dd'T'HH:mm:ss+08:00"),
+ ASCM_FIVE_FORMAT("ASCM_FIVE_FORMAT", "yyyy-MM-dd'T'HH:mm:ss"),
+ IRS_FORMAT_YMD("IRS_FORMAT_YMD", "yyyyMMdd"),
+ IRS_FORMAT_YM("IRS_FORMAT_YM", "yyyyMM"),
+ ENUM_FORMAT_YMD("ENUM_FORMAT_YMD", "yyyy-MM-dd"),
+ ENUM_FORMAT_YMD000("ENUM_FORMAT_YMD", "yyyy-MM-dd 00:00:00"),
+ ENUM_FORMAT_YMD_CSB("ENUM_FORMAT_YMD_CSB", "yyyy-MM-dd/00");
+
+ private String key;
+ private String value;
+
+ public String getKey() {
+ return key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ DateFormatEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+}
diff --git a/src/main/java/com/xiang/common/enums/DingTalkBizTypeEnum.java b/src/main/java/com/xiang/common/enums/DingTalkBizTypeEnum.java
new file mode 100644
index 0000000..f197b91
--- /dev/null
+++ b/src/main/java/com/xiang/common/enums/DingTalkBizTypeEnum.java
@@ -0,0 +1,20 @@
+package com.xiang.common.enums;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-01-04 16:13
+ */
+@Getter
+@RequiredArgsConstructor
+public enum DingTalkBizTypeEnum implements BaseDingTalkBizType {
+
+ JT("venue", "江南体育中心"),
+ XB("xb", "股票基金变化通知"),
+ SCRIPT("script", "脚本运行通知群")
+ ;
+ private final String bizName;
+ private final String desc;
+}
diff --git a/src/main/java/com/xiang/common/enums/JntyzxUrlConstant.java b/src/main/java/com/xiang/common/enums/JntyzxUrlConstant.java
new file mode 100644
index 0000000..1fd1023
--- /dev/null
+++ b/src/main/java/com/xiang/common/enums/JntyzxUrlConstant.java
@@ -0,0 +1,47 @@
+package com.xiang.common.enums;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-15 13:46
+ */
+public class JntyzxUrlConstant {
+
+ /**
+ * 江南体育中心基础URL
+ */
+ private final static String GNTYZX_BASE_URL = "https://jntyzx.cn:8443";
+
+ /**
+ * 查询当天的场地信息
+ */
+ public final static String QUERY_TODAY_SUBSCRIBE_URL = GNTYZX_BASE_URL + "/GYM-JN/multi/Subscribe/getSubscribeByToday";
+ /**
+ * 查询明天场地信息
+ */
+ public final static String QUERY_TOMORROW_SUBSCRIBE_URL = GNTYZX_BASE_URL + "/GYM-JN/multi/Subscribe/getSubscribeByTomorrow";
+
+ /**
+ * 订阅场地
+ */
+ public final static String ADD_SUBSCRIBE = GNTYZX_BASE_URL + "/GYM-JN/multi/Subscribe/addSubscribe";
+
+ /**
+ * 订单信息
+ */
+ public final static String ORDER_INFO = GNTYZX_BASE_URL + "/GYM-JN/multi/busiOrder/queryOrderInfo";
+
+ /**
+ * 心跳监测接口
+ */
+ public final static String HEALTH_DECLARATION = GNTYZX_BASE_URL + "/GYM-JN//busi/healthDeclaration/addUserPrivacy";
+
+ /**
+ * 校验会员卡状态
+ */
+ public final static String CHECK_NUM = GNTYZX_BASE_URL + "/GYM-JN/multi/Subscribe/checkDefaultsNum";
+
+ /**
+ * 根据openId查询会员卡信息
+ */
+ public final static String QUERY_BY_OPEN_ID = GNTYZX_BASE_URL + "/GYM-JN/multi/xfConsumer/queryByOpenId";
+}
diff --git a/src/main/java/com/xiang/common/enums/RedisKeyConstant.java b/src/main/java/com/xiang/common/enums/RedisKeyConstant.java
new file mode 100644
index 0000000..1e2a78a
--- /dev/null
+++ b/src/main/java/com/xiang/common/enums/RedisKeyConstant.java
@@ -0,0 +1,38 @@
+package com.xiang.common.enums;
+
+
+import com.xiang.common.utils.DateUtils;
+
+import java.time.LocalDate;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-16 10:43
+ */
+public class RedisKeyConstant {
+
+ public static final String JNTYZX_ORDER_CREATE_KEY = "jntyzx:order:create:orderId:";
+
+ public static final String JNTUZX_ORDER_PEEK_KEY = "jntyzx:order:peek:user:";
+
+ public static final String JNTYZX_VENUE_MSG_SEND_KEY = "jntyzx:order:venue:msg:send";
+
+ private static final String JNTYZX_VENUE_SUBSCRIBE_KEY = "jntyzx:venue:subscribe:";
+
+ private static final String JNTYZX_ORDER_CLOSE_CARD_KEY = "jntyzx:order:close:card:";
+
+ public static String getCloseCardKey(String username) {
+ return JNTYZX_ORDER_CLOSE_CARD_KEY + username + ":" +getDate();
+ }
+
+ public static String getVenueSubscribeKey(String placeName) {
+ return JNTYZX_VENUE_SUBSCRIBE_KEY + placeName + ":" + getDate();
+ }
+
+ public static final String JNTYZX_SUBSCRIBE_TIME_KEY = "jntyzx:subscribe:time";
+
+ public static String getDate() {
+ LocalDate now = LocalDate.now();
+ return ":" + DateUtils.getDateFromDate(now);
+ }
+}
diff --git a/src/main/java/com/xiang/common/enums/ScheduleEnums.java b/src/main/java/com/xiang/common/enums/ScheduleEnums.java
new file mode 100644
index 0000000..bbe9742
--- /dev/null
+++ b/src/main/java/com/xiang/common/enums/ScheduleEnums.java
@@ -0,0 +1,49 @@
+package com.xiang.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum ScheduleEnums {
+
+ /**
+ * 0:glados 1:芬玩岛 2:江体小程序 3:江体zlb 4:DDNS
+ */
+
+ /**
+ * Aliyun DDNS任务
+ */
+ DOMAIN_DYNAMIC_ANALYSIS_TASK(4, "domain", "domainDynamicAnalysisTask"),
+
+ /**
+ * Glados任务
+ */
+ GLADOS_CHECK_IN_TASK(0, "glados", "gladosCheckInTask"),
+
+ /**
+ * 江体 ZLB任务
+ */
+ 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"),
+ ZLB_USER_CONFIG_TASK(3, "zlb", "zlbUserConfigTask"),
+
+
+ JNTYZX_TOKEN_REFRESH_TASK(4, "jt-miniApp", "jntyzxTokenRefreshTask"),
+ JNTYZX_VENUE_INFO_PULL_TASK(4, "jt-miniApp", "jntyzxVenuePullTask"),
+ JNTYZX_ORDER_SUBSCRIBE_TASK(4, "jt-miniApp", "jntyzxOrderSubscribeTask"),
+ JNTYZX_VENUE_TODAY_SUBSCRIBE_TASK(4, "jt-miniApp", "jntyzxVenueTodaySubscribeTask"),
+ JNTYZX_VENUE_TOMORROW_PULL_TASK(4, "jt-miniApp", "jntyzxVenueTodayPullTask"),
+ JNTYZX_USER_INFO_CONFIG(4, "jt-miniApp", "jntyzxUserInfoConfigTask"),
+ JNTYZX_VENUE_INFO_TODAY_RESULT_TASK(4, "jt-miniApp", "jtVenueInfoTodayResultTask"),
+ JNTYZX_VENUE_INFO_TOMORROW_RESULT_TASK(4, "jt-miniApp", "jtVenueInfoTomorrowResultTask"),
+
+ ;
+
+ private final Integer moduleCode;
+ private final String module;
+ private final String taskName;
+}
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..99c9088
--- /dev/null
+++ b/src/main/java/com/xiang/common/enums/YcCodeTypeEnum.java
@@ -0,0 +1,18 @@
+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"),
+ YC_310700(310700, "适合Zlb使用的word click")
+
+ ;
+ private final Integer type;
+ private final String desc;
+
+}
diff --git a/src/main/java/com/xiang/common/factory/JntyzxDingTalkFactory.java b/src/main/java/com/xiang/common/factory/JntyzxDingTalkFactory.java
new file mode 100644
index 0000000..e67c3ac
--- /dev/null
+++ b/src/main/java/com/xiang/common/factory/JntyzxDingTalkFactory.java
@@ -0,0 +1,19 @@
+package com.xiang.common.factory;
+
+import com.xiang.common.config.DingTalkRobotProperties;
+import com.xiang.common.enums.DingTalkBizTypeEnum;
+import com.xiang.common.utils.dingTalk.AbstractDingTalkFactory;
+import com.xiang.common.utils.dingTalk.DingTalkSender;
+import org.springframework.stereotype.Service;
+
+@Service
+public class JntyzxDingTalkFactory extends AbstractDingTalkFactory {
+ public JntyzxDingTalkFactory(DingTalkRobotProperties dingTalkRobotProperties, DingTalkSender dingTalkSender) {
+ super(dingTalkRobotProperties, dingTalkSender);
+ }
+
+ @Override
+ public void sendMsg(String msg) {
+ getClient(DingTalkBizTypeEnum.JT).sendDingTalkMsg(msg);
+ }
+}
diff --git a/src/main/java/com/xiang/common/factory/ScriptDingTalkFactory.java b/src/main/java/com/xiang/common/factory/ScriptDingTalkFactory.java
new file mode 100644
index 0000000..d97e7a8
--- /dev/null
+++ b/src/main/java/com/xiang/common/factory/ScriptDingTalkFactory.java
@@ -0,0 +1,19 @@
+package com.xiang.common.factory;
+
+import com.xiang.common.config.DingTalkRobotProperties;
+import com.xiang.common.enums.DingTalkBizTypeEnum;
+import com.xiang.common.utils.dingTalk.AbstractDingTalkFactory;
+import com.xiang.common.utils.dingTalk.DingTalkSender;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ScriptDingTalkFactory extends AbstractDingTalkFactory {
+ public ScriptDingTalkFactory(DingTalkRobotProperties dingTalkRobotProperties, DingTalkSender dingTalkSender) {
+ super(dingTalkRobotProperties, dingTalkSender);
+ }
+
+ @Override
+ public void sendMsg(String msg) {
+ getClient(DingTalkBizTypeEnum.SCRIPT).sendDingTalkMsg(msg);
+ }
+}
diff --git a/src/main/java/com/xiang/common/factory/schedule/BaseScheduleTaskTemplate.java b/src/main/java/com/xiang/common/factory/schedule/BaseScheduleTaskTemplate.java
new file mode 100644
index 0000000..c2277af
--- /dev/null
+++ b/src/main/java/com/xiang/common/factory/schedule/BaseScheduleTaskTemplate.java
@@ -0,0 +1,171 @@
+package com.xiang.common.factory.schedule;
+
+import com.xiang.common.pojo.schedule.ScheduleOpeningConfigDO;
+import com.xiang.common.pojo.schedule.ScheduleRunLogDO;
+import com.xiang.common.pojo.schedule.TaskResult;
+import com.xiang.common.pojo.schedule.ValidationResult;
+import com.xiang.common.service.IScheduleOpeningConfigService;
+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;
+
+public abstract class BaseScheduleTaskTemplate {
+
+ protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+ private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+ private final IScheduleOpeningConfigService scheduleOpeningConfigService;
+ private final IScheduleRunLogService scheduleRunLogService;
+
+ protected BaseScheduleTaskTemplate(IScheduleOpeningConfigService scheduleOpeningConfigService, IScheduleRunLogService scheduleRunLogService) {
+ this.scheduleOpeningConfigService = scheduleOpeningConfigService;
+ this.scheduleRunLogService = scheduleRunLogService;
+ }
+
+
+ /**
+ * 模板方法 - 定义任务执行的标准流程
+ * 子类不应覆写此方法
+ */
+ public final void run() {
+ String taskName = getTaskName();
+ Integer module = getModule();
+ LocalDateTime startTime = LocalDateTime.now();
+ logger.info("【{}】任务开始执行,开始时间:{}", taskName, startTime.format(formatter));
+
+ try {
+ // 1. 参数校验
+ logger.info("【{}】开始参数校验...", taskName);
+ ValidationResult validate = validate(module, taskName);
+
+ if (!validate.isValid()) {
+ logger.error("【{}】参数校验失败:{}", taskName, validate.getMessage());
+ onValidationFailure(validate);
+ return;
+ }
+ logger.info("【{}】参数校验通过", taskName);
+
+ // 2. 执行业务逻辑
+ logger.info("【{}】开始执行业务逻辑...", taskName);
+ TaskResult result = doExecute(validate.getValidatedParams());
+
+ // 3. 记录成功结果
+ recordSuccess(result, startTime);
+ } catch (Exception e) {
+ // 4. 记录失败结果
+ logger.error("【{}】任务执行异常", taskName, e);
+ recordFailure(e, startTime);
+ }
+
+ LocalDateTime endTime = LocalDateTime.now();
+ logger.info("【{}】任务结束,结束时间:{}", taskName, endTime.format(formatter));
+ }
+
+ /**
+ * 获取任务名称(子类必须实现)
+ */
+ protected abstract String getTaskName();
+
+ /**
+ * 获取模块名称(子类必须实现)
+ * @return
+ */
+ protected abstract Integer getModule();
+ /**
+ * 获取模块名称(子类必须实现)
+ * @return
+ */
+ protected abstract String getModuleName();
+
+ /**
+ * 任务校验(子类必须实现)
+ * @return 校验结果,包含是否通过、错误信息、校验通过的参数对象
+ */
+ private ValidationResult validate(Integer moduleCode, String taskName) {
+ ValidationResult validationResult = new ValidationResult();
+ boolean flag = checkTaskOpening(moduleCode, taskName);
+ validationResult.setValidatedParams(null);
+ validationResult.setValid(flag);
+ validationResult.setMessage(flag ? "" : "任务未开启");
+ return validationResult;
+ }
+
+ /**
+ * 校验任务是否开启
+ * @param moduleCode 模块id
+ * @param taskName 任务名称
+ * @return
+ */
+ private boolean checkTaskOpening(Integer moduleCode, String taskName) {
+ ScheduleOpeningConfigDO configsByModule = scheduleOpeningConfigService.getConfigByModule(moduleCode, taskName);
+ if (Objects.isNull(configsByModule)) {
+ return false;
+ }
+ return Objects.equals(configsByModule.getStatus(), 1);
+ }
+
+ /**
+ * 具体的业务逻辑执行(子类必须实现)
+ * @param validatedParams 校验通过的参数
+ * @return 任务执行结果
+ */
+ protected abstract TaskResult doExecute(Object validatedParams) throws Exception;
+
+ /**
+ * 记录成功结果 - 子类可选择性覆写
+ */
+ protected void recordSuccess(TaskResult result, LocalDateTime startTime) {
+ LocalDateTime endTime = LocalDateTime.now();
+ long duration = java.time.Duration.between(startTime, endTime).toMillis();
+
+ logger.info("【{}】任务执行成功,耗时:{}ms,结果概要:{}",
+ getTaskName(), duration, result.getSummary());
+
+ // 可在此扩展:写入数据库、发送通知等
+ // 例如:saveTaskLog(getTaskName(), "SUCCESS", duration, result.getDetail());
+ ScheduleRunLogDO scheduleRunLogDO = new ScheduleRunLogDO();
+ scheduleRunLogDO.setModuleName(getModuleName());
+ scheduleRunLogDO.setTaskName(getTaskName());
+ scheduleRunLogDO.setParams(result.getParams());
+ scheduleRunLogDO.setResponse(result.getSummary());
+ scheduleRunLogDO.setCreateTime(endTime);
+ scheduleRunLogDO.setRequestFlag(result.isSuccess() ? 1 : 0);
+ scheduleRunLogService.save(scheduleRunLogDO);
+ }
+
+ /**
+ * 记录失败结果 - 子类可选择性覆写
+ */
+ protected void recordFailure(Exception e, LocalDateTime startTime) {
+ LocalDateTime endTime = LocalDateTime.now();
+ long duration = java.time.Duration.between(startTime, endTime).toMillis();
+
+ logger.error("【{}】任务执行失败,耗时:{}ms,错误:{}",
+ getTaskName(), duration, e.getMessage());
+
+ // 可在此扩展:写入数据库、发送告警等
+ // 例如:saveTaskLog(getTaskName(), "FAILURE", duration, e.getMessage());
+
+ ScheduleRunLogDO scheduleRunLogDO = new ScheduleRunLogDO();
+ scheduleRunLogDO.setModuleName(getModuleName());
+ scheduleRunLogDO.setTaskName(getTaskName());
+// scheduleRunLogDO.setParams();
+ scheduleRunLogDO.setResponse(e.getMessage());
+ scheduleRunLogDO.setCreateTime(endTime);
+ scheduleRunLogDO.setRequestFlag(0);
+ scheduleRunLogService.save(scheduleRunLogDO);
+ }
+
+ /**
+ * 参数校验失败时的处理 - 子类可选择性覆写
+ */
+ protected void onValidationFailure(ValidationResult result) {
+ // 默认实现:仅记录日志
+ logger.warn("【{}】参数校验失败,跳过任务执行", getTaskName());
+ // 可在此扩展:发送通知、写入失败日志等
+ }
+}
diff --git a/src/main/java/com/xiang/common/handler/CallbackHandler.java b/src/main/java/com/xiang/common/handler/CallbackHandler.java
new file mode 100644
index 0000000..ec4b76d
--- /dev/null
+++ b/src/main/java/com/xiang/common/handler/CallbackHandler.java
@@ -0,0 +1,6 @@
+package com.xiang.common.handler;
+
+public interface CallbackHandler {
+ void onResponse(String response);
+ void onFailure(Throwable t);
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IOrderCreateInfoManage.java b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IOrderCreateInfoManage.java
new file mode 100644
index 0000000..99315a7
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IOrderCreateInfoManage.java
@@ -0,0 +1,17 @@
+package com.xiang.common.manage.jntyzx.miniapp;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.OrderInfoDO;
+
+import java.util.List;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-16 10:59
+ */
+public interface IOrderCreateInfoManage extends IService {
+
+
+ List queryNoPayOrder();
+
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IUserInfoManage.java b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IUserInfoManage.java
new file mode 100644
index 0000000..27ce953
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IUserInfoManage.java
@@ -0,0 +1,12 @@
+package com.xiang.common.manage.jntyzx.miniapp;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserInfoDO;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-05-09 10:17
+ */
+public interface IUserInfoManage extends IService {
+ boolean delAll();
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IUserRestrictionManage.java b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IUserRestrictionManage.java
new file mode 100644
index 0000000..6f7f53d
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IUserRestrictionManage.java
@@ -0,0 +1,13 @@
+package com.xiang.common.manage.jntyzx.miniapp;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserRestrictionInfo;
+
+import java.util.List;
+
+public interface IUserRestrictionManage extends IService {
+
+ UserRestrictionInfo queryByUserId(Long userId);
+
+ List queryByIdList(List idList);
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IUserTokenInfoManage.java b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IUserTokenInfoManage.java
new file mode 100644
index 0000000..6f702ce
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IUserTokenInfoManage.java
@@ -0,0 +1,20 @@
+package com.xiang.common.manage.jntyzx.miniapp;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserTokenInfoDO;
+import com.xiang.common.pojo.jntyzx.miniapp.req.UserQueryReq;
+
+import java.util.List;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-16 09:19
+ */
+public interface IUserTokenInfoManage extends IService {
+ List listUser();
+ UserTokenInfoDO getByName(String name);
+
+ List listCanOrder();
+
+ List queryByList(UserQueryReq req);
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IVenueInfoManage.java b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IVenueInfoManage.java
new file mode 100644
index 0000000..7e3a517
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/IVenueInfoManage.java
@@ -0,0 +1,18 @@
+package com.xiang.common.manage.jntyzx.miniapp;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.VenueInfoDO;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-15 15:50
+ */
+public interface IVenueInfoManage extends IService {
+
+ List queryByDate(LocalDate date);
+
+ List queryByType(LocalDate date, Integer type);
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/miniapp/OrderCreateInfoManageImpl.java b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/OrderCreateInfoManageImpl.java
new file mode 100644
index 0000000..a3aee2c
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/OrderCreateInfoManageImpl.java
@@ -0,0 +1,26 @@
+package com.xiang.common.manage.jntyzx.miniapp;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.OrderInfoDO;
+import com.xiang.common.mapper.JntyzxOrderCreateInfoMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-16 10:59
+ */
+@Service
+public class OrderCreateInfoManageImpl extends ServiceImpl implements IOrderCreateInfoManage {
+
+
+ @Override
+ public List queryNoPayOrder() {
+ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery();
+ lambdaQueryWrapper.eq(OrderInfoDO::getOrderStatus, 0);
+ return baseMapper.selectList(lambdaQueryWrapper);
+ }
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/miniapp/UserInfoManageImpl.java b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/UserInfoManageImpl.java
new file mode 100644
index 0000000..db94e14
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/UserInfoManageImpl.java
@@ -0,0 +1,18 @@
+package com.xiang.common.manage.jntyzx.miniapp;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiang.common.mapper.JntyzxUserInfoMapper;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserInfoDO;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-05-09 10:17
+ */
+@Service
+public class UserInfoManageImpl extends ServiceImpl implements IUserInfoManage {
+ @Override
+ public boolean delAll() {
+ return baseMapper.delAll() > 0;
+ }
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/miniapp/UserRestrictionManageImpl.java b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/UserRestrictionManageImpl.java
new file mode 100644
index 0000000..a5a0db7
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/UserRestrictionManageImpl.java
@@ -0,0 +1,27 @@
+package com.xiang.common.manage.jntyzx.miniapp;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserRestrictionInfo;
+import com.xiang.common.mapper.JntyzxUserRestrictionInfoMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class UserRestrictionManageImpl extends ServiceImpl implements IUserRestrictionManage {
+ @Override
+ public UserRestrictionInfo queryByUserId(Long userId) {
+ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery();
+ lambdaQueryWrapper.eq(UserRestrictionInfo::getUserId, userId);
+ return baseMapper.selectOne(lambdaQueryWrapper);
+ }
+
+ @Override
+ public List queryByIdList(List idList) {
+ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery();
+ lambdaQueryWrapper.in(UserRestrictionInfo::getUserId, idList);
+ return baseMapper.selectList(lambdaQueryWrapper);
+ }
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/miniapp/UserTokenInfoManageImpl.java b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/UserTokenInfoManageImpl.java
new file mode 100644
index 0000000..d752e95
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/UserTokenInfoManageImpl.java
@@ -0,0 +1,69 @@
+package com.xiang.common.manage.jntyzx.miniapp;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserTokenInfoDO;
+import com.xiang.common.pojo.jntyzx.miniapp.req.UserQueryReq;
+import com.xiang.common.mapper.JntyzxUserTokenInfoMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-16 09:19
+ */
+@Service
+public class UserTokenInfoManageImpl extends ServiceImpl implements IUserTokenInfoManage {
+ @Override
+ public List listUser() {
+ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery();
+ lambdaQueryWrapper.eq(UserTokenInfoDO::getStatus, 1);
+ return baseMapper.selectList(lambdaQueryWrapper);
+ }
+
+ @Override
+ public UserTokenInfoDO getByName(String name) {
+ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery();
+ lambdaQueryWrapper.eq(UserTokenInfoDO::getStatus, 1);
+ lambdaQueryWrapper.eq(UserTokenInfoDO::getName, name);
+ lambdaQueryWrapper.last("limit 1");
+ return baseMapper.selectOne(lambdaQueryWrapper);
+ }
+
+ @Override
+ public List listCanOrder() {
+ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery();
+ lambdaQueryWrapper.eq(UserTokenInfoDO::getStatus, 1);
+ lambdaQueryWrapper.eq(UserTokenInfoDO::getIsOrder, 1);
+ lambdaQueryWrapper.eq(UserTokenInfoDO::getIsRestriction, 0);
+ return baseMapper.selectList(lambdaQueryWrapper);
+ }
+
+ @Override
+ public List queryByList(UserQueryReq req) {
+ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery();
+ if (StringUtils.isNotBlank(req.getName())) {
+ lambdaQueryWrapper.like(UserTokenInfoDO::getName, req.getName());
+ }
+ if (StringUtils.isNotBlank(req.getOpenId())) {
+ lambdaQueryWrapper.eq(UserTokenInfoDO::getOpenId, req.getOpenId());
+ }
+ if (StringUtils.isNotBlank(req.getMemberCardNo())) {
+ lambdaQueryWrapper.eq(UserTokenInfoDO::getMemberCardNo, req.getMemberCardNo());
+ }
+ if (Objects.nonNull(req.getStatus())) {
+ lambdaQueryWrapper.eq(UserTokenInfoDO::getStatus, req.getStatus());
+ }
+ if (Objects.nonNull(req.getIsRestriction())) {
+ lambdaQueryWrapper.eq(UserTokenInfoDO::getIsRestriction, req.getIsRestriction());
+ }
+ if (Objects.nonNull(req.getIsOrder())) {
+ lambdaQueryWrapper.eq(UserTokenInfoDO::getIsOrder, req.getIsOrder());
+ }
+ return baseMapper.selectList(lambdaQueryWrapper);
+ }
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/miniapp/VenueInfoManageImpl.java b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/VenueInfoManageImpl.java
new file mode 100644
index 0000000..b949ad5
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/miniapp/VenueInfoManageImpl.java
@@ -0,0 +1,33 @@
+package com.xiang.common.manage.jntyzx.miniapp;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.VenueInfoDO;
+import com.xiang.common.mapper.JntyzxVenueInfoMapper;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-15 15:51
+ */
+@Service
+public class VenueInfoManageImpl extends ServiceImpl implements IVenueInfoManage {
+
+ public List queryByDate(LocalDate date) {
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(VenueInfoDO::getDate, date);
+ return baseMapper.selectList(lqw);
+ }
+
+ @Override
+ public List queryByType(LocalDate date, Integer type) {
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(VenueInfoDO::getDate, date);
+ lqw.eq(VenueInfoDO::getType, type);
+ return baseMapper.selectList(lqw);
+ }
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/zlb/IZlbOrderInfoManage.java b/src/main/java/com/xiang/common/manage/jntyzx/zlb/IZlbOrderInfoManage.java
new file mode 100644
index 0000000..ce20403
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/zlb/IZlbOrderInfoManage.java
@@ -0,0 +1,11 @@
+package com.xiang.common.manage.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbPayOrder;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-05-09 15:11
+ */
+public interface IZlbOrderInfoManage extends IService {
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbOrderInfoManageImpl.java b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbOrderInfoManageImpl.java
new file mode 100644
index 0000000..7e49403
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbOrderInfoManageImpl.java
@@ -0,0 +1,15 @@
+package com.xiang.common.manage.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiang.common.mapper.ZlbOrderInfoMapper;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbPayOrder;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-05-09 15:11
+ */
+@Service
+public class ZlbOrderInfoManageImpl extends ServiceImpl implements IZlbOrderInfoManage {
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbSiteInfoService.java b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbSiteInfoService.java
new file mode 100644
index 0000000..9f10a0b
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbSiteInfoService.java
@@ -0,0 +1,13 @@
+package com.xiang.common.manage.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbSiteInfo;
+
+/**
+* @author a123
+* @description 针对表【zlb_site_info】的数据库操作Service
+* @createDate 2025-06-19 23:32:29
+*/
+public interface ZlbSiteInfoService extends IService {
+
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbSiteInfoServiceImpl.java b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbSiteInfoServiceImpl.java
new file mode 100644
index 0000000..f7d394c
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbSiteInfoServiceImpl.java
@@ -0,0 +1,21 @@
+package com.xiang.common.manage.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiang.common.mapper.ZlbSiteInfoMapper;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbSiteInfo;
+import org.springframework.stereotype.Service;
+
+/**
+* @author a123
+* @description 针对表【zlb_site_info】的数据库操作Service实现
+* @createDate 2025-06-19 23:32:29
+*/
+@Service
+public class ZlbSiteInfoServiceImpl extends ServiceImpl
+ implements ZlbSiteInfoService {
+
+}
+
+
+
+
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbTokenInfoService.java b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbTokenInfoService.java
new file mode 100644
index 0000000..9cd6008
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbTokenInfoService.java
@@ -0,0 +1,18 @@
+package com.xiang.common.manage.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbTokenInfo;
+
+import java.util.List;
+
+/**
+* @author a123
+* @description 针对表【zlb_token_info】的数据库操作Service
+* @createDate 2025-06-20 23:51:24
+*/
+public interface ZlbTokenInfoService extends IService {
+
+ ZlbTokenInfo queryByName(String name);
+
+ List getAllUsers();
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbTokenInfoServiceImpl.java b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbTokenInfoServiceImpl.java
new file mode 100644
index 0000000..5d23605
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbTokenInfoServiceImpl.java
@@ -0,0 +1,38 @@
+package com.xiang.common.manage.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiang.common.mapper.ZlbTokenInfoMapper;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbTokenInfo;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+* @author a123
+* @description 针对表【zlb_token_info】的数据库操作Service实现
+* @createDate 2025-06-20 23:51:24
+*/
+@Service
+public class ZlbTokenInfoServiceImpl extends ServiceImpl
+ implements ZlbTokenInfoService {
+
+ @Override
+ public ZlbTokenInfo queryByName(String name) {
+ LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
+ wrapper.eq(ZlbTokenInfo::getName, name);
+ return this.getOne(wrapper);
+ }
+
+ @Override
+ public List getAllUsers() {
+ LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery();
+ lambdaQueryWrapper.eq(ZlbTokenInfo::getIsDel, 0);
+ return baseMapper.selectList(lambdaQueryWrapper);
+ }
+}
+
+
+
+
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbUserInfoService.java b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbUserInfoService.java
new file mode 100644
index 0000000..557faa6
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbUserInfoService.java
@@ -0,0 +1,20 @@
+package com.xiang.common.manage.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbUserInfo;
+
+import java.time.LocalDate;
+import java.util.List;
+
+public interface ZlbUserInfoService extends IService {
+
+ /**
+ * 查询日期内未预订的用户
+ * @param date
+ * @return
+ */
+ List getNoBookUsers(LocalDate date);
+
+ int delAll();
+
+}
diff --git a/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbUserInfoServiceImpl.java b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbUserInfoServiceImpl.java
new file mode 100644
index 0000000..04fd5e6
--- /dev/null
+++ b/src/main/java/com/xiang/common/manage/jntyzx/zlb/ZlbUserInfoServiceImpl.java
@@ -0,0 +1,28 @@
+package com.xiang.common.manage.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiang.common.mapper.ZlbUserInfoMapper;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbUserInfo;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.List;
+
+@Service
+public class ZlbUserInfoServiceImpl extends ServiceImpl
+ implements ZlbUserInfoService {
+
+ @Override
+ public List getNoBookUsers(LocalDate date) {
+ return List.of();
+ }
+
+ @Override
+ public int delAll() {
+ return baseMapper.deleteAll();
+ }
+}
+
+
+
+
diff --git a/src/main/java/com/xiang/common/mapper/GladosRunLogDao.java b/src/main/java/com/xiang/common/mapper/GladosRunLogDao.java
new file mode 100644
index 0000000..69a7f9a
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/GladosRunLogDao.java
@@ -0,0 +1,11 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.glados.GladosRunLogDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface GladosRunLogDao extends BaseMapper {
+}
diff --git a/src/main/java/com/xiang/common/mapper/GladosUserDao.java b/src/main/java/com/xiang/common/mapper/GladosUserDao.java
new file mode 100644
index 0000000..07881d6
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/GladosUserDao.java
@@ -0,0 +1,17 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.glados.GladosUserDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+
+/**
+ * @Author: xiang
+ * @Date: 2025-05-09 13:49
+ */
+@Mapper
+@Repository
+public interface GladosUserDao extends BaseMapper {
+
+}
diff --git a/src/main/java/com/xiang/common/mapper/JntyzxOrderCreateInfoMapper.java b/src/main/java/com/xiang/common/mapper/JntyzxOrderCreateInfoMapper.java
new file mode 100644
index 0000000..0bfaa6f
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/JntyzxOrderCreateInfoMapper.java
@@ -0,0 +1,15 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.OrderInfoDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-16 10:58
+ */
+@Mapper
+@Repository
+public interface JntyzxOrderCreateInfoMapper extends BaseMapper {
+}
diff --git a/src/main/java/com/xiang/common/mapper/JntyzxUserInfoMapper.java b/src/main/java/com/xiang/common/mapper/JntyzxUserInfoMapper.java
new file mode 100644
index 0000000..cfe1b00
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/JntyzxUserInfoMapper.java
@@ -0,0 +1,20 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserInfoDO;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-05-09 10:16
+ */
+@Mapper
+@Repository
+public interface JntyzxUserInfoMapper extends BaseMapper {
+
+ @Delete("delete from jntyzx_user_info where 1=1")
+ int delAll();
+
+}
diff --git a/src/main/java/com/xiang/common/mapper/JntyzxUserRestrictionInfoMapper.java b/src/main/java/com/xiang/common/mapper/JntyzxUserRestrictionInfoMapper.java
new file mode 100644
index 0000000..bde072c
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/JntyzxUserRestrictionInfoMapper.java
@@ -0,0 +1,11 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserRestrictionInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface JntyzxUserRestrictionInfoMapper extends BaseMapper {
+}
diff --git a/src/main/java/com/xiang/common/mapper/JntyzxUserTokenInfoMapper.java b/src/main/java/com/xiang/common/mapper/JntyzxUserTokenInfoMapper.java
new file mode 100644
index 0000000..447f82e
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/JntyzxUserTokenInfoMapper.java
@@ -0,0 +1,15 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.UserTokenInfoDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-16 09:18
+ */
+@Mapper
+@Repository
+public interface JntyzxUserTokenInfoMapper extends BaseMapper {
+}
diff --git a/src/main/java/com/xiang/common/mapper/JntyzxVenueInfoMapper.java b/src/main/java/com/xiang/common/mapper/JntyzxVenueInfoMapper.java
new file mode 100644
index 0000000..c16fa62
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/JntyzxVenueInfoMapper.java
@@ -0,0 +1,15 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.jntyzx.miniapp.pojo.VenueInfoDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-15 15:48
+ */
+@Mapper
+@Repository
+public interface JntyzxVenueInfoMapper extends BaseMapper {
+}
diff --git a/src/main/java/com/xiang/common/mapper/ScheduleOpeningConfigDao.java b/src/main/java/com/xiang/common/mapper/ScheduleOpeningConfigDao.java
new file mode 100644
index 0000000..a574486
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/ScheduleOpeningConfigDao.java
@@ -0,0 +1,11 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.schedule.ScheduleOpeningConfigDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface ScheduleOpeningConfigDao extends BaseMapper {
+}
diff --git a/src/main/java/com/xiang/common/mapper/ScheduleRunLogDao.java b/src/main/java/com/xiang/common/mapper/ScheduleRunLogDao.java
new file mode 100644
index 0000000..8b0b6e6
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/ScheduleRunLogDao.java
@@ -0,0 +1,11 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.schedule.ScheduleRunLogDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface ScheduleRunLogDao extends BaseMapper {
+}
diff --git a/src/main/java/com/xiang/common/mapper/ZlbJlUserInfoMapper.java b/src/main/java/com/xiang/common/mapper/ZlbJlUserInfoMapper.java
new file mode 100644
index 0000000..e779a99
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/ZlbJlUserInfoMapper.java
@@ -0,0 +1,17 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbJlUserInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+
+@Mapper
+@Repository
+public interface ZlbJlUserInfoMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/src/main/java/com/xiang/common/mapper/ZlbLoginInfoMapper.java b/src/main/java/com/xiang/common/mapper/ZlbLoginInfoMapper.java
new file mode 100644
index 0000000..144dadd
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/ZlbLoginInfoMapper.java
@@ -0,0 +1,17 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbLoginInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+
+@Mapper
+@Repository
+public interface ZlbLoginInfoMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/src/main/java/com/xiang/common/mapper/ZlbOrderInfoMapper.java b/src/main/java/com/xiang/common/mapper/ZlbOrderInfoMapper.java
new file mode 100644
index 0000000..5c2b242
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/ZlbOrderInfoMapper.java
@@ -0,0 +1,16 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbPayOrder;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface ZlbOrderInfoMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/src/main/java/com/xiang/common/mapper/ZlbSiteInfoMapper.java b/src/main/java/com/xiang/common/mapper/ZlbSiteInfoMapper.java
new file mode 100644
index 0000000..1e68cb3
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/ZlbSiteInfoMapper.java
@@ -0,0 +1,16 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbSiteInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface ZlbSiteInfoMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/src/main/java/com/xiang/common/mapper/ZlbTokenInfoMapper.java b/src/main/java/com/xiang/common/mapper/ZlbTokenInfoMapper.java
new file mode 100644
index 0000000..4c185c8
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/ZlbTokenInfoMapper.java
@@ -0,0 +1,16 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbTokenInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface ZlbTokenInfoMapper extends BaseMapper {
+
+}
+
+
+
+
diff --git a/src/main/java/com/xiang/common/mapper/ZlbUserInfoMapper.java b/src/main/java/com/xiang/common/mapper/ZlbUserInfoMapper.java
new file mode 100644
index 0000000..516b0e8
--- /dev/null
+++ b/src/main/java/com/xiang/common/mapper/ZlbUserInfoMapper.java
@@ -0,0 +1,19 @@
+package com.xiang.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xiang.common.pojo.jntyzx.zlb.ZlbUserInfo;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Repository
+@Mapper
+public interface ZlbUserInfoMapper extends BaseMapper {
+
+ @Delete("delete from zlb_user_info where 1=1")
+ int deleteAll();
+}
+
+
+
+
diff --git a/src/main/java/com/xiang/common/pojo/TrackPoint.java b/src/main/java/com/xiang/common/pojo/TrackPoint.java
new file mode 100644
index 0000000..43ba8b2
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/TrackPoint.java
@@ -0,0 +1,29 @@
+package com.xiang.common.pojo;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-05-07 15:57
+ */
+
+import lombok.Data;
+
+/**
+ * 轨迹点类
+ */
+@Data
+public class TrackPoint {
+ public int x, y, t;
+ public String type;
+
+ public TrackPoint(int x, int y, int t, String type) {
+ this.x = x;
+ this.y = y;
+ this.t = t;
+ this.type = type;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("{\"x\":%d,\"y\":%d,\"t\":%d,\"type\":\"%s\"}", x, y, t, type);
+ }
+}
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..2ab8493
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/code/YcCodeRequest.java
@@ -0,0 +1,31 @@
+package com.xiang.common.pojo.code;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class YcCodeRequest {
+ /**
+ * 图片 base64
+ */
+ private String image;
+ /**
+ * token
+ */
+ private String token;
+ /**
+ * 接口类型
+ */
+ private Integer type;
+ private String extra;
+
+ /**
+ * 模板图片 base64
+ */
+ @JSONField(name = "label_image")
+ private String labelImage;
+}
diff --git a/src/main/java/com/xiang/common/pojo/glados/GladosRunLogDO.java b/src/main/java/com/xiang/common/pojo/glados/GladosRunLogDO.java
new file mode 100644
index 0000000..bb4d187
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/glados/GladosRunLogDO.java
@@ -0,0 +1,47 @@
+package com.xiang.common.pojo.glados;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-05-09 13:56
+ */
+@Data
+@Builder
+public class GladosRunLogDO {
+
+ 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/src/main/java/com/xiang/common/pojo/glados/GladosUserDO.java b/src/main/java/com/xiang/common/pojo/glados/GladosUserDO.java
new file mode 100644
index 0000000..9684fbf
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/glados/GladosUserDO.java
@@ -0,0 +1,24 @@
+package com.xiang.common.pojo.glados;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-05-09 13:49
+ */
+@Data
+@TableName("glados_script_user")
+public class GladosUserDO {
+
+ private Integer id;
+
+ private String user;
+
+ private String email;
+
+ private String cookie;
+
+ private Integer status;
+
+}
diff --git a/src/main/java/com/xiang/common/pojo/glados/req/GladosCheckInReq.java b/src/main/java/com/xiang/common/pojo/glados/req/GladosCheckInReq.java
new file mode 100644
index 0000000..0e75bff
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/glados/req/GladosCheckInReq.java
@@ -0,0 +1,16 @@
+package com.xiang.common.pojo.glados.req;
+
+import lombok.Data;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-05-08 15:22
+ */
+@Data
+public class GladosCheckInReq {
+
+ /**
+ * cookie
+ */
+ private String cookie;
+}
diff --git a/src/main/java/com/xiang/common/pojo/glados/resp/CheckInResp.java b/src/main/java/com/xiang/common/pojo/glados/resp/CheckInResp.java
new file mode 100644
index 0000000..18aad27
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/glados/resp/CheckInResp.java
@@ -0,0 +1,20 @@
+package com.xiang.common.pojo.glados.resp;
+
+import lombok.Data;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-01-23 09:21
+ */
+@Data
+public class CheckInResp {
+
+ private Long id;
+ private Long userId;
+ private Long time;
+ private String asset;
+ private String business;
+ private String change;
+ private String balance;
+ private String detail;
+}
diff --git a/src/main/java/com/xiang/common/pojo/glados/resp/GLaDOSResponse.java b/src/main/java/com/xiang/common/pojo/glados/resp/GLaDOSResponse.java
new file mode 100644
index 0000000..9fae3eb
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/glados/resp/GLaDOSResponse.java
@@ -0,0 +1,21 @@
+package com.xiang.common.pojo.glados.resp;
+
+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/src/main/java/com/xiang/common/pojo/glados/resp/GladosPointsHistoryResp.java b/src/main/java/com/xiang/common/pojo/glados/resp/GladosPointsHistoryResp.java
new file mode 100644
index 0000000..0891045
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/glados/resp/GladosPointsHistoryResp.java
@@ -0,0 +1,26 @@
+package com.xiang.common.pojo.glados.resp;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-05-08 15:47
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class GladosPointsHistoryResp {
+
+ private String asset;
+ private String balance;
+ private String business;
+ private String change;
+ private String detail;
+ private Long id;
+ private Long time;
+ @JSONField(name = "user_id")
+ private Long userId;
+}
diff --git a/src/main/java/com/xiang/common/pojo/glados/resp/GladosPointsResp.java b/src/main/java/com/xiang/common/pojo/glados/resp/GladosPointsResp.java
new file mode 100644
index 0000000..d26d03e
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/glados/resp/GladosPointsResp.java
@@ -0,0 +1,30 @@
+package com.xiang.common.pojo.glados.resp;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-05-08 15:46
+ */
+@Data
+public class GladosPointsResp {
+ private Integer code;
+ private List history;
+ private Plans plans;
+ private String points;
+}
+
+@Data
+class Plans {
+
+ private Plan plan100;
+ private Plan plan200;
+ private Plan plan500;
+}
+@Data
+class Plan {
+ private Integer days;
+ private Integer points;
+}
\ No newline at end of file
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/dto/VenueListDTO.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/dto/VenueListDTO.java
new file mode 100644
index 0000000..67352c2
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/dto/VenueListDTO.java
@@ -0,0 +1,34 @@
+package com.xiang.common.pojo.jntyzx.miniapp.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-15 13:55
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class VenueListDTO {
+ /**
+ * 时间
+ */
+ private String date;
+
+ /**
+ * 时间
+ */
+ private String sjName;
+
+ /**
+ * 场地名称
+ */
+ private String placeName;
+
+ /**
+ * 联系人
+ */
+ private String contacts;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/OrderInfoDO.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/OrderInfoDO.java
new file mode 100644
index 0000000..3f2174a
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/OrderInfoDO.java
@@ -0,0 +1,55 @@
+package com.xiang.common.pojo.jntyzx.miniapp.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-16 10:57
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("jntyzx_order_create_info")
+public class OrderInfoDO {
+ private Long id;
+ /**
+ * 订单id
+ */
+ private String orderId;
+
+ /**
+ * 参数
+ */
+ private String params;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 订单创建人
+ */
+ private String username;
+
+ /**
+ * 场地号
+ */
+ private String placeName;
+
+ /**
+ * 所属日期
+ */
+ private LocalDate date;
+
+ /**
+ * 订单状态 (0:待付款,1:已付款)
+ */
+ private Integer orderStatus;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/UserInfoDO.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/UserInfoDO.java
new file mode 100644
index 0000000..0036631
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/UserInfoDO.java
@@ -0,0 +1,53 @@
+package com.xiang.common.pojo.jntyzx.miniapp.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-05-09 09:54
+ */
+@Data
+@TableName("jntyzx_user_info")
+public class UserInfoDO {
+ /**
+ *
+ */
+ @TableId(type = IdType.AUTO)
+ private Integer id;
+
+ private Integer loginInfoId;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 星期几
+ */
+ private String week;
+
+ /**
+ * 分配的任务参数
+ */
+ private String type;
+
+ /**
+ * 场地信息
+ */
+ private String placeName;
+
+ /**
+ * 时间id111
+ */
+ private String siteTimeName;
+
+ /**
+ * 是否开抢0-抢,1-不抢
+ */
+ private Integer isBook;
+
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/UserRestrictionInfo.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/UserRestrictionInfo.java
new file mode 100644
index 0000000..9c558e9
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/UserRestrictionInfo.java
@@ -0,0 +1,29 @@
+package com.xiang.common.pojo.jntyzx.miniapp.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("jntyzx_user_restriction")
+public class UserRestrictionInfo {
+
+ private Long id;
+ /**
+ * 用户id
+ */
+ private Long userId;
+ /**
+ * 封禁截止时间
+ */
+ private LocalDateTime restrictionDeadline;
+ /**
+ * 封禁原因
+ */
+ private String restrictionDesc;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/UserTokenInfoDO.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/UserTokenInfoDO.java
new file mode 100644
index 0000000..d8c6d4c
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/UserTokenInfoDO.java
@@ -0,0 +1,59 @@
+package com.xiang.common.pojo.jntyzx.miniapp.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-16 09:18
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("jntyzx_user_token_info")
+public class UserTokenInfoDO {
+ private Long id;
+ /**
+ * 用户名
+ */
+ private String name;
+
+ /**
+ * token
+ */
+ private String token;
+
+ /**
+ * wx openid
+ */
+ private String openId;
+
+ /**
+ * 状态(0:禁用 1:启用)
+ */
+ private Integer status;
+
+ /**
+ * 是否可以下单 (0:否 1:是)
+ */
+ private Integer isOrder;
+
+ /**
+ * 会员卡号
+ */
+ @TableField("member_card_no")
+ private String memberCardNo;
+
+ /**
+ * 是否封禁 0:否 1:是
+ */
+ @TableField("is_restriction")
+ private Integer isRestriction;
+
+ private LocalDateTime updateTime;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/VenueInfoDO.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/VenueInfoDO.java
new file mode 100644
index 0000000..adc15c0
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/pojo/VenueInfoDO.java
@@ -0,0 +1,72 @@
+package com.xiang.common.pojo.jntyzx.miniapp.pojo;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-15 15:48
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("jntyzx_venue_info")
+public class VenueInfoDO {
+ private Long id;
+ /**
+ * 场地名称
+ */
+ private String placeName;
+
+ /**
+ * 所属日期
+ */
+ private LocalDate date;
+
+ /**
+ * 场地信息三方主键
+ */
+ private Long placeMainId;
+
+ /**
+ * 场地id
+ */
+ private Integer placeId;
+
+ /**
+ *
+ */
+ private Integer scheduleId;
+
+ /**
+ * 时间范围
+ */
+ private String sjName;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createTime;
+
+ /**
+ * 联系人
+ */
+ private String contacts;
+
+ /**
+ * 状态
+ */
+ private Integer type;
+
+ private BigDecimal money;
+ private String className;
+ private String classCode;
+ private String appointments;
+ private String cTypeCode;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/SubscribeRequest.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/SubscribeRequest.java
new file mode 100644
index 0000000..bd3c51a
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/SubscribeRequest.java
@@ -0,0 +1,23 @@
+package com.xiang.common.pojo.jntyzx.miniapp.req;
+
+import com.alibaba.fastjson2.JSONObject;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-15 16:34
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SubscribeRequest {
+ private JSONObject jsonObject;
+ private List subscribeVos;
+ private String bookTime;
+ private Integer paymentMethod;
+ private String svCiphertext;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/SubscribeVo.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/SubscribeVo.java
new file mode 100644
index 0000000..1e7d690
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/SubscribeVo.java
@@ -0,0 +1,60 @@
+package com.xiang.common.pojo.jntyzx.miniapp.req;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-15 16:35
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SubscribeVo {
+ private int id;
+
+ private String ballCourtId;
+
+ private String sjName;
+
+ private String scheduleId;
+
+ private String placeName;
+
+ private int placeId;
+
+ private String 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 int specOneTimes;
+
+ private String ctypeCode;
+
+ private int isWhole;
+
+ private String orderId;
+
+ private int votesnum;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UserAddReq.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UserAddReq.java
new file mode 100644
index 0000000..da0b607
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UserAddReq.java
@@ -0,0 +1,33 @@
+package com.xiang.common.pojo.jntyzx.miniapp.req;
+
+import lombok.Data;
+import org.jetbrains.annotations.NotNull;
+
+
+@Data
+public class UserAddReq {
+
+ /**
+ * 用户名称
+ */
+ private String name;
+ /**
+ * token
+ */
+ private String token;
+ /**
+ * wx openId
+ */
+ private String openId;
+
+ /**
+ * 会员卡号
+ */
+ private String memberCardNo;
+
+ /**
+ * 状态 0:禁用 1:启用
+ */
+ private Integer status;
+}
+
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UserQueryReq.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UserQueryReq.java
new file mode 100644
index 0000000..7217b24
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UserQueryReq.java
@@ -0,0 +1,41 @@
+package com.xiang.common.pojo.jntyzx.miniapp.req;
+
+import lombok.Data;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-03-24 16:40
+ */
+@Data
+public class UserQueryReq {
+
+ /**
+ * 用户名称
+ */
+ private String name;
+
+ /**
+ * wx openId
+ */
+ private String openId;
+
+ /**
+ * 会员卡号
+ */
+ private String memberCardNo;
+
+ /**
+ * 状态 0:禁用 1:启用
+ */
+ private Integer status;
+
+ /**
+ * 是否可以下单 0:否 1:是
+ */
+ private Integer isOrder;
+
+ /**
+ * 是否封禁 0:否 1:是
+ */
+ private Integer isRestriction;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UserStatusUpdateReq.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UserStatusUpdateReq.java
new file mode 100644
index 0000000..96b1ceb
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UserStatusUpdateReq.java
@@ -0,0 +1,18 @@
+package com.xiang.common.pojo.jntyzx.miniapp.req;
+
+import lombok.Data;
+
+
+@Data
+public class UserStatusUpdateReq {
+
+ /**
+ * 用户名称
+ */
+ private String username;
+
+ /**
+ * status
+ */
+ private Integer status;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UserTokenUpdateReq.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UserTokenUpdateReq.java
new file mode 100644
index 0000000..d016730
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UserTokenUpdateReq.java
@@ -0,0 +1,18 @@
+package com.xiang.common.pojo.jntyzx.miniapp.req;
+
+import lombok.Data;
+
+
+@Data
+public class UserTokenUpdateReq {
+
+ /**
+ * 用户名称
+ */
+ private String username;
+
+ /**
+ * token
+ */
+ private String token;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UsernameReq.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UsernameReq.java
new file mode 100644
index 0000000..bca2270
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/UsernameReq.java
@@ -0,0 +1,9 @@
+package com.xiang.common.pojo.jntyzx.miniapp.req;
+
+import lombok.Data;
+
+
+@Data
+public class UsernameReq {
+ private String username;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/VenueInfoQueryRequest.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/VenueInfoQueryRequest.java
new file mode 100644
index 0000000..b083df4
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/VenueInfoQueryRequest.java
@@ -0,0 +1,33 @@
+package com.xiang.common.pojo.jntyzx.miniapp.req;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jetbrains.annotations.NotNull;
+
+import java.time.LocalDate;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-04-09 09:39
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class VenueInfoQueryRequest{
+
+ /**
+ * 日期
+ */
+ private LocalDate date;
+ /**
+ * 时间段 例如 20:00-21:00
+ */
+ private String sj;
+
+ /**
+ * 场地名称
+ */
+ private String placeName;
+
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/VenueInfoSubscribeRequest.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/VenueInfoSubscribeRequest.java
new file mode 100644
index 0000000..7fa4250
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/req/VenueInfoSubscribeRequest.java
@@ -0,0 +1,11 @@
+package com.xiang.common.pojo.jntyzx.miniapp.req;
+
+import lombok.Data;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-04-09 10:00
+ */
+@Data
+public class VenueInfoSubscribeRequest {
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/JntyzxResponse.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/JntyzxResponse.java
new file mode 100644
index 0000000..549bc78
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/JntyzxResponse.java
@@ -0,0 +1,20 @@
+package com.xiang.common.pojo.jntyzx.miniapp.resp;
+
+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/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/JtUserVo.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/JtUserVo.java
new file mode 100644
index 0000000..7d49341
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/JtUserVo.java
@@ -0,0 +1,64 @@
+package com.xiang.common.pojo.jntyzx.miniapp.resp;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-03-24 16:40
+ */
+@Data
+public class JtUserVo {
+
+ private Long userId;
+
+ /**
+ * 用户名称
+ */
+ private String name;
+ /**
+ * token
+ */
+ private String token;
+ /**
+ * wx:openId
+ */
+ private String openId;
+ /**
+ * 账号状态:
+ * 状态(0:禁用 1:启用)
+ */
+ private Integer status;
+ /**
+ * 修改时间
+ */
+ @DateTimeFormat(pattern = "yyyy-MM-dd Hh:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd Hh:mm:ss")
+ private LocalDateTime updateTime;
+ /**
+ * 江南体育中心会员卡号
+ */
+ private String memberCardNo;
+ /**
+ * 是否可以下单
+ */
+ private Boolean isOrder;
+ /**
+ * 是否封禁
+ */
+ private Boolean isRestriction;
+ /**
+ * 封禁结束时间
+ */
+ @DateTimeFormat(pattern = "yyyy-MM-dd Hh:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd Hh:mm:ss")
+ private LocalDateTime restrictionDeadline;
+ /**
+ * 封禁缘由
+ */
+ private String restrictionDesc;
+
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/OrderCreateResp.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/OrderCreateResp.java
new file mode 100644
index 0000000..11463e6
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/OrderCreateResp.java
@@ -0,0 +1,18 @@
+package com.xiang.common.pojo.jntyzx.miniapp.resp;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author: xiang
+ * @Date: 2025-12-16 10:36
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrderCreateResp {
+
+ private String id;
+ private String countDownNum;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/VenueInfoQueryResp.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/VenueInfoQueryResp.java
new file mode 100644
index 0000000..1ea2780
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/VenueInfoQueryResp.java
@@ -0,0 +1,53 @@
+package com.xiang.common.pojo.jntyzx.miniapp.resp;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-04-09 09:42
+ */
+@Data
+@AllArgsConstructor
+public class VenueInfoQueryResp {
+
+ /**
+ * 场地名称
+ */
+ private String placeName;
+
+ /**
+ * 日期
+ */
+ private LocalDate date;
+
+ /**
+ * 时间范围
+ */
+ private String sjName;
+
+ /**
+ * 价格
+ */
+ private BigDecimal money;
+
+ /**
+ * 联系人
+ */
+ private String contacts;
+
+ /**
+ * 0:可订购 2:zlb 4:已订购
+ */
+ private Integer type;
+ private Long placeMainId;
+ private Integer placeId;
+ private Integer scheduleId;
+ private String className;
+ private String classCode;
+ private String appointments;
+ private String cTypeCode;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/QueryVenueResponse.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/QueryVenueResponse.java
new file mode 100644
index 0000000..3d9dec0
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/QueryVenueResponse.java
@@ -0,0 +1,16 @@
+package com.xiang.common.pojo.jntyzx.miniapp.resp.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/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/SitePositionList.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/SitePositionList.java
new file mode 100644
index 0000000..3a04d50
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/SitePositionList.java
@@ -0,0 +1,56 @@
+package com.xiang.common.pojo.jntyzx.miniapp.resp.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/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/TimeList.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/TimeList.java
new file mode 100644
index 0000000..2981845
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/TimeList.java
@@ -0,0 +1,32 @@
+package com.xiang.common.pojo.jntyzx.miniapp.resp.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/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/UserInfoResponse.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/UserInfoResponse.java
new file mode 100644
index 0000000..a1fbaf8
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/UserInfoResponse.java
@@ -0,0 +1,109 @@
+package com.xiang.common.pojo.jntyzx.miniapp.resp.query;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserInfoResponse {
+
+ /**
+ * id
+ */
+ private Long id;
+ /**
+ * 会员卡号
+ */
+ private String consCard;
+ /**
+ * 姓名
+ */
+ private String consName;
+ /**
+ * 性别
+ */
+ private String consSex;
+ /**
+ * 身份证号
+ */
+ private String consIdCard;
+ /**
+ * 固定电话
+ */
+ private String consTel;
+ /**
+ * 手机号码
+ */
+ private String consHandSet;
+ /**
+ * 单位
+ */
+ private String consUnit;
+ /**
+ * 照片
+ */
+ private String consPhoto;
+ private Integer consWaste;
+ /**
+ * 会员卡号
+ */
+ private String consNumber;
+ private BigDecimal consMin;
+ private Integer consProp;
+ /**
+ * 注册年
+ */
+ private String consYear;
+ /**
+ * 注册月
+ */
+ private String consMonth;
+ /**
+ * 注册日
+ */
+ private String consDay;
+ private boolean consIflag;
+ /**
+ * 注册时间
+ */
+ private LocalDateTime consTimes;
+ /**
+ * openId
+ */
+ private String openId;
+ /**
+ * 头像
+ */
+ private String photoUrl;
+ /**
+ * 会员
+ */
+ private Integer consVip;
+ /**
+ * 会员等级号
+ */
+ private String consVipCode;
+
+ private String eleCardNum;
+ private Integer appointmentEligibility;
+ /**
+ * 封禁截止日期
+ */
+ @JSONField(name = "restrictionDeadline")
+ private String restrictionDeadline;
+ /**
+ * 封禁原因
+ */
+ private String restrictionDescription;
+ /**
+ * 封禁截止日期
+ */
+ @JSONField(name = "RestrictionDeadline")
+ private String RestrictionDeadline2;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/VenueList.java b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/VenueList.java
new file mode 100644
index 0000000..61b1401
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/miniapp/resp/query/VenueList.java
@@ -0,0 +1,20 @@
+package com.xiang.common.pojo.jntyzx.miniapp.resp.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/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbCaptcha.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbCaptcha.java
new file mode 100644
index 0000000..c49d0aa
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbCaptcha.java
@@ -0,0 +1,26 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-05-07 15:44
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ZlbCaptcha {
+
+ private String type;
+ private String backgroundImage;
+ private String templateImage;
+ private String backgroundImageTag;
+ private String templateImageTag;
+ private Integer backgroundImageWidth;
+ private Integer backgroundImageHeight;
+ private Integer templateImageWidth;
+ private Integer templateImageHeight;
+ private String data;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbCaptchaResp.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbCaptchaResp.java
new file mode 100644
index 0000000..6be9574
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbCaptchaResp.java
@@ -0,0 +1,17 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author: xiang
+ * @Date: 2026-05-07 15:44
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ZlbCaptchaResp {
+ private String id;
+ private ZlbCaptcha captcha;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbJlUserInfo.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbJlUserInfo.java
new file mode 100644
index 0000000..a5316df
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbJlUserInfo.java
@@ -0,0 +1,55 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ *
+ * @TableName zlb_jl_user_info
+ */
+@TableName(value ="zlb_jl_user_info")
+@Data
+public class ZlbJlUserInfo {
+ /**
+ *
+ */
+ @TableId(type = IdType.AUTO)
+ private Integer id;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 星期几
+ */
+ private String week;
+
+ /**
+ * 日期
+ */
+ private String day;
+
+ /**
+ * token
+ */
+ private String token;
+
+ /**
+ * secretKey
+ */
+ private String secretKey;
+
+ /**
+ * 场地信息
+ */
+ private String placeName;
+
+ /**
+ * 时间id111
+ */
+ private String siteTimeName;
+}
\ No newline at end of file
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbLoginInfo.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbLoginInfo.java
new file mode 100644
index 0000000..90d935f
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbLoginInfo.java
@@ -0,0 +1,82 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * @TableName zlb_login_info
+ */
+@TableName(value ="zlb_login_info")
+@Data
+public class ZlbLoginInfo {
+ /**
+ *
+ */
+ @TableId(type = IdType.AUTO)
+ private Integer id;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 11
+ */
+ private String cookie;
+
+ /**
+ * 22
+ */
+ private String bizSessionId;
+
+ /**
+ * 33
+ */
+ private String xDeviceId;
+
+ /**
+ * 44
+ */
+ private String xSignValue;
+
+ /**
+ * 55
+ */
+ private String token;
+
+ /**
+ * 66
+ */
+ private String gucGsid;
+
+ /**
+ * 77
+ */
+ private String xSiteCode;
+
+ /**
+ * 77
+ */
+ private String aliyungfTc;
+
+ /**
+ * 是否失效0-未失效,1-失效
+ */
+ private Integer isDel;
+
+ /**
+ * 数据创建时间
+ */
+ private Date createdDate;
+
+ /**
+ * 数据修改时间
+ */
+ private Date updatedDate;
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..f5b844f
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderInfo.java
@@ -0,0 +1,36 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author caoliang
+ * @version 1.0
+ * @date 2025-06-18 00:52:44
+ * @Description:***
+ */
+@Data
+public class ZlbOrderInfo {
+ private String id;
+ private ZlbData data;
+
+ @Data
+ public static class ZlbData {
+ 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 String siteOrderDetailsStr;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderJson.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderJson.java
new file mode 100644
index 0000000..6b62659
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderJson.java
@@ -0,0 +1,56 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * @author caoliang
+ * @version 1.0
+ * @date 2025-06-22 19:49:46
+ * @Description:***
+ */
+@Data
+public class ZlbOrderJson {
+ @JsonProperty("issueIds")
+ @JSONField(ordinal=1)
+ private String issueIds;
+ @JsonProperty("issueAmount")
+ @JSONField(ordinal=2)
+ private Integer issueAmount;
+ @JsonProperty("cardOrderId")
+ @JSONField(ordinal=3)
+ private String cardOrderId;
+
+
+ @JsonProperty("amount")
+ @JSONField(ordinal=4)
+ private Integer amount;
+ @JsonProperty("belongDate")
+ @JSONField(ordinal=5)
+ private String belongDate;
+ @JsonProperty("dayEffectiveTimes")
+ @JSONField(ordinal=6)
+ private String dayEffectiveTimes;
+ @JsonProperty("dayOverdueTimes")
+ @JSONField(ordinal=7)
+ private String dayOverdueTimes;
+ @JsonProperty("placeName")
+ @JSONField(ordinal=8)
+ private String placeName;
+ @JsonProperty("siteId")
+ @JSONField(ordinal=9)
+ private String siteId;
+ @JsonProperty("siteItemId")
+ @JSONField(ordinal=10)
+ private Integer siteItemId;
+ @JsonProperty("siteRuleId")
+ @JSONField(ordinal=11)
+ private String siteRuleId;
+ @JsonProperty("siteTicketId")
+ @JSONField(ordinal=12)
+ private Integer siteTicketId;
+ @JsonProperty("payChannel")
+ @JSONField(ordinal=13)
+ private Integer payChannel;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderWqInfo.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderWqInfo.java
new file mode 100644
index 0000000..d525bf9
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderWqInfo.java
@@ -0,0 +1,14 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import lombok.Data;
+
+/**
+ * @author caoliang
+ * @version 1.0
+ * @date 2025-06-18 00:52:44
+ * @Description:***
+ */
+@Data
+public class ZlbOrderWqInfo {
+ private String siteOrderDetailsStr;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderWqJson.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderWqJson.java
new file mode 100644
index 0000000..570916a
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbOrderWqJson.java
@@ -0,0 +1,61 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * @author caoliang
+ * @version 1.0
+ * @date 2025-06-22 19:49:46
+ * @Description:***
+ */
+@Data
+public class ZlbOrderWqJson {
+ @JsonProperty("issueIds")
+ @JSONField(ordinal=1)
+ private String issueIds;
+ @JsonProperty("issueAmount")
+ @JSONField(ordinal=2)
+ private Integer issueAmount;
+ @JsonProperty("cardOrderId")
+ @JSONField(ordinal=3)
+ private String cardOrderId;
+
+
+ @JsonProperty("amount")
+ @JSONField(ordinal=4)
+ private Integer amount;
+ @JsonProperty("belongDate")
+ @JSONField(ordinal=5)
+ private String belongDate;
+ @JsonProperty("dayEffectiveTimes")
+ @JSONField(ordinal=6)
+ private String dayEffectiveTimes;
+ @JsonProperty("dayOverdueTimes")
+ @JSONField(ordinal=7)
+ private String dayOverdueTimes;
+ @JsonProperty("placeName")
+ @JSONField(ordinal=8)
+ private String placeName;
+
+ @JsonProperty("saasTicketId")
+ @JSONField(ordinal=9)
+ private String saasTicketId;
+
+ @JsonProperty("siteId")
+ @JSONField(ordinal=10)
+ private String siteId;
+ @JsonProperty("siteItemId")
+ @JSONField(ordinal=11)
+ private Integer siteItemId;
+ @JsonProperty("siteRuleId")
+ @JSONField(ordinal=12)
+ private String siteRuleId;
+ @JsonProperty("siteTicketId")
+ @JSONField(ordinal=13)
+ private Integer siteTicketId;
+ @JsonProperty("payChannel")
+ @JSONField(ordinal=14)
+ private Integer payChannel;
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbPayOrder.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbPayOrder.java
new file mode 100644
index 0000000..bdf54a8
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbPayOrder.java
@@ -0,0 +1,50 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ *
+ * @TableName zlb_order_info
+ */
+@TableName(value ="zlb_order_info")
+@Data
+public class ZlbPayOrder {
+ /**
+ *
+ */
+ @TableId(type = IdType.AUTO)
+ private Integer id;
+
+ /**
+ * 姓名
+ */
+ private String name;
+
+ /**
+ * 日期
+ */
+ private String day;
+
+ /**
+ * 场馆
+ */
+ private String venues;
+
+ /**
+ * 场地名称
+ */
+ private String placeName;
+
+ /**
+ * 时间id111
+ */
+ private String time;
+
+ /**
+ * 0-未付款,1-已付款
+ */
+ private Integer isPay;
+}
\ No newline at end of file
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbSiteInfo.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbSiteInfo.java
new file mode 100644
index 0000000..95e2121
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbSiteInfo.java
@@ -0,0 +1,139 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * @TableName zlb_site_info
+ */
+@TableName(value ="zlb_site_info")
+@Data
+public class ZlbSiteInfo {
+ /**
+ *
+ */
+ @TableId(type = IdType.AUTO)
+ private Integer id;
+
+ /**
+ * 场地Id
+ */
+ private Integer type;
+ private Integer siteTicketId;
+
+ /**
+ * 场地名称
+ */
+ private String siteTicketName;
+ private String saasTicketId;
+
+ /**
+ * 金额
+ */
+ private String siteRuleId;
+
+ /**
+ * 金额
+ */
+ private String siteId;
+
+ /**
+ * 时间顺序id
+ */
+ private String placeName;
+
+ /**
+ * 票id
+ */
+ private Integer weekType;
+
+ /**
+ * 票id
+ */
+ private Integer blocId;
+
+ /**
+ * 票id
+ */
+ private Integer stadiumId;
+
+ /**
+ * 会员号
+ */
+ private String stadiumName;
+
+ /**
+ * 票id
+ */
+ private Integer siteItemId;
+
+ /**
+ * 订场人信息
+ */
+ private String spName;
+
+ /**
+ * 订场人电话
+ */
+ private String url;
+
+ /**
+ * 票id
+ */
+ private Integer startCheckMinutes;
+
+ /**
+ * 票id
+ */
+ private Integer endCheckMinutes;
+
+ /**
+ * 订场时间
+ */
+ private String dayEffectiveTimes;
+
+ /**
+ * 场地票名
+ */
+ private String dayOverdueTimes;
+
+ /**
+ * 票id
+ */
+ private Integer amount;
+
+ /**
+ * 票id
+ */
+ private Integer ticketType;
+
+ /**
+ * 场地票名
+ */
+ private String belongDate;
+
+ /**
+ * 场地票名
+ */
+ private String isOpen;
+
+ /**
+ * 票id
+ */
+ private Integer isPreferential;
+
+ /**
+ * 数据创建时间
+ */
+ private Date createdDate;
+
+ /**
+ * 数据修改时间
+ */
+ private Date updatedDate;
+}
\ No newline at end of file
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbSiteRequest.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbSiteRequest.java
new file mode 100644
index 0000000..391cdbf
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbSiteRequest.java
@@ -0,0 +1,18 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import lombok.Data;
+
+/**
+ * @author caoliang
+ * @version 1.0
+ * @date 2025-06-19 23:53:44
+ * @Description:***
+ */
+@Data
+public class ZlbSiteRequest {
+
+ private String dataStr;
+ private String stadiumId;
+ private Integer siteItemId;
+
+}
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbTokenInfo.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbTokenInfo.java
new file mode 100644
index 0000000..0f844d3
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbTokenInfo.java
@@ -0,0 +1,43 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ *
+ * @TableName zlb_token_info
+ */
+@TableName(value ="zlb_token_info")
+@Data
+public class ZlbTokenInfo {
+ /**
+ *
+ */
+ @TableId(type = IdType.AUTO)
+ private Integer id;
+
+ private Integer loginInfoId;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * tokenId
+ */
+ private String tokenId;
+ private String zlbUserId;
+ private String secretKey;
+
+ /**
+ * 是否失效0-未失效,1-失效
+ */
+ private Integer isDel;
+ private Date createdDate;
+ private Date updatedDate;
+}
\ No newline at end of file
diff --git a/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbUserInfo.java b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbUserInfo.java
new file mode 100644
index 0000000..9e46d6c
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/jntyzx/zlb/ZlbUserInfo.java
@@ -0,0 +1,52 @@
+package com.xiang.common.pojo.jntyzx.zlb;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ *
+ * @TableName zlb_user_info
+ */
+@TableName(value ="zlb_user_info")
+@Data
+public class ZlbUserInfo {
+ /**
+ *
+ */
+ @TableId(type = IdType.AUTO)
+ private Integer id;
+
+ private Integer loginInfoId;
+
+ /**
+ * 名称
+ */
+ private String name;
+
+ /**
+ * 星期几
+ */
+ private String week;
+
+ /**
+ * 分配的任务参数
+ */
+ private String type;
+
+ /**
+ * 场地信息
+ */
+ private String placeName;
+
+ /**
+ * 时间id111
+ */
+ private String siteTimeName;
+
+ /**
+ * 是否开抢0-抢,1-不抢
+ */
+ private Integer isBook;
+}
\ No newline at end of file
diff --git a/src/main/java/com/xiang/common/pojo/schedule/ScheduleOpeningConfigDO.java b/src/main/java/com/xiang/common/pojo/schedule/ScheduleOpeningConfigDO.java
new file mode 100644
index 0000000..a025864
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/schedule/ScheduleOpeningConfigDO.java
@@ -0,0 +1,24 @@
+package com.xiang.common.pojo.schedule;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("schedule_opening_config")
+public class ScheduleOpeningConfigDO {
+ private Long id;
+ /**
+ * 模块id(0:glados 1:芬玩岛 2:江体小程序 3:江体zlb 4:ddns)
+ */
+ private Integer module;
+ private String beanName;
+ private Integer status;
+ private LocalDateTime createTime;
+ private LocalDateTime updateTime;
+}
diff --git a/src/main/java/com/xiang/common/pojo/schedule/ScheduleRunLogDO.java b/src/main/java/com/xiang/common/pojo/schedule/ScheduleRunLogDO.java
new file mode 100644
index 0000000..f303534
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/schedule/ScheduleRunLogDO.java
@@ -0,0 +1,22 @@
+package com.xiang.common.pojo.schedule;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("schedule_run_log")
+public class ScheduleRunLogDO {
+ private Long id;
+ private String moduleName;
+ private String taskName;
+ private String params;
+ private String response;
+ private LocalDateTime createTime;
+ private Integer requestFlag;
+}
diff --git a/src/main/java/com/xiang/common/pojo/schedule/TaskResult.java b/src/main/java/com/xiang/common/pojo/schedule/TaskResult.java
new file mode 100644
index 0000000..cf52a25
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/schedule/TaskResult.java
@@ -0,0 +1,22 @@
+package com.xiang.common.pojo.schedule;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TaskResult {
+
+ private String params;
+
+ /**
+ * 是否成功
+ */
+ private boolean success;
+ /**
+ * 响应结果
+ */
+ private String summary;
+}
diff --git a/src/main/java/com/xiang/common/pojo/schedule/ValidationResult.java b/src/main/java/com/xiang/common/pojo/schedule/ValidationResult.java
new file mode 100644
index 0000000..d3a919b
--- /dev/null
+++ b/src/main/java/com/xiang/common/pojo/schedule/ValidationResult.java
@@ -0,0 +1,15 @@
+package com.xiang.common.pojo.schedule;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.checkerframework.checker.units.qual.A;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ValidationResult {
+ private boolean valid;
+ private String message;
+ private Object validatedParams;
+}
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..d50203a
--- /dev/null
+++ b/src/main/java/com/xiang/common/service/CodeServiceImpl.java
@@ -0,0 +1,96 @@
+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.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+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 List codeResolve(String image, String templateImage) {
+ HashMap header = Maps.newHashMap();
+ header.put("Content-Type", "application/json");
+ YcCodeRequest ycCodeRequest = new YcCodeRequest();
+ ycCodeRequest.setImage(image);
+ ycCodeRequest.setToken("9LQ1ATKVEeO8Arhq-HavXzpHvkzdZz_r7ydmqlYhp9c");
+ ycCodeRequest.setLabelImage(templateImage);
+ ycCodeRequest.setType(YcCodeTypeEnum.YC_310700.getType());
+
+ String resp = HttpService.doPost(YUN_CODE_API_URL, header, JSON.toJSONString(ycCodeRequest));
+ YcCodeBaseResponse response = JSON.parseObject(resp, new TypeReference>() {
+ });
+ if (Objects.isNull(response)) {
+ return null;
+ }
+ Integer code = response.getCode();
+ if (10000 == code) {
+ YcCodeDataResp data = response.getData();
+ if (Objects.isNull(data)) {
+ return null;
+ }
+ Integer dataCode = data.getCode();
+ if (0 == dataCode) {
+ String dataData = data.getData();
+ if (StringUtils.isNotBlank(dataData)) {
+ String[] split = dataData.split("\\|");
+ return Arrays.asList(split);
+ }
+ }
+ }
+ 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..ed10cbc
--- /dev/null
+++ b/src/main/java/com/xiang/common/service/ICodeService.java
@@ -0,0 +1,16 @@
+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;
+
+import java.util.List;
+
+public interface ICodeService {
+
+ String templateCodeResolve(String image);
+
+ List codeResolve(String image, String extra);
+
+ YcCodeBaseResponse baseCodeResolve(Integer type, String image, String extra);
+}
diff --git a/src/main/java/com/xiang/common/service/IScheduleOpeningConfigService.java b/src/main/java/com/xiang/common/service/IScheduleOpeningConfigService.java
new file mode 100644
index 0000000..95ad703
--- /dev/null
+++ b/src/main/java/com/xiang/common/service/IScheduleOpeningConfigService.java
@@ -0,0 +1,22 @@
+package com.xiang.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xiang.common.pojo.schedule.ScheduleOpeningConfigDO;
+
+import java.util.List;
+
+public interface IScheduleOpeningConfigService extends IService {
+
+ /**
+ * 获取所有未删除的任务
+ * @return
+ */
+ List getAll();
+ /**
+ * 根据模块id和任务名称查询
+ * @param moduleCode
+ * @param taskName
+ * @return
+ */
+ ScheduleOpeningConfigDO getConfigByModule(Integer moduleCode, String taskName);
+}
diff --git a/src/main/java/com/xiang/common/service/IScheduleRunLogService.java b/src/main/java/com/xiang/common/service/IScheduleRunLogService.java
new file mode 100644
index 0000000..420c001
--- /dev/null
+++ b/src/main/java/com/xiang/common/service/IScheduleRunLogService.java
@@ -0,0 +1,7 @@
+package com.xiang.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xiang.common.pojo.schedule.ScheduleRunLogDO;
+
+public interface IScheduleRunLogService extends IService {
+}
diff --git a/src/main/java/com/xiang/common/service/ScheduleOpeningConfigServiceImpl.java b/src/main/java/com/xiang/common/service/ScheduleOpeningConfigServiceImpl.java
new file mode 100644
index 0000000..7b3df46
--- /dev/null
+++ b/src/main/java/com/xiang/common/service/ScheduleOpeningConfigServiceImpl.java
@@ -0,0 +1,27 @@
+package com.xiang.common.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiang.common.mapper.ScheduleOpeningConfigDao;
+import com.xiang.common.pojo.schedule.ScheduleOpeningConfigDO;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+@Service
+public class ScheduleOpeningConfigServiceImpl extends ServiceImpl implements IScheduleOpeningConfigService {
+ @Override
+ public List getAll() {
+ return baseMapper.selectList(Wrappers.lambdaQuery());
+ }
+
+ @Override
+ public ScheduleOpeningConfigDO getConfigByModule(Integer moduleCode, String taskName) {
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(ScheduleOpeningConfigDO::getModule, moduleCode);
+ lqw.eq(ScheduleOpeningConfigDO::getBeanName, taskName);
+ return baseMapper.selectOne(lqw);
+ }
+}
diff --git a/src/main/java/com/xiang/common/service/ScheduleRunLogServiceImpl.java b/src/main/java/com/xiang/common/service/ScheduleRunLogServiceImpl.java
new file mode 100644
index 0000000..98c31fa
--- /dev/null
+++ b/src/main/java/com/xiang/common/service/ScheduleRunLogServiceImpl.java
@@ -0,0 +1,10 @@
+package com.xiang.common.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xiang.common.mapper.ScheduleRunLogDao;
+import com.xiang.common.pojo.schedule.ScheduleRunLogDO;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ScheduleRunLogServiceImpl extends ServiceImpl implements IScheduleRunLogService {
+}
diff --git a/src/main/java/com/xiang/common/utils/AESECBUtils.java b/src/main/java/com/xiang/common/utils/AESECBUtils.java
new file mode 100644
index 0000000..1ed916d
--- /dev/null
+++ b/src/main/java/com/xiang/common/utils/AESECBUtils.java
@@ -0,0 +1,86 @@
+package com.xiang.common.utils;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+
+public class AESECBUtils {
+ // 填充方式(PKCS5Padding)
+ private static final String ALGORITHM = "AES/ECB/PKCS5Padding";
+
+ /**
+ * AES ECB 模式加密
+ *
+ * @param plainText 明文字符串
+ * @param key 密钥(16 / 24 / 32 字节)
+ * @return 十六进制格式的密文
+ */
+ public static String encrypt(String plainText, String key) throws Exception {
+ Cipher cipher = Cipher.getInstance(ALGORITHM);
+ SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
+ cipher.init(Cipher.ENCRYPT_MODE, keySpec);
+
+ byte[] encrypted = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
+ return bytesToHex(encrypted).toUpperCase();
+ }
+
+ /**
+ * AES ECB 模式解密
+ *
+ * @param hexCipherText 十六进制格式的密文
+ * @param key 密钥(16 / 24 / 32 字节)
+ * @return 解密后的明文
+ */
+ public static String decrypt(String hexCipherText, String key) throws Exception {
+ Cipher cipher = Cipher.getInstance(ALGORITHM);
+ SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
+ cipher.init(Cipher.DECRYPT_MODE, keySpec);
+
+ byte[] cipherData = hexStringToByteArray(hexCipherText);
+ byte[] decrypted = cipher.doFinal(cipherData);
+ return new String(decrypted, StandardCharsets.UTF_8);
+ }
+
+ // 十六进制字符串转 byte[]
+ private static byte[] hexStringToByteArray(String s) {
+ int len = s.length();
+ byte[] data = new byte[len / 2];
+ for (int i = 0; i < len; i += 2) {
+ data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ + Character.digit(s.charAt(i + 1), 16));
+ }
+ return data;
+ }
+
+ // byte[] 转十六进制字符串
+ private static String bytesToHex(byte[] bytes) {
+ StringBuilder sb = new StringBuilder();
+ for (byte b : bytes) {
+ sb.append(String.format("%02x", b));
+ }
+ return sb.toString();
+ }
+
+ // 示例主函数
+ public static void main(String[] args) {
+ String key = "1ad2ee1b6e3f4e81"; // 16字节密钥
+ // String key = "3f18655f909d495d"; // 16字节密钥
+ // String key = "ea08f7da82e44df7"; // 16字节密钥
+ // 取前16位数密钥
+ //String key = keystr.substring(0,16);
+
+ String longCiphertext = "8A559F1F4A8A782169E6F5BC32217A8CAA263E173FA2C05751CFC49B9018D57779F5B7C47B8C1570142EAB5A781175DE45AD141C3CC8E62380EA6C0036A2D80BF219B326C2302553E43B0F534A51D18D";
+
+ try {
+ String decrypted = decrypt(longCiphertext, key);
+ System.out.println("长密文解密结果: " + decrypted);
+ decrypted = "{\"stadiumId\":\"49\",\"siteItemId\":1940,\"belongDate\":\"2025-10-10\",\"channelType\":6}";
+ // decrypted = " {\"stadiumId\":\"360112\",\"siteItemId\":1148,\"belongDate\":\"2025-08-11\",\"channelType\":6}";
+ String reEncrypted = encrypt(decrypted, key);
+ System.out.println("重新加密结果: " + reEncrypted);
+ } catch (Exception e) {
+ System.err.println("长密文解密失败: " + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/com/xiang/common/utils/Base64.java b/src/main/java/com/xiang/common/utils/Base64.java
new file mode 100644
index 0000000..5df1063
--- /dev/null
+++ b/src/main/java/com/xiang/common/utils/Base64.java
@@ -0,0 +1,253 @@
+package com.xiang.common.utils;
+
+/**
+ * Base64工具类
+ *
+ * @author xiang
+ */
+public final class Base64 {
+ static private final int BASELENGTH = 128;
+ static private final int LOOKUPLENGTH = 64;
+ static private final int TWENTYFOURBITGROUP = 24;
+ static private final int EIGHTBIT = 8;
+ static private final int SIXTEENBIT = 16;
+ static private final int FOURBYTE = 4;
+ static private final int SIGN = -128;
+ static private final char PAD = '=';
+ static final private byte[] base64Alphabet = new byte[BASELENGTH];
+ static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH];
+
+ static {
+ for (int i = 0; i < BASELENGTH; ++i) {
+ base64Alphabet[i] = -1;
+ }
+ for (int i = 'Z'; i >= 'A'; i--) {
+ base64Alphabet[i] = (byte) (i - 'A');
+ }
+ for (int i = 'z'; i >= 'a'; i--) {
+ base64Alphabet[i] = (byte) (i - 'a' + 26);
+ }
+
+ for (int i = '9'; i >= '0'; i--) {
+ base64Alphabet[i] = (byte) (i - '0' + 52);
+ }
+
+ base64Alphabet['+'] = 62;
+ base64Alphabet['/'] = 63;
+
+ for (int i = 0; i <= 25; i++) {
+ lookUpBase64Alphabet[i] = (char) ('A' + i);
+ }
+
+ for (int i = 26, j = 0; i <= 51; i++, j++) {
+ lookUpBase64Alphabet[i] = (char) ('a' + j);
+ }
+
+ for (int i = 52, j = 0; i <= 61; i++, j++) {
+ lookUpBase64Alphabet[i] = (char) ('0' + j);
+ }
+ lookUpBase64Alphabet[62] = '+';
+ lookUpBase64Alphabet[63] = '/';
+ }
+
+ private static boolean isWhiteSpace(char octect) {
+ return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
+ }
+
+ private static boolean isPad(char octect) {
+ return (octect == PAD);
+ }
+
+ private static boolean isData(char octect) {
+ return (octect < BASELENGTH && base64Alphabet[octect] != -1);
+ }
+
+ /**
+ * Encodes hex octects into Base64
+ *
+ * @param binaryData Array containing binaryData
+ * @return Encoded Base64 array
+ */
+ public static String encode(byte[] binaryData) {
+ if (binaryData == null) {
+ return null;
+ }
+
+ int lengthDataBits = binaryData.length * EIGHTBIT;
+ if (lengthDataBits == 0) {
+ return "";
+ }
+
+ int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
+ int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
+ int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;
+ char[] encodedData = null;
+
+ encodedData = new char[numberQuartet * 4];
+
+ byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
+
+ int encodedIndex = 0;
+ int dataIndex = 0;
+
+ for (int i = 0; i < numberTriplets; i++) {
+ b1 = binaryData[dataIndex++];
+ b2 = binaryData[dataIndex++];
+ b3 = binaryData[dataIndex++];
+
+ l = (byte) (b2 & 0x0f);
+ k = (byte) (b1 & 0x03);
+
+ byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
+ byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
+ byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);
+
+ encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
+ encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
+ encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];
+ encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
+ }
+
+ // form integral number of 6-bit groups
+ if (fewerThan24bits == EIGHTBIT) {
+ b1 = binaryData[dataIndex];
+ k = (byte) (b1 & 0x03);
+ byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
+ encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
+ encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];
+ encodedData[encodedIndex++] = PAD;
+ encodedData[encodedIndex++] = PAD;
+ } else if (fewerThan24bits == SIXTEENBIT) {
+ b1 = binaryData[dataIndex];
+ b2 = binaryData[dataIndex + 1];
+ l = (byte) (b2 & 0x0f);
+ k = (byte) (b1 & 0x03);
+
+ byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
+ byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
+
+ encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
+ encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
+ encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];
+ encodedData[encodedIndex++] = PAD;
+ }
+ return new String(encodedData);
+ }
+
+ /**
+ * Decodes Base64 data into octects
+ *
+ * @param encoded string containing Base64 data
+ * @return Array containind decoded data.
+ */
+ public static byte[] decode(String encoded) {
+ if (encoded == null) {
+ return null;
+ }
+
+ char[] base64Data = encoded.toCharArray();
+ // remove white spaces
+ int len = removeWhiteSpace(base64Data);
+
+ if (len % FOURBYTE != 0) {
+ return null;// should be divisible by four
+ }
+
+ int numberQuadruple = (len / FOURBYTE);
+
+ if (numberQuadruple == 0) {
+ return new byte[0];
+ }
+
+ byte[] decodedData = null;
+ byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
+ char d1 = 0, d2 = 0, d3 = 0, d4 = 0;
+
+ int i = 0;
+ int encodedIndex = 0;
+ int dataIndex = 0;
+ decodedData = new byte[(numberQuadruple) * 3];
+
+ for (; i < numberQuadruple - 1; i++) {
+
+ if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))
+ || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) {
+ return null;
+ } // if found "no data" just return null
+
+ b1 = base64Alphabet[d1];
+ b2 = base64Alphabet[d2];
+ b3 = base64Alphabet[d3];
+ b4 = base64Alphabet[d4];
+
+ decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
+ decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
+ decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
+ }
+
+ if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) {
+ return null;// if found "no data" just return null
+ }
+
+ b1 = base64Alphabet[d1];
+ b2 = base64Alphabet[d2];
+
+ d3 = base64Data[dataIndex++];
+ d4 = base64Data[dataIndex++];
+ if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters
+ if (isPad(d3) && isPad(d4)) {
+ if ((b2 & 0xf) != 0)// last 4 bits should be zero
+ {
+ return null;
+ }
+ byte[] tmp = new byte[i * 3 + 1];
+ System.arraycopy(decodedData, 0, tmp, 0, i * 3);
+ tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
+ return tmp;
+ } else if (!isPad(d3) && isPad(d4)) {
+ b3 = base64Alphabet[d3];
+ if ((b3 & 0x3) != 0)// last 2 bits should be zero
+ {
+ return null;
+ }
+ byte[] tmp = new byte[i * 3 + 2];
+ System.arraycopy(decodedData, 0, tmp, 0, i * 3);
+ tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
+ tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
+ return tmp;
+ } else {
+ return null;
+ }
+ } else { // No PAD e.g 3cQl
+ b3 = base64Alphabet[d3];
+ b4 = base64Alphabet[d4];
+ decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
+ decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
+ decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
+
+ }
+ return decodedData;
+ }
+
+ /**
+ * remove WhiteSpace from MIME containing encoded Base64 data.
+ *
+ * @param data the byte array of base64 data (with WS)
+ * @return the new length
+ */
+ private static int removeWhiteSpace(char[] data) {
+ if (data == null) {
+ return 0;
+ }
+
+ // count characters that's not whitespace
+ int newSize = 0;
+ int len = data.length;
+ for (int i = 0; i < len; i++) {
+ if (!isWhiteSpace(data[i])) {
+ data[newSize++] = data[i];
+ }
+ }
+ return newSize;
+ }
+}
diff --git a/src/main/java/com/xiang/common/utils/Base64ImageScaler.java b/src/main/java/com/xiang/common/utils/Base64ImageScaler.java
new file mode 100644
index 0000000..dcd3a12
--- /dev/null
+++ b/src/main/java/com/xiang/common/utils/Base64ImageScaler.java
@@ -0,0 +1,97 @@
+package com.xiang.common.utils;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Base64;
+
+/**
+ * Base64图片缩放工具类
+ */
+public class Base64ImageScaler {
+ /**
+ * 将Base64图片等比例缩小1倍(缩小到原来的50%)
+ * @param base64Image 原始Base64图片(支持带或不带data:image前缀)
+ * @return 缩放后的Base64图片(保持原格式)
+ */
+ public static String scaleToHalf(String base64Image) {
+ try {
+ // 1. 解析Base64数据
+ String base64Data = base64Image;
+ String prefix = "";
+
+ if (base64Image.contains(",")) {
+ String[] parts = base64Image.split(",");
+ prefix = parts[0] + ",";
+ base64Data = parts[1];
+ }
+
+ // 2. Base64解码为字节数组
+ byte[] imageBytes = Base64.getDecoder().decode(base64Data);
+
+ // 3. 字节数组转BufferedImage
+ ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);
+ BufferedImage originalImage = ImageIO.read(bis);
+
+ // 4. 计算新尺寸(缩小一半)
+ int originalWidth = originalImage.getWidth();
+ int originalHeight = originalImage.getHeight();
+ int newWidth = originalWidth / 2;
+ int newHeight = originalHeight / 2;
+
+ // 5. 创建缩放后的图片
+ BufferedImage scaledImage = new BufferedImage(newWidth, newHeight, originalImage.getType());
+ Graphics2D g2d = scaledImage.createGraphics();
+
+ // 设置高质量缩放算法
+ g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
+
+ // 绘制缩放后的图片
+ g2d.drawImage(originalImage, 0, 0, newWidth, newHeight, null);
+ g2d.dispose();
+
+ // 6. BufferedImage转字节数组
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ String format = getImageFormat(originalImage);
+ ImageIO.write(scaledImage, format, baos);
+ byte[] scaledBytes = baos.toByteArray();
+
+ // 7. 字节数组转Base64
+ String scaledBase64 = Base64.getEncoder().encodeToString(scaledBytes);
+
+ // 8. 返回带前缀的Base64(如果原图有前缀则保留)
+ return prefix.isEmpty() ? scaledBase64 : prefix + scaledBase64;
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("图片缩放失败: " + e.getMessage());
+ }
+ }
+
+ /**
+ * 获取图片格式
+ */
+ private static String getImageFormat(BufferedImage image) {
+ // 简单判断,默认返回png
+ return "png";
+ }
+
+ /**
+ * 使用示例
+ */
+ public static void main(String[] args) {
+ // 您的Base64图片
+ String yourBase64Image = "data:image/jpeg;base64,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";
+
+ // 调用方法缩小1倍
+ String scaledBase64 = scaleToHalf(yourBase64Image);
+
+ System.out.println("缩放完成!");
+ System.out.println("原始长度: " + yourBase64Image.length());
+ System.out.println("缩放后长度: " + scaledBase64.length());
+ System.out.println("缩放后的Base64: " + scaledBase64);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/xiang/common/utils/DateUtils.java b/src/main/java/com/xiang/common/utils/DateUtils.java
new file mode 100644
index 0000000..b040f36
--- /dev/null
+++ b/src/main/java/com/xiang/common/utils/DateUtils.java
@@ -0,0 +1,615 @@
+package com.xiang.common.utils;
+
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.xiang.common.enums.DateFormatEnum;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author clover
+ * @Date 2020/9/15 09:31
+ */
+public class DateUtils {
+
+ private static final Logger logger = LoggerFactory.getLogger(DateUtils.class);
+
+ public static final String ENUM_FORMAT = "yyyy-MM-dd HH:mm:ss";
+ public static final String ASCM_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
+ public static final String ENUM_FORMAT_YMD = "yyyy-MM-dd";
+ public static final String ENUM_FORMAT_YMD_1 = "yyyyMMdd";
+ public static final String ENUM_FORMAT_YMDS = "yyyy-MM-dd HH:mm:ss.S";
+ public static final String ENUM_FORMAT_SLASH = "yyyy/MM/dd HH:mm:ss";
+ public static final String ENUM_FORMAT_YMDS_SLASH = "yyyy/MM/dd HH:mm:ss.S";
+ public static final String LEVEL_DAY = "day"; // 粒度级别
+ public static final String LEVEL_HOUR = "hour";
+ public static final String LEVEL_MINUTE = "minute";
+ public static final String LEVEL_SECOND = "second";
+ private static Map mapSign = new HashMap<>();
+ private static ThreadLocal