From 7fce8c91f251b636e6c1b3b83be86408adc9a8de Mon Sep 17 00:00:00 2001 From: Xiang Date: Tue, 16 Dec 2025 10:57:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E8=AE=A2=E5=8D=95=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jntyzx/constants/RedisKeyConstant.java | 10 +++ .../script/jntyzx/constants/UrlConstant.java | 5 ++ .../jntyzx/controller/VenueController.java | 33 +++++++++- .../jntyzx/entity/resp/OrderCreateResp.java | 18 +++++ .../jntyzx/service/IJntyzxHttpService.java | 2 +- .../jntyzx/service/IUserTokenInfoService.java | 1 + .../jntyzx/service/JntyzxHttpServiceImpl.java | 65 +++++++++++++++++-- .../service/UserTokenInfoServiceImpl.java | 9 +++ .../script/jntyzx/utils/VenueInfoUtils.java | 22 +++++++ 9 files changed, 154 insertions(+), 11 deletions(-) create mode 100644 script/src/main/java/com/xiang/xservice/application/script/jntyzx/constants/RedisKeyConstant.java create mode 100644 script/src/main/java/com/xiang/xservice/application/script/jntyzx/entity/resp/OrderCreateResp.java create mode 100644 script/src/main/java/com/xiang/xservice/application/script/jntyzx/utils/VenueInfoUtils.java diff --git a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/constants/RedisKeyConstant.java b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/constants/RedisKeyConstant.java new file mode 100644 index 0000000..3b1aeb2 --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/constants/RedisKeyConstant.java @@ -0,0 +1,10 @@ +package com.xiang.xservice.application.script.jntyzx.constants; + +/** + * @Author: xiang + * @Date: 2025-12-16 10:43 + */ +public class RedisKeyConstant { + + public static final String JNTYZX_ORDER_CREATE_KEY = "jntyzx:order:create:orderId:"; +} diff --git a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/constants/UrlConstant.java b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/constants/UrlConstant.java index 77d8f8a..e7e87ae 100644 --- a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/constants/UrlConstant.java +++ b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/constants/UrlConstant.java @@ -22,6 +22,11 @@ public class UrlConstant { */ 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"; + /** * 心跳监测接口 */ diff --git a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/controller/VenueController.java b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/controller/VenueController.java index 9d9ead6..e515825 100644 --- a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/controller/VenueController.java +++ b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/controller/VenueController.java @@ -2,15 +2,22 @@ package com.xiang.xservice.application.script.jntyzx.controller; import com.xiang.xservice.application.script.jntyzx.entity.pojo.VenueInfoDO; import com.xiang.xservice.application.script.jntyzx.entity.resp.query.SitePositionList; -import com.xiang.xservice.application.script.jntyzx.service.IVenueService; +import com.xiang.xservice.application.script.jntyzx.service.DingTalkScriptVenueService; import com.xiang.xservice.application.script.jntyzx.service.IJntyzxHttpService; +import com.xiang.xservice.application.script.jntyzx.service.IUserTokenInfoService; +import com.xiang.xservice.application.script.jntyzx.service.IVenueService; +import com.xiang.xservice.application.script.jntyzx.utils.VenueInfoUtils; import com.xiang.xservice.basic.common.resp.Result; import lombok.RequiredArgsConstructor; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @Author: xiang @@ -22,6 +29,8 @@ public class VenueController { private final IVenueService venueService; private final IJntyzxHttpService jntyzxHttpService; + private final IUserTokenInfoService userTokenInfoService; + private final DingTalkScriptVenueService dingTalkScriptVenueService; private final static String STATIC_TOKEN = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NjU3ODQ1NjMsInVzZXJuYW1lIjoid3hfb3Blbl9pZF9vMjFNWDR5N3doWENHanZVVEdQNkNUejJIYkQ4In0.QBzNQNvJZQPZZnzmbU8K5Liz0piHwercrDIq3kirUJk"; @@ -37,13 +46,31 @@ public class VenueController { return Result.success(sitePositionLists); } - @PostMapping("addSubscribe") + @PostMapping("/addSubscribe") public Result addSubscribe() { List venueInfoDOS = venueService.queryCanBuyVenue(); if (CollectionUtils.isEmpty(venueInfoDOS)) { return Result.error("暂无可订购的数据"); } - jntyzxHttpService.createOrder(venueInfoDOS); + Map> map = venueInfoDOS.stream().filter(VenueInfoUtils::get1221VenueInfo4Mor).collect(Collectors.groupingBy(VenueInfoDO::getPlaceName)); + String token = userTokenInfoService.getToken("Xiang"); + if (StringUtils.isBlank(token)) { + return Result.error("暂无可订购的用户"); + } + for (String placeName : map.keySet()) { + List venueInfoDOList = map.get(placeName); + Boolean order = jntyzxHttpService.createOrder(venueInfoDOList, token); + if (order) { + dingTalkScriptVenueService.sendScriptMsg("场地:" + placeName + "下单成功,请付款!时间:" + LocalDateTime.now()); + } + } +// map.keySet().forEach(placeName -> { +// List venueInfoDOList = map.get(placeName); +// Boolean order = jntyzxHttpService.createOrder(venueInfoDOList, token); +// if (order) { +// dingTalkScriptVenueService.sendScriptMsg("场地:" + placeName + "下单成功,请付款!时间:" + LocalDateTime.now()); +// } +// }); return Result.success(); } diff --git a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/entity/resp/OrderCreateResp.java b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/entity/resp/OrderCreateResp.java new file mode 100644 index 0000000..3286d5b --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/entity/resp/OrderCreateResp.java @@ -0,0 +1,18 @@ +package com.xiang.xservice.application.script.jntyzx.entity.resp; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: xiang + * @Date: 2025-12-16 10:36 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class OrderCreateResp { + + private String id; + private String countDownNum; +} diff --git a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/IJntyzxHttpService.java b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/IJntyzxHttpService.java index 7b402fc..90604f5 100644 --- a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/IJntyzxHttpService.java +++ b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/IJntyzxHttpService.java @@ -22,7 +22,7 @@ public interface IJntyzxHttpService { * 订单创建 * @return */ - Boolean createOrder(List venueInfos); + Boolean createOrder(List venueInfos, String token); /** * 心跳监测 diff --git a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/IUserTokenInfoService.java b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/IUserTokenInfoService.java index 7ad0c33..d490e95 100644 --- a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/IUserTokenInfoService.java +++ b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/IUserTokenInfoService.java @@ -6,6 +6,7 @@ package com.xiang.xservice.application.script.jntyzx.service; */ public interface IUserTokenInfoService { + String getToken(String name); boolean flushSingleToken(String name); boolean flushToken(); } diff --git a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/JntyzxHttpServiceImpl.java b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/JntyzxHttpServiceImpl.java index b8e8234..52943d1 100644 --- a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/JntyzxHttpServiceImpl.java +++ b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/JntyzxHttpServiceImpl.java @@ -2,17 +2,22 @@ package com.xiang.xservice.application.script.jntyzx.service; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.xiang.xmc.service.cache.service.IRedisService; import com.xiang.xmc.service.http.helper.HttpHelper; +import com.xiang.xservice.application.script.jntyzx.constants.RedisKeyConstant; import com.xiang.xservice.application.script.jntyzx.constants.UrlConstant; import com.xiang.xservice.application.script.jntyzx.entity.pojo.VenueInfoDO; import com.xiang.xservice.application.script.jntyzx.entity.req.SubscribeRequest; import com.xiang.xservice.application.script.jntyzx.entity.req.SubscribeVo; import com.xiang.xservice.application.script.jntyzx.entity.resp.JntyzxResponse; +import com.xiang.xservice.application.script.jntyzx.entity.resp.OrderCreateResp; import com.xiang.xservice.application.script.jntyzx.entity.resp.query.SitePositionList; import com.xiang.xservice.application.script.jntyzx.entity.resp.query.VenueList; import com.xiang.xservice.basic.utils.Base64; +import com.xiang.xservice.basic.utils.JsonUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -21,6 +26,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.nio.charset.StandardCharsets; +import java.time.LocalDate; import java.util.List; import java.util.Map; import java.util.Objects; @@ -34,6 +40,8 @@ import java.util.Objects; @Slf4j public class JntyzxHttpServiceImpl implements IJntyzxHttpService { + private final IRedisService redisService; + @Override public List queryAvailable(String isWeekend, String token) { String url = UrlConstant.QUERY_TODAY_SUBSCRIBE_URL; @@ -96,7 +104,7 @@ public class JntyzxHttpServiceImpl implements IJntyzxHttpService { } @Override - public Boolean createOrder(List venueInfos) { + public Boolean createOrder(List venueInfos, String token) { List vos = Lists.newArrayList(); for (VenueInfoDO venueInfo : venueInfos) { @@ -110,7 +118,7 @@ public class JntyzxHttpServiceImpl implements IJntyzxHttpService { subscribeVo.setType("0"); subscribeVo.setClassName(venueInfo.getClassName()); subscribeVo.setClassCode(venueInfo.getClassCode()); - subscribeVo.setMoney(venueInfo.getMoney()); + subscribeVo.setMoney(venueInfo.getMoney().setScale(0)); subscribeVo.setContacts("0"); subscribeVo.setContactNumber(null); subscribeVo.setMemberNumber(null); @@ -132,15 +140,32 @@ public class JntyzxHttpServiceImpl implements IJntyzxHttpService { subscribeRequest.setSubscribeVos(vos); subscribeRequest.setBookTime(venueInfos.get(0).getAppointments()); subscribeRequest.setPaymentMethod(1); - subscribeRequest.setSvCiphertext(Base64.encode(JSON.toJSONString(vos).getBytes(StandardCharsets.UTF_8))); + subscribeRequest.setSvCiphertext(sonAddSalt(JsonUtils.toJsonString(vos))); subscribeRequest.setJsonObject(jsonObject); Map params = Maps.newHashMap(); - params.put("X-Access-Token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NjU3ODQ1NjMsInVzZXJuYW1lIjoid3hfb3Blbl9pZF9vMjFNWDR5N3doWENHanZVVEdQNkNUejJIYkQ4In0.QBzNQNvJZQPZZnzmbU8K5Liz0piHwercrDIq3kirUJk"); - String resp = HttpHelper.doPost(UrlConstant.ADD_SUBSCRIBE, params, JSONObject.toJSONString(subscribeRequest)); - return null; + params.put("X-Access-Token", token); + String resp = HttpHelper.doPost(UrlConstant.ADD_SUBSCRIBE, params, JsonUtils.toJsonString(subscribeRequest)); + if (StringUtils.isBlank(resp)) { + log.info("请求结果为空"); + return false; + } + JntyzxResponse response = JSON.parseObject(resp, new TypeReference>() { + }); + if (Objects.isNull(response)) { + log.info("请求结果为空"); + return false; + } + if (response.getSuccess()) { + OrderCreateResp createResp = response.getResult(); + if (Objects.nonNull(createResp)) { + String orderId = createResp.getId(); + redisService.set(RedisKeyConstant.JNTYZX_ORDER_CREATE_KEY + orderId, String.valueOf(System.currentTimeMillis())); + return true; + } + } + return false; } - @Override public JntyzxResponse healthDeclaration(String token, String openId) { Map headers = Maps.newHashMap(); @@ -175,4 +200,30 @@ public class JntyzxHttpServiceImpl implements IJntyzxHttpService { jsonObject.put("default05", null); return jsonObject; } + + private static int[] getMonthAndDay() { + LocalDate currentDate = LocalDate.now(); + int month = currentDate.getMonthValue(); + int day = currentDate.getDayOfMonth(); + return new int[]{month, day}; + } + + private String sonAddSalt(String json) { + String svCiphertext = ""; + String suiji = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + String token1 = String.valueOf(suiji.charAt((int) (Math.random() * (double) suiji.length()))); + String token2 = String.valueOf(suiji.charAt((int) (Math.random() * (double) suiji.length()))); + svCiphertext = Base64.encode(json.getBytes(StandardCharsets.UTF_8)); + int[] monthAndDay = getMonthAndDay(); + int month = monthAndDay[0]; + int day = monthAndDay[1]; + if (month == 1) { + svCiphertext = (svCiphertext = token1 + svCiphertext).substring(0, day - 1) + token2 + svCiphertext.substring(day - 1); + } else if (day == 1) { + svCiphertext = token2 + svCiphertext.substring(0, month - 1) + token1 + svCiphertext.substring(month - 1); + } else { + svCiphertext = (svCiphertext = svCiphertext.substring(0, month - 1) + token1 + svCiphertext.substring(month - 1)).substring(0, day - 1) + token2 + svCiphertext.substring(day - 1); + } + return svCiphertext; + } } diff --git a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/UserTokenInfoServiceImpl.java b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/UserTokenInfoServiceImpl.java index 6737388..d0c2960 100644 --- a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/UserTokenInfoServiceImpl.java +++ b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/service/UserTokenInfoServiceImpl.java @@ -26,6 +26,15 @@ public class UserTokenInfoServiceImpl implements IUserTokenInfoService { private final DingTalkScriptVenueService dingTalkScriptVenueService; + @Override + public String getToken(String name) { + UserTokenInfoDO userTokenInfoDO = userTokenInfoManage.getByName(name); + if (Objects.isNull(userTokenInfoDO)) { + return null; + } + return userTokenInfoDO.getToken(); + } + @Override public boolean flushSingleToken(String name) { UserTokenInfoDO userTokenInfoDO = userTokenInfoManage.getByName(name); diff --git a/script/src/main/java/com/xiang/xservice/application/script/jntyzx/utils/VenueInfoUtils.java b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/utils/VenueInfoUtils.java new file mode 100644 index 0000000..39a105b --- /dev/null +++ b/script/src/main/java/com/xiang/xservice/application/script/jntyzx/utils/VenueInfoUtils.java @@ -0,0 +1,22 @@ +package com.xiang.xservice.application.script.jntyzx.utils; + +import com.xiang.xservice.application.script.jntyzx.entity.pojo.VenueInfoDO; +import org.apache.commons.lang3.StringUtils; + +/** + * @Author: xiang + * @Date: 2025-12-16 09:55 + */ +public class VenueInfoUtils { + + public static boolean get123VenueInfo4Mor(VenueInfoDO venueInfoDO) { + return StringUtils.equals(venueInfoDO.getSjName(), "13:00-14:00") || StringUtils.equals(venueInfoDO.getSjName(), "14:00-15:00"); + } + public static boolean get1221VenueInfo4Mor(VenueInfoDO venueInfoDO) { + return StringUtils.equals(venueInfoDO.getSjName(), "12:00-13:00") || StringUtils.equals(venueInfoDO.getSjName(), "13:00-14:00"); + } + + public static boolean get8210VenueInfo(VenueInfoDO venueInfoDO) { + return StringUtils.equals(venueInfoDO.getSjName(), "20:00-21:00") || StringUtils.equals(venueInfoDO.getSjName(), "21:00-22:00"); + } +}