diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/AttendanceServiceImpl.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/AttendanceServiceImpl.java index 1700c0f01..867c1b742 100644 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/AttendanceServiceImpl.java +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/AttendanceServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; +import com.alibaba.nacos.shaded.com.google.common.util.concurrent.RateLimiter; import com.czg.account.entity.ShopConfig; import com.czg.account.service.ShopConfigService; import com.czg.market.service.AttendanceService; @@ -52,17 +53,17 @@ public class AttendanceServiceImpl implements AttendanceService { } // 自定义规则:1-5 → 数字, 6 → 六, 7 → 日 - private static String formatWeek(String week) { - return switch (week) { - case "星期一" -> "1"; - case "星期二" -> "2"; - case "星期三" -> "3"; - case "星期四" -> "4"; - case "星期五" -> "5"; + private static String formatWeek(DateTime dateTime) { + String chinese = DateUtil.dayOfWeekEnum(dateTime).toChinese(); + String week = switch (chinese) { case "星期六" -> "六"; case "星期日" -> "日"; - default -> week; + default -> null; }; + if (week == null) { + week = String.valueOf(DateUtil.dayOfMonth(dateTime)); + } + return week; } @Override @@ -71,9 +72,12 @@ public class AttendanceServiceImpl implements AttendanceService { ArrayList> weekList = new ArrayList<>(); DateTime dateTime = StrUtil.isBlank(endTime) ? DateUtil.date() : DateUtil.parse(endTime); - for (int i = 7 * weekNum; i < 15 + 7 * weekNum; i++) { - DateTime date = DateUtil.offsetDay(dateTime, (15 - i + 1) * -1); - String week = formatWeek(DateUtil.dayOfWeekEnum(date).toChinese()); + + int start = DateUtil.dayOfMonth(StrUtil.isBlank(startTime) ? DateUtil.beginOfMonth(dateTime) : DateUtil.parse(startTime)); + int end = DateUtil.dayOfMonth(dateTime); + for (int i = start; i <= end; i++) { + DateTime date = DateUtil.offsetDay(StrUtil.isBlank(startTime) ? DateUtil.beginOfMonth(dateTime) : DateUtil.parse(startTime), i - 1); + String week = formatWeek(date); weekList.add(new HashMap<>(){{ put("week", week); put("date", date); @@ -96,8 +100,19 @@ public class AttendanceServiceImpl implements AttendanceService { }}; } ConcurrentLinkedDeque statusList = new ConcurrentLinkedDeque<>(); + RateLimiter rateLimiter = RateLimiter.create(15.0); // 每秒15次 + weekList.parallelStream().forEach(week -> { - statusList.add(dingService.getAttendanceStatus(config.getDingAppKey(), config.getDingAppSecret(), shopId, (Date) week.get("date"), userId)); + rateLimiter.acquire(); // 阻塞直到获取令牌(保证限流) + statusList.add( + dingService.getAttendanceStatus( + config.getDingAppKey(), + config.getDingAppSecret(), + shopId, + (Date) week.get("date"), + userId + ) + ); }); return Map.of( diff --git a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/DingService.java b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/DingService.java index 44df7d2f0..9d9887ebc 100644 --- a/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/DingService.java +++ b/cash-service/market-service/src/main/java/com/czg/service/market/service/impl/DingService.java @@ -167,6 +167,7 @@ public class DingService { req.setUserid(userId); req.setWorkDate(date); OapiAttendanceGetupdatedataResponse rsp = client.execute(req, getToken(key, secret, shopId)); + System.out.println(rsp.getBody()); JSONArray resultList = JSONObject.parseObject(rsp.getBody()).getJSONObject("result").getJSONArray("attendance_result_list"); if (resultList.isEmpty()) { status = "休息日";