33 Commits

Author SHA1 Message Date
Xiang
20a92a22bf fix:修改定时任务时间 2026-05-13 15:57:39 +08:00
Xiang
3c6ce446c7 fix:捡漏任务 2026-05-12 10:08:16 +08:00
Xiang
9d0ed87191 fix:zlb订单查询 2026-05-11 09:59:58 +08:00
Xiang
d7be3786c3 feat:zlb场地排序 2026-05-11 08:45:22 +08:00
44efd5689b Merge pull request '江体小程序和zlb接口开发' (#1) from feat/script_v1 into master
Reviewed-on: https://gitea.xiangtech.xyz/XiangZ/script/pulls/1
2026-05-10 09:06:33 +00:00
Xiang
0f7af30789 feat:zlb场地排序 2026-05-09 16:43:55 +08:00
Xiang
b4ed93171c feat:日志打印优化 2026-05-09 15:42:21 +08:00
Xiang
6902a16cfa feat:日志打印优化 2026-05-09 15:24:44 +08:00
Xiang
60992dc4f6 feat:zlb江体优化 2026-05-09 15:17:12 +08:00
Xiang
cb21b38287 feat:江体小程序定时任务优化 2026-05-09 14:58:07 +08:00
Xiang
268b63e607 feat:江体小程序定时任务优化 2026-05-09 14:35:54 +08:00
Xiang
d1584184ae feat:江体小程序 2026-05-09 11:41:03 +08:00
Xiang
fea069d795 feat:江体小程序 2026-05-09 10:56:26 +08:00
Xiang
b30af008e0 feat:江体小程序 2026-05-09 10:21:03 +08:00
Xiang
76ec2c8b3c feat:江体小程序 2026-05-08 17:32:17 +08:00
Xiang
c61343a238 fix:定时任务时间调整 2026-05-08 16:42:24 +08:00
Xiang
a78da44f23 feat:glados积分数量 2026-05-08 16:04:18 +08:00
Xiang
3b596bfa91 feat:glados积分数量 2026-05-08 15:57:50 +08:00
Xiang
f1f3268e84 feat:生产配置 2026-05-08 15:24:35 +08:00
Xiang
9d3db5e1b3 feat:生产配置 2026-05-08 15:02:58 +08:00
Xiang
833b6fc208 doc:注释 2026-05-08 14:59:49 +08:00
Xiang
04862d861a feat:任务加载配置 2026-05-08 14:57:50 +08:00
Xiang
0a8e853753 feat:配置场地信息 2026-05-08 14:28:51 +08:00
Xiang
4eeacf8c52 feat:场地信息拉取 2026-05-08 14:26:57 +08:00
Xiang
c0647b69e2 feat:zlb调试 2026-05-08 14:12:38 +08:00
Xiang
8c4ea440b6 feat:zlb调试 2026-05-08 14:05:51 +08:00
Xiang
8a302db65a feat:zlb任务调试 2026-05-08 12:02:45 +08:00
Xiang
3964547e84 debugger:zlb下单调试 2026-05-08 09:23:50 +08:00
Xiang
c387f81225 feat:zlb接口 2026-05-08 09:19:04 +08:00
Xiang
582beb13db feat:zlb接口 2026-05-07 16:38:59 +08:00
xiang
a1d42a4b27 feat:验证码 2026-05-05 21:23:11 +08:00
xiang
66a69a4968 feat:下单 2026-05-05 17:28:14 +08:00
xiang
d551427821 feat:zlb脚本 2026-05-03 23:43:37 +08:00
148 changed files with 8607 additions and 22 deletions

38
pom.xml
View File

@@ -104,6 +104,11 @@
<artifactId>mapstruct</artifactId> <artifactId>mapstruct</artifactId>
<version>1.5.5.Final</version> <version>1.5.5.Final</version>
</dependency> </dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.9</version>
</dependency>
<!-- http --> <!-- http -->
<dependency> <dependency>
@@ -111,6 +116,11 @@
<artifactId>httpclient</artifactId> <artifactId>httpclient</artifactId>
<version>4.5.13</version> <version>4.5.13</version>
</dependency> </dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<!-- collections --> <!-- collections -->
<dependency> <dependency>
<groupId>com.google.guava</groupId> <groupId>com.google.guava</groupId>
@@ -129,6 +139,11 @@
</dependency> </dependency>
<!-- json --> <!-- json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency> <dependency>
<groupId>com.alibaba.fastjson2</groupId> <groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId> <artifactId>fastjson2</artifactId>
@@ -155,4 +170,27 @@
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.0.RELEASE</version>
<configuration>
<classifier>exec</classifier>
<!-- 指定该Main Class为全局的唯一入口 -->
<mainClass>com.xiang.Application</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project> </project>

View File

@@ -4,8 +4,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication @SpringBootApplication
@EnableScheduling
public class Application { public class Application {
private static final Logger log = LoggerFactory.getLogger(Application.class); private static final Logger log = LoggerFactory.getLogger(Application.class);

View File

@@ -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<ScheduleOpeningConfigDO> allSchedules = scheduleOpeningConfigService.getAll();
Map<String, ScheduleOpeningConfigDO> 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<ScheduleOpeningConfigDO> 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");
}
}

View File

@@ -7,11 +7,17 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory; 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.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
@Configuration @Configuration
public class RedisConfig { public class RedisConfig {
@Bean @Bean
@@ -35,7 +41,6 @@ public class RedisConfig {
template.setValueSerializer(jackson2JsonRedisSerializer); template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet(); template.afterPropertiesSet();
return template; return template;
} }
@@ -44,4 +49,18 @@ public class RedisConfig {
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) { public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
return new StringRedisTemplate(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);
}
} }

View File

@@ -14,7 +14,7 @@ public class RedisProperties {
private String host; private String host;
private String port; private String port;
private String password; private String password;
private Integer database = 0; private Integer database;
public String getAddress() { public String getAddress() {
return "redis://" + host + ":" + port; return "redis://" + host + ":" + port;

View File

@@ -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;
}
}

View File

@@ -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";
}

View File

@@ -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);
}
}

View File

@@ -7,11 +7,56 @@ import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
public enum ScheduleEnums { public enum ScheduleEnums {
DOMAIN_DYNAMIC_ANALYSIS_TASK(4, "domain", "domainDynamicAnalysisTask"), /**
* 0glados
* 1芬玩岛
* 2DDNS
* 3江体zlb
* 4江体小程序
*/
/**
* Glados任务
*/
GLADOS_CHECK_IN_TASK(0, "glados", "gladosCheckInTask"), GLADOS_CHECK_IN_TASK(0, "glados", "gladosCheckInTask"),
/**
* Aliyun DDNS任务
*/
DOMAIN_DYNAMIC_ANALYSIS_TASK(2, "domain", "domainDynamicAnalysisTask"),
/**
* 芬玩岛 任务
*/
/**
* 江体 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"),
ZLB_ORDER_QUERY_TASK(3, "zlb", "zlbOrderQueryTask"),
ZLB_ORDER_JL_TASK(3, "zlb", "zlbOrderJlTask"),
/**
* 江体 小程序任务
*/
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 modeleCode; private final Integer moduleCode;
private final String module; private final String module;
private final String taskName; private final String taskName;
} }

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -9,6 +9,7 @@ import com.xiang.common.service.IScheduleRunLogService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Objects; import java.util.Objects;
@@ -112,7 +113,7 @@ public abstract class BaseScheduleTaskTemplate {
* @param validatedParams 校验通过的参数 * @param validatedParams 校验通过的参数
* @return 任务执行结果 * @return 任务执行结果
*/ */
protected abstract TaskResult doExecute(Object validatedParams); protected abstract TaskResult doExecute(Object validatedParams) throws Exception;
/** /**
* 记录成功结果 - 子类可选择性覆写 * 记录成功结果 - 子类可选择性覆写

View File

@@ -0,0 +1,6 @@
package com.xiang.common.handler;
public interface CallbackHandler {
void onResponse(String response);
void onFailure(Throwable t);
}

View File

@@ -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<OrderInfoDO> {
List<OrderInfoDO> queryNoPayOrder();
}

View File

@@ -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<UserInfoDO> {
boolean delAll();
}

View File

@@ -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> {
UserRestrictionInfo queryByUserId(Long userId);
List<UserRestrictionInfo> queryByIdList(List<Long> idList);
}

View File

@@ -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<UserTokenInfoDO> {
List<UserTokenInfoDO> listUser();
UserTokenInfoDO getByName(String name);
List<UserTokenInfoDO> listCanOrder();
List<UserTokenInfoDO> queryByList(UserQueryReq req);
}

View File

@@ -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<VenueInfoDO> {
List<VenueInfoDO> queryByDate(LocalDate date);
List<VenueInfoDO> queryByType(LocalDate date, Integer type);
}

View File

@@ -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<JntyzxOrderCreateInfoMapper, OrderInfoDO> implements IOrderCreateInfoManage {
@Override
public List<OrderInfoDO> queryNoPayOrder() {
LambdaQueryWrapper<OrderInfoDO> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(OrderInfoDO::getOrderStatus, 0);
return baseMapper.selectList(lambdaQueryWrapper);
}
}

View File

@@ -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<JntyzxUserInfoMapper, UserInfoDO> implements IUserInfoManage {
@Override
public boolean delAll() {
return baseMapper.delAll() > 0;
}
}

View File

@@ -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<JntyzxUserRestrictionInfoMapper, UserRestrictionInfo> implements IUserRestrictionManage {
@Override
public UserRestrictionInfo queryByUserId(Long userId) {
LambdaQueryWrapper<UserRestrictionInfo> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(UserRestrictionInfo::getUserId, userId);
return baseMapper.selectOne(lambdaQueryWrapper);
}
@Override
public List<UserRestrictionInfo> queryByIdList(List<Long> idList) {
LambdaQueryWrapper<UserRestrictionInfo> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.in(UserRestrictionInfo::getUserId, idList);
return baseMapper.selectList(lambdaQueryWrapper);
}
}

View File

@@ -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<JntyzxUserTokenInfoMapper, UserTokenInfoDO> implements IUserTokenInfoManage {
@Override
public List<UserTokenInfoDO> listUser() {
LambdaQueryWrapper<UserTokenInfoDO> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(UserTokenInfoDO::getStatus, 1);
return baseMapper.selectList(lambdaQueryWrapper);
}
@Override
public UserTokenInfoDO getByName(String name) {
LambdaQueryWrapper<UserTokenInfoDO> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(UserTokenInfoDO::getStatus, 1);
lambdaQueryWrapper.eq(UserTokenInfoDO::getName, name);
lambdaQueryWrapper.last("limit 1");
return baseMapper.selectOne(lambdaQueryWrapper);
}
@Override
public List<UserTokenInfoDO> listCanOrder() {
LambdaQueryWrapper<UserTokenInfoDO> 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<UserTokenInfoDO> queryByList(UserQueryReq req) {
LambdaQueryWrapper<UserTokenInfoDO> 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);
}
}

View File

@@ -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<JntyzxVenueInfoMapper, VenueInfoDO> implements IVenueInfoManage {
public List<VenueInfoDO> queryByDate(LocalDate date) {
LambdaQueryWrapper<VenueInfoDO> lqw = Wrappers.lambdaQuery();
lqw.eq(VenueInfoDO::getDate, date);
return baseMapper.selectList(lqw);
}
@Override
public List<VenueInfoDO> queryByType(LocalDate date, Integer type) {
LambdaQueryWrapper<VenueInfoDO> lqw = Wrappers.lambdaQuery();
lqw.eq(VenueInfoDO::getDate, date);
lqw.eq(VenueInfoDO::getType, type);
return baseMapper.selectList(lqw);
}
}

View File

@@ -0,0 +1,15 @@
package com.xiang.common.manage.jntyzx.zlb;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiang.common.pojo.jntyzx.zlb.ZlbJlUserInfo;
import java.util.List;
/**
* @Author: xiang
* @Date: 2026-05-12 09:18
*/
public interface IZlbJlUserInfoManage extends IService<ZlbJlUserInfo> {
List<ZlbJlUserInfo> getJlUsers();
}

View File

@@ -0,0 +1,16 @@
package com.xiang.common.manage.jntyzx.zlb;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiang.common.pojo.jntyzx.zlb.ZlbPayOrder;
import java.time.LocalDate;
import java.util.List;
/**
* @Author: xiang
* @Date: 2026-05-09 15:11
*/
public interface IZlbOrderInfoManage extends IService<ZlbPayOrder> {
List<ZlbPayOrder> queryOrder(LocalDate date);
}

View File

@@ -0,0 +1,27 @@
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.ZlbJlUserInfoMapper;
import com.xiang.common.pojo.jntyzx.zlb.ZlbJlUserInfo;
import com.xiang.common.utils.DateUtils;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.List;
/**
* @Author: xiang
* @Date: 2026-05-12 09:18
*/
@Service
public class ZlbJlUserInfoManageImpl extends ServiceImpl<ZlbJlUserInfoMapper, ZlbJlUserInfo> implements IZlbJlUserInfoManage {
@Override
public List<ZlbJlUserInfo> getJlUsers() {
LambdaQueryWrapper<ZlbJlUserInfo> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(ZlbJlUserInfo::getDay, DateUtils.getDateFromDate(LocalDate.now()));
lambdaQueryWrapper.eq(ZlbJlUserInfo::getDay, DateUtils.getWeekDay(LocalDate.now()));
return baseMapper.selectList(lambdaQueryWrapper);
}
}

View File

@@ -0,0 +1,27 @@
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.ZlbOrderInfoMapper;
import com.xiang.common.pojo.jntyzx.zlb.ZlbPayOrder;
import com.xiang.common.utils.DateUtils;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.List;
/**
* @Author: xiang
* @Date: 2026-05-09 15:11
*/
@Service
public class ZlbOrderInfoManageImpl extends ServiceImpl<ZlbOrderInfoMapper, ZlbPayOrder> implements IZlbOrderInfoManage {
@Override
public List<ZlbPayOrder> queryOrder(LocalDate date) {
LambdaQueryWrapper<ZlbPayOrder> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(ZlbPayOrder::getDay, DateUtils.getDateFromDate(date));
lambdaQueryWrapper.eq(ZlbPayOrder::getIsPay, 0);
return baseMapper.selectList(lambdaQueryWrapper);
}
}

View File

@@ -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<ZlbSiteInfo> {
}

View File

@@ -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<ZlbSiteInfoMapper, ZlbSiteInfo>
implements ZlbSiteInfoService {
}

View File

@@ -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> {
ZlbTokenInfo queryByName(String name);
List<ZlbTokenInfo> getAllUsers();
}

View File

@@ -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<ZlbTokenInfoMapper, ZlbTokenInfo>
implements ZlbTokenInfoService {
@Override
public ZlbTokenInfo queryByName(String name) {
LambdaQueryWrapper<ZlbTokenInfo> wrapper = Wrappers.lambdaQuery();
wrapper.eq(ZlbTokenInfo::getName, name);
return this.getOne(wrapper);
}
@Override
public List<ZlbTokenInfo> getAllUsers() {
LambdaQueryWrapper<ZlbTokenInfo> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(ZlbTokenInfo::getIsDel, 0);
return baseMapper.selectList(lambdaQueryWrapper);
}
}

View File

@@ -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<ZlbUserInfo> {
/**
* 查询日期内未预订的用户
* @param date
* @return
*/
List<ZlbUserInfo> getNoBookUsers(LocalDate date);
int delAll();
}

View File

@@ -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<ZlbUserInfoMapper, ZlbUserInfo>
implements ZlbUserInfoService {
@Override
public List<ZlbUserInfo> getNoBookUsers(LocalDate date) {
return List.of();
}
@Override
public int delAll() {
return baseMapper.deleteAll();
}
}

View File

@@ -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<OrderInfoDO> {
}

View File

@@ -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<UserInfoDO> {
@Delete("delete from jntyzx_user_info where 1=1")
int delAll();
}

View File

@@ -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<UserRestrictionInfo> {
}

View File

@@ -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<UserTokenInfoDO> {
}

View File

@@ -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<VenueInfoDO> {
}

View File

@@ -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<ZlbJlUserInfo> {
}

View File

@@ -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<ZlbLoginInfo> {
}

View File

@@ -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<ZlbPayOrder> {
}

View File

@@ -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<ZlbSiteInfo> {
}

View File

@@ -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<ZlbTokenInfo> {
}

View File

@@ -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<ZlbUserInfo> {
@Delete("delete from zlb_user_info where 1=1")
int deleteAll();
}

View File

@@ -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);
}
}

View File

@@ -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<T> {
private String msg;
private Integer code;
private T data;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<GladosPointsHistoryResp> 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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<SubscribeVo> subscribeVos;
private String bookTime;
private Integer paymentMethod;
private String svCiphertext;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -0,0 +1,9 @@
package com.xiang.common.pojo.jntyzx.miniapp.req;
import lombok.Data;
@Data
public class UsernameReq {
private String username;
}

View File

@@ -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;
}

View File

@@ -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 {
}

View File

@@ -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<T> {
private Boolean success;
private String message;
private Integer code;
private T result;
private Long timestamp;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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可订购 2zlb 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;
}

View File

@@ -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> timeList;
private List<VenueList> venue;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<SitePositionList> sitePosition;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -0,0 +1,51 @@
package com.xiang.common.pojo.jntyzx.zlb;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @Author: xiang
* @Date: 2026-05-11 09:43
*/
@Data
@AllArgsConstructor
public class ZlbOrderDetailResp {
private Integer state;
private Integer blocId;
private Integer stadiumId;
private String stadiumArea;
private String stadiumName;
private String stadiumPhone;
private String stadiumType;
private String stadiumAddress;
private String mapLongitude;
private String mapLatitude;
private String ticketImg;
private String spName;
private String siteName;
private String siteAmount;
// private String orderAmount;
private Integer payNumber;
// private String ticketInfos;
private Integer orderId;
private String orderNo;
private String orderTime;
private String payTime;
private Integer payType;
private String payAmount;
private String discountPayAmount;
private String totalDiscountAmount;
private String isUseCoupon;
private String isUseCard;
private String name;
private String idCard;
private String phone;
private String notice;
private String blocNotice;
private Integer isRefund;
private String ticketCate;
private String spreadAmout;
private Integer isPreferential;
private String doNotWatermarkFlag;
}

View File

@@ -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> trackList;
@Data
public static class TrackList {
private Integer x;
private Integer y;
private Integer t;
private String type;
}
}
private String siteOrderDetailsStr;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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_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;
/**
* 订单id
*/
private String orderId;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<YcCodeDataResp> 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<String> codeResolve(String image, String templateImage) {
HashMap<String, String> 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<YcCodeDataResp> response = JSON.parseObject(resp, new TypeReference<YcCodeBaseResponse<YcCodeDataResp>>() {
});
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<YcCodeDataResp> baseCodeResolve(Integer type, String image, String extra) {
HashMap<String, String> 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<YcCodeBaseResponse<YcCodeDataResp>>() {
});
}
}

View File

@@ -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<String> codeResolve(String image, String extra);
YcCodeBaseResponse<YcCodeDataResp> baseCodeResolve(Integer type, String image, String extra);
}

View File

@@ -7,6 +7,11 @@ import java.util.List;
public interface IScheduleOpeningConfigService extends IService<ScheduleOpeningConfigDO> { public interface IScheduleOpeningConfigService extends IService<ScheduleOpeningConfigDO> {
/**
* 获取所有未删除的任务
* @return
*/
List<ScheduleOpeningConfigDO> getAll();
/** /**
* 根据模块id和任务名称查询 * 根据模块id和任务名称查询
* @param moduleCode * @param moduleCode

View File

@@ -7,9 +7,16 @@ import com.xiang.common.mapper.ScheduleOpeningConfigDao;
import com.xiang.common.pojo.schedule.ScheduleOpeningConfigDO; import com.xiang.common.pojo.schedule.ScheduleOpeningConfigDO;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Service @Service
public class ScheduleOpeningConfigServiceImpl extends ServiceImpl<ScheduleOpeningConfigDao, ScheduleOpeningConfigDO> implements IScheduleOpeningConfigService { public class ScheduleOpeningConfigServiceImpl extends ServiceImpl<ScheduleOpeningConfigDao, ScheduleOpeningConfigDO> implements IScheduleOpeningConfigService {
@Override
public List<ScheduleOpeningConfigDO> getAll() {
return baseMapper.selectList(Wrappers.lambdaQuery());
}
@Override @Override
public ScheduleOpeningConfigDO getConfigByModule(Integer moduleCode, String taskName) { public ScheduleOpeningConfigDO getConfigByModule(Integer moduleCode, String taskName) {
LambdaQueryWrapper<ScheduleOpeningConfigDO> lqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<ScheduleOpeningConfigDO> lqw = Wrappers.lambdaQuery();

View File

@@ -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();
}
}
}

View File

@@ -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;
}
}

File diff suppressed because one or more lines are too long

View File

@@ -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<String, String> mapSign = new HashMap<>();
private static ThreadLocal<Map<String, SimpleDateFormat>> threadLocalDateFormat = new ThreadLocal<>();
/**
* 初始化DateFormat标志位.
*/
private static void initMapSign() {
if (mapSign.isEmpty()) {
mapSign.put("上午|下午", "a");
mapSign.put("星期[一二三四五六日天七]", "E");
mapSign.put("CST", "z");
mapSign.put("公元[前]?", "G");
}
}
public static int getWeekDay() {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.DAY_OF_WEEK);
}
public static void main(String[] args) {
Date date = DateUtils.addDate(new Date(), 6);
String day = DateUtils.format(date, DateUtils.ENUM_FORMAT_YMD_1);
System.out.println(day);
System.out.println(getWeekDay(day));
}
public static String getWeekDay(String bookTime) {//20250101
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
// 解析输入日期
LocalDate date = LocalDate.parse(bookTime, formatter);
// 获取星期几
DayOfWeek dayOfWeek = date.getDayOfWeek();
// 将星期几转换为中文
return convertToChinese(dayOfWeek);
}
public static String getWeekDayTwo(String bookTime) {//20250101
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 解析输入日期
LocalDate date = LocalDate.parse(bookTime, formatter);
// 获取星期几
DayOfWeek dayOfWeek = date.getDayOfWeek();
// 将星期几转换为中文
return convertToChinese(dayOfWeek);
}
public static String getWeekDay(LocalDate date) {
DayOfWeek dayOfWeek = date.getDayOfWeek();
return convertToChinese(dayOfWeek);
}
private static String convertToChinese(DayOfWeek dayOfWeek) {
switch (dayOfWeek) {
case MONDAY:
return "星期一";
case TUESDAY:
return "星期二";
case WEDNESDAY:
return "星期三";
case THURSDAY:
return "星期四";
case FRIDAY:
return "星期五";
case SATURDAY:
return "星期六";
case SUNDAY:
return "星期日";
default:
return "未知";
}
}
public static String getBookTime() {
Date date = DateUtils.addDate(new Date(), 1);
return DateUtils.formatYMd(date);
}
/**
* 获取当前时间的毫秒数
*
* @return 当前时间
*/
public static long getTimeInMillis() {
Date now = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(now);
return calendar.getTimeInMillis();
}
/**
* 常规日期格式yyyy-MM-dd HH:mm:ss.
*
* @param date date
* @return time
*/
public static String format(Date date) {
return getDateFormat(ENUM_FORMAT).format(date);
}
public static String format(Long timestamp) {
return getDateFormat(ENUM_FORMAT).format(timestamp);
}
/**
* 常规日期格式yyyy-MM-dd.
*
* @param date date
* @return time
*/
public static String formatYMd(Date date) {
return getDateFormat(ENUM_FORMAT_YMD).format(date);
}
/**
* 格式化时间.
*
* @param date date
* @param dateFormat dateFormat
* @return time
*/
public static String format(Date date, String dateFormat) {
if (null == date) {
return null;
}
return getDateFormat(dateFormat).format(date);
}
/**
* parse时间(yyyy-MM-dd HH:mm:ss).
*
* @param source source
* @return Date
* @throws ParseException ParseException
*/
public static Date parse(String source) throws ParseException {
return getDateFormat(DateFormatEnum.COMMON1.getValue()).parse(source);
}
/**
* parse时间(yyyy-MM-dd HH:mm:ss).
*
* @param source source
* @return Date
* @throws ParseException ParseException
*/
public static Date parseAscm(String source) throws ParseException {
return getDateFormat(ASCM_FORMAT).parse(source);
}
/**
* parse时间(yyyy-MM-dd).
*
* @param source source
* @return Date
* @throws ParseException ParseException
*/
public static Date parseYMd(String source) throws ParseException {
return getDateFormat(ENUM_FORMAT_YMD).parse(source);
}
/**
* 格式化时间.
*
* @param time time
* @param dateFormat dateFormat
* @return Date
* @throws ParseException ParseException
*/
public static Date parse(String time, String dateFormat) throws ParseException {
if (isNullOrEmpty(time) || isNullOrEmpty(dateFormat)) {
return null;
}
return getDateFormat(dateFormat).parse(time);
}
public static Date parse(String time, String dateFormat, String timeZone) throws ParseException {
if (isNullOrEmpty(time) || isNullOrEmpty(dateFormat)) {
return null;
}
return getDateFormat(dateFormat, timeZone).parse(time);
}
/**
* 获取指定时间格式的 SimpleDateFormat.
*
* @param pattern 时间格式
* @return SimpleDateFormat
*/
public static SimpleDateFormat getDateFormat(String pattern) {
Map<String, SimpleDateFormat> dateFormatMap = threadLocalDateFormat.get();
if (dateFormatMap == null) {
dateFormatMap = new HashMap<>();
}
SimpleDateFormat simpleDateFormat = dateFormatMap.get(pattern);
if (simpleDateFormat == null) {
simpleDateFormat = new SimpleDateFormat(pattern, Locale.getDefault());
dateFormatMap.put(pattern, simpleDateFormat);
threadLocalDateFormat.set(dateFormatMap);
}
return simpleDateFormat;
}
private static SimpleDateFormat getDateFormat(String pattern, String timeZone) {
SimpleDateFormat dateFormat = getDateFormat(pattern);
if (StringUtils.isNotBlank(timeZone)) {
dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
}
return dateFormat;
}
/**
* 自动解析时间格式并parse时间格式为yyyyMMddHHmmssS默认24小时制、前包含且必须包含yyyyMMdd.
*
* @param time time
* @return Date
* @throws ParseException ParseException
*/
public static Date parseAuto(String time) throws ParseException {
if (isNullOrEmpty(time) || time.length() < 8) {
return null;
}
initMapSign();
time = time.trim();
String formatPattern = "";
if (time.matches("[\\d]+")) { // 纯数字
String all = "yyyyMMddHHmmssSSS";
if (time.length() > all.length()) { // 超长截取
time = time.substring(0, all.length());
}
formatPattern = all.substring(0, time.length());
} else {
char next = 'y';
String idNext = "yMdHmsS";
StringBuilder buffer = new StringBuilder();
for (char var : time.toCharArray()) {
if (String.valueOf(var).matches("[0-9]")) {
buffer.append(next);
} else if ("T".equals(String.valueOf(var))) {
buffer.append("'").append(var).append("'");
} else {
buffer.append(var);
next = idNext.charAt(Math.min(idNext.indexOf(next) + 1, idNext.length() - 1));
}
}
formatPattern = buffer.toString();
}
for (Map.Entry<String, String> entry : mapSign.entrySet()) {
formatPattern = formatPattern.replaceAll(entry.getKey(), entry.getValue());
}
return parse(time, formatPattern);
}
/**
* 是否为空或"".
*
* @param param param
* @return boolean
*/
private static boolean isNullOrEmpty(String param) {
return null == param || "".equals(param.trim());
}
/**
* 日期增加num天.
*
* @param date date
* @param num 加减天数
* @return Date
*/
public static Date addDate(Date date, int num) {
return addDate(date, Calendar.DATE, num);
}
/**
* 时间增加.
*
* @param date date
* @param calendar 加减级别Calendar
* @param num 加减天数
* @return Date
*/
public static Date addDate(Date date, int calendar, int num) {
if (null == date || 0 == num) {
return date;
}
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(calendar, num);
return cal.getTime();
}
/**
* 保留日期到某一级别(天、时、分、秒....
*
* @param date date
* @param level 保留级别null保留到day
* @return date
*/
public static Date setDate(Date date, String level) {
if (null == date || null == level) {
return date;
}
Calendar cal = Calendar.getInstance();
cal.setTime(date);
switch (level) {
case LEVEL_DAY: // 保留到 Day
// cal.set(Calendar.HOUR, 0); // 12小时制
cal.set(Calendar.HOUR_OF_DAY, 0); // 24小时制
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
break;
case LEVEL_HOUR: // 保留到 Hour
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
break;
case LEVEL_MINUTE: // 保留到 MINUTE
cal.set(Calendar.SECOND, 0);
break;
case LEVEL_SECOND: // 保留到 SECOND
cal.set(Calendar.MILLISECOND, 0);
break;
default:
break;
}
return cal.getTime();
}
/**
* 比较两个日期的间隔(时间差绝对值,向下取整day、hour、minute.
*
* @param date1 date1
* @param date2 date2
* @param level 比较级别
* @return int 无对应时间间隔级别
*/
public static Integer getDateInterval(Date date1, Date date2, String level) {
Double num = dateInterval(date1, date2, level);
if (null == num) {
return null;
}
return (int) Math.floor(num);
}
/**
* 比较两个日期的间隔(时间差绝对值,向上取整day、hour、minute.
*
* @param date1 date1
* @param date2 date2
* @param level 比较级别
* @return int 无对应时间间隔级别
*/
public static Integer getDateIntervalCeil(Date date1, Date date2, String level) {
Double num = dateInterval(date1, date2, level);
if (null == num) {
return null;
}
return (int) Math.ceil(num);
}
/**
* 比较两个日期的间隔day、hour、minute.
*
* @param date1 date1
* @param date2 date2
* @param level 比较级别
* @return int 无对应时间间隔级别
*/
private static Double dateInterval(Date date1, Date date2, String level) {
Double time = (double) (date1.getTime() - date2.getTime());
if (time < 0) {
time = time * -1;
}
Double num = null;
switch (level) {
case LEVEL_DAY: // 天
num = (Double) (time / TimeUnit.DAYS.toMillis(1));
break;
case LEVEL_HOUR: // 小时
num = (Double) (time / TimeUnit.HOURS.toMillis(1));
break;
case LEVEL_MINUTE: // 分钟
num = (Double) (time / TimeUnit.MINUTES.toMillis(1));
break;
case LEVEL_SECOND: // 秒
num = (Double) (time / TimeUnit.SECONDS.toMillis(1));
break;
default:
break;
}
return num;
}
/**
* 获取当前日期指定时间.
*
* @param date date
* @param time time
* @return date
* @throws ParseException ParseException
*/
public static Date dateToHms(Date date, String time) throws ParseException {
if (null == date || isNullOrEmpty(time)) {
return date;
}
StringBuilder timeBuf = new StringBuilder();
String dateStr = formatYMd(date);
timeBuf.append(dateStr).append(" ");
time = time.trim();
while (!time.matches(".*\\d")) {
time = time.substring(0, time.length() - 1);
}
timeBuf.append(time);
if (time.matches("\\d{1,2}:\\d{1,2}:\\d{1,2}")) {
timeBuf.append(".0");
} else if (time.matches("\\d{1,2}:\\d{1,2}")) {
timeBuf.append(":00.0");
} else if (time.matches("\\d{1,2}")) {
timeBuf.append(":00:00.0");
}
return parse(timeBuf.toString(), ENUM_FORMAT_YMDS);
}
/**
* 取N天之前的时间
*
* @param beforeDays
* @return
*/
public static Date getDateBefore(int beforeDays) {
Calendar now = Calendar.getInstance();
now.setTime(new Date());
now.set(Calendar.DATE, now.get(Calendar.DATE) - beforeDays);
return now.getTime();
}
/**
* 将Date类转换为XMLGregorianCalendar.
*
* @param date date
* @return XMLGregorianCalendar
* @throws DatatypeConfigurationException DatatypeConfigurationException
*/
public static XMLGregorianCalendar dateToXmlDate(Date date) throws DatatypeConfigurationException {
XMLGregorianCalendar dateType = null;
if (null != date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
DatatypeFactory dtf = DatatypeFactory.newInstance();
dateType = dtf.newXMLGregorianCalendar();
if (null != dateType) {
dateType.setYear(cal.get(Calendar.YEAR));
// 由于Calendar.MONTH取值范围为0~11,需要加1
dateType.setMonth(cal.get(Calendar.MONTH) + 1);
dateType.setDay(cal.get(Calendar.DAY_OF_MONTH));
dateType.setHour(cal.get(Calendar.HOUR_OF_DAY));
dateType.setMinute(cal.get(Calendar.MINUTE));
dateType.setSecond(cal.get(Calendar.SECOND));
}
}
return dateType;
}
/**
* 清理ThreadLocal每次线程结束都应执行此操作.
*/
public static void clearThreadLocal() {
threadLocalDateFormat.remove();
}
/**
* 获取前一天的23点59分59秒避免
*
* @return
*/
public static String getYesterdayForSurvey() {
SimpleDateFormat dateFormat = getDateFormat(DateFormatEnum.COMMON1.getValue());
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, -1);
c.set(Calendar.HOUR_OF_DAY, 23);
c.set(Calendar.MINUTE, 59);
c.set(Calendar.SECOND, 59);
return dateFormat.format(c.getTime());
}
/**
* 获取前一天时间yyyy-mm-dd
*
* @return
*/
public static String getYesterdayForYMD() {
SimpleDateFormat dateFormat = getDateFormat(DateFormatEnum.ENUM_FORMAT_YMD.getValue());
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, -1);
return dateFormat.format(c.getTime());
}
public static Date getYesterday() {
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, -1);
c.set(Calendar.HOUR_OF_DAY, 23);
c.set(Calendar.MINUTE, 59);
c.set(Calendar.SECOND, 59);
return c.getTime();
}
public static String getLastDayMonthStr() {
LocalDate now = LocalDate.now();
LocalDate lastDay = now.minusDays(1L);
return lastDay.format(DateTimeFormatter.ofPattern("yyyyMM"));
}
private static final ConcurrentHashMap<String, Date> modifiedDate = new ConcurrentHashMap<>();
public static Date getModifiedDate(String key) {
return modifiedDate.get(key);
}
public static Date setModifiedDate(String key, Date date) {
return modifiedDate.put(key, date);
}
public static LocalDateTime getDateTimeFromStr(String dateStr) {
return getDateTimeFromStr(dateStr, "yyyy-MM-dd HH:mm:ss");
}
public static LocalDateTime getDateTimeFromStr(String dateStr, String pattern) {
return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
}
public static LocalDate getDateFromStr(String dataStr) {
return getDateFromStr(dataStr, "yyyy-MM-dd");
}
public static LocalDate getDateFromStr(String dataStr, String pattern) {
return LocalDate.parse(dataStr, DateTimeFormatter.ofPattern(pattern));
}
public static String getDateFromDate(LocalDate date) {
return getDateFromDate(date, "yyyy-MM-dd");
}
public static String getDateFromDate(LocalDate date, String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return date.format(formatter);
}
public static String getDateTimeFromDateTime(LocalDateTime dateTime) {
return getDateTimeFromDateTime(dateTime, "yyyy-MM-dd HH:mm:ss");
}
public static String getDateTimeFromDateTime(LocalDateTime dateTime, String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
return dateTime.format(formatter);
}
public static LocalDateTime getTimeFromStr(String date, String time) {
String dateTimeStr = date + " " + time;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return LocalDateTime.parse(dateTimeStr, formatter);
}
public static Boolean validWeekTime() {
if (!Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) && !Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) {
LocalTime now = LocalTime.now();
boolean inMorning = now.isAfter(LocalTime.of(9, 29)) && now.isBefore(LocalTime.of(11, 31));
boolean inAfternoon = now.isAfter(LocalTime.of(12, 59)) && now.isBefore(LocalTime.of(15, 1));
return !inAfternoon && !inMorning ? true : false;
} else {
logger.info("当前时间为:{}", LocalDateTime.now());
return true;
}
}
}

View File

@@ -73,7 +73,7 @@ public class HttpService {
CloseableHttpResponse response = null; CloseableHttpResponse response = null;
String result = ""; String result = "";
try { try {
log.info("HTTP请求请求地址===>{}, 请求头===>{}, 请求参数===>{}", url, JSON.toJSONString(header), jsonParams); log.debug("HTTP请求请求地址===>{}, 请求头===>{}, 请求参数===>{}", url, JSON.toJSONString(header), jsonParams);
HttpPost httpPost = new HttpPost(url); HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "application/json"); httpPost.addHeader("Content-Type", "application/json");
// 创建请求内容 // 创建请求内容
@@ -88,7 +88,7 @@ public class HttpService {
} }
response = httpClient.execute(httpPost); response = httpClient.execute(httpPost);
result = EntityUtils.toString(response.getEntity(), "utf-8"); result = EntityUtils.toString(response.getEntity(), "utf-8");
log.info("【POST请求】 请求地址===>{}, 响应结果==={}", url, result); log.debug("【POST请求】 请求地址===>{}, 响应结果==={}", url, result);
} catch (Exception e) { } catch (Exception e) {
log.error("doPost异常", e); log.error("doPost异常", e);
} finally { } finally {
@@ -117,10 +117,10 @@ public class HttpService {
httpGet.setHeader(entry.getKey(), entry.getValue()); httpGet.setHeader(entry.getKey(), entry.getValue());
} }
} }
log.info("doGet请求请求头:{},请求地址:{}", header, url + request); log.debug("doGet请求请求头:{},请求地址:{}", header, url + request);
response = httpClient.execute(httpGet); response = httpClient.execute(httpGet);
result = EntityUtils.toString(response.getEntity(), "utf-8"); result = EntityUtils.toString(response.getEntity(), "utf-8");
log.info("【GET请求】, 请求地址===>{}, 响应结果===>{}", url + request, result); log.debug("【GET请求】, 请求地址===>{}, 响应结果===>{}", url + request, result);
} catch (Exception e) { } catch (Exception e) {
log.error("doGet异常", e); log.error("doGet异常", e);
} finally { } finally {

View File

@@ -0,0 +1,68 @@
package com.xiang.common.utils;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Base64;
/**
* @Author: xiang
* @Date: 2026-05-08 08:56
*/
public class ImageUtils {
/**
* 将 Base64 图片写入文件
* @param base64String Base64 编码的图片字符串
* @param outputPath 输出文件路径
*/
public static void saveBase64Image(String base64String, String outputPath) {
try {
// 处理可能包含前缀的 Base64如 data:image/png;base64,
String base64Data = extractBase64Data(base64String);
// 解码 Base64
byte[] imageBytes = Base64.getDecoder().decode(base64Data);
// 写入文件
try (FileOutputStream fos = new FileOutputStream(outputPath)) {
fos.write(imageBytes);
}
System.out.println("图片已保存至: " + outputPath);
} catch (IllegalArgumentException e) {
System.err.println("Base64 解码失败: " + e.getMessage());
} catch (IOException e) {
System.err.println("文件写入失败: " + e.getMessage());
}
}
/**
* 提取纯 Base64 数据(去除前缀)
*/
private static String extractBase64Data(String base64String) {
if (base64String == null || base64String.isEmpty()) {
throw new IllegalArgumentException("Base64 字符串不能为空");
}
// 检查是否包含 data:image/xxx;base64, 前缀
if (base64String.contains(",")) {
return base64String.split(",", 2)[1];
}
return base64String;
}
/**
* 从 Base64 字符串中获取图片类型
*/
public static String getImageType(String base64String) {
if (base64String.startsWith("data:image/")) {
String type = base64String.substring(11, base64String.indexOf(";"));
return type; // 返回 png, jpeg, gif 等
}
return "png"; // 默认类型
}
public static void main(String[] args) {
}
}

View File

@@ -0,0 +1,18 @@
package com.xiang.common.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
/**
* @Author: xiang
* @Date: 2025-07-25 15:58
*/
public class JsonUtils {
public static String toJsonString(Object obj) {
return JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue);
}
public static <T> T parse(String json, Class<T> clazz) {
return JSON.parseObject(json, clazz);
}
}

View File

@@ -0,0 +1,169 @@
package com.xiang.common.utils;
import cn.hutool.http.HttpRequest;
import com.xiang.common.handler.CallbackHandler;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import javax.net.ssl.*;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Slf4j
public class OkHttpUtil {
private static final String secretId = "o82qrnb4z0s8y6j9qvyw";
private static final String signature = "p93f1o4fn6zht9sa6aryu9wpfp2el8dm";
private static final String urlString = "https://dps.kdlapi.com/api/getdps/?secret_id=" + secretId + "&signature=" + signature + "&num=1&format=text&sep=1";
// 用户名密码认证(私密代理/独享代理)
static final String username = "d2859987908";
static final String password = "1auxzpkz";
// 单例实例
private static final OkHttpUtil INSTANCE;
static {
try {
INSTANCE = new OkHttpUtil();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
} catch (KeyManagementException e) {
throw new RuntimeException(e);
}
}
// OkHttpClient 实例
private final OkHttpClient client;
// 私有构造方法,初始化 OkHttpClient
private OkHttpUtil() throws NoSuchAlgorithmException, KeyManagementException {
// 创建一个信任所有证书的TrustManager
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
};
// 初始化SSLContext
final SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// 创建一个信任所有主机名的HostnameVerifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
// 2. 配置连接池(关键参数)
ConnectionPool pool = new ConnectionPool(
5, // 最大空闲连接数(根据服务器承受能力调整)
5, // 存活时间(分钟)
TimeUnit.MINUTES
);
client = new OkHttpClient.Builder()
.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0])
.hostnameVerifier(allHostsValid)
.connectionPool(pool)
.connectTimeout(60, TimeUnit.SECONDS) // 连接超时时间
.readTimeout(60, TimeUnit.SECONDS) // 读取超时时间
.writeTimeout(60, TimeUnit.SECONDS) // 写入超时时间
.retryOnConnectionFailure(true) // 自动重试
.protocols(Arrays.asList(Protocol.HTTP_2, Protocol.HTTP_1_1)) // 协议优先级
.build();
}
public OkHttpUtil(OkHttpClient client){
this.client = client;
}
// 获取单例实例
public static OkHttpUtil getInstance() {
return INSTANCE;
}
/**
* 发送 GET 请求
*
* @param url 请求URL
* @param headers 请求头(可以为空)
* @return 响应结果
* @throws IOException 请求失败时抛出异常
*/
public String get(String url, Map<String, String> headers) throws IOException {
Request.Builder builder = new Request.Builder().url(url);
// 添加请求头
if (headers != null) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
builder.addHeader(entry.getKey(), entry.getValue());
}
}
Request request = builder.build();
try (Response response = client.newCall(request).execute()) {
String string = response.body().string();
if (!response.isSuccessful()) {
log.error("{}okhttp请求失败: {}-->", url, string);
}
return string;
}
}
/**
* 发送 POST 请求JSON 格式)
*
* @param url 请求URL
* @param headers 请求头(可以为空)
* @param json JSON 请求体
* @return 响应结果
* @throws IOException 请求失败时抛出异常
*/
public String postJson(String url, Map<String, String> headers, String json) throws IOException {
RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8"));
Request.Builder builder = new Request.Builder()
.url(url)
.post(body)
.addHeader("User-Agent", "BookingClient/1.0");
// 添加请求头
if (headers != null) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
builder.addHeader(entry.getKey(), entry.getValue());
}
}
Request request = builder.build();
try (Response response = client.newCall(request).execute()) {
String string = response.body().string();
if (!response.isSuccessful()) {
log.error("{}okhttp请求失败: {}-->", url, string);
return string;
}
return string;
}
}
}

Some files were not shown because too many files have changed in this diff Show More