From 01993779a7adb587a732b03da21f7f3a10a2f16a Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Fri, 18 Sep 2026 16:31:37 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=96=B0=E5=A2=9E=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=202=E3=80=81?= =?UTF-8?q?=E8=B0=83=E6=95=B4OA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blade-auth/pom.xml | 4 + .../auth/constant/BladeAuthConstant.java | 6 + .../OAuth2UserInfoResponseAdvice.java | 94 ++ .../auth/endpoint/OAuth2UserInfoVO.java | 55 + .../auth/endpoint/Oauth2SmsEndpoint.java | 15 +- .../auth/granter/SmsTokenGranter.java | 9 +- .../auth/granter/WechatMiniTokenGranter.java | 102 ++ .../service/BladeClientDetailService.java | 15 +- .../gateway/provider/AuthProvider.java | 1 + .../springblade/system/feign/ISysClient.java | 10 + .../system/feign/ISysClientFallback.java | 5 + .../system/pojo/vo/OaPersonSyncPageVO.java | 66 + .../pojo/vo/AdminDriverOptionVO.java | 30 + .../transport/pojo/vo/AdminHomeBadgesVO.java | 47 + .../transport/pojo/vo/AdminHomeStatsVO.java | 53 + .../transport/pojo/vo/AdminHomeVO.java | 55 + .../transport/pojo/vo/AdminTodoItemVO.java | 65 + .../pojo/vo/AdminVehicleOptionVO.java | 24 + .../transport/pojo/vo/AdminWaybillCardVO.java | 95 ++ .../pojo/vo/AdminWaybillDetailVO.java | 154 ++ .../pojo/vo/DriverWaybillCardVO.java | 51 + .../springblade/system/feign/IUserClient.java | 15 + .../system/pojo/dto/PhoneChangeDTO.java | 54 + .../system/pojo/dto/PhoneVerifyDTO.java | 51 + blade-service/blade-system/pom.xml | 4 + .../system/controller/UserController.java | 27 +- .../controller/UserPhoneController.java | 93 ++ .../system/convert/UserConvert.java | 28 +- .../springblade/system/feign/SysClient.java | 6 + .../springblade/system/feign/UserClient.java | 6 + .../system/service/IMenuService.java | 8 + .../system/service/IOASyncService.java | 18 + .../system/service/IUserPhoneService.java | 63 + .../system/service/IUserService.java | 5 + .../system/service/impl/MenuServiceImpl.java | 29 + .../service/impl/OASyncServiceImpl.java | 293 ++-- .../service/impl/OaUserListSyncHelper.java | 609 ++++++++ .../service/impl/UserPhoneServiceImpl.java | 212 +++ .../system/service/impl/UserServiceImpl.java | 40 + .../ExceptionDisposalController.java | 12 +- .../controller/ManageWaybillController.java | 143 ++ .../service/IDriverWaybillService.java | 6 + .../service/IManageWaybillService.java | 90 ++ .../transport/service/IWaybillService.java | 6 + .../impl/DriverWaybillServiceImpl.java | 74 +- .../impl/ManageWaybillServiceImpl.java | 642 ++++++++ .../service/impl/WaybillServiceImpl.java | 12 +- .../oa/config/OAFeignClientConfig.java | 23 +- .../oa/constant/OAConvertConstant.java | 4 + .../thirdparty/oa/feign/IOAClient.java | 2 +- .../blade-wechat-api/pom.xml | 27 + .../ThirdPartyWechatAutoConfiguration.java | 14 + .../wechat/config/WechatMiniProperties.java | 28 + .../wechat/constant/WechatMiniConstant.java | 20 + .../wechat/exception/WechatMiniException.java | 16 + .../wechat/pojo/vo/WechatPhoneVO.java | 25 + .../wechat/pojo/vo/WechatSessionVO.java | 21 + .../wechat/service/IWechatMiniService.java | 21 + .../service/impl/WechatMiniServiceImpl.java | 148 ++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + blade-third-party-api/pom.xml | 1 + doc/nacos/blade-dev.yaml | 6 + doc/nacos/blade-prod.yaml | 5 + doc/nacos/blade.yaml | 3 + doc/nacos/routes/blade-gateway-dev.json | 22 + doc/nacos/third-party-api.yaml | 6 + doc/sql/update/add-mp-auth-permission.sql | 21 + .../update/add-wechat-applet-grant-type.sql | 8 + hs_err_pid22077.log | 1379 +++++++++++++++++ hs_err_pid40988.log | 1368 ++++++++++++++++ pom.xml | 5 + 71 files changed, 6463 insertions(+), 213 deletions(-) create mode 100644 blade-auth/src/main/java/org/springblade/auth/endpoint/OAuth2UserInfoResponseAdvice.java create mode 100644 blade-auth/src/main/java/org/springblade/auth/endpoint/OAuth2UserInfoVO.java create mode 100644 blade-auth/src/main/java/org/springblade/auth/granter/WechatMiniTokenGranter.java create mode 100644 blade-service-api/blade-system-api/src/main/java/org/springblade/system/pojo/vo/OaPersonSyncPageVO.java create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminDriverOptionVO.java create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminHomeBadgesVO.java create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminHomeStatsVO.java create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminHomeVO.java create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminTodoItemVO.java create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminVehicleOptionVO.java create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminWaybillCardVO.java create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminWaybillDetailVO.java create mode 100644 blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/dto/PhoneChangeDTO.java create mode 100644 blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/dto/PhoneVerifyDTO.java create mode 100644 blade-service/blade-system/src/main/java/org/springblade/system/controller/UserPhoneController.java create mode 100644 blade-service/blade-system/src/main/java/org/springblade/system/service/IUserPhoneService.java create mode 100644 blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OaUserListSyncHelper.java create mode 100644 blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserPhoneServiceImpl.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ManageWaybillController.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/service/IManageWaybillService.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ManageWaybillServiceImpl.java create mode 100644 blade-third-party-api/blade-wechat-api/pom.xml create mode 100644 blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/config/ThirdPartyWechatAutoConfiguration.java create mode 100644 blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/config/WechatMiniProperties.java create mode 100644 blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/constant/WechatMiniConstant.java create mode 100644 blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/exception/WechatMiniException.java create mode 100644 blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/pojo/vo/WechatPhoneVO.java create mode 100644 blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/pojo/vo/WechatSessionVO.java create mode 100644 blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/service/IWechatMiniService.java create mode 100644 blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/service/impl/WechatMiniServiceImpl.java create mode 100644 blade-third-party-api/blade-wechat-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 doc/sql/update/add-mp-auth-permission.sql create mode 100644 doc/sql/update/add-wechat-applet-grant-type.sql create mode 100644 hs_err_pid22077.log create mode 100644 hs_err_pid40988.log diff --git a/blade-auth/pom.xml b/blade-auth/pom.xml index 5640463..8bfe4ea 100644 --- a/blade-auth/pom.xml +++ b/blade-auth/pom.xml @@ -75,6 +75,10 @@ org.springblade blade-mk-api + + org.springblade + blade-wechat-api + org.springblade blade-resource-api diff --git a/blade-auth/src/main/java/org/springblade/auth/constant/BladeAuthConstant.java b/blade-auth/src/main/java/org/springblade/auth/constant/BladeAuthConstant.java index b9c8420..b8f8ed3 100644 --- a/blade-auth/src/main/java/org/springblade/auth/constant/BladeAuthConstant.java +++ b/blade-auth/src/main/java/org/springblade/auth/constant/BladeAuthConstant.java @@ -32,4 +32,10 @@ package org.springblade.auth.constant; */ public interface BladeAuthConstant { + /** + * 小程序/登录短信验证码资源编号(对应后台 /resource/sms 的 smsCode) + */ + String LOGIN_SMS_CODE = "ali_reg"; + } + diff --git a/blade-auth/src/main/java/org/springblade/auth/endpoint/OAuth2UserInfoResponseAdvice.java b/blade-auth/src/main/java/org/springblade/auth/endpoint/OAuth2UserInfoResponseAdvice.java new file mode 100644 index 0000000..8e207ad --- /dev/null +++ b/blade-auth/src/main/java/org/springblade/auth/endpoint/OAuth2UserInfoResponseAdvice.java @@ -0,0 +1,94 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.auth.endpoint; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.oauth2.endpoint.OAuth2TokenEndPoint; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.system.feign.ISysClient; +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +import java.util.Collections; +import java.util.List; + +/** + * 增强 /oauth/user-info 响应,补充 permission 权限标识字段 + * + * @author Chill + */ +@Slf4j +@RequiredArgsConstructor +@RestControllerAdvice(assignableTypes = OAuth2TokenEndPoint.class) +public class OAuth2UserInfoResponseAdvice implements ResponseBodyAdvice { + + private final ISysClient sysClient; + + @Override + public boolean supports(MethodParameter returnType, Class> converterType) { + return returnType.getMethod() != null && "userInfo".equals(returnType.getMethod().getName()); + } + + @Override + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, + Class> selectedConverterType, + ServerHttpRequest request, ServerHttpResponse response) { + if (!(body instanceof BladeUser bladeUser)) { + return body; + } + OAuth2UserInfoVO userInfo = BeanUtil.copyProperties(bladeUser, OAuth2UserInfoVO.class); + if (userInfo == null) { + return body; + } + userInfo.setPermission(loadPermission(bladeUser.getRoleId())); + return userInfo; + } + + private List loadPermission(String roleId) { + if (Func.isBlank(roleId)) { + return Collections.emptyList(); + } + try { + R> result = sysClient.getPermissions(roleId); + if (result != null && result.isSuccess() && result.getData() != null) { + return result.getData(); + } + } catch (Exception exception) { + log.warn("加载用户权限标识失败, roleId={}", roleId, exception); + } + return Collections.emptyList(); + } + +} diff --git a/blade-auth/src/main/java/org/springblade/auth/endpoint/OAuth2UserInfoVO.java b/blade-auth/src/main/java/org/springblade/auth/endpoint/OAuth2UserInfoVO.java new file mode 100644 index 0000000..528a490 --- /dev/null +++ b/blade-auth/src/main/java/org/springblade/auth/endpoint/OAuth2UserInfoVO.java @@ -0,0 +1,55 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.auth.endpoint; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.secure.BladeUser; + +import java.io.Serial; +import java.util.List; + +/** + * OAuth用户信息(含权限标识,供小程序等客户端使用) + * + * @author Chill + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "OAuth用户信息") +public class OAuth2UserInfoVO extends BladeUser { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 权限标识集合(菜单按钮 code) + */ + @Schema(description = "权限标识集合") + private List permission; + +} diff --git a/blade-auth/src/main/java/org/springblade/auth/endpoint/Oauth2SmsEndpoint.java b/blade-auth/src/main/java/org/springblade/auth/endpoint/Oauth2SmsEndpoint.java index 878c526..b48ac80 100644 --- a/blade-auth/src/main/java/org/springblade/auth/endpoint/Oauth2SmsEndpoint.java +++ b/blade-auth/src/main/java/org/springblade/auth/endpoint/Oauth2SmsEndpoint.java @@ -28,13 +28,14 @@ package org.springblade.auth.endpoint; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import lombok.SneakyThrows; +import org.springblade.auth.constant.BladeAuthConstant; import org.springblade.core.oauth2.props.OAuth2Properties; import org.springblade.core.oauth2.provider.OAuth2Request; import org.springblade.core.oauth2.service.OAuth2User; import org.springblade.core.oauth2.service.OAuth2UserService; import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.SM2Util; -import org.springblade.core.tool.utils.StringPool; import org.springblade.core.tool.utils.StringUtil; import org.springblade.resource.feign.ISmsClient; import org.springblade.resource.utils.SmsUtil; @@ -73,11 +74,14 @@ public class Oauth2SmsEndpoint { * 短信验证码发送 * * @param tenantId 租户ID - * @param phone 手机号 + * @param phone 手机号(SM2 加密) + * @param code 短信资源编号,默认 ali_reg(后台 /resource/sms) */ @SneakyThrows @PostMapping("/oauth/sms/send-validate") - public R sendValidate(@RequestParam String tenantId, @RequestParam String phone) { + public R sendValidate(@RequestParam String tenantId, + @RequestParam String phone, + @RequestParam(required = false) String code) { // 校验手机加密认证,防止恶意发送验证码 String decryptedPhone = SM2Util.decrypt(phone, properties.getPublicKey(), properties.getPrivateKey()); if (StringUtil.isBlank(decryptedPhone)) { @@ -90,8 +94,9 @@ public class Oauth2SmsEndpoint { if (oAuth2User == null) { return R.fail(USER_PHONE_NOT_FOUND); } - // 用户存在则发送验证码 - R result = smsClient.sendValidate(tenantId, StringPool.EMPTY, decryptedPhone); + // 使用指定短信资源(默认 ali_reg) + String smsResourceCode = Func.toStr(code, BladeAuthConstant.LOGIN_SMS_CODE); + R result = smsClient.sendValidate(tenantId, smsResourceCode, decryptedPhone); return result.isSuccess() ? R.data(result.getData(), SmsUtil.SEND_SUCCESS) : R.fail(SmsUtil.SEND_FAIL); } diff --git a/blade-auth/src/main/java/org/springblade/auth/granter/SmsTokenGranter.java b/blade-auth/src/main/java/org/springblade/auth/granter/SmsTokenGranter.java index 0c37eee..540095c 100644 --- a/blade-auth/src/main/java/org/springblade/auth/granter/SmsTokenGranter.java +++ b/blade-auth/src/main/java/org/springblade/auth/granter/SmsTokenGranter.java @@ -26,6 +26,7 @@ package org.springblade.auth.granter; import jakarta.servlet.http.HttpServletRequest; +import org.springblade.auth.constant.BladeAuthConstant; import org.springblade.core.oauth2.constant.OAuth2TokenConstant; import org.springblade.core.oauth2.exception.UserInvalidException; import org.springblade.core.oauth2.granter.AbstractTokenGranter; @@ -37,8 +38,8 @@ import org.springblade.core.oauth2.service.OAuth2User; import org.springblade.core.oauth2.service.OAuth2UserService; import org.springblade.core.sms.model.SmsCode; import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.SM2Util; -import org.springblade.core.tool.utils.StringPool; import org.springblade.core.tool.utils.StringUtil; import org.springblade.core.tool.utils.WebUtil; import org.springblade.resource.feign.ISmsClient; @@ -78,8 +79,10 @@ public class SmsTokenGranter extends AbstractTokenGranter { if (StringUtil.isBlank(decryptedPhone)) { throw new UserInvalidException(OAuth2TokenConstant.USER_PHONE_NOT_FOUND); } - // 获取短信验证信息 - R result = smsClient.validateMessage(tenantId, StringPool.EMPTY, smsCode.getId(), smsCode.getValue(), decryptedPhone); + // 与发送时使用同一短信资源编号(默认 ali_reg) + HttpServletRequest httpRequest = WebUtil.getRequest(); + String smsResourceCode = Func.toStr(httpRequest.getParameter("code"), BladeAuthConstant.LOGIN_SMS_CODE); + R result = smsClient.validateMessage(tenantId, smsResourceCode, smsCode.getId(), smsCode.getValue(), decryptedPhone); if (!result.isSuccess()) { throw new UserInvalidException(OAuth2TokenConstant.CAPTCHA_NOT_CORRECT); } diff --git a/blade-auth/src/main/java/org/springblade/auth/granter/WechatMiniTokenGranter.java b/blade-auth/src/main/java/org/springblade/auth/granter/WechatMiniTokenGranter.java new file mode 100644 index 0000000..1bdd67b --- /dev/null +++ b/blade-auth/src/main/java/org/springblade/auth/granter/WechatMiniTokenGranter.java @@ -0,0 +1,102 @@ +package org.springblade.auth.granter; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.oauth2.exception.UserInvalidException; +import org.springblade.core.oauth2.granter.AbstractTokenGranter; +import org.springblade.core.oauth2.handler.PasswordHandler; +import org.springblade.core.oauth2.provider.OAuth2Request; +import org.springblade.core.oauth2.service.OAuth2ClientService; +import org.springblade.core.oauth2.service.OAuth2User; +import org.springblade.core.oauth2.service.OAuth2UserService; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.core.tool.utils.WebUtil; +import org.springblade.system.feign.IUserClient; +import org.springblade.thirdparty.wechat.constant.WechatMiniConstant; +import org.springblade.thirdparty.wechat.exception.WechatMiniException; +import org.springblade.thirdparty.wechat.pojo.vo.WechatPhoneVO; +import org.springblade.thirdparty.wechat.pojo.vo.WechatSessionVO; +import org.springblade.thirdparty.wechat.service.IWechatMiniService; +import org.springframework.stereotype.Component; + +/** + * 微信小程序手机号一键登录。 + *

+ * grant_type=wechat_applet,参数:loginCode(wx.login)、phoneCode(getPhoneNumber)。 + * 流程:换 openid + 手机号 → 按手机号查用户(不存在则拒绝)→ 记录 openid → 发令牌(与密码登录一致)。 + */ +@Slf4j +@Component +public class WechatMiniTokenGranter extends AbstractTokenGranter { + + private final OAuth2UserService userService; + private final IWechatMiniService wechatMiniService; + private final IUserClient userClient; + + public WechatMiniTokenGranter(OAuth2ClientService clientService, + OAuth2UserService userService, + PasswordHandler passwordHandler, + IWechatMiniService wechatMiniService, + IUserClient userClient) { + super(clientService, userService, passwordHandler); + this.userService = userService; + this.wechatMiniService = wechatMiniService; + this.userClient = userClient; + } + + @Override + public String type() { + return WechatMiniConstant.GRANT_TYPE; + } + + @Override + public OAuth2User user(OAuth2Request request) { + // 先校验客户端是否允许该授权类型,避免先调微信再因客户端配置失败 + var oauthClient = client(request); + + HttpServletRequest httpRequest = WebUtil.getRequest(); + String loginCode = httpRequest.getParameter("loginCode"); + String phoneCode = httpRequest.getParameter("phoneCode"); + if (StringUtil.isBlank(loginCode) || StringUtil.isBlank(phoneCode)) { + throw new UserInvalidException("微信登录参数不完整"); + } + + WechatSessionVO session; + WechatPhoneVO phoneInfo; + try { + session = wechatMiniService.code2Session(loginCode); + phoneInfo = wechatMiniService.getPhoneNumber(phoneCode); + } catch (WechatMiniException e) { + log.warn("微信小程序登录失败: {}", e.getMessage()); + throw new UserInvalidException(e.getMessage()); + } + + String phone = Func.toStr(phoneInfo.getPurePhoneNumber(), phoneInfo.getPhoneNumber()); + if (StringUtil.isBlank(phone)) { + throw new UserInvalidException("未获取到微信手机号"); + } + + OAuth2User user = userService.loadByPhone(phone, request); + if (!userService.validateUser(user)) { + throw new UserInvalidException("用户不存在,无法登录"); + } + + R bindResult = userClient.bindWxMiniOpenId( + request.getTenantId(), + Func.toLong(user.getUserId()), + session.getOpenid(), + phone + ); + if (bindResult == null || !bindResult.isSuccess()) { + String msg = bindResult != null ? bindResult.getMsg() : "绑定 openid 失败"; + log.warn("绑定微信 openid 失败 userId={} openid={} msg={}", user.getUserId(), session.getOpenid(), msg); + throw new UserInvalidException(StringUtil.isBlank(msg) ? "绑定 openid 失败" : msg); + } + + user.setClient(oauthClient); + return user; + } + +} diff --git a/blade-auth/src/main/java/org/springblade/auth/service/BladeClientDetailService.java b/blade-auth/src/main/java/org/springblade/auth/service/BladeClientDetailService.java index ee43e92..db727e8 100644 --- a/blade-auth/src/main/java/org/springblade/auth/service/BladeClientDetailService.java +++ b/blade-auth/src/main/java/org/springblade/auth/service/BladeClientDetailService.java @@ -25,11 +25,17 @@ */ package org.springblade.auth.service; +import org.springblade.core.oauth2.constant.OAuth2GranterConstant; import org.springblade.core.oauth2.provider.OAuth2Request; import org.springblade.core.oauth2.service.OAuth2Client; import org.springblade.core.oauth2.service.impl.OAuth2ClientDetailService; +import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.StringPool; import org.springframework.jdbc.core.JdbcTemplate; +import java.util.Arrays; +import java.util.Optional; + /** * BladeClientDetailService * @@ -57,6 +63,13 @@ public class BladeClientDetailService extends OAuth2ClientDetailService { @Override public boolean validateGranter(OAuth2Client client, String grantType) { - return super.validateGranter(client, grantType); + // 微信小程序一键登录:兼容库表未配置 wechat_applet 的存量客户端 + if (OAuth2GranterConstant.WECHAT_APPLET.equals(grantType) || "wechat_mini".equals(grantType)) { + return true; + } + return Optional.ofNullable(client) + .map(c -> Arrays.stream(Func.split(c.getAuthorizedGrantTypes(), StringPool.COMMA)) + .anyMatch(s -> s.trim().equals(grantType))) + .orElse(false); } } diff --git a/blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java b/blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java index 86787cf..a259f7b 100644 --- a/blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java +++ b/blade-gateway/src/main/java/org/springblade/gateway/provider/AuthProvider.java @@ -48,6 +48,7 @@ public class AuthProvider { DEFAULT_SKIP_URL.add("/oauth/sms/**"); DEFAULT_SKIP_URL.add("/oauth/clear-cache/**"); DEFAULT_SKIP_URL.add("/oauth/user-info"); + DEFAULT_SKIP_URL.add("/oauth/logout/**"); DEFAULT_SKIP_URL.add("/oauth/render/**"); DEFAULT_SKIP_URL.add("/oauth/callback/**"); DEFAULT_SKIP_URL.add("/oauth/revoke/**"); diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java index 37e33b1..77eeef8 100644 --- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java +++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java @@ -73,6 +73,7 @@ public interface ISysClient { String REGION = API_PREFIX + "/region"; String FEE_ITEMS = API_PREFIX + "/fee-items"; String CARGO_TYPES = API_PREFIX + "/cargo-types"; + String PERMISSIONS = API_PREFIX + "/permissions"; /** * 获取菜单 @@ -316,4 +317,13 @@ public interface ISysClient { @GetMapping(CARGO_TYPES) R> getCargoTypes(); + /** + * 获取角色权限标识集合(按钮编号) + * + * @param roleId 角色id + * @return 权限标识 + */ + @GetMapping(PERMISSIONS) + R> getPermissions(@RequestParam("roleId") String roleId); + } diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java index c7598c3..4825a4d 100644 --- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java +++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java @@ -174,4 +174,9 @@ public class ISysClientFallback implements ISysClient { return R.fail("获取数据失败"); } + @Override + public R> getPermissions(String roleId) { + return R.fail("获取数据失败"); + } + } diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/pojo/vo/OaPersonSyncPageVO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/pojo/vo/OaPersonSyncPageVO.java new file mode 100644 index 0000000..b493bdf --- /dev/null +++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/pojo/vo/OaPersonSyncPageVO.java @@ -0,0 +1,66 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.system.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * OA人员分页同步结果 + * + * @author Chill + */ +@Data +@Schema(description = "OA人员分页同步结果") +public class OaPersonSyncPageVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "当前页") + private Integer current; + + @Schema(description = "每页条数") + private Integer size; + + @Schema(description = "OA人员总条数") + private Long total; + + @Schema(description = "本页从OA拉取的条数") + private Integer fetchedCount; + + @Schema(description = "本页同步成功条数") + private Integer syncedCount; + + @Schema(description = "本页跳过条数") + private Integer skippedCount; + + @Schema(description = "是否已到最后一页") + private Boolean finished; +} diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminDriverOptionVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminDriverOptionVO.java new file mode 100644 index 0000000..21839e5 --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminDriverOptionVO.java @@ -0,0 +1,30 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + */ +package org.springblade.transport.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@Schema(description = "调度端司机搜索项") +public class AdminDriverOptionVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "司机ID") + private Long id; + + @Schema(description = "姓名") + private String name; + + @Schema(description = "手机号") + private String phone; + + @Schema(description = "绑定车牌") + private String vehicleNo; +} diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminHomeBadgesVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminHomeBadgesVO.java new file mode 100644 index 0000000..d37bd5b --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminHomeBadgesVO.java @@ -0,0 +1,47 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 调度端首页快捷入口角标 + */ +@Data +@Schema(description = "调度端首页角标") +public class AdminHomeBadgesVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "异常处置待办数(disposalStatus≠completed)") + private long exception; + + @Schema(description = "风险记录待办数(disposalStatus=pending)") + private long risk; + +} diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminHomeStatsVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminHomeStatsVO.java new file mode 100644 index 0000000..b3b9770 --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminHomeStatsVO.java @@ -0,0 +1,53 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 调度端首页顶部统计(对齐小程序 admin/home) + */ +@Data +@Schema(description = "调度端首页运单状态统计") +public class AdminHomeStatsVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "运输中(businessStatus=running)") + private long transporting; + + @Schema(description = "待接单(businessStatus=pending)") + private long pendingAccept; + + @Schema(description = "在途异常(异常处置状态≠已完成)") + private long exception; + + @Schema(description = "已完成(businessStatus=completed)") + private long completed; + +} diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminHomeVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminHomeVO.java new file mode 100644 index 0000000..2302825 --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminHomeVO.java @@ -0,0 +1,55 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 调度端首页聚合数据(统计 + 角标 + 待处理 feed + 用户名) + */ +@Data +@Schema(description = "调度端首页聚合") +public class AdminHomeVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "当前登录用户姓名") + private String userName; + + @Schema(description = "顶部运单状态统计") + private AdminHomeStatsVO stats = new AdminHomeStatsVO(); + + @Schema(description = "快捷入口角标") + private AdminHomeBadgesVO badges = new AdminHomeBadgesVO(); + + @Schema(description = "待处理事项(异常处置状态≠已完成)") + private List feed = new ArrayList<>(); + +} diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminTodoItemVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminTodoItemVO.java new file mode 100644 index 0000000..8d8430f --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminTodoItemVO.java @@ -0,0 +1,65 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 调度端首页「待处理事项」条目 + */ +@Data +@Schema(description = "调度端首页待处理事项") +public class AdminTodoItemVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "条目ID(异常处置ID)") + private Long id; + + @Schema(description = "类型:exception=异常待处置 / reassign=重新派单待处理") + private String type; + + @Schema(description = "标题") + private String title; + + @Schema(description = "相对时间文案,如「2分钟」") + private String timeAgo; + + @Schema(description = "摘要描述") + private String desc; + + @Schema(description = "运单号") + private String waybillNo; + + @Schema(description = "操作按钮文案") + private String actionLabel; + + @Schema(description = "跳转路径(小程序内路径)") + private String targetUrl; + +} diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminVehicleOptionVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminVehicleOptionVO.java new file mode 100644 index 0000000..53bcaa4 --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminVehicleOptionVO.java @@ -0,0 +1,24 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + */ +package org.springblade.transport.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@Schema(description = "调度端车牌搜索项") +public class AdminVehicleOptionVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "车牌号") + private String vehicleNo; + + @Schema(description = "关联司机名(可选)") + private String driverName; +} diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminWaybillCardVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminWaybillCardVO.java new file mode 100644 index 0000000..9e63df3 --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminWaybillCardVO.java @@ -0,0 +1,95 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 调度端运单列表卡片(对齐小程序 admin/waybill-list) + */ +@Data +@Schema(description = "调度端运单列表卡片") +public class AdminWaybillCardVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "运单ID") + private Long id; + + @Schema(description = "运单号") + private String waybillNo; + + @Schema(description = "起点") + private String fromName; + + @Schema(description = "终点") + private String toName; + + @Schema(description = "货物名称") + private String cargo; + + @Schema(description = "重量(带单位)") + private String weight; + + @Schema(description = "计划开始时间") + private String planTime; + + @Schema(description = "计划结束时间") + private String planTimeEnd; + + @Schema(description = "状态:0待接单/1运输中/2已完成/3已取消") + private Integer status; + + @Schema(description = "承运方") + private String carrierName; + + @Schema(description = "司机姓名") + private String driverName; + + @Schema(description = "车牌号") + private String vehicleNo; + + @Schema(description = "是否有未完成异常") + private Boolean hasException; + + @Schema(description = "运输组织类型:common普通 / load配载") + private String transportType; + + @Schema(description = "运输方式:road / 公路运输 / 铁路运输 等") + private String transportMode; + + @Schema(description = "创建时间") + private String createTime; + + @Schema(description = "需重新派单(司机已拒单)") + private Boolean needReassign; + + @Schema(description = "采购方是否已付款(预留)") + private Boolean buyerPaid; + +} diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminWaybillDetailVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminWaybillDetailVO.java new file mode 100644 index 0000000..ebbd9cc --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/AdminWaybillDetailVO.java @@ -0,0 +1,154 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +/** + * 调度端运单详情(对齐小程序 pages/waybill/detail) + */ +@Data +@Schema(description = "调度端运单详情") +public class AdminWaybillDetailVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "运单ID") + private Long id; + + @Schema(description = "运单号") + private String waybillNo; + + @Schema(description = "状态:0待接单/1运输中/2已完成/3已取消") + private Integer status; + + @Schema(description = "起点名称") + private String fromName; + + @Schema(description = "终点名称") + private String toName; + + @Schema(description = "起点地址") + private String fromAddress; + + @Schema(description = "终点地址") + private String toAddress; + + @Schema(description = "装货地址") + private String pickupAddress; + + @Schema(description = "卸货地址") + private String unloadAddress; + + @Schema(description = "货物名称") + private String cargoName; + + @Schema(description = "货物数量(带单位)") + private String cargoQuantity; + + @Schema(description = "重量(带单位)") + private String weight; + + @Schema(description = "合计货重") + private String totalWeight; + + @Schema(description = "运输方式文案:公路运输 / 铁路运输 等") + private String transportType; + + @Schema(description = "运输方式字典值:road 等") + private String transportMode; + + @Schema(description = "运输组织:common普通 / load配载") + private String transportOrgType; + + @Schema(description = "计划发货时间") + private String planShipTime; + + @Schema(description = "计划完成时间") + private String planFinishTime; + + @Schema(description = "承运方") + private String carrierName; + + @Schema(description = "司机姓名") + private String driverName; + + @Schema(description = "司机联系方式") + private String driverPhone; + + @Schema(description = "车牌号") + private String vehicleNo; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "是否有未完成异常") + private Boolean hasException; + + @Schema(description = "最近一条未完成异常处置ID(有异常时返回)") + private Long exceptionId; + + @Schema(description = "需重新派单") + private Boolean needReassign; + + @Schema(description = "司机接单状态:pending/accepted/rejected") + private String acceptStatus; + + @Schema(description = "司机拒绝接单原因") + private String rejectReason; + + @Schema(description = "原指派司机ID") + private Long driverId; + + @Schema(description = "装卸点列表") + private List routePoints; + + @Schema(description = "过程打卡节点(与司机端 punchNodes 同结构)") + private List punchNodes; + + @Schema(description = "途打卡记录") + private List enrouteRecords; + + @Data + @Schema(description = "装卸点") + public static class AdminRoutePointVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "点位名称") + private String name; + + @Schema(description = "详细地址") + private String address; + + @Schema(description = "状态:pending/done/active") + private String status; + } + +} diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/DriverWaybillCardVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/DriverWaybillCardVO.java index 162b386..57e394d 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/DriverWaybillCardVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/DriverWaybillCardVO.java @@ -133,4 +133,55 @@ public class DriverWaybillCardVO implements Serializable { @Schema(description = "过程配置中 punch=是 的打卡节点列表(详情返回)") private List punchNodes; + /* ===== pages/waybill/detail 接单查看字段 ===== */ + + @Schema(description = "货物名称") + private String cargoName; + + @Schema(description = "装货地址") + private String pickupAddress; + + @Schema(description = "卸货地址") + private String unloadAddress; + + @Schema(description = "货物数量(带单位)") + private String cargoQuantity; + + @Schema(description = "运输方式文案:公路运输等") + private String transportType; + + @Schema(description = "计划发货时间") + private String planShipTime; + + @Schema(description = "计划完成时间") + private String planFinishTime; + + @Schema(description = "合计货重") + private String totalWeight; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "装卸点(详情返回)") + private List routePoints; + + @Schema(description = "过程配置 JSON(详情返回,供前端兜底推导打卡节点)") + private String processJson; + + @Data + @Schema(description = "司机端装卸点") + public static class DriverRoutePointVO implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "点位名称") + private String name; + + @Schema(description = "详细地址") + private String address; + + @Schema(description = "状态:pending/done/active") + private String status; + } + } diff --git a/blade-service-api/blade-user-api/src/main/java/org/springblade/system/feign/IUserClient.java b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/feign/IUserClient.java index cc78a95..50be69e 100644 --- a/blade-service-api/blade-user-api/src/main/java/org/springblade/system/feign/IUserClient.java +++ b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/feign/IUserClient.java @@ -61,6 +61,7 @@ public interface IUserClient { String SAVE_IAM_USER = API_PREFIX + "/save-iam-user"; String REGISTER_USER = API_PREFIX + "/register-user"; String REMOVE_USER = API_PREFIX + "/remove-user"; + String BIND_WX_MINI_OPENID = API_PREFIX + "/bind-wx-mini-openid"; /** * 获取用户信息 @@ -187,4 +188,18 @@ public interface IUserClient { @PostMapping(REMOVE_USER) R removeUser(@RequestParam("tenantIds") String tenantIds); + /** + * 绑定微信小程序 openid(写入 blade_user_oauth,source=WECHAT_MINI) + * + * @param tenantId 租户ID + * @param userId 用户ID + * @param openid 微信 openid + * @param phone 手机号(可选,写入 username) + */ + @PostMapping(BIND_WX_MINI_OPENID) + R bindWxMiniOpenId(@RequestParam("tenantId") String tenantId, + @RequestParam("userId") Long userId, + @RequestParam("openid") String openid, + @RequestParam(value = "phone", required = false) String phone); + } diff --git a/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/dto/PhoneChangeDTO.java b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/dto/PhoneChangeDTO.java new file mode 100644 index 0000000..1743376 --- /dev/null +++ b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/dto/PhoneChangeDTO.java @@ -0,0 +1,54 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.system.pojo.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 更换手机号参数 + * + * @author Chill + */ +@Data +@Schema(description = "更换手机号参数") +public class PhoneChangeDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "新手机号", requiredMode = Schema.RequiredMode.REQUIRED) + private String newPhone; + + @Schema(description = "短信校验 ID(发送验证码接口返回)", requiredMode = Schema.RequiredMode.REQUIRED) + private String id; + + @Schema(description = "新手机号短信验证码", requiredMode = Schema.RequiredMode.REQUIRED) + private String code; +} diff --git a/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/dto/PhoneVerifyDTO.java b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/dto/PhoneVerifyDTO.java new file mode 100644 index 0000000..79520b8 --- /dev/null +++ b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/pojo/dto/PhoneVerifyDTO.java @@ -0,0 +1,51 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.system.pojo.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 原手机号短信校验参数 + * + * @author Chill + */ +@Data +@Schema(description = "原手机号短信校验参数") +public class PhoneVerifyDTO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @Schema(description = "短信校验 ID(发送验证码接口返回)", requiredMode = Schema.RequiredMode.REQUIRED) + private String id; + + @Schema(description = "短信验证码", requiredMode = Schema.RequiredMode.REQUIRED) + private String code; +} diff --git a/blade-service/blade-system/pom.xml b/blade-service/blade-system/pom.xml index 08aea8b..35b4f52 100644 --- a/blade-service/blade-system/pom.xml +++ b/blade-service/blade-system/pom.xml @@ -45,6 +45,10 @@ org.springblade blade-user-api + + org.springblade + blade-resource-api + org.springblade blade-process-api diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java index a4b7b6b..36c7f7d 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserController.java @@ -54,7 +54,9 @@ import org.springblade.core.tool.utils.StringPool; import org.springblade.system.excel.UserExcel; import org.springblade.system.excel.UserImporter; import org.springblade.system.pojo.entity.User; +import org.springblade.system.pojo.vo.OaPersonSyncPageVO; import org.springblade.system.pojo.vo.UserVO; +import org.springblade.system.service.IOASyncService; import org.springblade.system.service.IUserService; import org.springblade.system.wrapper.UserWrapper; import org.springframework.web.bind.annotation.*; @@ -77,6 +79,7 @@ import java.util.Map; public class UserController { private final IUserService userService; + private final IOASyncService oaSyncService; /** * 查询单条 @@ -158,14 +161,16 @@ public class UserController { } /** - * 同步IAM账号。 + * 从OA按页同步人员,并按公司/部门生成组织后绑定到三级部门。 */ @IsAdmin @PostMapping("/sync-iam-accounts") @ApiOperationSupport(order = 6) - @Operation(summary = "同步IAM账号") - public R syncIamAccounts() { - return R.data(userService.syncIamAccounts()); + @Operation(summary = "同步OA人员") + public R syncIamAccounts( + @RequestParam(defaultValue = "1") Integer current, + @RequestParam(defaultValue = "50") Integer size) { + return R.data(oaSyncService.syncPersonFromUserList(current, size)); } /** @@ -227,6 +232,20 @@ public class UserController { return R.status(temp); } + /** + * 当前用户设置/重置登录密码(小程序首次设密、短信验证后改密) + *

+ * 对外路径:/blade-system/user/password ;网关别名 /blade-user/password 亦可到达。 + */ + @PostMapping("/password") + @ApiOperationSupport(order = 10) + @Operation(summary = "设置登录密码", description = "当前登录用户设置密码,无需原密码") + public R password(BladeUser user, + @Parameter(description = "新密码", required = true) @RequestParam String password, + @Parameter(description = "确认密码", required = true) @RequestParam String password2) { + return R.status(userService.setPassword(user.getUserId(), password, password2)); + } + /** * 管理员修改密码 */ diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserPhoneController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserPhoneController.java new file mode 100644 index 0000000..ecf7b71 --- /dev/null +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/UserPhoneController.java @@ -0,0 +1,93 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.system.controller; + +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import org.springblade.core.tenant.annotation.NonDS; +import org.springblade.core.tool.api.R; +import org.springblade.system.pojo.dto.PhoneChangeDTO; +import org.springblade.system.pojo.dto.PhoneVerifyDTO; +import org.springblade.system.service.IUserPhoneService; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 用户手机号变更(小程序「修改手机号」) + *

+ * 对外路径:/blade-system/user/phone/** ;网关别名 /blade-user/phone/** 亦可到达。 + * + * @author Chill + */ +@NonDS +@RestController +@AllArgsConstructor +@RequestMapping("/user/phone") +@Tag(name = "用户手机号", description = "修改手机号") +public class UserPhoneController { + + private final IUserPhoneService userPhoneService; + + /** + * 发送短信验证码(需登录) + *

+ * 当前手机号、未占用的新手机号均可发送;新号若已被其他账号占用则拒绝。 + */ + @PostMapping("/send-code") + @ApiOperationSupport(order = 1) + @Operation(summary = "发送手机号变更验证码", description = "传入明文手机号,返回短信校验 id") + public R sendCode(@Parameter(description = "手机号", required = true) @RequestParam String phone) { + return userPhoneService.sendCode(phone); + } + + /** + * 校验原手机号验证码(修改手机号第 1 步) + */ + @PostMapping("/verify-old") + @ApiOperationSupport(order = 2) + @Operation(summary = "校验原手机号验证码", description = "传入发送验证码返回的 id 与验证码") + public R verifyOld(@Valid @RequestBody PhoneVerifyDTO phoneVerify) { + return R.status(userPhoneService.verifyOldPhone(phoneVerify)); + } + + /** + * 绑定新手机号(修改手机号第 3 步,需先完成 verify-old) + */ + @PostMapping("/change") + @ApiOperationSupport(order = 3) + @Operation(summary = "更换手机号", description = "传入新手机号及短信校验 id、验证码") + public R change(@Valid @RequestBody PhoneChangeDTO phoneChange) { + return R.status(userPhoneService.changePhone(phoneChange)); + } + +} diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/convert/UserConvert.java b/blade-service/blade-system/src/main/java/org/springblade/system/convert/UserConvert.java index 924daee..28f7004 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/convert/UserConvert.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/convert/UserConvert.java @@ -64,11 +64,11 @@ public interface UserConvert { @Mapping(target = "password", ignore = true) @Mapping(target = "birthday", ignore = true) @Mapping(target = "sex", ignore = true) + @Mapping(target = "account", ignore = true) @Mapping(source = "workcode", target = "code") @Mapping(source = "lastname", target = "name") @Mapping(source = "lastname", target = "realName") @Mapping(source = "mobile", target = "phone") - @Mapping(source = "mobile", target = "account") @Mapping(source = "email", target = "email") User baseConvert(OAPersonResponse person); @@ -86,7 +86,7 @@ public interface UserConvert { */ default User person2user(OAPersonResponse person, String defaultPassword) { User user = baseConvert(person); - + user.setAccount(resolveAccount(person)); // 密码 user.setPassword(defaultPassword); // 性别 @@ -102,6 +102,28 @@ public interface UserConvert { return user; } + /** + * 解析本系统登录账号:优先 OA loginid,其次工号,最后手机号 + * + * @param person OA人员 + * @return 账号,无法识别时返回 null + */ + default String resolveAccount(OAPersonResponse person) { + if (person == null) { + return null; + } + if (StringUtils.isNotBlank(person.getLoginid())) { + return person.getLoginid().trim(); + } + if (StringUtils.isNotBlank(person.getWorkcode())) { + return person.getWorkcode().trim(); + } + if (StringUtils.isNotBlank(person.getMobile())) { + return person.getMobile().trim(); + } + return null; + } + /** * oa人员转本系统用户部门 * @param person @@ -120,7 +142,7 @@ public interface UserConvert { // 排序 userDept.setSort(OAUtils.parseInt(person.getDsporder())); // 用户id - userDept.setUserId(userMap.get(person.getMobile())); + userDept.setUserId(userMap.get(resolveAccount(person))); userDept.setSyncTime(new Date()); return userDept; } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java b/blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java index 49c8613..d08d36a 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/feign/SysClient.java @@ -231,4 +231,10 @@ public class SysClient implements ISysClient { .orderByAsc(CargoType::getCargoCode))); } + @Override + @GetMapping(PERMISSIONS) + public R> getPermissions(String roleId) { + return R.data(menuService.permissionCodes(roleId)); + } + } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/feign/UserClient.java b/blade-service/blade-system/src/main/java/org/springblade/system/feign/UserClient.java index 12b97fd..f25da25 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/feign/UserClient.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/feign/UserClient.java @@ -133,4 +133,10 @@ public class UserClient implements IUserClient { return R.data(service.remove(Wrappers.query().lambda().in(User::getTenantId, Func.toStrList(tenantIds)))); } + @Override + @PostMapping(BIND_WX_MINI_OPENID) + public R bindWxMiniOpenId(String tenantId, Long userId, String openid, String phone) { + return R.data(service.bindWxMiniOpenId(tenantId, userId, openid, phone)); + } + } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/IMenuService.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/IMenuService.java index 6b18066..2d7c77f 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/IMenuService.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/IMenuService.java @@ -77,6 +77,14 @@ public interface IMenuService extends IService

{ */ List buttons(String roleId); + /** + * 权限标识集合(按钮编号,与前端 GetButtons 叶子 code 一致) + * + * @param roleId 角色id + * @return 权限标识 + */ + List permissionCodes(String roleId); + /** * 树形结构 * diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/IOASyncService.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/IOASyncService.java index 1c7c1d9..45b7437 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/IOASyncService.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/IOASyncService.java @@ -1,5 +1,7 @@ package org.springblade.system.service; +import org.springblade.system.pojo.vo.OaPersonSyncPageVO; + /** * oa同步接口 * @author bfhuange @@ -18,4 +20,20 @@ public interface IOASyncService { * @param syncAll 是否同步所有 */ void syncPersonAndPushMK(boolean syncAll); + + /** + * 从 OA 人员接口全量同步组织与人员,不推送 MK + * + * @return 处理的人员数量 + */ + int syncPersonFromUserList(); + + /** + * 按页从 OA 人员接口同步组织与人员 + * + * @param current 当前页,从 1 开始 + * @param size 每页条数 + * @return 本页同步结果 + */ + OaPersonSyncPageVO syncPersonFromUserList(int current, int size); } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserPhoneService.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserPhoneService.java new file mode 100644 index 0000000..75653ac --- /dev/null +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserPhoneService.java @@ -0,0 +1,63 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.system.service; + +import org.springblade.core.tool.api.R; +import org.springblade.system.pojo.dto.PhoneChangeDTO; +import org.springblade.system.pojo.dto.PhoneVerifyDTO; + +/** + * 用户手机号变更服务 + * + * @author Chill + */ +public interface IUserPhoneService { + + /** + * 发送变更手机号短信验证码 + * + * @param phone 明文手机号 + * @return 含短信校验 id 的响应 + */ + R sendCode(String phone); + + /** + * 校验原手机号验证码,通过后写入短期凭证 + * + * @param phoneVerify 校验参数 + * @return 是否通过 + */ + boolean verifyOldPhone(PhoneVerifyDTO phoneVerify); + + /** + * 校验新手机号验证码并更换手机号 + * + * @param phoneChange 更换参数 + * @return 是否成功 + */ + boolean changePhone(PhoneChangeDTO phoneChange); + +} diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserService.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserService.java index 366db18..7c3db61 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserService.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/IUserService.java @@ -188,6 +188,11 @@ public interface IUserService extends BaseService { */ UserInfo userInfo(UserOauth userOauth); + /** + * 绑定微信小程序 openid 到已有用户(blade_user_oauth,source=WECHAT_MINI) + */ + boolean bindWxMiniOpenId(String tenantId, Long userId, String openid, String phone); + /** * 根据租户与账号获取用户 * diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/MenuServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/MenuServiceImpl.java index e04feb2..7b0ced4 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/MenuServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/MenuServiceImpl.java @@ -164,6 +164,35 @@ public class MenuServiceImpl extends ServiceImpl implements IM return menuWrapper.listNodeVO(buttons); } + @Override + public List permissionCodes(String roleId) { + List permissionCodes = new ArrayList<>(); + // Feign 调用时无登录态,不能走 AuthUtil.isAdministrator() 分支;按 roleId 取按钮权限 + List

buttons = StringUtil.isBlank(roleId) + ? Collections.emptyList() + : baseMapper.buttons(Func.toLongList(roleId)); + MenuWrapper menuWrapper = new MenuWrapper(); + collectLeafPermissionCodes(menuWrapper.listNodeVO(buttons), permissionCodes); + return permissionCodes; + } + + /** + * 递归收集按钮树叶子节点的权限编号(与前端 SET_PERMISSION 逻辑一致) + */ + private void collectLeafPermissionCodes(List menuList, List permissionCodes) { + if (menuList == null || menuList.isEmpty()) { + return; + } + for (MenuVO menu : menuList) { + List children = menu.getChildren(); + if (children != null && !children.isEmpty()) { + collectLeafPermissionCodes(children, permissionCodes); + } else if (StringUtil.isNotBlank(menu.getCode())) { + permissionCodes.add(menu.getCode()); + } + } + } + @Override public List tree() { return ForestNodeMerger.merge(baseMapper.tree()); diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OASyncServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OASyncServiceImpl.java index 38e7eb9..6e0c3e9 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OASyncServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OASyncServiceImpl.java @@ -11,16 +11,14 @@ import org.springblade.common.constant.DictTypeEnum; import org.springblade.core.cache.utils.CacheUtil; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.utils.DateUtil; -import org.springblade.core.tool.utils.DigestUtil; import org.springblade.system.cache.DictCache; import org.springblade.system.cache.ParamCache; import org.springblade.system.convert.DeptConvert; -import org.springblade.system.convert.UserConvert; import org.springblade.system.log.ComposeLogUtil; import org.springblade.system.pojo.entity.*; import org.springblade.system.pojo.enums.DataSync; import org.springblade.system.pojo.enums.DeptCategory; -import org.springblade.system.pojo.vo.UserDeptIdsVO; +import org.springblade.system.pojo.vo.OaPersonSyncPageVO; import org.springblade.system.service.*; import org.springblade.system.util.DataSyncRecordUtils; import org.springblade.thirdparty.oa.constant.OAConstant; @@ -29,6 +27,8 @@ import org.springblade.thirdparty.oa.feign.IOAClient; import org.springblade.thirdparty.oa.pojo.response.OACompanyResponse; import org.springblade.thirdparty.oa.pojo.response.OADepartmentResponse; import org.springblade.thirdparty.oa.pojo.response.OAPersonResponse; +import org.springblade.thirdparty.oa.pojo.response.OAResponse; +import org.springblade.thirdparty.oa.pojo.response.OAResponseData; import org.springblade.thirdparty.oa.pojo.search.OACompanySearch; import org.springblade.thirdparty.oa.pojo.search.OADepartmentSearch; import org.springblade.thirdparty.oa.pojo.search.OAPersonSearch; @@ -38,6 +38,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -54,20 +55,14 @@ import static org.springblade.core.cache.constant.CacheConstant.USER_CACHE; @RequiredArgsConstructor @Service public class OASyncServiceImpl implements IOASyncService { - /** - * 用户表部门id最大长度 - */ - private static final int MAX_DEPT_ID_LENGTH = 2000; private final IOAClient oaClient; private final DeptConvert deptConvert; private final IDeptService deptService; - private final IUserService userService; - private final UserConvert userConvert; - private final IUserDeptService userDeptService; private final IRoleService roleService; private final IMKPushService mkPushService; private final IDataSyncRecordService dataSyncRecordService; + private final OaUserListSyncHelper oaUserListSyncHelper; @Transactional(rollbackFor = Exception.class) @Override @@ -104,6 +99,31 @@ public class OASyncServiceImpl implements IOASyncService { } } + @Transactional(rollbackFor = Exception.class) + @Override + public int syncPersonFromUserList() { + AtomicInteger syncedCount = new AtomicInteger(); + try { + ComposeLogUtil.addLog(log); + this.syncAndRecord(DataSyncRecordUtils::createOAPersonFetch, startTime -> + syncedCount.set(this.syncPersonFromOa(null)), true); + return syncedCount.get(); + } finally { + ComposeLogUtil.removeLastLog(); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public OaPersonSyncPageVO syncPersonFromUserList(int current, int size) { + try { + ComposeLogUtil.addLog(log); + return this.syncPersonFromOaPage(current, size); + } finally { + ComposeLogUtil.removeLastLog(); + } + } + /** * 同步并记录 * @@ -213,174 +233,93 @@ public class OASyncServiceImpl implements IOASyncService { * @param startTime 查询开始时间 */ private void syncPerson(Date startTime) { - String subCompanyIds = getSubCompanyIds(); - if (StringUtils.isEmpty(subCompanyIds)) { - ComposeLogUtil.getLastLog().warn("未查询到子公司查询参数"); - return; - } - // 1. 设置查询参数 - OAPersonSearch personSearch = new OAPersonSearch(); - personSearch.setCurPage(1); - personSearch.setSubcompanyid1(subCompanyIds); - if (startTime != null) { - // 开始时间不为空,设置修改时间参数 - personSearch.setModified(DateUtil.format(startTime, DateUtil.PATTERN_DATETIME)); - } - // 2. 分页查询并处理数据 - OAUtils.pageSyncHandler(personSearch, param -> oaClient.queryPersonPage(new OASearch<>(param)), response -> { - ComposeLogUtil.getLastLog().error("调用OA接口查询人员信息失败 {}", JSON.toJSONString(response)); - return new ServiceException("调用OA接口查询人员信息失败"); - }, 10000, ComposeLogUtil.getLastLog()::info).accept(this::handlePerson); - // 清除用户缓存 - CacheUtil.clear(USER_CACHE); + this.syncPersonFromOa(startTime); } /** - * 处理oa人员 - * @param oaPersons + * 从 OA 人员列表同步组织与人员 + * + * @param startTime 增量查询开始时间,为空则全量 + * @return 处理的人员数量 */ - private void handlePerson(List oaPersons) { - if (CollectionUtil.isEmpty(oaPersons)) { - // 数据为空,直接返回 - return; - } - // 根公司id - String rootCompanyId = getRootCompanyId(); - if (rootCompanyId == null) { - return; - } - // 根公司下要同步的部门id - Set rootCompanyDeptIds = getRootCompanyDeptIds(rootCompanyId); - oaPersons = oaPersons.stream() - // 公司不是根公司,或者部门在根公司下要同步的部门列表中 - .filter(oaPerson -> !rootCompanyId.equals(oaPerson.getSubcompanyid1()) || rootCompanyDeptIds.contains(oaPerson.getDepartmentid())) - .toList(); - // 根据手机号转成set - TreeSet oaPersonSet = CollectionUtil.toTreeSet(oaPersons, Comparator.comparing(OAPersonResponse::getMobile)); - // 默认密码 - String defaultPassword = DigestUtil.encrypt(ParamCache.getValue(DEFAULT_PARAM_PASSWORD)); - // 转换数据 - List users = oaPersonSet.stream() - // 只需要手机不为空的 - .filter(person -> StringUtils.isNotBlank(person.getMobile())) - .map(person -> userConvert.person2user(person, defaultPassword)) - .toList(); - List phones = users.stream() - .map(User::getPhone) - .filter(StringUtils::isNotBlank) - .distinct() - .toList(); - // 查询所有用户 - Map userMap = userService.list(Wrappers.lambdaQuery() - //.eq(User::getIsDeleted, BladeConstant.DB_NOT_DELETED) - .in(User::getPhone, phones) - ).stream() - // 解密手机号 - .peek(userService::decryptPhone) - .collect(Collectors.toMap(User::getPhone, User::getId, (a, b) -> b)); - // 数据库存在的所有用户id - Set existsUserIds = new HashSet<>(userMap.values()); - users.forEach(user -> { - if (userMap.containsKey(user.getPhone())) { - // 根据手机号获取对应的用户id - user.setId(userMap.get(user.getPhone())); - // 清空密码,不修改密码 - user.setPassword(null); - } else { - // 没有就生成一个id - user.setId(DefaultIdentifierGenerator.getInstance().nextId(null)); - userService.encryptPhone(user); - userMap.put(user.getPhone(), user.getId()); - } - }); + private int syncPersonFromOa(Date startTime) { + OAPersonSearch personSearch = buildPersonSearch(startTime); + List oaPersons = new ArrayList<>(); + OAUtils.pageSyncHandler(personSearch, param -> oaClient.queryPersonPage(new OASearch<>(param)), response -> { + ComposeLogUtil.getLastLog().error("调用OA接口查询人员信息失败 {}", JSON.toJSONString(response)); + return new ServiceException("调用OA接口查询人员信息失败"); + }, 10000, ComposeLogUtil.getLastLog()::info).accept(oaPersons::addAll); + OaUserListSyncHelper.OaOrgIndex orgIndex = oaUserListSyncHelper.syncOrgsFromPersons(oaPersons); + OaUserListSyncHelper.PersonSyncCount personSyncCount = oaUserListSyncHelper.handlePerson(oaPersons, orgIndex); + CacheUtil.clear(USER_CACHE); + CacheUtil.clear(SYS_CACHE); + CacheUtil.clear(SYS_CACHE, Boolean.FALSE); + return personSyncCount.getSyncedCount(); + } - // 不存在的新增 - List addUsers = users.stream() - .filter(user -> !existsUserIds.contains(user.getId())) - .toList(); - if (CollectionUtil.isNotEmpty(addUsers)) { - ComposeLogUtil.getLastLog().info("批量新增用户:{}", addUsers.size()); - userService.saveBatch(addUsers); + /** + * 按页从 OA 人员列表同步组织与人员 + * + * @param current 当前页 + * @param size 每页条数 + * @return 本页同步结果 + */ + private OaPersonSyncPageVO syncPersonFromOaPage(int current, int size) { + int pageNo = current < 1 ? 1 : current; + int pageSize = size < 1 ? 50 : Math.min(size, 200); + OAPersonSearch personSearch = buildPersonSearch(null); + personSearch.setCurPage(pageNo); + personSearch.setPageSize(pageSize); + OAResponse oaResponse = oaClient.queryPersonPage(new OASearch<>(personSearch)); + if (oaResponse == null || !OAConstant.OA_SUCCESS_CODE.equals(oaResponse.getCode()) || oaResponse.getData() == null) { + ComposeLogUtil.getLastLog().error("调用OA接口查询人员信息失败 {}", JSON.toJSONString(oaResponse)); + throw new ServiceException("调用OA接口查询人员信息失败"); } - // 存在的修改 - List updateUsers = users.stream() - .filter(user -> existsUserIds.contains(user.getId())) - .toList(); - if (CollectionUtil.isNotEmpty(updateUsers)) { - ComposeLogUtil.getLastLog().info("批量修改用户:{}", updateUsers.size()); - userService.updateBatchById(updateUsers); - } - // 没有手机号的数据 = 手机号为空的数量 - long noPhoneNum = oaPersons.stream() - .map(OAPersonResponse::getMobile) - .filter(StringUtils::isBlank) - .count(); - ComposeLogUtil.getLastLog().info("没有手机号的数据:{}", noPhoneNum); + OAResponseData responseData = oaResponse.getData(); + List oaPersons = responseData.getDataList() == null + ? Collections.emptyList() : responseData.getDataList(); + long totalSize = responseData.getTotalSize() == null ? 0L : responseData.getTotalSize(); + OaUserListSyncHelper.OaOrgIndex orgIndex = oaUserListSyncHelper.syncOrgsFromPersons(oaPersons); + OaUserListSyncHelper.PersonSyncCount personSyncCount = oaUserListSyncHelper.handlePerson(oaPersons, orgIndex); + CacheUtil.clear(USER_CACHE); + CacheUtil.clear(SYS_CACHE); + CacheUtil.clear(SYS_CACHE, Boolean.FALSE); + OaPersonSyncPageVO pageVO = new OaPersonSyncPageVO(); + pageVO.setCurrent(pageNo); + pageVO.setSize(pageSize); + pageVO.setTotal(totalSize); + pageVO.setFetchedCount(oaPersons.size()); + pageVO.setSyncedCount(personSyncCount.getSyncedCount()); + pageVO.setSkippedCount(personSyncCount.getSkippedCount()); + boolean finished = oaPersons.isEmpty() + || oaPersons.size() < pageSize + || (long) pageNo * pageSize >= totalSize; + pageVO.setFinished(finished); + ComposeLogUtil.getLastLog().info("OA人员分页同步完成 {}/{},成功{},跳过{}", + pageNo, totalSize, personSyncCount.getSyncedCount(), personSyncCount.getSkippedCount()); + return pageVO; + } - Map userDeptMap = userDeptService.list(Wrappers.lambdaQuery() - .in(UserDept::getUserId, userMap.values()) - ).stream() - .collect(Collectors.toMap(this::getUserDeptKey, UserDept::getId, (a, b) -> b)); - // 数据库存在的所有用户部门id - Set existsUserDeptIds = new HashSet<>(userDeptMap.values()); - - List userDeptList = oaPersons.stream() - // 只要包含用户手机号的 - .filter(oaPerson -> userMap.containsKey(oaPerson.getMobile())) - .map(oaPerson -> userConvert.person2userDept(oaPerson, userMap)) - .toList(); - userDeptList.forEach(userDept -> { - String userDeptKey = getUserDeptKey(userDept); - if (userDeptMap.containsKey(userDeptKey)) { - // 根据key获取用户部门id - userDept.setId(userDeptMap.get(userDeptKey)); - } else { - // 没有就生成一个id - userDept.setId(DefaultIdentifierGenerator.getInstance().nextId(null)); - } - }); - // 不存在的新增 - List addList = userDeptList.stream() - .filter(userDept -> !existsUserDeptIds.contains(userDept.getId())) - .toList(); - if (CollectionUtil.isNotEmpty(addList)) { - ComposeLogUtil.getLastLog().info("批量新增用户部门:{}", addList.size()); - userDeptService.saveBatch(addList); - } - // 存在的修改 - List updateList = userDeptList.stream() - .filter(userDept -> existsUserDeptIds.contains(userDept.getId())) - .toList(); - if (CollectionUtil.isNotEmpty(updateList)) { - ComposeLogUtil.getLastLog().info("批量修改用户部门:{}", updateList.size()); - userDeptService.updateBatchById(updateList); - } - // 回写部门id到用户表 - Collection userIds = userMap.values(); - List list = userDeptService.queryUserDeptIds(userIds); - // 查询没有角色的用户id - Set noRoleUserIds = userService.list(Wrappers.lambdaQuery() - .in(User::getId, userIds) - .isNull(User::getRoleId) - ).stream() - .map(User::getId) - .collect(Collectors.toSet()); - // 获取默认角色id - String defaultRoleId = getDefaultRoleId(); - List updateUserParams = list.stream() - // 过滤掉空部门id及长度超长的 - .filter(userDeptIds -> StringUtils.isNotBlank(userDeptIds.getDeptIds()) && userDeptIds.getDeptIds().length() <= MAX_DEPT_ID_LENGTH) - .map(userDeptIds -> { - User user = new User(); - user.setId(userDeptIds.getUserId()); - user.setDeptId(userDeptIds.getDeptIds()); - user.setDeptCodes(userDeptIds.getDeptCodes()); - if (noRoleUserIds.contains(userDeptIds.getUserId())) { - user.setRoleId(defaultRoleId); - } - return user; - }).toList(); - userService.updateBatchById(updateUserParams); + /** + * 组装 OA 人员分页查询参数 + * + * @param startTime 增量查询开始时间 + * @return 查询参数 + */ + private OAPersonSearch buildPersonSearch(Date startTime) { + OAPersonSearch personSearch = new OAPersonSearch(); + personSearch.setCurPage(1); + personSearch.setPageSize(200); + personSearch.setCreated(""); + personSearch.setWorkcode(""); + personSearch.setSubcompanyid1(""); + personSearch.setDepartmentid(""); + personSearch.setJobtitleid(""); + personSearch.setId(""); + personSearch.setLoginid(""); + personSearch.setIsadaccount(""); + personSearch.setModified(startTime == null ? "" : DateUtil.format(startTime, DateUtil.PATTERN_DATETIME)); + return personSearch; } /** @@ -634,16 +573,4 @@ public class OASyncServiceImpl implements IOASyncService { // 部门编码去掉前缀,就是oa的id return dept.getDeptCode().replace(OAConvertConstant.COMPANY_OA_PREFIX, ""); } - - /** - * 获取用户部门唯一标识,用户id+公司编码+部门编码 - * @param userDept - * @return - */ - private String getUserDeptKey(UserDept userDept) { - if (userDept == null) { - return null; - } - return userDept.getUserId() + userDept.getCompanyCode() + userDept.getDeptCode(); - } } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OaUserListSyncHelper.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OaUserListSyncHelper.java new file mode 100644 index 0000000..6a8a188 --- /dev/null +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OaUserListSyncHelper.java @@ -0,0 +1,609 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.system.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springblade.common.constant.DataStatusEnum; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.constant.BladeConstant; +import org.springblade.core.tool.utils.DigestUtil; +import org.springblade.system.cache.ParamCache; +import org.springblade.system.convert.UserConvert; +import org.springblade.system.log.ComposeLogUtil; +import org.springblade.system.pojo.entity.Dept; +import org.springblade.system.pojo.entity.Role; +import org.springblade.system.pojo.entity.User; +import org.springblade.system.pojo.entity.UserDept; +import org.springblade.system.pojo.enums.DeptCategory; +import org.springblade.system.pojo.vo.UserDeptIdsVO; +import org.springblade.system.service.IDeptService; +import org.springblade.system.service.IRoleService; +import org.springblade.system.service.IUserDeptService; +import org.springblade.system.service.IUserService; +import org.springblade.thirdparty.oa.constant.OAConvertConstant; +import org.springblade.thirdparty.oa.pojo.response.OAPersonResponse; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.springblade.common.constant.CommonConstant.DEFAULT_PARAM_PASSWORD; +import static org.springblade.common.constant.CommonConstant.DEFAULT_PARAM_ROLE; +import static org.springblade.common.constant.CommonConstant.DEFAULT_ROLE; +import static org.springblade.common.constant.CommonConstant.YES; + +/** + * 从 OA 人员列表提取组织并同步人员 + * + * @author Chill + */ +@Component +@RequiredArgsConstructor +public class OaUserListSyncHelper { + + private static final int MAX_DEPT_ID_LENGTH = 2000; + + private final IDeptService deptService; + private final IUserService userService; + private final UserConvert userConvert; + private final IUserDeptService userDeptService; + private final IRoleService roleService; + + /** + * 从人员数据提取二级公司、三级部门,并挂到「桂物物流集团」下 + * + * @param oaPersons OA人员 + * @return 组织索引 + */ + public OaOrgIndex syncOrgsFromPersons(List oaPersons) { + OaOrgIndex orgIndex = new OaOrgIndex(); + if (CollectionUtil.isEmpty(oaPersons)) { + return orgIndex; + } + Date orgSyncStart = new Date(); + Dept rootCompany = this.getOrCreateRootCompany(); + String tenantId = resolveTenantId(); + Map companyPersonMap = new LinkedHashMap<>(); + Map departmentPersonMap = new LinkedHashMap<>(); + for (OAPersonResponse oaPerson : oaPersons) { + String companyKey = resolveCompanyKey(oaPerson); + if (StringUtils.isNotBlank(companyKey) && StringUtils.isNotBlank(oaPerson.getSubcompanyname())) { + companyPersonMap.putIfAbsent(companyKey, oaPerson); + } + String departmentKey = resolveDepartmentKey(oaPerson); + if (StringUtils.isNotBlank(departmentKey) && StringUtils.isNotBlank(oaPerson.getDepartmentname()) + && StringUtils.isNotBlank(oaPerson.getSubcompanyname())) { + departmentPersonMap.putIfAbsent(departmentKey, oaPerson); + } + } + + Map existingCompanyByCode = new HashMap<>(); + Map existingCompanyByName = new HashMap<>(); + deptService.list(Wrappers.lambdaQuery() + .eq(Dept::getParentId, rootCompany.getId()) + .eq(Dept::getDeptCategory, DeptCategory.COMPANY.getCode()) + ).forEach(dept -> { + if (StringUtils.isNotBlank(dept.getDeptCode())) { + existingCompanyByCode.put(dept.getDeptCode(), dept); + } + if (StringUtils.isNotBlank(dept.getDeptName())) { + existingCompanyByName.put(dept.getDeptName(), dept); + } + }); + List addCompanies = new ArrayList<>(); + List updateCompanies = new ArrayList<>(); + companyPersonMap.forEach((companyKey, oaPerson) -> { + String oaCode = buildCompanyCode(oaPerson, companyKey); + Dept existing = existingCompanyByCode.get(oaCode); + if (existing == null) { + existing = existingCompanyByName.get(oaPerson.getSubcompanyname()); + } + Dept company = this.upsertOrg(oaPerson.getSubcompanyname(), oaCode, existing, rootCompany, tenantId, + DeptCategory.COMPANY, addCompanies, updateCompanies); + orgIndex.companyByOaId.put(companyKey, company); + }); + this.saveOrgs(addCompanies, updateCompanies, DeptCategory.COMPANY); + + Map existingDeptByCode = new HashMap<>(); + Map existingDeptByParentAndName = new HashMap<>(); + List companyIds = orgIndex.companyByOaId.values().stream() + .map(Dept::getId) + .filter(Objects::nonNull) + .distinct() + .toList(); + if (CollectionUtil.isNotEmpty(companyIds)) { + deptService.list(Wrappers.lambdaQuery() + .in(Dept::getParentId, companyIds) + .eq(Dept::getDeptCategory, DeptCategory.DEPT.getCode()) + ).forEach(dept -> { + if (StringUtils.isNotBlank(dept.getDeptCode())) { + existingDeptByCode.put(dept.getDeptCode(), dept); + } + if (dept.getParentId() != null && StringUtils.isNotBlank(dept.getDeptName())) { + existingDeptByParentAndName.put(dept.getParentId() + "#" + dept.getDeptName(), dept); + } + }); + } + List addDepartments = new ArrayList<>(); + List updateDepartments = new ArrayList<>(); + departmentPersonMap.forEach((departmentKey, oaPerson) -> { + Dept parentCompany = orgIndex.findCompany(oaPerson); + if (parentCompany == null || parentCompany.getId() == null) { + return; + } + String oaCode = buildDepartmentCode(oaPerson, departmentKey); + Dept existing = existingDeptByCode.get(oaCode); + if (existing == null) { + existing = existingDeptByParentAndName.get(parentCompany.getId() + "#" + oaPerson.getDepartmentname()); + } + Dept department = this.upsertOrg(oaPerson.getDepartmentname(), oaCode, existing, parentCompany, tenantId, + DeptCategory.DEPT, addDepartments, updateDepartments); + orgIndex.deptByOaId.put(departmentKey, department); + orgIndex.deptByCompanyAndName.put(resolveCompanyKey(oaPerson) + "#" + oaPerson.getDepartmentname(), department); + }); + this.saveOrgs(addDepartments, updateDepartments, DeptCategory.DEPT); + deptService.updateAncestors(orgSyncStart); + ComposeLogUtil.getLastLog().info("同步人员提取组织完成,二级公司{}个,三级部门{}个", + orgIndex.companyByOaId.size(), orgIndex.deptByOaId.size()); + return orgIndex; + } + + /** + * 同步人员并绑定到三级部门 + * + * @param oaPersons OA人员 + * @param orgIndex 组织索引 + * @return 本批同步成功与跳过数量 + */ + public PersonSyncCount handlePerson(List oaPersons, OaOrgIndex orgIndex) { + if (CollectionUtil.isEmpty(oaPersons)) { + return new PersonSyncCount(0, 0); + } + Map uniquePersonMap = new LinkedHashMap<>(); + int skippedCount = 0; + for (OAPersonResponse oaPerson : oaPersons) { + String account = userConvert.resolveAccount(oaPerson); + if (StringUtils.isBlank(account)) { + skippedCount++; + continue; + } + uniquePersonMap.putIfAbsent(account, oaPerson); + } + if (uniquePersonMap.isEmpty()) { + ComposeLogUtil.getLastLog().warn("OA人员均缺少loginid/工号/手机号,跳过人员同步"); + return new PersonSyncCount(0, skippedCount); + } + String tenantId = resolveTenantId(); + String defaultPassword = DigestUtil.encrypt(ParamCache.getValue(DEFAULT_PARAM_PASSWORD)); + List users = uniquePersonMap.values().stream() + .map(person -> { + User user = userConvert.person2user(person, defaultPassword); + user.setTenantId(tenantId); + return user; + }) + .toList(); + List accounts = users.stream() + .map(User::getAccount) + .filter(StringUtils::isNotBlank) + .distinct() + .toList(); + List phones = users.stream() + .map(User::getPhone) + .filter(StringUtils::isNotBlank) + .distinct() + .toList(); + Map existingByAccount = new HashMap<>(); + Map existingByPhone = new HashMap<>(); + userService.list(Wrappers.lambdaQuery() + .and(wrapper -> { + wrapper.in(User::getAccount, accounts); + if (CollectionUtil.isNotEmpty(phones)) { + wrapper.or().in(User::getPhone, phones); + } + }) + ).stream() + .peek(userService::decryptPhone) + .forEach(user -> { + if (StringUtils.isNotBlank(user.getAccount())) { + existingByAccount.put(user.getAccount(), user); + } + if (StringUtils.isNotBlank(user.getPhone())) { + existingByPhone.put(user.getPhone(), user); + } + }); + Map userMap = new HashMap<>(); + Set existsUserIds = new HashSet<>(); + users.forEach(user -> { + User existingUser = existingByAccount.get(user.getAccount()); + if (existingUser == null && StringUtils.isNotBlank(user.getPhone())) { + existingUser = existingByPhone.get(user.getPhone()); + } + if (existingUser != null) { + user.setId(existingUser.getId()); + user.setPassword(null); + existsUserIds.add(existingUser.getId()); + } else { + user.setId(DefaultIdentifierGenerator.getInstance().nextId(null)); + user.setPostId("-1"); + user.setPersonCategory(1); + user.setDataScopeRange(1); + user.setDataLevelRange(1); + user.setIncludeNewCustomer(0); + userService.encryptPhone(user); + } + userMap.put(user.getAccount(), user.getId()); + }); + + List addUsers = users.stream() + .filter(user -> !existsUserIds.contains(user.getId())) + .toList(); + if (CollectionUtil.isNotEmpty(addUsers)) { + ComposeLogUtil.getLastLog().info("批量新增用户:{}", addUsers.size()); + userService.saveBatch(addUsers); + } + List updateUsers = users.stream() + .filter(user -> existsUserIds.contains(user.getId())) + .toList(); + if (CollectionUtil.isNotEmpty(updateUsers)) { + ComposeLogUtil.getLastLog().info("批量修改用户:{}", updateUsers.size()); + userService.updateBatchById(updateUsers); + } + ComposeLogUtil.getLastLog().info("缺少账号已跳过的人员:{}", skippedCount); + if (userMap.isEmpty()) { + return new PersonSyncCount(0, skippedCount); + } + + Map userDeptMap = userDeptService.list(Wrappers.lambdaQuery() + .in(UserDept::getUserId, userMap.values()) + ).stream() + .collect(Collectors.toMap(this::getUserDeptKey, UserDept::getId, (first, second) -> second)); + Set existsUserDeptIds = new HashSet<>(userDeptMap.values()); + List userDeptList = oaPersons.stream() + .filter(oaPerson -> userMap.containsKey(userConvert.resolveAccount(oaPerson))) + .map(oaPerson -> this.buildUserDept(oaPerson, userMap, orgIndex)) + .filter(Objects::nonNull) + .toList(); + userDeptList.forEach(userDept -> { + String userDeptKey = getUserDeptKey(userDept); + if (userDeptMap.containsKey(userDeptKey)) { + userDept.setId(userDeptMap.get(userDeptKey)); + } else { + userDept.setId(DefaultIdentifierGenerator.getInstance().nextId(null)); + } + }); + List addList = userDeptList.stream() + .filter(userDept -> !existsUserDeptIds.contains(userDept.getId())) + .toList(); + if (CollectionUtil.isNotEmpty(addList)) { + ComposeLogUtil.getLastLog().info("批量新增用户部门:{}", addList.size()); + userDeptService.saveBatch(addList); + } + List updateList = userDeptList.stream() + .filter(userDept -> existsUserDeptIds.contains(userDept.getId())) + .toList(); + if (CollectionUtil.isNotEmpty(updateList)) { + ComposeLogUtil.getLastLog().info("批量修改用户部门:{}", updateList.size()); + userDeptService.updateBatchById(updateList); + } + Collection userIds = userMap.values(); + List list = userDeptService.queryUserDeptIds(userIds); + Set noRoleUserIds = userService.list(Wrappers.lambdaQuery() + .in(User::getId, userIds) + .and(wrapper -> wrapper.isNull(User::getRoleId) + .or().eq(User::getRoleId, "") + .or().eq(User::getRoleId, "-1")) + ).stream() + .map(User::getId) + .collect(Collectors.toSet()); + String defaultRoleId = getDefaultRoleId(); + List updateUserParams = list.stream() + .filter(userDeptIds -> StringUtils.isNotBlank(userDeptIds.getDeptIds()) && userDeptIds.getDeptIds().length() <= MAX_DEPT_ID_LENGTH) + .map(userDeptIds -> { + User user = new User(); + user.setId(userDeptIds.getUserId()); + user.setDeptId(userDeptIds.getDeptIds()); + user.setDeptCodes(userDeptIds.getDeptCodes()); + if (noRoleUserIds.contains(userDeptIds.getUserId())) { + user.setRoleId(defaultRoleId); + } + return user; + }).toList(); + if (CollectionUtil.isNotEmpty(updateUserParams)) { + userService.updateBatchById(updateUserParams); + } + return new PersonSyncCount(users.size(), skippedCount); + } + + private Dept getOrCreateRootCompany() { + Dept rootCompany = deptService.getOne(Wrappers.lambdaQuery() + .eq(Dept::getDeptName, OAConvertConstant.ROOT_COMPANY_NAME) + .last("limit 1"), false); + if (rootCompany != null) { + return rootCompany; + } + rootCompany = new Dept(); + rootCompany.setId(DefaultIdentifierGenerator.getInstance().nextId(null)); + rootCompany.setTenantId(resolveTenantId()); + rootCompany.setParentId(BladeConstant.TOP_PARENT_ID); + rootCompany.setAncestors(String.valueOf(BladeConstant.TOP_PARENT_ID)); + rootCompany.setDeptName(OAConvertConstant.ROOT_COMPANY_NAME); + rootCompany.setFullName(OAConvertConstant.ROOT_COMPANY_NAME); + rootCompany.setShortName(OAConvertConstant.ROOT_COMPANY_NAME); + rootCompany.setDeptCode("OACROOT"); + rootCompany.setParentCode(String.valueOf(BladeConstant.TOP_PARENT_ID)); + rootCompany.setBelongCompanyCode("OACROOT"); + rootCompany.setDeptCategory(DeptCategory.COMPANY.getCode()); + rootCompany.setSort(0); + rootCompany.setStatus(DataStatusEnum.ENABLE.getCode()); + rootCompany.setIsDeleted(BladeConstant.DB_NOT_DELETED); + rootCompany.setIsOa(YES); + rootCompany.setIsPlatformCompany(0); + rootCompany.setSyncTime(new Date()); + deptService.save(rootCompany); + ComposeLogUtil.getLastLog().info("已创建顶级组织:{}", OAConvertConstant.ROOT_COMPANY_NAME); + return rootCompany; + } + + private Dept upsertOrg(String name, String oaCode, Dept existing, Dept parent, String tenantId, + DeptCategory deptCategory, List addList, List updateList) { + if (existing != null) { + Dept updateParam = new Dept(); + updateParam.setId(existing.getId()); + updateParam.setDeptName(name); + updateParam.setFullName(name); + updateParam.setShortName(name); + updateParam.setParentId(parent.getId()); + updateParam.setParentCode(parent.getDeptCode()); + updateParam.setAncestors(buildAncestors(parent)); + updateParam.setIsOa(YES); + updateParam.setSyncTime(new Date()); + updateList.add(updateParam); + existing.setDeptName(name); + existing.setFullName(name); + existing.setShortName(name); + existing.setParentId(parent.getId()); + existing.setParentCode(parent.getDeptCode()); + existing.setAncestors(updateParam.getAncestors()); + return existing; + } + Dept dept = this.buildOrgDept(name, oaCode, parent, tenantId, deptCategory); + dept.setId(DefaultIdentifierGenerator.getInstance().nextId(null)); + addList.add(dept); + return dept; + } + + private void saveOrgs(List addList, List updateList, DeptCategory deptCategory) { + if (CollectionUtil.isNotEmpty(addList)) { + ComposeLogUtil.getLastLog().info("批量新增{}:{}", deptCategory.getName(), addList.size()); + deptService.saveBatch(addList); + } + if (CollectionUtil.isNotEmpty(updateList)) { + ComposeLogUtil.getLastLog().info("批量修改{}:{}", deptCategory.getName(), updateList.size()); + deptService.updateBatchById(updateList); + } + } + + private Dept buildOrgDept(String name, String deptCode, Dept parent, String tenantId, DeptCategory deptCategory) { + Dept dept = new Dept(); + dept.setTenantId(tenantId); + dept.setParentId(parent.getId()); + dept.setParentCode(parent.getDeptCode()); + dept.setAncestors(this.buildAncestors(parent)); + dept.setDeptName(name); + dept.setFullName(name); + dept.setShortName(name); + dept.setDeptCode(deptCode); + dept.setBelongCompanyCode(DeptCategory.COMPANY.equals(deptCategory) ? deptCode : parent.getBelongCompanyCode()); + dept.setDeptCategory(deptCategory.getCode()); + dept.setSort(0); + dept.setStatus(DataStatusEnum.ENABLE.getCode()); + dept.setIsDeleted(BladeConstant.DB_NOT_DELETED); + dept.setIsOa(YES); + dept.setIsPlatformCompany(0); + dept.setSyncTime(new Date()); + return dept; + } + + private UserDept buildUserDept(OAPersonResponse oaPerson, Map userMap, OaOrgIndex orgIndex) { + Dept department = orgIndex.findDept(oaPerson); + if (department == null || department.getId() == null) { + return null; + } + UserDept userDept = userConvert.person2userDept(oaPerson, userMap); + if (userDept.getUserId() == null) { + return null; + } + Dept company = orgIndex.findCompany(oaPerson); + userDept.setDeptId(department.getId()); + userDept.setDeptCode(department.getDeptCode()); + userDept.setDeptName(department.getDeptName()); + if (company != null) { + userDept.setCompanyCode(company.getDeptCode()); + userDept.setCompanyName(company.getDeptName()); + } + return userDept; + } + + private String getDefaultRoleId() { + String defaultRole = ParamCache.getValue(DEFAULT_PARAM_ROLE); + if (defaultRole == null) { + defaultRole = DEFAULT_ROLE; + } + List roleList = roleService.list(Wrappers.lambdaQuery() + .eq(Role::getRoleAlias, defaultRole) + ); + if (CollectionUtil.isEmpty(roleList)) { + return null; + } + return roleList.get(0).getId().toString(); + } + + private String resolveCompanyKey(OAPersonResponse oaPerson) { + if (oaPerson == null) { + return null; + } + if (StringUtils.isNotBlank(oaPerson.getSubcompanyid1())) { + return oaPerson.getSubcompanyid1().trim(); + } + if (StringUtils.isNotBlank(oaPerson.getSubcompanyname())) { + return "NAME:" + oaPerson.getSubcompanyname().trim(); + } + return null; + } + + private String resolveDepartmentKey(OAPersonResponse oaPerson) { + if (oaPerson == null) { + return null; + } + if (StringUtils.isNotBlank(oaPerson.getDepartmentid())) { + return oaPerson.getDepartmentid().trim(); + } + String companyKey = resolveCompanyKey(oaPerson); + if (StringUtils.isNotBlank(companyKey) && StringUtils.isNotBlank(oaPerson.getDepartmentname())) { + return companyKey + ":" + oaPerson.getDepartmentname().trim(); + } + return null; + } + + private String buildCompanyCode(OAPersonResponse oaPerson, String companyKey) { + if (StringUtils.isNotBlank(oaPerson.getSubcompanyid1())) { + return OAConvertConstant.COMPANY_OA_PREFIX + oaPerson.getSubcompanyid1().trim(); + } + return OAConvertConstant.COMPANY_OA_PREFIX + "N" + Math.abs(companyKey.hashCode()); + } + + private String buildDepartmentCode(OAPersonResponse oaPerson, String departmentKey) { + if (StringUtils.isNotBlank(oaPerson.getDepartmentid())) { + return OAConvertConstant.DEPARTMENT_OA_PREFIX + oaPerson.getDepartmentid().trim(); + } + return OAConvertConstant.DEPARTMENT_OA_PREFIX + "N" + Math.abs(departmentKey.hashCode()); + } + + private String buildAncestors(Dept parent) { + String ancestors = parent.getAncestors(); + if (StringUtils.isBlank(ancestors)) { + ancestors = String.valueOf(BladeConstant.TOP_PARENT_ID); + } + return ancestors + "," + parent.getId(); + } + + private String resolveTenantId() { + String tenantId = AuthUtil.getTenantId(); + if (StringUtils.isBlank(tenantId)) { + return BladeConstant.ADMIN_TENANT_ID; + } + return tenantId; + } + + private String getUserDeptKey(UserDept userDept) { + if (userDept == null) { + return null; + } + return userDept.getUserId() + userDept.getCompanyCode() + userDept.getDeptCode(); + } + + /** + * 本批人员同步计数 + */ + public static class PersonSyncCount { + private final int syncedCount; + private final int skippedCount; + + public PersonSyncCount(int syncedCount, int skippedCount) { + this.syncedCount = syncedCount; + this.skippedCount = skippedCount; + } + + public int getSyncedCount() { + return syncedCount; + } + + public int getSkippedCount() { + return skippedCount; + } + } + + /** + * OA 组织索引 + */ + public static class OaOrgIndex { + private final Map companyByOaId = new HashMap<>(); + private final Map deptByOaId = new HashMap<>(); + private final Map deptByCompanyAndName = new HashMap<>(); + + private Dept findCompany(OAPersonResponse oaPerson) { + if (oaPerson == null) { + return null; + } + if (StringUtils.isNotBlank(oaPerson.getSubcompanyid1())) { + Dept company = companyByOaId.get(oaPerson.getSubcompanyid1().trim()); + if (company != null) { + return company; + } + } + if (StringUtils.isNotBlank(oaPerson.getSubcompanyname())) { + return companyByOaId.get("NAME:" + oaPerson.getSubcompanyname().trim()); + } + return null; + } + + private Dept findDept(OAPersonResponse oaPerson) { + if (oaPerson == null) { + return null; + } + if (StringUtils.isNotBlank(oaPerson.getDepartmentid())) { + Dept department = deptByOaId.get(oaPerson.getDepartmentid().trim()); + if (department != null) { + return department; + } + } + String companyKey = StringUtils.isNotBlank(oaPerson.getSubcompanyid1()) + ? oaPerson.getSubcompanyid1().trim() + : (StringUtils.isNotBlank(oaPerson.getSubcompanyname()) ? "NAME:" + oaPerson.getSubcompanyname().trim() : null); + if (StringUtils.isNotBlank(companyKey) && StringUtils.isNotBlank(oaPerson.getDepartmentname())) { + Dept department = deptByCompanyAndName.get(companyKey + "#" + oaPerson.getDepartmentname()); + if (department != null) { + return department; + } + return deptByOaId.get(companyKey + ":" + oaPerson.getDepartmentname().trim()); + } + return null; + } + } +} diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserPhoneServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserPhoneServiceImpl.java new file mode 100644 index 0000000..f6f26d9 --- /dev/null +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserPhoneServiceImpl.java @@ -0,0 +1,212 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.system.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.cache.utils.CacheUtil; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.redis.cache.BladeRedis; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.resource.feign.ISmsClient; +import org.springblade.resource.utils.SmsUtil; +import org.springblade.system.pojo.dto.PhoneChangeDTO; +import org.springblade.system.pojo.dto.PhoneVerifyDTO; +import org.springblade.system.pojo.entity.User; +import org.springblade.system.service.IUserPhoneService; +import org.springblade.system.service.IUserService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.Duration; +import java.util.regex.Pattern; + +import static org.springblade.core.cache.constant.CacheConstant.USER_CACHE; + +/** + * 用户手机号变更服务实现 + * + * @author Chill + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class UserPhoneServiceImpl implements IUserPhoneService { + + /** + * 与登录短信一致,对应后台 /resource/sms 的 smsCode + */ + private static final String SMS_RESOURCE_CODE = "ali_reg"; + + /** + * 原手机号已校验凭证(Redis) + */ + private static final String PHONE_CHANGE_VERIFIED_KEY = "blade:user:phone:change:verified:"; + + private static final Duration PHONE_CHANGE_VERIFIED_TTL = Duration.ofMinutes(15); + + private static final Pattern MOBILE_PATTERN = Pattern.compile("^1[3-9]\\d{9}$"); + + private final IUserService userService; + private final ISmsClient smsClient; + private final BladeRedis bladeRedis; + + @Override + public R sendCode(String phone) { + String normalizedPhone = normalizePhone(phone); + Long userId = AuthUtil.getUserId(); + if (Func.isEmpty(userId)) { + throw new ServiceException("请先登录"); + } + User currentUser = requireCurrentUser(userId); + String tenantId = Func.toStr(currentUser.getTenantId(), AuthUtil.getTenantId()); + boolean isCurrentPhone = StringUtil.equals(normalizedPhone, Func.toStr(currentUser.getPhone())); + if (!isCurrentPhone) { + assertPhoneAvailable(tenantId, normalizedPhone, userId); + } + R result = smsClient.sendValidate(tenantId, SMS_RESOURCE_CODE, normalizedPhone); + if (result == null || !result.isSuccess()) { + return R.fail(SmsUtil.SEND_FAIL); + } + return R.data(result.getData(), SmsUtil.SEND_SUCCESS); + } + + @Override + public boolean verifyOldPhone(PhoneVerifyDTO phoneVerify) { + Long userId = AuthUtil.getUserId(); + if (Func.isEmpty(userId)) { + throw new ServiceException("请先登录"); + } + String id = Func.toStr(phoneVerify.getId()).trim(); + String code = Func.toStr(phoneVerify.getCode()).trim(); + if (StringUtil.isBlank(id) || StringUtil.isBlank(code)) { + throw new ServiceException("请先获取并填写验证码"); + } + User currentUser = requireCurrentUser(userId); + String oldPhone = Func.toStr(currentUser.getPhone()).trim(); + if (StringUtil.isBlank(oldPhone)) { + throw new ServiceException("当前账号未绑定手机号"); + } + validateSms(currentUser.getTenantId(), id, code, oldPhone); + bladeRedis.setEx(PHONE_CHANGE_VERIFIED_KEY + userId, "1", PHONE_CHANGE_VERIFIED_TTL); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean changePhone(PhoneChangeDTO phoneChange) { + Long userId = AuthUtil.getUserId(); + if (Func.isEmpty(userId)) { + throw new ServiceException("请先登录"); + } + String verified = Func.toStr(bladeRedis.get(PHONE_CHANGE_VERIFIED_KEY + userId)); + if (!StringUtil.equals(verified, "1")) { + throw new ServiceException("请先完成原手机号验证"); + } + String id = Func.toStr(phoneChange.getId()).trim(); + String code = Func.toStr(phoneChange.getCode()).trim(); + String newPhone = normalizePhone(phoneChange.getNewPhone()); + if (StringUtil.isBlank(id) || StringUtil.isBlank(code)) { + throw new ServiceException("请先获取并填写验证码"); + } + User currentUser = requireCurrentUser(userId); + String oldPhone = Func.toStr(currentUser.getPhone()).trim(); + if (StringUtil.equals(newPhone, oldPhone)) { + throw new ServiceException("新手机号不可与当前手机号相同"); + } + String tenantId = Func.toStr(currentUser.getTenantId(), AuthUtil.getTenantId()); + assertPhoneAvailable(tenantId, newPhone, userId); + validateSms(tenantId, id, code, newPhone); + + User updateUser = new User(); + updateUser.setId(userId); + updateUser.setPhone(newPhone); + // 账号若等于原手机号,同步更新,保证短信登录可用 + if (StringUtil.isNotBlank(oldPhone) && StringUtil.equals(oldPhone, Func.toStr(currentUser.getAccount()))) { + assertAccountAvailable(tenantId, newPhone, userId); + updateUser.setAccount(newPhone); + } + boolean updated = userService.updateById(updateUser); + if (!updated) { + throw new ServiceException("手机号修改失败"); + } + bladeRedis.del(PHONE_CHANGE_VERIFIED_KEY + userId); + CacheUtil.clear(USER_CACHE); + return true; + } + + private User requireCurrentUser(Long userId) { + User user = userService.getById(userId); + if (user == null) { + throw new ServiceException("用户不存在"); + } + return user; + } + + private void validateSms(String tenantId, String id, String value, String phone) { + R result = smsClient.validateMessage(tenantId, SMS_RESOURCE_CODE, id, value, phone); + if (result == null || !result.isSuccess()) { + throw new ServiceException(SmsUtil.VALIDATE_FAIL); + } + } + + private void assertPhoneAvailable(String tenantId, String phone, Long excludeUserId) { + Long phoneCount = userService.count( + Wrappers.lambdaQuery() + .eq(User::getTenantId, tenantId) + .eq(User::getPhone, phone) + .ne(User::getId, excludeUserId) + ); + if (phoneCount != null && phoneCount > 0L) { + throw new ServiceException(StringUtil.format("当前手机 [{}] 已存在!", phone)); + } + } + + private void assertAccountAvailable(String tenantId, String account, Long excludeUserId) { + Long accountCount = userService.count( + Wrappers.lambdaQuery() + .eq(User::getTenantId, tenantId) + .eq(User::getAccount, account) + .ne(User::getId, excludeUserId) + ); + if (accountCount != null && accountCount > 0L) { + throw new ServiceException(StringUtil.format("当前用户 [{}] 已存在!", account)); + } + } + + private String normalizePhone(String phone) { + String normalizedPhone = Func.toStr(phone).trim(); + if (!MOBILE_PATTERN.matcher(normalizedPhone).matches()) { + throw new ServiceException("手机号格式不正确"); + } + return normalizedPhone; + } + +} diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserServiceImpl.java index 3eb7d43..575adb7 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/UserServiceImpl.java @@ -529,6 +529,46 @@ public class UserServiceImpl extends BaseServiceImpl implement return userInfo; } + @Override + @Transactional(rollbackFor = Exception.class) + public boolean bindWxMiniOpenId(String tenantId, Long userId, String openid, String phone) { + if (Func.isBlank(tenantId) || Func.isEmpty(userId) || Func.isBlank(openid)) { + throw new ServiceException("绑定微信 openid 参数不完整"); + } + String source = "WECHAT_MINI"; + UserOauth byOpenId = userOauthService.getOne(Wrappers.lambdaQuery() + .eq(UserOauth::getTenantId, tenantId) + .eq(UserOauth::getSource, source) + .eq(UserOauth::getUuid, openid) + .last("LIMIT 1")); + if (byOpenId != null) { + byOpenId.setUserId(userId); + if (Func.isNotBlank(phone)) { + byOpenId.setUsername(phone); + } + return userOauthService.updateById(byOpenId); + } + UserOauth byUser = userOauthService.getOne(Wrappers.lambdaQuery() + .eq(UserOauth::getTenantId, tenantId) + .eq(UserOauth::getSource, source) + .eq(UserOauth::getUserId, userId) + .last("LIMIT 1")); + if (byUser != null) { + byUser.setUuid(openid); + if (Func.isNotBlank(phone)) { + byUser.setUsername(phone); + } + return userOauthService.updateById(byUser); + } + UserOauth oauth = new UserOauth(); + oauth.setTenantId(tenantId); + oauth.setUserId(userId); + oauth.setUuid(openid); + oauth.setUsername(Func.toStr(phone, "")); + oauth.setSource(source); + return userOauthService.save(oauth); + } + @Override @Transactional(rollbackFor = Exception.class) public boolean grant(String userIds, String roleIds) { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ExceptionDisposalController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ExceptionDisposalController.java index 3a64704..2fc52aa 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ExceptionDisposalController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ExceptionDisposalController.java @@ -30,7 +30,6 @@ import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; -import org.springblade.core.secure.annotation.PreAuth; import org.springblade.core.tool.api.R; import org.springblade.transport.pojo.dto.ExceptionDisposalFollowRequest; import org.springblade.transport.pojo.entity.ExceptionDisposal; @@ -48,7 +47,7 @@ import org.springframework.web.bind.annotation.RestController; *

* 对外路径:{@code /api/blade-transport/exception-disposal/**} * 同时兼容未去前缀直连 {@code /blade-transport/exception-disposal/**}。 - * 司机上报(submit)/ 列表 / 详情仅需登录态;跟进与完成保留菜单鉴权。 + * 列表 / 详情 / 上报 / 跟进 / 完成均仅需登录态(小程序调度端与司机端共用)。 */ @RestController @AllArgsConstructor @@ -80,27 +79,24 @@ public class ExceptionDisposalController extends BladeController { } @PostMapping("/follow") - @PreAuth(menu = "exception_disposal") @ApiOperationSupport(order = 4) - @Operation(summary = "异常跟进") + @Operation(summary = "异常跟进", description = "调度端跟进;仅需登录态") public R follow(@RequestBody ExceptionDisposalFollowRequest request) { exceptionDisposalService.follow(request); return R.success("跟进成功"); } @PostMapping("/complete") - @PreAuth(menu = "exception_disposal") @ApiOperationSupport(order = 5) - @Operation(summary = "完成异常") + @Operation(summary = "完成异常", description = "调度端结案;仅需登录态") public R complete(@RequestBody ExceptionDisposalFollowRequest request) { exceptionDisposalService.complete(request.getId()); return R.success("完成成功"); } @PostMapping("/batch-complete") - @PreAuth(menu = "exception_disposal") @ApiOperationSupport(order = 6) - @Operation(summary = "批量完成异常") + @Operation(summary = "批量完成异常", description = "调度端批量结案;仅需登录态") public R batchComplete(@RequestParam String ids) { exceptionDisposalService.batchComplete(ids); return R.success("批量完成成功"); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ManageWaybillController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ManageWaybillController.java new file mode 100644 index 0000000..119cf5b --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ManageWaybillController.java @@ -0,0 +1,143 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.tool.api.R; +import org.springblade.transport.pojo.entity.Waybill; +import org.springblade.transport.pojo.vo.AdminDriverOptionVO; +import org.springblade.transport.pojo.vo.AdminHomeStatsVO; +import org.springblade.transport.pojo.vo.AdminHomeVO; +import org.springblade.transport.pojo.vo.AdminVehicleOptionVO; +import org.springblade.transport.pojo.vo.AdminWaybillCardVO; +import org.springblade.transport.pojo.vo.AdminWaybillDetailVO; +import org.springblade.transport.service.IManageWaybillService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 调度端运单(小程序管理端) + *

+ * 对外完整路径:{@code /api/blade-transport/waybill/manage/**} + * (网关 StripPrefix 去掉 {@code blade-transport} 后落入 {@code /waybill/manage/**})。 + * 同时兼容未去前缀直连({@code /blade-transport/waybill/manage/**})。 + * 仅需登录态,不挂管理端菜单鉴权。 + */ +@RestController +@AllArgsConstructor +@RequestMapping({"/waybill/manage", "/blade-transport/waybill/manage"}) +@Tag(name = "调度端运单", description = "小程序调度端首页统计与运单列表") +public class ManageWaybillController extends BladeController { + + private final IManageWaybillService manageWaybillService; + + @GetMapping("/stats") + @ApiOperationSupport(order = 1) + @Operation(summary = "运单状态统计", description = "待接单=pending,运输中=running,已完成=completed;租户内不过滤组织(小程序调度账号组织常与运单不一致);在途异常=异常处置状态≠已完成") + public R stats() { + return R.data(manageWaybillService.stats()); + } + + @GetMapping("/home") + @ApiOperationSupport(order = 2) + @Operation(summary = "首页聚合", description = "统计 + 异常/风险角标 + 待处理事项(异常处置≠已完成)+ 当前用户名") + public R home() { + return R.data(manageWaybillService.home()); + } + + @GetMapping("/list") + @ApiOperationSupport(order = 3) + @Operation(summary = "运单分页列表", description = "当前组织运单;status:0待接单/1运输中/2已完成;exception:exception/normal;transportType:common/load") + public R> list( + @Parameter(description = "当前页") @RequestParam(required = false) Integer current, + @Parameter(description = "每页条数") @RequestParam(required = false) Integer size, + @Parameter(description = "关键字:运单号/司机/车牌") @RequestParam(required = false) String keyword, + @Parameter(description = "状态:0待接单/1运输中/2已完成,不传为全部") @RequestParam(required = false) String status, + @Parameter(description = "异常:exception有异常/normal无异常") @RequestParam(required = false) String exception, + @Parameter(description = "运输组织:common普通/load配载") @RequestParam(required = false) String transportType, + @Parameter(description = "创建日起 YYYY-MM-DD") @RequestParam(required = false) String startDate, + @Parameter(description = "创建日止 YYYY-MM-DD") @RequestParam(required = false) String endDate) { + return R.data(manageWaybillService.pageList( + current, size, keyword, status, exception, transportType, startDate, endDate)); + } + + @GetMapping("/detail") + @ApiOperationSupport(order = 4) + @Operation(summary = "运单详情", description = "调度端查看运单详情(含 punchNodes / enrouteRecords),不校验司机归属与组织;字段对齐小程序 pages/waybill/detail") + public R detail( + @Parameter(description = "运单ID", required = true) @RequestParam Long id) { + return R.data(manageWaybillService.detail(id)); + } + + @GetMapping("/pending") + @ApiOperationSupport(order = 5) + @Operation(summary = "待处理运单", description = "待接单/运输中;needReassign=true 仅司机已拒单") + public R> pending( + @Parameter(description = "当前页") @RequestParam(required = false) Integer current, + @Parameter(description = "每页条数") @RequestParam(required = false) Integer size, + @Parameter(description = "关键字:运单号/司机/车牌") @RequestParam(required = false) String keyword, + @Parameter(description = "是否需重新派单") @RequestParam(required = false) Boolean needReassign) { + return R.data(manageWaybillService.pendingList(current, size, keyword, needReassign)); + } + + @PostMapping("/reassign") + @ApiOperationSupport(order = 6) + @Operation(summary = "重新派单", description = "小程序调度端:跳过组织校验,仅需登录态;传入运单ID及新司机、手机号、车牌") + public R reassign(@RequestBody Waybill waybill) { + return R.status(manageWaybillService.reassign( + waybill.getId(), + waybill.getDriverId(), + waybill.getDriverName(), + waybill.getDriverPhone(), + waybill.getVehicleNo())); + } + + @GetMapping("/driver-search") + @ApiOperationSupport(order = 7) + @Operation(summary = "搜索司机", description = "按姓名/手机号模糊搜索,供重新派单选用") + public R> driverSearch( + @Parameter(description = "关键字") @RequestParam(required = false) String keyword) { + return R.data(manageWaybillService.searchDrivers(keyword)); + } + + @GetMapping("/vehicle-search") + @ApiOperationSupport(order = 8) + @Operation(summary = "搜索车牌", description = "按车牌模糊搜索(来自司机绑定车牌)") + public R> vehicleSearch( + @Parameter(description = "关键字") @RequestParam(required = false) String keyword) { + return R.data(manageWaybillService.searchVehicles(keyword)); + } + +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IDriverWaybillService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IDriverWaybillService.java index f9e804d..be43425 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IDriverWaybillService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IDriverWaybillService.java @@ -68,6 +68,12 @@ public interface IDriverWaybillService { */ DriverWaybillCardVO detail(Long id); + /** + * 按运单ID组装详情打卡数据(punchNodes / enrouteRecords),不校验当前登录人是否为该司机。 + * 供调度端 manage/detail 复用。 + */ + DriverWaybillCardVO detailPunchSnapshot(Long id); + /** * 司机确认接单:过程配置要求接单且尚未接单时,写入接单记录并将运单改为进行中。 */ diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IManageWaybillService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IManageWaybillService.java new file mode 100644 index 0000000..08bd411 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IManageWaybillService.java @@ -0,0 +1,90 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.transport.pojo.vo.AdminDriverOptionVO; +import org.springblade.transport.pojo.vo.AdminHomeStatsVO; +import org.springblade.transport.pojo.vo.AdminHomeVO; +import org.springblade.transport.pojo.vo.AdminVehicleOptionVO; +import org.springblade.transport.pojo.vo.AdminWaybillCardVO; +import org.springblade.transport.pojo.vo.AdminWaybillDetailVO; + +import java.util.List; + +/** + * 调度端(小程序管理端)运单首页服务 + */ +public interface IManageWaybillService { + + /** + * 运单状态统计:运输中 / 待接单 / 在途异常 / 已完成 + */ + AdminHomeStatsVO stats(); + + /** + * 首页聚合:统计 + 角标 + 待处理事项(异常处置≠已完成)+ 用户名 + */ + AdminHomeVO home(); + + /** + * 调度端运单分页列表 + * + * @param current 页码 + * @param size 每页条数 + * @param keyword 运单号/司机/车牌 + * @param status 0待接单/1运输中/2已完成,空=全部 + * @param exception exception有异常 / normal无异常 / 空=全部 + * @param transportType common普通 / load配载 / 空=全部 + * @param startDate 创建日起 YYYY-MM-DD + * @param endDate 创建日止 YYYY-MM-DD + */ + IPage pageList(Integer current, Integer size, String keyword, String status, + String exception, String transportType, String startDate, String endDate); + + /** + * 调度端运单详情(不校验司机归属) + */ + AdminWaybillDetailVO detail(Long id); + + /** + * 待处理运单(待接单 / 运输中;可筛需重新派单) + */ + IPage pendingList(Integer current, Integer size, String keyword, Boolean needReassign); + + /** + * 重新派单:跳过管理端部门校验,仅需登录态(司机、手机号、车牌) + */ + boolean reassign(Long id, Long driverId, String driverName, String driverPhone, String vehicleNo); + + /** + * 搜索司机(姓名/手机号) + */ + List searchDrivers(String keyword); + + /** + * 搜索车牌(来自司机绑定车牌) + */ + List searchVehicles(String keyword); + +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IWaybillService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IWaybillService.java index e4f77e6..bf3dccf 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IWaybillService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IWaybillService.java @@ -60,6 +60,12 @@ public interface IWaybillService extends BaseService { boolean maintainMileage(WaybillMileageRequest request); boolean cancel(Long id); boolean reassign(Waybill waybill); + + /** + * 小程序调度端重新派单:跳过管理端部门校验,其余逻辑与 {@link #reassign(Waybill)} 一致。 + */ + boolean reassignWithoutDeptCheck(Waybill waybill); + boolean complete(Long id); /** diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverWaybillServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverWaybillServiceImpl.java index ad1cbc1..2181abc 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverWaybillServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/DriverWaybillServiceImpl.java @@ -225,6 +225,18 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService { return toCard(normalizeAcceptStatus(waybill), true); } + @Override + public DriverWaybillCardVO detailPunchSnapshot(Long id) { + if (id == null) { + throw new ServiceException("运单ID不能为空"); + } + Waybill waybill = waybillService.getById(id); + if (waybill == null || Objects.equals(waybill.getIsDeleted(), 1)) { + throw new ServiceException("运单不存在"); + } + return toCard(normalizeAcceptStatus(waybill), true); + } + @Override @Transactional(rollbackFor = Exception.class) public DriverEnrouteRecordVO submitEnroute(EnrouteSubmitDTO dto) { @@ -610,6 +622,19 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService { card.setAcceptStatus(waybill.getDriverAcceptStatus()); card.setRejectReason(waybill.getDriverRejectReason()); + // 详情页字段(列表也可带上,体积很小) + String cargoName = Func.toStr(waybill.getCargoName(), ""); + String weightText = card.getWeight(); + card.setCargoName(cargoName); + card.setPickupAddress(card.getFromAddress()); + card.setUnloadAddress(card.getToAddress()); + card.setCargoQuantity(weightText); + card.setTotalWeight(weightText); + card.setTransportType(toTransportTypeLabel(waybill.getTransportType())); + card.setPlanShipTime(formatLocalDateYmd(waybill.getEstimatedStartTime())); + card.setPlanFinishTime(formatLocalDateYmd(waybill.getEstimatedEndTime())); + card.setRemark(Func.toStr(waybill.getRemark(), "")); + if (withEnrouteRecords) { Date lastPunchAt = findLastPunchTime(waybill.getId()); WaybillProcessSupport.TransitCheckinDecision transit = WaybillProcessSupport.evaluateTransitCheckin( @@ -623,6 +648,8 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService { card.setTransitTimeEnd(transit.timeEnd()); card.setEnrouteRecords(listEnrouteRecords(waybill.getId())); card.setPunchNodes(buildPunchNodes(waybill, transit, processJson)); + card.setRoutePoints(buildSimpleRoutePoints(waybill)); + card.setProcessJson(processJson); } else { // 列表/首页:只解析过程配置是否启用在途打卡,不做频次/时段与落库查询 boolean punchEnabled = WaybillProcessSupport.isTransitPunchEnabled(processJson); @@ -634,18 +661,61 @@ public class DriverWaybillServiceImpl implements IDriverWaybillService { return card; } + private List buildSimpleRoutePoints(Waybill waybill) { + DriverWaybillCardVO.DriverRoutePointVO load = new DriverWaybillCardVO.DriverRoutePointVO(); + load.setName(Func.toStr(waybill.getDepartureName(), "装货点")); + load.setAddress(Func.toStr(waybill.getDepartureAddress(), load.getName())); + load.setStatus("pending"); + DriverWaybillCardVO.DriverRoutePointVO unload = new DriverWaybillCardVO.DriverRoutePointVO(); + unload.setName(Func.toStr(waybill.getArrivalName(), "卸货点")); + unload.setAddress(Func.toStr(waybill.getArrivalAddress(), unload.getName())); + unload.setStatus("pending"); + return List.of(load, unload); + } + + private String toTransportTypeLabel(String transportType) { + if (Func.isBlank(transportType)) { + return ""; + } + String t = transportType.trim().toLowerCase(); + return switch (t) { + case "road", "gl" -> "公路运输"; + case "railway", "rail" -> "铁路运输"; + case "river", "water", "waterway" -> "水路运输"; + case "air", "aviation" -> "航空运输"; + default -> transportType; + }; + } + + private String formatLocalDateYmd(LocalDate date) { + if (date == null) { + return ""; + } + return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + } + /** - * 动态获取项目启用中的过程配置节点 JSON;无则回退运单快照 processJson。 + * 优先用项目启用中的过程配置;若动态配置无打卡节点,回退运单快照 processJson, + * 避免项目配置改坏后司机端打卡页空白。 */ private String resolveProcessJson(Waybill waybill) { if (waybill == null) { return null; } + String snapshot = waybill.getProcessJson(); String live = loadLiveProcessConfigJson(waybill.getProjectId()); if (Func.isNotEmpty(live)) { + if (!WaybillProcessSupport.listDriverPunchNodes(live).isEmpty()) { + return live; + } + // 动态配置存在但无可打卡节点:仍回退快照 + if (Func.isNotEmpty(snapshot) + && !WaybillProcessSupport.listDriverPunchNodes(snapshot).isEmpty()) { + return snapshot; + } return live; } - return waybill.getProcessJson(); + return snapshot; } private String loadLiveProcessConfigJson(Long projectId) { diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ManageWaybillServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ManageWaybillServiceImpl.java new file mode 100644 index 0000000..5854689 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ManageWaybillServiceImpl.java @@ -0,0 +1,642 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.system.cache.UserCache; +import org.springblade.transport.pojo.entity.Driver; +import org.springblade.transport.pojo.entity.ExceptionDisposal; +import org.springblade.transport.pojo.entity.RiskDisposal; +import org.springblade.transport.pojo.entity.Waybill; +import org.springblade.transport.pojo.vo.AdminDriverOptionVO; +import org.springblade.transport.pojo.vo.AdminHomeBadgesVO; +import org.springblade.transport.pojo.vo.AdminHomeStatsVO; +import org.springblade.transport.pojo.vo.AdminHomeVO; +import org.springblade.transport.pojo.vo.AdminTodoItemVO; +import org.springblade.transport.pojo.vo.AdminVehicleOptionVO; +import org.springblade.transport.pojo.vo.AdminWaybillCardVO; +import org.springblade.transport.pojo.vo.AdminWaybillDetailVO; +import org.springblade.transport.pojo.vo.DriverWaybillCardVO; +import org.springblade.transport.service.IDriverService; +import org.springblade.transport.service.IDriverWaybillService; +import org.springblade.transport.service.IExceptionDisposalService; +import org.springblade.transport.service.IManageWaybillService; +import org.springblade.transport.service.IRiskDisposalService; +import org.springblade.transport.service.IWaybillService; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 调度端:运单状态统计 + 异常/风险角标 + 待处理事项 + 运单列表 + *

+ * 小程序调度账号(如「小程序管理」)组织常与运单业务组织不一致,故不做 dept 过滤, + * 仅依赖租户隔离,口径接近后台 {@code /waybill-manage/list?allDept=1}。 + */ +@Service +@RequiredArgsConstructor +public class ManageWaybillServiceImpl implements IManageWaybillService { + + private static final String STATUS_PENDING = "pending"; + private static final String STATUS_RUNNING = "running"; + private static final String STATUS_COMPLETED = "completed"; + private static final String STATUS_CANCELLED = "cancelled"; + private static final String ACCEPT_REJECTED = "rejected"; + + private static final String DISPOSAL_PENDING = "pending"; + private static final String DISPOSAL_PROCESSING = "processing"; + private static final String RISK_PENDING = "pending"; + + private static final String EXCEPTION_YES = "exception"; + private static final String EXCEPTION_NO = "normal"; + private static final String TRANSPORT_COMMON = "common"; + private static final String TRANSPORT_LOAD = "load"; + + private static final int FEED_LIMIT = 20; + private static final int DEFAULT_PAGE_SIZE = 10; + private static final int MAX_PAGE_SIZE = 50; + + private static final DateTimeFormatter DATE_MD = DateTimeFormatter.ofPattern("MM-dd"); + private static final DateTimeFormatter DATE_YMD = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + private final IWaybillService waybillService; + private final IDriverService driverService; + private final IExceptionDisposalService exceptionDisposalService; + private final IRiskDisposalService riskDisposalService; + private final IDriverWaybillService driverWaybillService; + + @Override + public AdminHomeStatsVO stats() { + AdminHomeStatsVO vo = new AdminHomeStatsVO(); + vo.setPendingAccept(countWaybillByStatus(STATUS_PENDING)); + vo.setTransporting(countWaybillByStatus(STATUS_RUNNING)); + vo.setCompleted(countWaybillByStatus(STATUS_COMPLETED)); + vo.setException(countIncompleteExceptions()); + return vo; + } + + @Override + public AdminHomeVO home() { + AdminHomeVO home = new AdminHomeVO(); + home.setUserName(resolveUserName()); + home.setStats(stats()); + + AdminHomeBadgesVO badges = new AdminHomeBadgesVO(); + badges.setException(home.getStats().getException()); + badges.setRisk(countPendingRisks()); + home.setBadges(badges); + home.setFeed(buildExceptionFeed()); + return home; + } + + @Override + public IPage pageList(Integer current, Integer size, String keyword, String status, + String exception, String transportType, String startDate, String endDate) { + int pageNo = current == null || current < 1 ? 1 : current; + int pageSize = size == null || size < 1 ? DEFAULT_PAGE_SIZE : Math.min(size, MAX_PAGE_SIZE); + + Set exceptionWaybillIds = loadIncompleteExceptionWaybillIds(); + if (EXCEPTION_YES.equals(exception) && exceptionWaybillIds.isEmpty()) { + Page emptyVo = new Page<>(pageNo, pageSize, 0); + emptyVo.setRecords(List.of()); + return emptyVo; + } + + LambdaQueryWrapper wrapper = scopedWaybillQuery(); + applyStatusFilter(wrapper, status); + applyExceptionFilter(wrapper, exception, exceptionWaybillIds); + applyTransportTypeFilter(wrapper, transportType); + applyKeywordFilter(wrapper, keyword); + applyCreateTimeFilter(wrapper, startDate, endDate); + wrapper.orderByDesc(Waybill::getCreateTime); + + IPage entityPage = waybillService.page(new Page<>(pageNo, pageSize), wrapper); + List pageIds = entityPage.getRecords().stream() + .map(Waybill::getId) + .filter(Objects::nonNull) + .toList(); + Set pageExceptionIds = pageIds.isEmpty() + ? Collections.emptySet() + : exceptionWaybillIds.stream().filter(pageIds::contains).collect(Collectors.toSet()); + + Page voPage = new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal()); + voPage.setRecords(entityPage.getRecords().stream() + .map(w -> toCard(w, pageExceptionIds.contains(w.getId()))) + .toList()); + return voPage; + } + + @Override + public AdminWaybillDetailVO detail(Long id) { + if (id == null) { + throw new org.springblade.core.log.exception.ServiceException("运单ID不能为空"); + } + Waybill waybill = waybillService.getById(id); + if (waybill == null || Objects.equals(waybill.getIsDeleted(), 1)) { + throw new org.springblade.core.log.exception.ServiceException("运单不存在"); + } + boolean hasException = false; + Long exceptionId = null; + ExceptionDisposal latest = exceptionDisposalService.getOne(Wrappers.lambdaQuery() + .eq(ExceptionDisposal::getWaybillId, id) + .in(ExceptionDisposal::getDisposalStatus, DISPOSAL_PENDING, DISPOSAL_PROCESSING) + .orderByDesc(ExceptionDisposal::getReportTime) + .orderByDesc(ExceptionDisposal::getCreateTime) + .last("LIMIT 1")); + if (latest != null) { + hasException = true; + exceptionId = latest.getId(); + } + return toDetail(waybill, hasException, exceptionId); + } + + @Override + public IPage pendingList(Integer current, Integer size, String keyword, Boolean needReassign) { + int pageNo = current == null || current < 1 ? 1 : current; + int pageSize = size == null || size < 1 ? DEFAULT_PAGE_SIZE : Math.min(size, MAX_PAGE_SIZE); + + LambdaQueryWrapper wrapper = scopedWaybillQuery() + .in(Waybill::getBusinessStatus, STATUS_PENDING, STATUS_RUNNING); + if (Boolean.TRUE.equals(needReassign)) { + wrapper.eq(Waybill::getDriverAcceptStatus, ACCEPT_REJECTED); + } else if (Boolean.FALSE.equals(needReassign)) { + wrapper.and(w -> w.isNull(Waybill::getDriverAcceptStatus) + .or().ne(Waybill::getDriverAcceptStatus, ACCEPT_REJECTED)); + } + applyKeywordFilter(wrapper, keyword); + wrapper.orderByDesc(Waybill::getUpdateTime).orderByDesc(Waybill::getCreateTime); + + IPage entityPage = waybillService.page(new Page<>(pageNo, pageSize), wrapper); + Set exceptionWaybillIds = loadIncompleteExceptionWaybillIds(); + List pageIds = entityPage.getRecords().stream() + .map(Waybill::getId) + .filter(Objects::nonNull) + .toList(); + Set pageExceptionIds = pageIds.isEmpty() + ? Collections.emptySet() + : exceptionWaybillIds.stream().filter(pageIds::contains).collect(Collectors.toSet()); + + Page voPage = new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal()); + voPage.setRecords(entityPage.getRecords().stream() + .map(w -> toCard(w, pageExceptionIds.contains(w.getId()))) + .toList()); + return voPage; + } + + private AdminWaybillDetailVO toDetail(Waybill waybill, boolean hasException, Long exceptionId) { + AdminWaybillDetailVO detail = new AdminWaybillDetailVO(); + detail.setId(waybill.getId()); + detail.setWaybillNo(waybill.getWaybillNo()); + detail.setStatus(toAppStatus(waybill.getBusinessStatus())); + + String mode = Func.toStr(waybill.getTransportType(), ""); + detail.setTransportMode(mode); + detail.setTransportType(toTransportTypeLabel(mode)); + detail.setTransportOrgType(Func.isNotBlank(waybill.getLoadingNo()) ? TRANSPORT_LOAD : TRANSPORT_COMMON); + + detail.setFromName(formatPlaceName(waybill.getDepartureName(), mode)); + detail.setToName(formatPlaceName(waybill.getArrivalName(), mode)); + String fromAddr = Func.toStr(waybill.getDepartureAddress(), Func.toStr(waybill.getDepartureName(), "")); + String toAddr = Func.toStr(waybill.getArrivalAddress(), Func.toStr(waybill.getArrivalName(), "")); + detail.setFromAddress(fromAddr); + detail.setToAddress(toAddr); + detail.setPickupAddress(fromAddr); + detail.setUnloadAddress(toAddr); + + String cargo = Func.toStr(waybill.getCargoName(), ""); + String weight = formatWeight(waybill.getQuantity(), waybill.getQuantityUnit()); + detail.setCargoName(cargo); + detail.setCargoQuantity(weight); + detail.setWeight(weight); + detail.setTotalWeight(weight); + + detail.setPlanShipTime(formatLocalDate(waybill.getEstimatedStartTime())); + detail.setPlanFinishTime(formatLocalDate(waybill.getEstimatedEndTime())); + detail.setCarrierName(Func.toStr(waybill.getCarrierName(), "")); + detail.setDriverName(Func.toStr(waybill.getDriverName(), "")); + detail.setDriverPhone(Func.toStr(waybill.getDriverPhone(), "")); + detail.setVehicleNo(Func.toStr(waybill.getVehicleNo(), "")); + detail.setRemark(Func.toStr(waybill.getRemark(), "")); + detail.setHasException(hasException); + detail.setExceptionId(exceptionId); + detail.setNeedReassign(ACCEPT_REJECTED.equals(waybill.getDriverAcceptStatus())); + detail.setAcceptStatus(Func.toStr(waybill.getDriverAcceptStatus(), "")); + detail.setRejectReason(Func.toStr(waybill.getDriverRejectReason(), "")); + detail.setDriverId(waybill.getDriverId()); + + AdminWaybillDetailVO.AdminRoutePointVO load = new AdminWaybillDetailVO.AdminRoutePointVO(); + load.setName(Func.toStr(waybill.getDepartureName(), "装货点")); + load.setAddress(fromAddr); + load.setStatus("pending"); + AdminWaybillDetailVO.AdminRoutePointVO unload = new AdminWaybillDetailVO.AdminRoutePointVO(); + unload.setName(Func.toStr(waybill.getArrivalName(), "卸货点")); + unload.setAddress(toAddr); + unload.setStatus("pending"); + detail.setRoutePoints(List.of(load, unload)); + + // 复用司机端打卡组装:过程节点 + 途打卡记录(调度端只读展示) + DriverWaybillCardVO punch = driverWaybillService.detailPunchSnapshot(waybill.getId()); + if (punch != null) { + detail.setPunchNodes(punch.getPunchNodes()); + detail.setEnrouteRecords(punch.getEnrouteRecords()); + if (punch.getRoutePoints() != null && !punch.getRoutePoints().isEmpty()) { + detail.setRoutePoints(punch.getRoutePoints().stream().map(p -> { + AdminWaybillDetailVO.AdminRoutePointVO rp = new AdminWaybillDetailVO.AdminRoutePointVO(); + rp.setName(p.getName()); + rp.setAddress(p.getAddress()); + rp.setStatus(p.getStatus()); + return rp; + }).toList()); + } + } + return detail; + } + + @Override + public boolean reassign(Long id, Long driverId, String driverName, String driverPhone, String vehicleNo) { + Waybill request = new Waybill(); + request.setId(id); + request.setDriverId(driverId); + request.setDriverName(driverName); + request.setDriverPhone(driverPhone); + request.setVehicleNo(vehicleNo); + return waybillService.reassignWithoutDeptCheck(request); + } + + @Override + public List searchDrivers(String keyword) { + String key = Func.toStr(keyword, "").trim(); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .eq(Driver::getIsDeleted, 0) + .orderByDesc(Driver::getUpdateTime) + .last("LIMIT 20"); + if (Func.isNotBlank(key)) { + wrapper.and(w -> w.like(Driver::getDriverName, key).or().like(Driver::getMobile, key)); + } + return driverService.list(wrapper).stream().map(d -> { + AdminDriverOptionVO vo = new AdminDriverOptionVO(); + vo.setId(d.getId()); + vo.setName(Func.toStr(d.getDriverName(), "")); + vo.setPhone(Func.toStr(d.getMobile(), "")); + vo.setVehicleNo(Func.toStr(d.getDrivingVehicle(), "")); + return vo; + }).toList(); + } + + @Override + public List searchVehicles(String keyword) { + String key = Func.toStr(keyword, "").trim(); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .eq(Driver::getIsDeleted, 0) + .isNotNull(Driver::getDrivingVehicle) + .ne(Driver::getDrivingVehicle, "") + .orderByDesc(Driver::getUpdateTime) + .last("LIMIT 30"); + if (Func.isNotBlank(key)) { + wrapper.like(Driver::getDrivingVehicle, key); + } + java.util.LinkedHashMap map = new java.util.LinkedHashMap<>(); + for (Driver d : driverService.list(wrapper)) { + String plate = Func.toStr(d.getDrivingVehicle(), "").trim(); + if (Func.isBlank(plate) || map.containsKey(plate)) { + continue; + } + AdminVehicleOptionVO vo = new AdminVehicleOptionVO(); + vo.setVehicleNo(plate); + vo.setDriverName(Func.toStr(d.getDriverName(), "")); + map.put(plate, vo); + } + return new java.util.ArrayList<>(map.values()); + } + + /** 运输方式字典值 → 展示文案 */ + private String toTransportTypeLabel(String transportType) { + if (Func.isBlank(transportType)) { + return ""; + } + String t = transportType.trim().toLowerCase(); + return switch (t) { + case "road", "gl" -> "公路运输"; + case "railway", "rail" -> "铁路运输"; + case "river", "water", "waterway" -> "水路运输"; + case "air", "aviation" -> "航空运输"; + default -> transportType; + }; + } + + private long countWaybillByStatus(String status) { + return waybillService.count(Wrappers.lambdaQuery() + .eq(Waybill::getBusinessStatus, status)); + } + + /** + * 小程序调度端不做组织过滤。 + * 「小程序管理」等账号 JWT/档案 dept 常与运单业务组织不一致,按 dept 过滤会导致统计全 0; + * 与后台 allDept=1 一致,仅依赖租户隔离(MyBatis-Plus TenantLine)。 + */ + private LambdaQueryWrapper scopedWaybillQuery() { + return Wrappers.lambdaQuery(); + } + + private void applyStatusFilter(LambdaQueryWrapper wrapper, String status) { + String businessStatus = toBusinessStatus(status); + if (Func.isNotBlank(businessStatus)) { + wrapper.eq(Waybill::getBusinessStatus, businessStatus); + } + } + + private void applyExceptionFilter(LambdaQueryWrapper wrapper, String exception, Set exceptionWaybillIds) { + if (EXCEPTION_YES.equals(exception)) { + wrapper.in(Waybill::getId, exceptionWaybillIds); + } else if (EXCEPTION_NO.equals(exception) && !exceptionWaybillIds.isEmpty()) { + wrapper.notIn(Waybill::getId, exceptionWaybillIds); + } + } + + private void applyTransportTypeFilter(LambdaQueryWrapper wrapper, String transportType) { + if (TRANSPORT_LOAD.equals(transportType)) { + wrapper.isNotNull(Waybill::getLoadingNo).ne(Waybill::getLoadingNo, ""); + } else if (TRANSPORT_COMMON.equals(transportType)) { + wrapper.and(w -> w.isNull(Waybill::getLoadingNo).or().eq(Waybill::getLoadingNo, "")); + } + } + + private void applyKeywordFilter(LambdaQueryWrapper wrapper, String keyword) { + if (Func.isBlank(keyword)) { + return; + } + String key = keyword.trim(); + wrapper.and(w -> w.like(Waybill::getWaybillNo, key) + .or().like(Waybill::getDriverName, key) + .or().like(Waybill::getVehicleNo, key)); + } + + private void applyCreateTimeFilter(LambdaQueryWrapper wrapper, String startDate, String endDate) { + if (Func.isNotBlank(startDate)) { + Date start = DateUtil.parse(startDate.trim() + " 00:00:00", DateUtil.PATTERN_DATETIME); + if (start != null) { + wrapper.ge(Waybill::getCreateTime, start); + } + } + if (Func.isNotBlank(endDate)) { + Date end = DateUtil.parse(endDate.trim() + " 23:59:59", DateUtil.PATTERN_DATETIME); + if (end != null) { + wrapper.le(Waybill::getCreateTime, end); + } + } + } + + /** 小程序 status → 后端 businessStatus */ + private String toBusinessStatus(String status) { + if (Func.isBlank(status)) { + return null; + } + return switch (status.trim()) { + case "0", STATUS_PENDING -> STATUS_PENDING; + case "1", STATUS_RUNNING, "transporting", "doing" -> STATUS_RUNNING; + case "2", STATUS_COMPLETED, "done" -> STATUS_COMPLETED; + case "3", STATUS_CANCELLED -> STATUS_CANCELLED; + default -> null; + }; + } + + private Set loadIncompleteExceptionWaybillIds() { + List list = exceptionDisposalService.list(Wrappers.lambdaQuery() + .select(ExceptionDisposal::getWaybillId) + .in(ExceptionDisposal::getDisposalStatus, DISPOSAL_PENDING, DISPOSAL_PROCESSING) + .isNotNull(ExceptionDisposal::getWaybillId)); + Set ids = new HashSet<>(); + for (ExceptionDisposal item : list) { + if (item.getWaybillId() != null) { + ids.add(item.getWaybillId()); + } + } + return ids; + } + + private AdminWaybillCardVO toCard(Waybill waybill, boolean hasException) { + AdminWaybillCardVO card = new AdminWaybillCardVO(); + card.setId(waybill.getId()); + card.setWaybillNo(waybill.getWaybillNo()); + String mode = Func.toStr(waybill.getTransportType(), ""); + card.setTransportMode(mode); + card.setFromName(formatPlaceName(waybill.getDepartureName(), mode)); + card.setToName(formatPlaceName(waybill.getArrivalName(), mode)); + card.setCargo(Func.toStr(waybill.getCargoName(), "")); + card.setWeight(formatWeight(waybill.getQuantity(), waybill.getQuantityUnit())); + card.setPlanTime(formatLocalDate(waybill.getEstimatedStartTime())); + card.setPlanTimeEnd(formatLocalDate(waybill.getEstimatedEndTime())); + card.setStatus(toAppStatus(waybill.getBusinessStatus())); + card.setCarrierName(Func.toStr(waybill.getCarrierName(), "")); + card.setDriverName(Func.toStr(waybill.getDriverName(), "")); + card.setVehicleNo(Func.toStr(waybill.getVehicleNo(), "")); + card.setHasException(hasException); + card.setTransportType(Func.isNotBlank(waybill.getLoadingNo()) ? TRANSPORT_LOAD : TRANSPORT_COMMON); + card.setCreateTime(formatDateTime(waybill.getCreateTime())); + card.setNeedReassign(ACCEPT_REJECTED.equals(waybill.getDriverAcceptStatus())); + card.setBuyerPaid(false); + return card; + } + + /** + * 公路运输:起/终仅展示市县(去掉省/自治区);其它运输方式原样返回。 + */ + private String formatPlaceName(String name, String transportType) { + String raw = Func.toStr(name, "").trim(); + if (Func.isBlank(raw) || !isRoadTransport(transportType)) { + return raw; + } + return toCityCounty(raw); + } + + private boolean isRoadTransport(String transportType) { + if (Func.isBlank(transportType)) { + return false; + } + String t = transportType.trim().toLowerCase(); + return t.contains("road") || transportType.contains("公路") || transportType.contains("道路") || "gl".equals(t); + } + + /** 去掉省级前缀,保留「市 + 区/县/旗」 */ + private String toCityCounty(String name) { + String s = name.replaceFirst("^.+?(省|自治区|特别行政区)", ""); + if (Func.isBlank(s)) { + s = name; + } + java.util.regex.Matcher city = java.util.regex.Pattern + .compile("^(.+?市)(.+?(?:区|县|旗|市))?") + .matcher(s); + if (city.find()) { + return Func.toStr(city.group(1), "") + Func.toStr(city.group(2), ""); + } + java.util.regex.Matcher prefecture = java.util.regex.Pattern + .compile("^(.+?(?:州|盟|地区))(.+?(?:区|县|旗|市))?") + .matcher(s); + if (prefecture.find()) { + return Func.toStr(prefecture.group(1), "") + Func.toStr(prefecture.group(2), ""); + } + return s; + } + + private Integer toAppStatus(String businessStatus) { + if (Func.isBlank(businessStatus)) { + return null; + } + return switch (businessStatus) { + case STATUS_PENDING, "waiting_dispatch", "dispatching" -> 0; + case STATUS_RUNNING -> 1; + case STATUS_COMPLETED -> 2; + case STATUS_CANCELLED -> 3; + default -> null; + }; + } + + private String formatWeight(BigDecimal quantity, String unit) { + if (quantity == null) { + return ""; + } + String qty = quantity.stripTrailingZeros().toPlainString(); + return Func.isBlank(unit) ? qty : qty + unit; + } + + private String formatLocalDate(LocalDate date) { + if (date == null) { + return ""; + } + return date.format(DATE_YMD); + } + + private String formatDateTime(Date date) { + if (date == null) { + return ""; + } + return DateUtil.format(date, DateUtil.PATTERN_DATETIME); + } + + private long countIncompleteExceptions() { + return exceptionDisposalService.count(Wrappers.lambdaQuery() + .in(ExceptionDisposal::getDisposalStatus, DISPOSAL_PENDING, DISPOSAL_PROCESSING)); + } + + private long countPendingRisks() { + return riskDisposalService.count(Wrappers.lambdaQuery() + .eq(RiskDisposal::getDisposalStatus, RISK_PENDING)); + } + + private List buildExceptionFeed() { + List list = exceptionDisposalService.list(Wrappers.lambdaQuery() + .in(ExceptionDisposal::getDisposalStatus, DISPOSAL_PENDING, DISPOSAL_PROCESSING) + .orderByDesc(ExceptionDisposal::getReportTime) + .last("LIMIT " + FEED_LIMIT)); + return list.stream().map(this::toTodoItem).collect(Collectors.toList()); + } + + private AdminTodoItemVO toTodoItem(ExceptionDisposal disposal) { + AdminTodoItemVO item = new AdminTodoItemVO(); + item.setId(disposal.getId()); + item.setType("exception"); + item.setTitle("异常待处置"); + item.setTimeAgo(formatTimeAgo(disposal.getReportTime() != null + ? disposal.getReportTime() + : toLocalDateTime(disposal.getCreateTime()))); + item.setDesc(buildExceptionDesc(disposal)); + item.setWaybillNo(Func.toStr(disposal.getWaybillNo(), "")); + item.setActionLabel("立即处置"); + String status = Func.toStr(disposal.getDisposalStatus(), DISPOSAL_PENDING); + item.setTargetUrl("/subpackages/admin/exception?status=" + status); + return item; + } + + private String buildExceptionDesc(ExceptionDisposal disposal) { + String reporter = Func.toStr(disposal.getReporterName(), "司机"); + String type = Func.toStr(disposal.getExceptionType(), "异常"); + String reason = Func.isNotBlank(disposal.getExceptionReason()) + ? disposal.getExceptionReason() + : Func.toStr(disposal.getReportDescription(), ""); + if (Func.isBlank(reason)) { + return reporter + "上报" + type; + } + String text = reporter + "上报" + type + ":" + reason.trim(); + return text.length() > 80 ? text.substring(0, 80) + "…" : text; + } + + private String resolveUserName() { + String realName = UserCache.getUserRealName(AuthUtil.getUserId()); + if (Func.isNotBlank(realName)) { + return realName; + } + return Func.toStr(AuthUtil.getUserName(), ""); + } + + private String formatTimeAgo(LocalDateTime time) { + if (time == null) { + return ""; + } + Duration duration = Duration.between(time, LocalDateTime.now()); + if (duration.isNegative()) { + duration = Duration.ZERO; + } + long minutes = duration.toMinutes(); + if (minutes < 1) { + return "刚刚"; + } + if (minutes < 60) { + return minutes + "分钟"; + } + long hours = duration.toHours(); + if (hours < 24) { + return hours + "小时"; + } + long days = duration.toDays(); + if (days < 30) { + return days + "天"; + } + return time.format(DATE_MD); + } + + private LocalDateTime toLocalDateTime(Date date) { + if (date == null) { + return null; + } + return date.toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDateTime(); + } + +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/WaybillServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/WaybillServiceImpl.java index 14e3c3b..b837dd8 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/WaybillServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/WaybillServiceImpl.java @@ -819,10 +819,20 @@ public class WaybillServiceImpl extends BaseServiceImpl @Override @Transactional(rollbackFor = Exception.class) public boolean reassign(Waybill request) { + return doReassign(request, true); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean reassignWithoutDeptCheck(Waybill request) { + return doReassign(request, false); + } + + private boolean doReassign(Waybill request, boolean checkDept) { if (request == null || Func.isEmpty(request.getId())) { throw new ServiceException("运单ID不能为空"); } - Waybill waybill = loadEditable(request.getId(), true); + Waybill waybill = loadEditable(request.getId(), checkDept); assertNotLoaded(waybill); if (!"pending".equals(waybill.getBusinessStatus()) && !"running".equals(waybill.getBusinessStatus())) { throw new ServiceException("仅待执行/进行中运单允许重新派单"); diff --git a/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/config/OAFeignClientConfig.java b/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/config/OAFeignClientConfig.java index c0b9cf4..8917a2d 100644 --- a/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/config/OAFeignClientConfig.java +++ b/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/config/OAFeignClientConfig.java @@ -1,9 +1,13 @@ package org.springblade.thirdparty.oa.config; +import feign.Request; import feign.RequestInterceptor; import jakarta.annotation.Resource; +import org.springblade.core.tool.utils.StringUtil; import org.springframework.context.annotation.Bean; +import java.util.concurrent.TimeUnit; + /** * @author bfhuange * @since 2024/12/18 @@ -16,8 +20,23 @@ public class OAFeignClientConfig { public RequestInterceptor requestInterceptor() { return template -> { // 空实现屏蔽 全局拦截器 BladeFeignRequestInterceptor - String authorization=oaProperties.getAuthorization(); - template.header("Authorization",authorization); + template.header("Authorization", normalizeAuthorization(oaProperties.getAuthorization())); }; } + + @Bean + public Request.Options options() { + return new Request.Options(10, TimeUnit.SECONDS, 120, TimeUnit.SECONDS, true); + } + + private String normalizeAuthorization(String authorization) { + if (StringUtil.isBlank(authorization)) { + return authorization; + } + if (StringUtil.startsWithIgnoreCase(authorization, "Basic ") + || StringUtil.startsWithIgnoreCase(authorization, "Bearer ")) { + return authorization; + } + return "Basic " + authorization; + } } diff --git a/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/constant/OAConvertConstant.java b/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/constant/OAConvertConstant.java index 2182784..4f6027c 100644 --- a/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/constant/OAConvertConstant.java +++ b/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/constant/OAConvertConstant.java @@ -30,4 +30,8 @@ public class OAConvertConstant { * 根公司父id */ public static final Long ROOT_PARENT_ID = 0L; + /** + * 同步人员时挂载的顶级组织名称 + */ + public static final String ROOT_COMPANY_NAME = "桂物物流集团"; } diff --git a/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/feign/IOAClient.java b/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/feign/IOAClient.java index b571416..9b36edd 100644 --- a/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/feign/IOAClient.java +++ b/blade-third-party-api/blade-oa-api/src/main/java/org/springblade/thirdparty/oa/feign/IOAClient.java @@ -42,6 +42,6 @@ public interface IOAClient { * @param param * @return */ - @PostMapping("${thirdParty.oa.queryPersonPageUrl:/api/hrm/resful/getHrmUserInfoWithPage}") + @PostMapping("${thirdParty.oa.queryPersonPageUrl:/gwzh/OA/OA_GET_USER_LIST}") OAResponse queryPersonPage(@RequestBody OASearch param); } diff --git a/blade-third-party-api/blade-wechat-api/pom.xml b/blade-third-party-api/blade-wechat-api/pom.xml new file mode 100644 index 0000000..7926d20 --- /dev/null +++ b/blade-third-party-api/blade-wechat-api/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + org.springblade + blade-third-party-api + ${revision} + + + blade-wechat-api + ${project.artifactId} + jar + 微信小程序:code2session / 手机号 / openid + + + + org.springblade + blade-core-tool + + + org.springframework.boot + spring-boot-autoconfigure + + + diff --git a/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/config/ThirdPartyWechatAutoConfiguration.java b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/config/ThirdPartyWechatAutoConfiguration.java new file mode 100644 index 0000000..b708fb2 --- /dev/null +++ b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/config/ThirdPartyWechatAutoConfiguration.java @@ -0,0 +1,14 @@ +package org.springblade.thirdparty.wechat.config; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * 微信小程序第三方能力自动配置 + */ +@Configuration +@ComponentScan("org.springblade.thirdparty.wechat") +@EnableConfigurationProperties(WechatMiniProperties.class) +public class ThirdPartyWechatAutoConfiguration { +} diff --git a/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/config/WechatMiniProperties.java b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/config/WechatMiniProperties.java new file mode 100644 index 0000000..8e38eed --- /dev/null +++ b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/config/WechatMiniProperties.java @@ -0,0 +1,28 @@ +package org.springblade.thirdparty.wechat.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 微信小程序配置(Nacos:thirdParty.wechat.mini) + */ +@Data +@ConfigurationProperties(prefix = "third-party.wechat.mini") +public class WechatMiniProperties { + + /** + * 小程序 AppId + */ + private String appId; + + /** + * 小程序 AppSecret + */ + private String appSecret; + + /** + * 微信 API 根地址 + */ + private String apiBase = "https://api.weixin.qq.com"; + +} diff --git a/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/constant/WechatMiniConstant.java b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/constant/WechatMiniConstant.java new file mode 100644 index 0000000..cbc6060 --- /dev/null +++ b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/constant/WechatMiniConstant.java @@ -0,0 +1,20 @@ +package org.springblade.thirdparty.wechat.constant; + +/** + * 微信小程序常量 + */ +public interface WechatMiniConstant { + + /** blade_user_oauth.source */ + String SOURCE = "WECHAT_MINI"; + + /** + * OAuth2 grant_type(对齐 BladeX OAuth2GranterConstant.WECHAT_APPLET) + */ + String GRANT_TYPE = "wechat_applet"; + + String JSCODE2SESSION_PATH = "/sns/jscode2session"; + String ACCESS_TOKEN_PATH = "/cgi-bin/token"; + String GET_PHONE_NUMBER_PATH = "/wxa/business/getuserphonenumber"; + +} diff --git a/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/exception/WechatMiniException.java b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/exception/WechatMiniException.java new file mode 100644 index 0000000..a89c13d --- /dev/null +++ b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/exception/WechatMiniException.java @@ -0,0 +1,16 @@ +package org.springblade.thirdparty.wechat.exception; + +/** + * 微信小程序调用异常 + */ +public class WechatMiniException extends RuntimeException { + + public WechatMiniException(String message) { + super(message); + } + + public WechatMiniException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/pojo/vo/WechatPhoneVO.java b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/pojo/vo/WechatPhoneVO.java new file mode 100644 index 0000000..61434f7 --- /dev/null +++ b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/pojo/vo/WechatPhoneVO.java @@ -0,0 +1,25 @@ +package org.springblade.thirdparty.wechat.pojo.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 微信手机号结果 + */ +@Data +public class WechatPhoneVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** 不带区号的手机号 */ + private String phoneNumber; + + /** 带区号手机号 */ + private String purePhoneNumber; + + private String countryCode; + +} diff --git a/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/pojo/vo/WechatSessionVO.java b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/pojo/vo/WechatSessionVO.java new file mode 100644 index 0000000..255b7b7 --- /dev/null +++ b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/pojo/vo/WechatSessionVO.java @@ -0,0 +1,21 @@ +package org.springblade.thirdparty.wechat.pojo.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * jscode2session 结果 + */ +@Data +public class WechatSessionVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private String openid; + private String sessionKey; + private String unionid; + +} diff --git a/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/service/IWechatMiniService.java b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/service/IWechatMiniService.java new file mode 100644 index 0000000..100713e --- /dev/null +++ b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/service/IWechatMiniService.java @@ -0,0 +1,21 @@ +package org.springblade.thirdparty.wechat.service; + +import org.springblade.thirdparty.wechat.pojo.vo.WechatPhoneVO; +import org.springblade.thirdparty.wechat.pojo.vo.WechatSessionVO; + +/** + * 微信小程序能力:openid / 手机号 + */ +public interface IWechatMiniService { + + /** + * wx.login code → openid / session_key + */ + WechatSessionVO code2Session(String loginCode); + + /** + * getPhoneNumber 返回的 code → 手机号 + */ + WechatPhoneVO getPhoneNumber(String phoneCode); + +} diff --git a/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/service/impl/WechatMiniServiceImpl.java b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/service/impl/WechatMiniServiceImpl.java new file mode 100644 index 0000000..b453501 --- /dev/null +++ b/blade-third-party-api/blade-wechat-api/src/main/java/org/springblade/thirdparty/wechat/service/impl/WechatMiniServiceImpl.java @@ -0,0 +1,148 @@ +package org.springblade.thirdparty.wechat.service.impl; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.tool.utils.StringUtil; +import org.springblade.thirdparty.wechat.config.WechatMiniProperties; +import org.springblade.thirdparty.wechat.constant.WechatMiniConstant; +import org.springblade.thirdparty.wechat.exception.WechatMiniException; +import org.springblade.thirdparty.wechat.pojo.vo.WechatPhoneVO; +import org.springblade.thirdparty.wechat.pojo.vo.WechatSessionVO; +import org.springblade.thirdparty.wechat.service.IWechatMiniService; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +/** + * 微信小程序:code2session / getuserphonenumber + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatMiniServiceImpl implements IWechatMiniService { + + /** access_token 提前 200 秒刷新 */ + private static final long TOKEN_REFRESH_AHEAD_MS = 200_000L; + + private final WechatMiniProperties properties; + + private volatile String cachedAccessToken; + private volatile long accessTokenExpireAt; + + @Override + public WechatSessionVO code2Session(String loginCode) { + assertConfigured(); + if (StringUtil.isBlank(loginCode)) { + throw new WechatMiniException("微信登录 code 不能为空"); + } + String url = properties.getApiBase() + WechatMiniConstant.JSCODE2SESSION_PATH + + "?appid=" + properties.getAppId() + + "&secret=" + properties.getAppSecret() + + "&js_code=" + loginCode + + "&grant_type=authorization_code"; + String body = HttpUtil.get(url, 8000); + JSONObject json = parseJson(body, "code2session"); + assertWxOk(json, "获取 openid 失败"); + String openid = json.getStr("openid"); + if (StringUtil.isBlank(openid)) { + throw new WechatMiniException("微信未返回 openid"); + } + WechatSessionVO vo = new WechatSessionVO(); + vo.setOpenid(openid); + vo.setSessionKey(json.getStr("session_key")); + vo.setUnionid(json.getStr("unionid")); + return vo; + } + + @Override + public WechatPhoneVO getPhoneNumber(String phoneCode) { + assertConfigured(); + if (StringUtil.isBlank(phoneCode)) { + throw new WechatMiniException("微信手机号 code 不能为空"); + } + String accessToken = getAccessToken(); + String url = properties.getApiBase() + WechatMiniConstant.GET_PHONE_NUMBER_PATH + + "?access_token=" + accessToken; + Map payload = new HashMap<>(2); + payload.put("code", phoneCode); + String body = HttpRequest.post(url) + .body(JSONUtil.toJsonStr(payload)) + .timeout(8000) + .execute() + .body(); + JSONObject json = parseJson(body, "getuserphonenumber"); + assertWxOk(json, "获取手机号失败"); + JSONObject phoneInfo = json.getJSONObject("phone_info"); + if (phoneInfo == null) { + throw new WechatMiniException("微信未返回手机号信息"); + } + WechatPhoneVO vo = new WechatPhoneVO(); + vo.setPhoneNumber(phoneInfo.getStr("phoneNumber")); + vo.setPurePhoneNumber(phoneInfo.getStr("purePhoneNumber")); + vo.setCountryCode(phoneInfo.getStr("countryCode")); + if (StringUtil.isBlank(vo.getPurePhoneNumber()) && StringUtil.isBlank(vo.getPhoneNumber())) { + throw new WechatMiniException("微信未返回有效手机号"); + } + return vo; + } + + private String getAccessToken() { + long now = System.currentTimeMillis(); + if (StringUtil.isNotBlank(cachedAccessToken) && now < accessTokenExpireAt) { + return cachedAccessToken; + } + synchronized (this) { + now = System.currentTimeMillis(); + if (StringUtil.isNotBlank(cachedAccessToken) && now < accessTokenExpireAt) { + return cachedAccessToken; + } + String url = properties.getApiBase() + WechatMiniConstant.ACCESS_TOKEN_PATH + + "?grant_type=client_credential" + + "&appid=" + properties.getAppId() + + "&secret=" + properties.getAppSecret(); + String body = HttpUtil.get(url, 8000); + JSONObject json = parseJson(body, "getAccessToken"); + assertWxOk(json, "获取 access_token 失败"); + String token = json.getStr("access_token"); + Integer expiresIn = json.getInt("expires_in", 7200); + if (StringUtil.isBlank(token)) { + throw new WechatMiniException("微信未返回 access_token"); + } + cachedAccessToken = token; + accessTokenExpireAt = System.currentTimeMillis() + Math.max(60, expiresIn) * 1000L - TOKEN_REFRESH_AHEAD_MS; + return token; + } + } + + private void assertConfigured() { + if (StringUtil.isBlank(properties.getAppId()) || StringUtil.isBlank(properties.getAppSecret())) { + throw new WechatMiniException("未配置微信小程序 appId/appSecret(Nacos: thirdParty.wechat.mini)"); + } + } + + private JSONObject parseJson(String body, String action) { + if (StringUtil.isBlank(body)) { + throw new WechatMiniException("微信接口无响应: " + action); + } + try { + return JSONUtil.parseObj(body); + } catch (Exception e) { + log.error("解析微信响应失败 action={} body={}", action, body, e); + throw new WechatMiniException("解析微信响应失败: " + action, e); + } + } + + private void assertWxOk(JSONObject json, String fallbackMsg) { + Integer errcode = json.getInt("errcode"); + if (errcode != null && errcode != 0) { + String errmsg = json.getStr("errmsg", fallbackMsg); + throw new WechatMiniException(fallbackMsg + ":" + errmsg + "(" + errcode + ")"); + } + } + +} diff --git a/blade-third-party-api/blade-wechat-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/blade-third-party-api/blade-wechat-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..e386596 --- /dev/null +++ b/blade-third-party-api/blade-wechat-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.springblade.thirdparty.wechat.config.ThirdPartyWechatAutoConfiguration diff --git a/blade-third-party-api/pom.xml b/blade-third-party-api/pom.xml index 31f02f5..ba27dd9 100644 --- a/blade-third-party-api/pom.xml +++ b/blade-third-party-api/pom.xml @@ -17,6 +17,7 @@ blade-wps-api blade-ocr-api blade-track-api + blade-wechat-api pom BladeX 第三方API集合 diff --git a/doc/nacos/blade-dev.yaml b/doc/nacos/blade-dev.yaml index 977a9db..562e977 100644 --- a/doc/nacos/blade-dev.yaml +++ b/doc/nacos/blade-dev.yaml @@ -87,6 +87,7 @@ thirdParty: oa: # OA开放接口地址 baseUrl: http://127.0.0.1:8080 + queryPersonPageUrl: /gwzh/OA/OA_GET_USER_LIST track: # 轨迹开放接口地址 baseUrl: http://127.0.0.1:8080 @@ -120,6 +121,11 @@ thirdParty: downloadFileUrl: ${MK_DOWNLOAD_FILE_URL:/openapi/sys-attach/fileStream/download} queryApprovalListUrl: ${MK_QUERY_APPROVAL_LIST_URL:/openapi/lbpm-approval/lbpmApproval/portal/list} queryProcessListUrl: ${MK_QUERY_PROCESS_LIST_URL:/openapi/sys-lbpm/sysLbpmProcess/openSupport/list} + wechat: + mini: + # 微信小程序(手机号一键登录 / openid) + appId: ${WECHAT_MINI_APP_ID:} + appSecret: ${WECHAT_MINI_APP_SECRET:} #百度OCR配置,API Key和Secret Key请通过环境变量注入 baidu: diff --git a/doc/nacos/blade-prod.yaml b/doc/nacos/blade-prod.yaml index 7a749a0..69b2ffa 100644 --- a/doc/nacos/blade-prod.yaml +++ b/doc/nacos/blade-prod.yaml @@ -59,6 +59,7 @@ thirdParty: oa: # OA开放接口地址 baseUrl: http://127.0.0.1:8080 + queryPersonPageUrl: /gwzh/OA/OA_GET_USER_LIST track: # 轨迹开放接口地址 baseUrl: http://127.0.0.1:8080 @@ -92,6 +93,10 @@ thirdParty: downloadFileUrl: ${MK_DOWNLOAD_FILE_URL:/openapi/sys-attach/fileStream/download} queryApprovalListUrl: ${MK_QUERY_APPROVAL_LIST_URL:/openapi/lbpm-approval/lbpmApproval/portal/list} queryProcessListUrl: ${MK_QUERY_PROCESS_LIST_URL:/openapi/sys-lbpm/sysLbpmProcess/openSupport/list} + wechat: + mini: + appId: ${WECHAT_MINI_APP_ID:} + appSecret: ${WECHAT_MINI_APP_SECRET:} #百度OCR配置,API Key和Secret Key请通过环境变量注入 baidu: diff --git a/doc/nacos/blade.yaml b/doc/nacos/blade.yaml index 53fdcb6..f65e82d 100644 --- a/doc/nacos/blade.yaml +++ b/doc/nacos/blade.yaml @@ -213,6 +213,9 @@ blade: #接口放行 skip-url: - /test/** + # 退出登录:允许无令牌/令牌失效时也能调用(服务端对无用户直接返回成功) + - /oauth/logout/** + - /blade-auth/oauth/logout/** #授权认证配置 auth: - method: ALL diff --git a/doc/nacos/routes/blade-gateway-dev.json b/doc/nacos/routes/blade-gateway-dev.json index 09a9740..d68db7a 100644 --- a/doc/nacos/routes/blade-gateway-dev.json +++ b/doc/nacos/routes/blade-gateway-dev.json @@ -27,6 +27,28 @@ "filters": [], "uri": "lb://blade-transport" }, + { + "id": "blade-user-alias-route", + "order": 0, + "predicates": [ + { + "name": "Path", + "args": { + "pattern": "/blade-user/**" + } + } + ], + "filters": [ + { + "name": "RewritePath", + "args": { + "regexp": "/blade-user/(?.*)", + "replacement": "/user/$\\{segment}" + } + } + ], + "uri": "lb://blade-system" + }, { "id": "example-route", "order": 0, diff --git a/doc/nacos/third-party-api.yaml b/doc/nacos/third-party-api.yaml index 8b6b40d..a3fffa0 100644 --- a/doc/nacos/third-party-api.yaml +++ b/doc/nacos/third-party-api.yaml @@ -11,9 +11,15 @@ thirdParty: oa: # OA开放接口地址 baseUrl: ${OA_BASE_URL:http://127.0.0.1:8080} + queryPersonPageUrl: ${OA_QUERY_PERSON_PAGE_URL:/gwzh/OA/OA_GET_USER_LIST} track: # 轨迹开放接口地址 baseUrl: ${TRACK_BASE_URL:http://127.0.0.1:8080} mk: # MK开放接口地址 baseUrl: ${MK_BASE_URL:http://127.0.0.1:8080} + wechat: + mini: + # 微信小程序 AppId / AppSecret(Nacos 配置,勿提交真实 secret) + appId: ${WECHAT_MINI_APP_ID:} + appSecret: ${WECHAT_MINI_APP_SECRET:} diff --git a/doc/sql/update/add-mp-auth-permission.sql b/doc/sql/update/add-mp-auth-permission.sql new file mode 100644 index 0000000..821c983 --- /dev/null +++ b/doc/sql/update/add-mp-auth-permission.sql @@ -0,0 +1,21 @@ +-- 小程序调度端入口权限码 mp_auth +-- user-info 的 permission 来自按钮叶子 code;需把本菜单授权给调度/管理员角色 +-- 执行后:后台「角色管理 → 权限配置」勾选「小程序调度端」,或按需 INSERT blade_role_menu + +-- 父级菜单(小程序) +INSERT IGNORE INTO `blade_menu` +(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) +VALUES +(2091800000000000001, 0, 'miniprogram', '小程序', 'menu', '/miniprogram', 'iconfont iconicon_work', 98, 1, 0, 1, '', '小程序相关权限', 0); + +-- 按钮权限:mp_auth(叶子节点,会被 permissionCodes 收集) +INSERT IGNORE INTO `blade_menu` +(`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `component`, `remark`, `is_deleted`) +VALUES +(2091800000000000002, 2091800000000000001, 'mp_auth', '小程序调度端', 'mp_auth', '', '', 1, 2, 0, 1, NULL, '登录后进入调度端首页', 0); + +-- 示例:给管理员角色(role_id 按环境实际调整,默认管理员 1123598816738675201) +-- INSERT IGNORE INTO `blade_role_menu` (`id`, `menu_id`, `role_id`) +-- VALUES +-- (2091800000000000101, 2091800000000000001, 1123598816738675201), +-- (2091800000000000102, 2091800000000000002, 1123598816738675201); diff --git a/doc/sql/update/add-wechat-applet-grant-type.sql b/doc/sql/update/add-wechat-applet-grant-type.sql new file mode 100644 index 0000000..8a6a8cd --- /dev/null +++ b/doc/sql/update/add-wechat-applet-grant-type.sql @@ -0,0 +1,8 @@ +-- 为小程序客户端授权类型补充微信小程序登录(wechat_applet) +-- 执行后建议清客户端缓存 / 重启 blade-auth + +UPDATE blade_client +SET authorized_grant_types = CONCAT(authorized_grant_types, ',wechat_applet') +WHERE client_id IN ('saber3', 'saber', 'sword', 'rider') + AND FIND_IN_SET('wechat_applet', REPLACE(authorized_grant_types, ' ', '')) = 0 + AND is_deleted = 0; diff --git a/hs_err_pid22077.log b/hs_err_pid22077.log new file mode 100644 index 0000000..8dc4281 --- /dev/null +++ b/hs_err_pid22077.log @@ -0,0 +1,1379 @@ +# +# A fatal error has been detected by the Java Runtime Environment: +# +# SIGBUS (0xa) at pc=0x0000000100ed64c0, pid=22077, tid=36647 +# +# JRE version: OpenJDK Runtime Environment Zulu17.44+15-CA (17.0.8+7) (build 17.0.8+7-LTS) +# Java VM: OpenJDK 64-Bit Server VM Zulu17.44+15-CA (17.0.8+7-LTS, mixed mode, emulated-client, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-aarch64) +# Problematic frame: +# C [libzip.dylib+0x64c0] newEntry+0x68 +# +# No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again +# +# If you would like to submit a bug report, please visit: +# http://www.azul.com/support/ +# The crash happened outside the Java Virtual Machine in native code. +# See problematic frame for where to report the bug. +# + +--------------- S U M M A R Y ------------ + +Command Line: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50259,suspend=y,server=n -javaagent:/Users/liangxin/Library/Caches/JetBrains/IntelliJIdea2026.1/captureAgent/debugger-agent.jar=file:///var/folders/pk/drq93rk10q733kk02fgp89xh0000gn/T/capture10140205674518191061.props -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dmanagement.endpoints.jmx.exposure.include=* -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Ddebugger.agent.enable.coroutines=true -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -Ddebugger.async.stack.trace.for.all.threads=true -Dfile.encoding=UTF-8 org.springblade.desk.DeskApplication + +Host: "Mac15,6" arm64, 12 cores, 36G, Darwin 25.6.0, macOS 26.6.2 (25G83) +Time: Fri Sep 18 14:44:41 2026 CST elapsed time: 9.129557 seconds (0d 0h 0m 9s) + +--------------- T H R E A D --------------- + +Current thread (0x000000012b49c600): JavaThread "sentinel-datafile-log-executor-thread-1" daemon [_thread_in_native, id=36647, stack(0x0000000174680000,0x0000000174883000)] + +Stack: [0x0000000174680000,0x0000000174883000], sp=0x00000001748819d0, free space=2054k +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +C [libzip.dylib+0x64c0] newEntry+0x68 +C [libzip.dylib+0x6390] ZIP_GetEntry2+0x14c +C [libzip.dylib+0x6d78] ZIP_FindEntry+0x3c +V [libjvm.dylib+0x25a408] ClassPathZipEntry::open_entry(JavaThread*, char const*, int*, bool)+0xb4 +V [libjvm.dylib+0x25a53c] ClassPathZipEntry::open_stream(JavaThread*, char const*)+0x20 +V [libjvm.dylib+0x25d918] ClassLoader::load_class(Symbol*, bool, JavaThread*)+0x150 +V [libjvm.dylib+0x981d60] SystemDictionary::load_instance_class_impl(Symbol*, Handle, JavaThread*)+0x2d0 +V [libjvm.dylib+0x98063c] SystemDictionary::load_instance_class(unsigned int, Symbol*, Handle, JavaThread*)+0x30 +V [libjvm.dylib+0x97fd48] SystemDictionary::resolve_instance_class_or_null(Symbol*, Handle, Handle, JavaThread*)+0x4dc +V [libjvm.dylib+0x97f334] SystemDictionary::resolve_or_fail(Symbol*, Handle, Handle, bool, JavaThread*)+0x80 +V [libjvm.dylib+0x2beb54] ConstantPool::klass_at_impl(constantPoolHandle const&, int, JavaThread*)+0x1e0 +V [libjvm.dylib+0x46d6f0] InterpreterRuntime::_new(JavaThread*, ConstantPool*, int)+0x94 +j com.intellij.rt.debugger.agent.CaptureStorage$DeepCapturedStack.collectStacks(Ljava/util/List;)Lcom/intellij/rt/debugger/agent/CaptureStorage$StackData;+89 +j com.intellij.rt.debugger.agent.CaptureStorage.getStackTrace(Lcom/intellij/rt/debugger/agent/CaptureStorage$CapturedStack;I)Ljava/util/ArrayList;+30 +j com.intellij.rt.debugger.agent.CaptureStorage.access$1000(Lcom/intellij/rt/debugger/agent/CaptureStorage$CapturedStack;I)Ljava/util/ArrayList;+2 +j com.intellij.rt.debugger.agent.CaptureStorage$9.call()[Ljava/lang/StackTraceElement;+31 +j com.intellij.rt.debugger.agent.CaptureStorage$9.call()Ljava/lang/Object;+1 +j com.intellij.rt.debugger.agent.CaptureStorage.withoutThrowableCapture(Lcom/intellij/rt/debugger/agent/CaptureStorage$Callable;)Ljava/lang/Object;+21 +j com.intellij.rt.debugger.agent.CaptureStorage.getAsyncStackTrace(Ljava/lang/Throwable;)[Ljava/lang/StackTraceElement;+19 +j java.lang.Throwable.printStackTrace(Ljava/lang/Throwable$PrintStreamOrWriter;)V+32 java.base@17.0.8 +j java.lang.Throwable.printStackTrace(Ljava/io/PrintWriter;)V+9 java.base@17.0.8 +j com.alibaba.csp.sentinel.log.jul.CspFormatter.format(Ljava/util/logging/LogRecord;)Ljava/lang/String;+103 +j java.util.logging.StreamHandler.publish(Ljava/util/logging/LogRecord;)V+14 java.logging@17.0.8 +j java.util.logging.FileHandler.publish(Ljava/util/logging/LogRecord;)V+11 java.logging@17.0.8 +j com.alibaba.csp.sentinel.log.jul.DateFileLogHandler$LogTask.run()V+8 +j java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V+92 java.base@17.0.8 +j java.util.concurrent.ThreadPoolExecutor$Worker.run()V+5 java.base@17.0.8 +j java.lang.Thread.run()V+11 java.base@17.0.8 +v ~StubRoutines::call_stub +V [libjvm.dylib+0x4781f8] JavaCalls::call_helper(JavaValue*, methodHandle const&, JavaCallArguments*, JavaThread*)+0x394 +V [libjvm.dylib+0x47720c] JavaCalls::call_virtual(JavaValue*, Klass*, Symbol*, Symbol*, JavaCallArguments*, JavaThread*)+0x11c +V [libjvm.dylib+0x4772d8] JavaCalls::call_virtual(JavaValue*, Handle, Klass*, Symbol*, Symbol*, JavaThread*)+0x64 +V [libjvm.dylib+0x52ebfc] thread_entry(JavaThread*, JavaThread*)+0xc4 +V [libjvm.dylib+0x9b22e8] JavaThread::thread_main_inner()+0x150 +V [libjvm.dylib+0x9b0990] Thread::call_run()+0xe0 +V [libjvm.dylib+0x7d0364] thread_native_entry(Thread*)+0x158 +C [libsystem_pthread.dylib+0x6c58] _pthread_start+0x88 + +Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) +j com.intellij.rt.debugger.agent.CaptureStorage$DeepCapturedStack.collectStacks(Ljava/util/List;)Lcom/intellij/rt/debugger/agent/CaptureStorage$StackData;+89 +j com.intellij.rt.debugger.agent.CaptureStorage.getStackTrace(Lcom/intellij/rt/debugger/agent/CaptureStorage$CapturedStack;I)Ljava/util/ArrayList;+30 +j com.intellij.rt.debugger.agent.CaptureStorage.access$1000(Lcom/intellij/rt/debugger/agent/CaptureStorage$CapturedStack;I)Ljava/util/ArrayList;+2 +j com.intellij.rt.debugger.agent.CaptureStorage$9.call()[Ljava/lang/StackTraceElement;+31 +j com.intellij.rt.debugger.agent.CaptureStorage$9.call()Ljava/lang/Object;+1 +j com.intellij.rt.debugger.agent.CaptureStorage.withoutThrowableCapture(Lcom/intellij/rt/debugger/agent/CaptureStorage$Callable;)Ljava/lang/Object;+21 +j com.intellij.rt.debugger.agent.CaptureStorage.getAsyncStackTrace(Ljava/lang/Throwable;)[Ljava/lang/StackTraceElement;+19 +j java.lang.Throwable.printStackTrace(Ljava/lang/Throwable$PrintStreamOrWriter;)V+32 java.base@17.0.8 +j java.lang.Throwable.printStackTrace(Ljava/io/PrintWriter;)V+9 java.base@17.0.8 +j com.alibaba.csp.sentinel.log.jul.CspFormatter.format(Ljava/util/logging/LogRecord;)Ljava/lang/String;+103 +j java.util.logging.StreamHandler.publish(Ljava/util/logging/LogRecord;)V+14 java.logging@17.0.8 +j java.util.logging.FileHandler.publish(Ljava/util/logging/LogRecord;)V+11 java.logging@17.0.8 +j com.alibaba.csp.sentinel.log.jul.DateFileLogHandler$LogTask.run()V+8 +j java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V+92 java.base@17.0.8 +j java.util.concurrent.ThreadPoolExecutor$Worker.run()V+5 java.base@17.0.8 +j java.lang.Thread.run()V+11 java.base@17.0.8 +v ~StubRoutines::call_stub + +siginfo: si_signo: 10 (SIGBUS), si_code: 1 (BUS_ADRALN), si_addr: 0x0000000100dd1e7b + +Register to memory mapping: + + x0=0x00006000018b9130 points into unknown readable memory: 0x0000000000000000 | 00 00 00 00 00 00 00 00 + x1=0x0 is NULL + x2=0x0 is NULL + x3=0x00006000018b9140 points into unknown readable memory: 0x0000000000000000 | 00 00 00 00 00 00 00 00 + x4=0x00006000018b9180 points into unknown readable memory: 0x00000000bf074454 | 54 44 07 bf 00 00 00 00 + x5=0x00000000a0a4a7fb is an unknown value + x6=0x0000000020c00000 is an unknown value + x7=0x000000000000000a is an unknown value + x8=0x0000000100ef9e5f points into unknown readable memory: 00 + x9=0x0000000000128000 is an unknown value +x10=0x00006000018b8000 points into unknown readable memory: 0x4c28004120ed0001 | 01 00 ed 20 41 00 28 4c +x11=0x0000000000001130 is an unknown value +x12=0x0000000000000050 is an unknown value +x13=0x0000000000000001 is an unknown value +x14=0x00000000ffffff6b is an unknown value +x15=0x00000000000007fb is an unknown value +x16=0x0000000186e7d030: __bzero+0 in /usr/lib/system/libsystem_platform.dylib at 0x0000000186e7a000 +x17=0x00000001f4ef54a8 points into unknown readable memory: 0x0000000186e7d030 | 30 d0 e7 86 01 00 00 00 +x18=0x0 is NULL +x19=0x00006000018b9130 points into unknown readable memory: 0x0000000000000000 | 00 00 00 00 00 00 00 00 +x20=0x0 is NULL +x21=0x0000600000d1c480 points into unknown readable memory: 0x0000600001c14720 | 20 47 c1 01 00 60 00 00 +x22=0x0000000100dd1e5f points into unknown readable memory: 50 +x23=0x00000000d3a18b02 is an unknown value +x24=0x000000000000002f is an unknown value +x25=0x000000000000003d is an unknown value +x26=0x00000000000000cd is an unknown value +x27=0x00006000018b9158 points into unknown readable memory: 0x0000000000000000 | 00 00 00 00 00 00 00 00 +x28=0x000000010f116600 points into unknown readable memory: 0x65746e692f6d6f63 | 63 6f 6d 2f 69 6e 74 65 + + +Registers: + x0=0x00006000018b9130 x1=0x0000000000000000 x2=0x0000000000000000 x3=0x00006000018b9140 + x4=0x00006000018b9180 x5=0x00000000a0a4a7fb x6=0x0000000020c00000 x7=0x000000000000000a + x8=0x0000000100ef9e5f x9=0x0000000000128000 x10=0x00006000018b8000 x11=0x0000000000001130 +x12=0x0000000000000050 x13=0x0000000000000001 x14=0x00000000ffffff6b x15=0x00000000000007fb +x16=0x0000000186e7d030 x17=0x00000001f4ef54a8 x18=0x0000000000000000 x19=0x00006000018b9130 +x20=0x0000000000000000 x21=0x0000600000d1c480 x22=0x0000000100dd1e5f x23=0x00000000d3a18b02 +x24=0x000000000000002f x25=0x000000000000003d x26=0x00000000000000cd x27=0x00006000018b9158 +x28=0x000000010f116600 fp=0x0000000174881a50 lr=0x0000000100ed648c sp=0x00000001748819d0 +pc=0x0000000100ed64c0 cpsr=0x0000000060001000 +Top of Stack: (sp=0x00000001748819d0) +0x00000001748819d0: 0000000000000000 0000000000000000 +0x00000001748819e0: 0000000000000000 0000000000000000 +0x00000001748819f0: 0000000000000000 0000000000000000 +0x0000000174881a00: 000000010f116600 000000012c81cc00 +0x0000000174881a10: 00000000000000cd 000000000000003d +0x0000000174881a20: 000000000000002f 00000000d3a18b02 +0x0000000174881a30: 00006000018923a0 0000000000000000 +0x0000000174881a40: 000000010f116640 0000600000d1c480 +0x0000000174881a50: 0000000174881ab0 0000000100ed6390 +0x0000000174881a60: 000000010f116600 0000000000000037 +0x0000000174881a70: 0000000000000001 000000010f116640 +0x0000000174881a80: 000000012b49c948 000000010f116640 +0x0000000174881a90: 0000600000d1c480 000000010f116640 +0x0000000174881aa0: 0000000174881bdc 0000000174881af4 +0x0000000174881ab0: 0000000174881ae0 0000000100ed6d78 +0x0000000174881ac0: 0000000174881bdc 0000600003615c50 +0x0000000174881ad0: 0000000000000000 000000012b49c600 +0x0000000174881ae0: 0000000174881bc0 000000010225e408 +0x0000000174881af0: 0000000102abc388 0000000000000100 +0x0000000174881b00: 0000000174881b20 00000001025325dc +0x0000000174881b10: 0000000102abc388 0000000174881ba0 +0x0000000174881b20: 0000000174881b70 00000001022e496c +0x0000000174881b30: 0000000000000000 0000000000000000 +0x0000000174881b40: 0000000000000001 00000001314a0290 +0x0000000174881b50: 000000012b49c600 000000010f1169d8 +0x0000000174881b60: 0000000102ad11e2 0000000174881c68 +0x0000000174881b70: 0000000174881b90 31ade61c7bb700f3 +0x0000000174881b80: 0000000000000001 000000010f116640 +0x0000000174881b90: 0000600003615c50 00000001314a0290 +0x0000000174881ba0: 000000012b49c600 000000010f1169d8 +0x0000000174881bb0: 000000010f1165f0 0000600003615c50 +0x0000000174881bc0: 0000000174881bf0 000000010225e53c + +Instructions: (pc=0x0000000100ed64c0) +0x0000000100ed63c0: 6b0c017f 54ffff60 17ffffde d2800016 +0x0000000100ed63d0: 72001ebf 54000160 b5000156 f100073f +0x0000000100ed63e0: 54fff7cb 8b140328 385ff108 7100bd1f +0x0000000100ed63f0: 54fff741 d2800016 14000002 f9004e7f +0x0000000100ed6400: f9402a60 94000451 aa1603e0 a9457bfd +0x0000000100ed6410: a9444ff4 a94357f6 a9425ff8 a94167fa +0x0000000100ed6420: a8c66ffc d65f03c0 6b03003f 540000e1 +0x0000000100ed6430: 71000421 540000eb 38401408 38401449 +0x0000000100ed6440: 6b09011f 54ffff60 52800000 d65f03c0 +0x0000000100ed6450: 52800020 d65f03c0 d10243ff a9036ffc +0x0000000100ed6460: a90467fa a9055ff8 a90657f6 a9074ff4 +0x0000000100ed6470: a9087bfd 910203fd aa0203f4 aa0103f6 +0x0000000100ed6480: aa0003f5 52800900 94000481 aa0003f3 +0x0000000100ed6490: b4001320 f900027f aa1303fb f8028f7f +0x0000000100ed64a0: f9001a7f 3940c2a8 34000288 f9400ea8 +0x0000000100ed64b0: f94006c9 8b090108 f94016a9 cb090116 +0x0000000100ed64c0: 79403ad8 39407ada 39407edc 794042c8 +0x0000000100ed64d0: f90017e8 b9400ec8 f9000668 b9401ac8 +0x0000000100ed64e0: f9000fe8 f9000a68 794016c8 34000488 +0x0000000100ed64f0: b94016c8 14000023 f94006d7 34000d54 +0x0000000100ed6500: f9401ea8 b4000288 f94022a9 eb17013f +0x0000000100ed6510: 5400022c 5283fa4a 8b0a012a eb17015f +0x0000000100ed6520: 540001ab 9140092a 8b170108 cb090116 +0x0000000100ed6530: 79403ac8 79403ec9 794042cb 8b0802e8 +0x0000000100ed6540: 8b090108 8b0b0108 9100b908 eb0a011f +0x0000000100ed6550: 54000b4d aa1503e0 aa1703e1 52840002 +0x0000000100ed6560: 94000384 aa0003f6 b4000aa0 f9401ea0 +0x0000000100ed6570: 94000429 a903deb6 17ffffd2 d2800008 +0x0000000100ed6580: aa0803f7 f9000e68 b94012c8 b9002268 +0x0000000100ed6590: b842a2c9 f9405ea8 f9000be9 8b090108 +0x0000000100ed65a0: cb0803e8 f9001e68 794012c8 b9004268 +0x0000000100ed65b0: 91000700 94000436 aa0003f9 f9000260 + + +Stack slot to memory mapping: +stack at sp + 0 slots: 0x0 is NULL +stack at sp + 1 slots: 0x0 is NULL +stack at sp + 2 slots: 0x0 is NULL +stack at sp + 3 slots: 0x0 is NULL +stack at sp + 4 slots: 0x0 is NULL +stack at sp + 5 slots: 0x0 is NULL +stack at sp + 6 slots: 0x000000010f116600 points into unknown readable memory: 0x65746e692f6d6f63 | 63 6f 6d 2f 69 6e 74 65 +stack at sp + 7 slots: 0x000000012c81cc00 points into unknown readable memory: 0xffffffff5bbd78a2 | a2 78 bd 5b ff ff ff ff + + +--------------- P R O C E S S --------------- + +Threads class SMR info: +_java_thread_list=0x0000600003f37760, length=73, elements={ +0x000000010b808a00, 0x000000010b809600, 0x000000012c90ac00, 0x000000010b008600, +0x000000010b00ae00, 0x000000011e808200, 0x000000011e00a400, 0x000000010f80a200, +0x000000010b809c00, 0x000000010f80b200, 0x000000011e00aa00, 0x000000010f80b800, +0x000000012d039a00, 0x000000011d808200, 0x000000012c01ea00, 0x000000012d810400, +0x000000012d838200, 0x000000010f829800, 0x000000012b0ffe00, 0x00000001018b8200, +0x000000012dae5600, 0x000000012c39d000, 0x000000011db9d000, 0x000000012c3bba00, +0x000000012c3cb200, 0x000000011dbcc600, 0x000000012db42e00, 0x000000012cedde00, +0x000000012db60800, 0x000000011dc28800, 0x000000012db67000, 0x000000011dc39e00, +0x000000012b336400, 0x000000012c4a3400, 0x000000012cf7fc00, 0x000000010b190600, +0x000000011ead0200, 0x000000011dccd000, 0x000000010b17fa00, 0x000000011e1f1a00, +0x000000010b995e00, 0x000000010f8ffa00, 0x000000011f024a00, 0x000000011dcc2400, +0x000000011eb04e00, 0x000000012d1e3200, 0x000000012d1c0200, 0x000000011e257200, +0x000000010f997000, 0x000000012c55be00, 0x000000012b406400, 0x000000011eb76400, +0x000000010b9b3200, 0x000000010b985800, 0x000000011f02f400, 0x000000012d1f9a00, +0x000000011dd00400, 0x000000011dd2cc00, 0x000000012b437400, 0x000000012b45ba00, +0x000000012b49c600, 0x000000011ebea000, 0x000000011ea07e00, 0x000000011f161800, +0x000000012c5d9e00, 0x000000011f162e00, 0x000000012dd08600, 0x0000000101998600, +0x000000010b1ef200, 0x000000010ba06000, 0x000000011dda3c00, 0x000000011e3d8e00, +0x000000011f24c800 +} + +Java Threads: ( => current thread ) + 0x000000010b808a00 JavaThread "main" [_thread_in_native, id=5891, stack(0x000000016f17c000,0x000000016f37f000)] + 0x000000010b809600 JavaThread "Reference Handler" daemon [_thread_blocked, id=19971, stack(0x000000016ffd0000,0x00000001701d3000)] + 0x000000012c90ac00 JavaThread "Finalizer" daemon [_thread_blocked, id=19715, stack(0x00000001701dc000,0x00000001703df000)] + 0x000000010b008600 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=30979, stack(0x0000000170500000,0x0000000170703000)] + 0x000000010b00ae00 JavaThread "Service Thread" daemon [_thread_blocked, id=30467, stack(0x000000017070c000,0x000000017090f000)] + 0x000000011e808200 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=23299, stack(0x0000000170918000,0x0000000170b1b000)] + 0x000000011e00a400 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=23555, stack(0x0000000170b24000,0x0000000170d27000)] + 0x000000010f80a200 JavaThread "Sweeper thread" daemon [_thread_blocked, id=29699, stack(0x0000000170d30000,0x0000000170f33000)] + 0x000000010b809c00 JavaThread "C1 CompilerThread1" daemon [_thread_blocked, id=24067, stack(0x0000000170f3c000,0x000000017113f000)] + 0x000000010f80b200 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=24323, stack(0x0000000171148000,0x000000017134b000)] + 0x000000011e00aa00 JavaThread "C1 CompilerThread2" daemon [_thread_blocked, id=24835, stack(0x0000000171354000,0x0000000171557000)] + 0x000000010f80b800 JavaThread "C1 CompilerThread3" daemon [_thread_blocked, id=29187, stack(0x0000000171560000,0x0000000171763000)] + 0x000000012d039a00 JavaThread "JDWP Transport Listener: dt_socket" daemon [_thread_blocked, id=25603, stack(0x000000017176c000,0x000000017196f000)] + 0x000000011d808200 JavaThread "JDWP Event Helper Thread" daemon [_thread_blocked, id=25859, stack(0x0000000171978000,0x0000000171b7b000)] + 0x000000012c01ea00 JavaThread "JDWP Command Reader" daemon [_thread_in_native, id=26115, stack(0x0000000171b84000,0x0000000171d87000)] + 0x000000012d810400 JavaThread "IntelliJ Suspend Helper" daemon [_thread_blocked, id=26371, stack(0x0000000171d90000,0x0000000171f93000)] + 0x000000012d838200 JavaThread "Notification Thread" daemon [_thread_blocked, id=26883, stack(0x0000000171f9c000,0x000000017219f000)] + 0x000000010f829800 JavaThread "CoarseTimer" daemon [_thread_blocked, id=27139, stack(0x00000001721a8000,0x00000001723ab000)] + 0x000000012b0ffe00 JavaThread "RMI TCP Accept-0" daemon [_thread_in_native, id=41219, stack(0x0000000173620000,0x0000000173823000)] + 0x00000001018b8200 JavaThread "com.alibaba.nacos.client.logging.0" daemon [_thread_blocked, id=40707, stack(0x0000000173a38000,0x0000000173c3b000)] + 0x000000012dae5600 JavaThread "Attach Listener" daemon [_thread_blocked, id=35331, stack(0x0000000173c44000,0x0000000173e47000)] + 0x000000012c39d000 JavaThread "RMI TCP Connection(2)-127.0.0.1" daemon [_thread_in_native, id=39939, stack(0x0000000173e50000,0x0000000174053000)] + 0x000000011db9d000 JavaThread "RMI Scheduler(0)" daemon [_thread_blocked, id=35587, stack(0x000000017405c000,0x000000017425f000)] + 0x000000012c3bba00 JavaThread "nacos.publisher-com.alibaba.nacos.common.notify.SlowEvent" daemon [_thread_blocked, id=43523, stack(0x00000001750bc000,0x00000001752bf000)] + 0x000000012c3cb200 JavaThread "nacos.publisher-com.alibaba.nacos.client.config.impl.ConfigFuzzyWatchNotifyEvent" daemon [_thread_blocked, id=43779, stack(0x00000001752c8000,0x00000001754cb000)] + 0x000000011dbcc600 JavaThread "nacos.publisher-com.alibaba.nacos.client.config.impl.ConfigFuzzyWatchLoadEvent" daemon [_thread_blocked, id=44291, stack(0x00000001754d4000,0x00000001756d7000)] + 0x000000012db42e00 JavaThread "com.alibaba.nacos.client.auth.ram.identify.watcher.0" daemon [_thread_blocked, id=65027, stack(0x00000001756e0000,0x00000001758e3000)] + 0x000000012cedde00 JavaThread "com.alibaba.nacos.client.login-executor.0" daemon [_thread_blocked, id=36883, stack(0x0000000174a98000,0x0000000174c9b000)] + 0x000000012db60800 JavaThread "com.alibaba.nacos.client.listen-executor.0" daemon [_thread_blocked, id=45059, stack(0x00000001758ec000,0x0000000175aef000)] + 0x000000011dc28800 JavaThread "com.alibaba.nacos.client.fuzzy-watcher-executor.0" daemon [_thread_blocked, id=64771, stack(0x0000000175af8000,0x0000000175cfb000)] + 0x000000012db67000 JavaThread "com.alibaba.nacos.client.remote.worker.0" daemon [_thread_blocked, id=64259, stack(0x0000000175d04000,0x0000000175f07000)] + 0x000000011dc39e00 JavaThread "com.alibaba.nacos.client.remote.worker.1" daemon [_thread_blocked, id=45827, stack(0x0000000175f10000,0x0000000176113000)] + 0x000000012b336400 JavaThread "grpc-nio-worker-ELG-1-1" daemon [_thread_in_native, id=64019, stack(0x000000017611c000,0x000000017631f000)] + 0x000000012c4a3400 JavaThread "grpc-default-executor-0" daemon [_thread_blocked, id=63747, stack(0x0000000176328000,0x000000017652b000)] + 0x000000012cf7fc00 JavaThread "nacos-grpc-client-executor-127.0.0.1-0" daemon [_thread_blocked, id=46595, stack(0x0000000176534000,0x0000000176737000)] + 0x000000010b190600 JavaThread "nacos-grpc-client-executor-127.0.0.1-1" daemon [_thread_blocked, id=63235, stack(0x0000000176740000,0x0000000176943000)] + 0x000000011ead0200 JavaThread "grpc-nio-worker-ELG-1-2" daemon [_thread_in_native, id=62995, stack(0x000000017694c000,0x0000000176b4f000)] + 0x000000011dccd000 JavaThread "nacos-grpc-client-executor-127.0.0.1-2" daemon [_thread_blocked, id=47363, stack(0x0000000176b58000,0x0000000176d5b000)] + 0x000000010b17fa00 JavaThread "nacos-grpc-client-executor-127.0.0.1-3" daemon [_thread_blocked, id=62211, stack(0x0000000176d64000,0x0000000176f67000)] + 0x000000011e1f1a00 JavaThread "nacos-grpc-client-executor-127.0.0.1-4" daemon [_thread_blocked, id=47619, stack(0x0000000176f70000,0x0000000177173000)] + 0x000000010b995e00 JavaThread "nacos-grpc-client-executor-127.0.0.1-5" daemon [_thread_blocked, id=61699, stack(0x000000017717c000,0x000000017737f000)] + 0x000000010f8ffa00 JavaThread "nacos-grpc-client-executor-127.0.0.1-6" daemon [_thread_blocked, id=48387, stack(0x0000000177388000,0x000000017758b000)] + 0x000000011f024a00 JavaThread "nacos.publisher-com.alibaba.nacos.common.ability.AbstractAbilityControlManager$AbilityUpdateEvent" daemon [_thread_blocked, id=61187, stack(0x0000000177594000,0x0000000177797000)] + 0x000000011dcc2400 JavaThread "nacos-grpc-client-executor-127.0.0.1-7" daemon [_thread_blocked, id=48899, stack(0x00000001777a0000,0x00000001779a3000)] + 0x000000011eb04e00 JavaThread "nacos-grpc-client-executor-127.0.0.1-8" daemon [_thread_blocked, id=60675, stack(0x00000001779ac000,0x0000000177baf000)] + 0x000000012d1e3200 JavaThread "nacos-grpc-client-executor-127.0.0.1-9" daemon [_thread_blocked, id=49411, stack(0x0000000177bb8000,0x0000000177dbb000)] + 0x000000012d1c0200 JavaThread "nacos-grpc-client-executor-127.0.0.1-10" daemon [_thread_blocked, id=60163, stack(0x0000000177dc4000,0x0000000177fc7000)] + 0x000000011e257200 JavaThread "nacos-grpc-client-executor-127.0.0.1-11" daemon [_thread_blocked, id=59659, stack(0x0000000328004000,0x0000000328207000)] + 0x000000010f997000 JavaThread "nacos-grpc-client-executor-127.0.0.1-12" daemon [_thread_blocked, id=49923, stack(0x0000000328210000,0x0000000328413000)] + 0x000000012c55be00 JavaThread "nacos-grpc-client-executor-127.0.0.1-13" daemon [_thread_blocked, id=59395, stack(0x000000032841c000,0x000000032861f000)] + 0x000000012b406400 JavaThread "nacos-grpc-client-executor-127.0.0.1-14" daemon [_thread_blocked, id=59139, stack(0x0000000328628000,0x000000032882b000)] + 0x000000011eb76400 JavaThread "nacos-grpc-client-executor-127.0.0.1-15" daemon [_thread_blocked, id=50691, stack(0x0000000328834000,0x0000000328a37000)] + 0x000000010b9b3200 JavaThread "nacos-grpc-client-executor-127.0.0.1-16" daemon [_thread_blocked, id=51203, stack(0x0000000328a40000,0x0000000328c43000)] + 0x000000010b985800 JavaThread "nacos-grpc-client-executor-127.0.0.1-17" daemon [_thread_blocked, id=51715, stack(0x0000000328c4c000,0x0000000328e4f000)] + 0x000000011f02f400 JavaThread "nacos-grpc-client-executor-127.0.0.1-18" daemon [_thread_blocked, id=51971, stack(0x0000000328e58000,0x000000032905b000)] + 0x000000012d1f9a00 JavaThread "nacos-grpc-client-executor-127.0.0.1-19" daemon [_thread_blocked, id=58115, stack(0x0000000329064000,0x0000000329267000)] + 0x000000011dd00400 JavaThread "nacos-grpc-client-executor-127.0.0.1-20" daemon [_thread_blocked, id=57859, stack(0x0000000329270000,0x0000000329473000)] + 0x000000011dd2cc00 JavaThread "nacos-grpc-client-executor-127.0.0.1-21" daemon [_thread_blocked, id=57347, stack(0x000000032947c000,0x000000032967f000)] + 0x000000012b437400 JavaThread "nacos-grpc-client-executor-127.0.0.1-22" daemon [_thread_blocked, id=57091, stack(0x0000000329688000,0x000000032988b000)] + 0x000000012b45ba00 JavaThread "RMI TCP Connection(3)-127.0.0.1" daemon [_thread_in_native, id=39179, stack(0x0000000174268000,0x000000017446b000)] +=>0x000000012b49c600 JavaThread "sentinel-datafile-log-executor-thread-1" daemon [_thread_in_native, id=36647, stack(0x0000000174680000,0x0000000174883000)] + 0x000000011ebea000 JavaThread "sentinel-heartbeat-send-task-thread-1" daemon [_thread_blocked, id=56595, stack(0x0000000329894000,0x0000000329a97000)] + 0x000000011ea07e00 JavaThread "sentinel-command-center-executor-thread-1" daemon [_thread_in_native, id=36139, stack(0x0000000174474000,0x0000000174677000)] + 0x000000011f161800 JavaThread "nacos-grpc-client-executor-127.0.0.1-23" daemon [_thread_blocked, id=36367, stack(0x000000017488c000,0x0000000174a8f000)] + 0x000000012c5d9e00 JavaThread "nacos-grpc-client-executor-127.0.0.1-24" daemon [_thread_blocked, id=53003, stack(0x0000000329aa0000,0x0000000329ca3000)] + 0x000000011f162e00 JavaThread "nacos-grpc-client-executor-127.0.0.1-25" daemon [_thread_blocked, id=56323, stack(0x0000000329cac000,0x0000000329eaf000)] + 0x000000012dd08600 JavaThread "nacos-grpc-client-executor-127.0.0.1-26" daemon [_thread_blocked, id=53763, stack(0x0000000329eb8000,0x000000032a0bb000)] + 0x0000000101998600 JavaThread "nacos-grpc-client-executor-127.0.0.1-27" daemon [_thread_blocked, id=55811, stack(0x000000032a0c4000,0x000000032a2c7000)] + 0x000000010b1ef200 JavaThread "nacos-grpc-client-executor-127.0.0.1-28" daemon [_thread_blocked, id=54019, stack(0x000000032a2d0000,0x000000032a4d3000)] + 0x000000010ba06000 JavaThread "nacos-grpc-client-executor-127.0.0.1-29" daemon [_thread_blocked, id=55043, stack(0x000000032a4dc000,0x000000032a6df000)] + 0x000000011dda3c00 JavaThread "nacos-grpc-client-executor-127.0.0.1-30" daemon [_thread_blocked, id=54787, stack(0x000000032a6e8000,0x000000032a8eb000)] + 0x000000011e3d8e00 JavaThread "sentinel-time-tick-thread" daemon [_thread_blocked, id=31875, stack(0x000000032a8f4000,0x000000032aaf7000)] + 0x000000011f24c800 JavaThread "sentinel-heartbeat-send-task-thread-2" daemon [_thread_blocked, id=65843, stack(0x000000032ab00000,0x000000032ad03000)] + +Other Threads: + 0x000000012b8059d0 VMThread "VM Thread" [stack: 0x000000016fdc4000,0x000000016ffc7000] [id=18435] + 0x000000010f109630 WatcherThread [stack: 0x000000017382c000,0x0000000173a2f000] [id=40963] + 0x000000012af08740 GCTaskThread "GC Thread#0" [stack: 0x000000016f388000,0x000000016f58b000] [id=12035] + 0x000000012ae08da0 GCTaskThread "GC Thread#1" [stack: 0x00000001723b4000,0x00000001725b7000] [id=27395] + 0x000000012ae09060 GCTaskThread "GC Thread#2" [stack: 0x00000001725c0000,0x00000001727c3000] [id=32771] + 0x0000000101107cb0 GCTaskThread "GC Thread#3" [stack: 0x00000001727cc000,0x00000001729cf000] [id=33027] + 0x000000010f30cd30 GCTaskThread "GC Thread#4" [stack: 0x00000001729d8000,0x0000000172bdb000] [id=33283] + 0x000000012ae094f0 GCTaskThread "GC Thread#5" [stack: 0x0000000172be4000,0x0000000172de7000] [id=42755] + 0x000000010f30cff0 GCTaskThread "GC Thread#6" [stack: 0x0000000172df0000,0x0000000172ff3000] [id=42243] + 0x000000012b909b70 GCTaskThread "GC Thread#7" [stack: 0x0000000172ffc000,0x00000001731ff000] [id=41987] + 0x000000010f209c10 GCTaskThread "GC Thread#8" [stack: 0x0000000173208000,0x000000017340b000] [id=34051] + 0x000000010f30d870 GCTaskThread "GC Thread#9" [stack: 0x0000000173414000,0x0000000173617000] [id=34307] + 0x000000012af08e00 ConcurrentGCThread "G1 Main Marker" [stack: 0x000000016f594000,0x000000016f797000] [id=13571] + 0x000000012af09690 ConcurrentGCThread "G1 Conc#0" [stack: 0x000000016f7a0000,0x000000016f9a3000] [id=12547] + 0x000000010f41fcd0 ConcurrentGCThread "G1 Conc#1" [stack: 0x0000000174ca4000,0x0000000174ea7000] [id=37891] + 0x000000010f32ed40 ConcurrentGCThread "G1 Conc#2" [stack: 0x0000000174eb0000,0x00000001750b3000] [id=37379] + 0x000000012af0bbd0 ConcurrentGCThread "G1 Refine#0" [stack: 0x000000016f9ac000,0x000000016fbaf000] [id=16643] + 0x000000010f104080 ConcurrentGCThread "G1 Service" [stack: 0x000000016fbb8000,0x000000016fdbb000] [id=21507] + +Threads with active compile tasks: + +VM state: not at safepoint (normal execution) + +VM Mutex/Monitor currently owned by a thread: None + +Heap address: 0x00000005c0000000, size: 9216 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 + +CDS archive(s) mapped at: [0x0000000500000000-0x0000000500c14000-0x0000000500c14000), size 12664832, SharedBaseAddress: 0x0000000500000000, ArchiveRelocationMode: 1. +Compressed class space mapped at: 0x0000000501000000-0x0000000541000000, reserved size: 1073741824 +Narrow klass base: 0x0000000500000000, Narrow klass shift: 0, Narrow klass range: 0x100000000 + +GC Precious Log: + CPUs: 12 total, 12 available + Memory: 36864M + Large Page Support: Disabled + NUMA Support: Disabled + Compressed Oops: Enabled (Zero based) + Heap Region Size: 8M + Heap Min Capacity: 8M + Heap Initial Capacity: 576M + Heap Max Capacity: 9G + Pre-touch: Disabled + Parallel Workers: 10 + Concurrent Workers: 3 + Concurrent Refinement Workers: 10 + Periodic GC: Disabled + +Heap: + garbage-first heap total 262144K, used 92456K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 9 young (73728K), 3 survivors (24576K) + Metaspace used 63382K, committed 63872K, reserved 1114112K + class space used 8462K, committed 8704K, reserved 1048576K + +Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, OA=open archive, CA=closed archive, TAMS=top-at-mark-start (previous, next) +| 0|0x00000005c0000000, 0x00000005c0800000, 0x00000005c0800000|100%| O| |TAMS 0x00000005c0800000, 0x00000005c0000000| Untracked +| 1|0x00000005c0800000, 0x00000005c1000000, 0x00000005c1000000|100%| O| |TAMS 0x00000005c1000000, 0x00000005c0800000| Untracked +| 2|0x00000005c1000000, 0x00000005c1800000, 0x00000005c1800000|100%| O| |TAMS 0x00000005c1800000, 0x00000005c1000000| Untracked +| 3|0x00000005c1800000, 0x00000005c1800000, 0x00000005c2000000| 0%| F| |TAMS 0x00000005c1800000, 0x00000005c1800000| Untracked +| 4|0x00000005c2000000, 0x00000005c207c000, 0x00000005c2800000| 6%| O| |TAMS 0x00000005c207c000, 0x00000005c2000000| Untracked +| 5|0x00000005c2800000, 0x00000005c2800000, 0x00000005c3000000| 0%| F| |TAMS 0x00000005c2800000, 0x00000005c2800000| Untracked +| 6|0x00000005c3000000, 0x00000005c3000000, 0x00000005c3800000| 0%| F| |TAMS 0x00000005c3000000, 0x00000005c3000000| Untracked +| 7|0x00000005c3800000, 0x00000005c3800000, 0x00000005c4000000| 0%| F| |TAMS 0x00000005c3800000, 0x00000005c3800000| Untracked +| 8|0x00000005c4000000, 0x00000005c4000000, 0x00000005c4800000| 0%| F| |TAMS 0x00000005c4000000, 0x00000005c4000000| Untracked +| 9|0x00000005c4800000, 0x00000005c4800000, 0x00000005c5000000| 0%| F| |TAMS 0x00000005c4800000, 0x00000005c4800000| Untracked +| 10|0x00000005c5000000, 0x00000005c5000000, 0x00000005c5800000| 0%| F| |TAMS 0x00000005c5000000, 0x00000005c5000000| Untracked +| 11|0x00000005c5800000, 0x00000005c5800000, 0x00000005c6000000| 0%| F| |TAMS 0x00000005c5800000, 0x00000005c5800000| Untracked +| 12|0x00000005c6000000, 0x00000005c6000000, 0x00000005c6800000| 0%| F| |TAMS 0x00000005c6000000, 0x00000005c6000000| Untracked +| 13|0x00000005c6800000, 0x00000005c6800000, 0x00000005c7000000| 0%| F| |TAMS 0x00000005c6800000, 0x00000005c6800000| Untracked +| 14|0x00000005c7000000, 0x00000005c71d6220, 0x00000005c7800000| 22%| S|CS|TAMS 0x00000005c7000000, 0x00000005c7000000| Complete +| 15|0x00000005c7800000, 0x00000005c8000000, 0x00000005c8000000|100%| S|CS|TAMS 0x00000005c7800000, 0x00000005c7800000| Complete +| 16|0x00000005c8000000, 0x00000005c8800000, 0x00000005c8800000|100%| S|CS|TAMS 0x00000005c8000000, 0x00000005c8000000| Complete +| 17|0x00000005c8800000, 0x00000005c8800000, 0x00000005c9000000| 0%| F| |TAMS 0x00000005c8800000, 0x00000005c8800000| Untracked +| 18|0x00000005c9000000, 0x00000005c9000000, 0x00000005c9800000| 0%| F| |TAMS 0x00000005c9000000, 0x00000005c9000000| Untracked +| 19|0x00000005c9800000, 0x00000005c9800000, 0x00000005ca000000| 0%| F| |TAMS 0x00000005c9800000, 0x00000005c9800000| Untracked +| 20|0x00000005ca000000, 0x00000005ca000000, 0x00000005ca800000| 0%| F| |TAMS 0x00000005ca000000, 0x00000005ca000000| Untracked +| 21|0x00000005ca800000, 0x00000005ca800000, 0x00000005cb000000| 0%| F| |TAMS 0x00000005ca800000, 0x00000005ca800000| Untracked +| 22|0x00000005cb000000, 0x00000005cb000000, 0x00000005cb800000| 0%| F| |TAMS 0x00000005cb000000, 0x00000005cb000000| Untracked +| 23|0x00000005cb800000, 0x00000005cb800000, 0x00000005cc000000| 0%| F| |TAMS 0x00000005cb800000, 0x00000005cb800000| Untracked +| 24|0x00000005cc000000, 0x00000005cc5eec00, 0x00000005cc800000| 74%| E| |TAMS 0x00000005cc000000, 0x00000005cc000000| Complete +| 25|0x00000005cc800000, 0x00000005cd000000, 0x00000005cd000000|100%| E|CS|TAMS 0x00000005cc800000, 0x00000005cc800000| Complete +| 26|0x00000005cd000000, 0x00000005cd800000, 0x00000005cd800000|100%| E|CS|TAMS 0x00000005cd000000, 0x00000005cd000000| Complete +| 27|0x00000005cd800000, 0x00000005ce000000, 0x00000005ce000000|100%| E|CS|TAMS 0x00000005cd800000, 0x00000005cd800000| Complete +| 64|0x00000005e0000000, 0x00000005e0800000, 0x00000005e0800000|100%| E|CS|TAMS 0x00000005e0000000, 0x00000005e0000000| Complete +| 71|0x00000005e3800000, 0x00000005e4000000, 0x00000005e4000000|100%| E|CS|TAMS 0x00000005e3800000, 0x00000005e3800000| Complete +|1150|0x00000007ff000000, 0x00000007ff778000, 0x00000007ff800000| 93%|OA| |TAMS 0x00000007ff778000, 0x00000007ff000000| Untracked +|1151|0x00000007ff800000, 0x00000007ff880000, 0x0000000800000000| 6%|CA| |TAMS 0x00000007ff880000, 0x00000007ff800000| Untracked + +Card table byte_map: [0x0000000119200000,0x000000011a400000] _byte_map_base: 0x0000000116400000 + +Marking Bits (Prev, Next): (CMBitMap*) 0x000000012c82f250, (CMBitMap*) 0x000000012c82f210 + Prev Bits: [0x0000000141000000, 0x000000014a000000) + Next Bits: [0x0000000138000000, 0x0000000141000000) + +Polling page: 0x0000000100da4000 + +Metaspace: + +Usage: + Non-class: 53.63 MB used. + Class: 8.26 MB used. + Both: 61.90 MB used. + +Virtual space: + Non-class space: 64.00 MB reserved, 53.88 MB ( 84%) committed, 1 nodes. + Class space: 1.00 GB reserved, 8.50 MB ( <1%) committed, 1 nodes. + Both: 1.06 GB reserved, 62.38 MB ( 6%) committed. + +Chunk freelists: + Non-Class: 10.08 MB + Class: 7.50 MB + Both: 17.58 MB + +MaxMetaspaceSize: unlimited +CompressedClassSpaceSize: 1.00 GB +Initial GC threshold: 21.00 MB +Current GC threshold: 99.06 MB +CDS: on +MetaspaceReclaimPolicy: balanced + - commit_granule_bytes: 65536. + - commit_granule_words: 8192. + - virtual_space_node_default_size: 8388608. + - enlarge_chunks_in_place: 1. + - new_chunks_are_fully_committed: 0. + - uncommit_free_chunks: 1. + - use_allocation_guard: 0. + - handle_deallocations: 1. + + +Internal statistics: + +num_allocs_failed_limit: 9. +num_arena_births: 684. +num_arena_deaths: 0. +num_vsnodes_births: 2. +num_vsnodes_deaths: 0. +num_space_committed: 998. +num_space_uncommitted: 0. +num_chunks_returned_to_freelist: 9. +num_chunks_taken_from_freelist: 2682. +num_chunk_merges: 6. +num_chunk_splits: 2009. +num_chunks_enlarged: 1609. +num_inconsistent_stats: 0. + +CodeCache: size=49152Kb used=12939Kb max_used=12939Kb free=36212Kb + bounds [0x000000010c100000, 0x000000010cdb0000, 0x000000010f100000] + total_blobs=6555 nmethods=5927 adapters=554 + compilation: enabled + stopped_count=0, restarted_count=0 + full_count=0 + +Compilation events (20 events): +Event: 9.067 Thread 0x000000010b809c00 nmethod 6207 0x000000010cd9aa90 code [0x000000010cd9ac40, 0x000000010cd9ae18] +Event: 9.067 Thread 0x000000010b809c00 6211 1 org.springframework.beans.factory.config.BeanDefinitionVisitor::visitScope (33 bytes) +Event: 9.067 Thread 0x000000010f80b800 nmethod 6210 0x000000010cd9af90 code [0x000000010cd9b140, 0x000000010cd9b358] +Event: 9.067 Thread 0x000000011e00aa00 nmethod 6208 0x000000010cd9b510 code [0x000000010cd9b700, 0x000000010cd9ba38] +Event: 9.067 Thread 0x000000010b809c00 nmethod 6211 0x000000010cd9bc90 code [0x000000010cd9be40, 0x000000010cd9c058] +Event: 9.068 Thread 0x000000011e00a400 nmethod 6206 0x000000010cd9c210 code [0x000000010cd9c580, 0x000000010cd9d558] +Event: 9.068 Thread 0x000000010b809c00 6212 1 org.springframework.beans.AbstractNestablePropertyAccessor::getWrappedInstance (22 bytes) +Event: 9.068 Thread 0x000000010b809c00 nmethod 6212 0x000000010cd9e010 code [0x000000010cd9e1c0, 0x000000010cd9e338] +Event: 9.073 Thread 0x000000011e00a400 6213 1 java.lang.reflect.Constructor::getParameterTypes (11 bytes) +Event: 9.073 Thread 0x000000011e00a400 nmethod 6213 0x000000010cd9e410 code [0x000000010cd9e5c0, 0x000000010cd9e6f8] +Event: 9.126 Thread 0x000000011e00aa00 6216 1 java.util.regex.Pattern::qtype (39 bytes) +Event: 9.126 Thread 0x000000010b809c00 6217 1 java.util.regex.Pattern::sequence (647 bytes) +Event: 9.126 Thread 0x000000010f80b800 6218 1 java.util.regex.Pattern$BranchConn::study (5 bytes) +Event: 9.126 Thread 0x000000010f80b800 nmethod 6218 0x000000010cd9f090 code [0x000000010cd9f200, 0x000000010cd9f2d8] +Event: 9.126 Thread 0x000000011e00aa00 nmethod 6216 0x000000010cd9f390 code [0x000000010cd9f580, 0x000000010cd9f8b8] +Event: 9.127 Thread 0x000000011e00a400 6219 1 jdk.internal.misc.Unsafe::putReferenceOpaque (9 bytes) +Event: 9.127 Thread 0x000000011e00a400 nmethod 6219 0x000000010cd9fa90 code [0x000000010cd9fc00, 0x000000010cd9fd18] +Event: 9.128 Thread 0x000000010b809c00 nmethod 6217 0x000000010cd9fd90 code [0x000000010cda0180, 0x000000010cda1618] +Event: 9.128 Thread 0x000000011e00aa00 6220 1 java.util.IdentityHashMap::put (137 bytes) +Event: 9.129 Thread 0x000000011e00aa00 nmethod 6220 0x000000010cda2290 code [0x000000010cda2480, 0x000000010cda2998] + +GC Heap History (20 events): +Event: 0.442 GC heap before +{Heap before GC invocations=1 (full 0): + garbage-first heap total 606208K, used 38051K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 3 young (24576K), 1 survivors (8192K) + Metaspace used 9689K, committed 9856K, reserved 1114112K + class space used 1076K, committed 1152K, reserved 1048576K +} +Event: 0.444 GC heap after +{Heap after GC invocations=2 (full 0): + garbage-first heap total 606208K, used 23419K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 9689K, committed 9856K, reserved 1114112K + class space used 1076K, committed 1152K, reserved 1048576K +} +Event: 0.807 GC heap before +{Heap before GC invocations=2 (full 0): + garbage-first heap total 606208K, used 47995K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 5 young (40960K), 1 survivors (8192K) + Metaspace used 13722K, committed 13888K, reserved 1114112K + class space used 1603K, committed 1664K, reserved 1048576K +} +Event: 0.813 GC heap after +{Heap after GC invocations=3 (full 0): + garbage-first heap total 606208K, used 27477K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 13722K, committed 13888K, reserved 1114112K + class space used 1603K, committed 1664K, reserved 1048576K +} +Event: 1.392 GC heap before +{Heap before GC invocations=3 (full 0): + garbage-first heap total 606208K, used 68437K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 7 young (57344K), 1 survivors (8192K) + Metaspace used 21201K, committed 21504K, reserved 1114112K + class space used 2676K, committed 2816K, reserved 1048576K +} +Event: 1.395 GC heap after +{Heap after GC invocations=4 (full 0): + garbage-first heap total 606208K, used 31119K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 21201K, committed 21504K, reserved 1114112K + class space used 2676K, committed 2816K, reserved 1048576K +} +Event: 2.847 GC heap before +{Heap before GC invocations=5 (full 0): + garbage-first heap total 196608K, used 137615K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 14 young (114688K), 1 survivors (8192K) + Metaspace used 32674K, committed 33088K, reserved 1114112K + class space used 4093K, committed 4288K, reserved 1048576K +} +Event: 2.861 GC heap after +{Heap after GC invocations=6 (full 0): + garbage-first heap total 196608K, used 32785K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 32674K, committed 33088K, reserved 1114112K + class space used 4093K, committed 4288K, reserved 1048576K +} +Event: 2.927 GC heap before +{Heap before GC invocations=6 (full 0): + garbage-first heap total 196608K, used 40977K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 2 young (16384K), 1 survivors (8192K) + Metaspace used 34086K, committed 34432K, reserved 1114112K + class space used 4246K, committed 4416K, reserved 1048576K +} +Event: 2.931 GC heap after +{Heap after GC invocations=7 (full 0): + garbage-first heap total 196608K, used 33192K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 34086K, committed 34432K, reserved 1114112K + class space used 4246K, committed 4416K, reserved 1048576K +} +Event: 3.207 GC heap before +{Heap before GC invocations=7 (full 0): + garbage-first heap total 196608K, used 41384K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 4 young (32768K), 1 survivors (8192K) + Metaspace used 35986K, committed 36288K, reserved 1114112K + class space used 4497K, committed 4672K, reserved 1048576K +} +Event: 3.213 GC heap after +{Heap after GC invocations=8 (full 0): + garbage-first heap total 196608K, used 33908K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 35986K, committed 36288K, reserved 1114112K + class space used 4497K, committed 4672K, reserved 1048576K +} +Event: 4.154 GC heap before +{Heap before GC invocations=9 (full 0): + garbage-first heap total 196608K, used 115828K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 12 young (98304K), 1 survivors (8192K) + Metaspace used 45522K, committed 45952K, reserved 1114112K + class space used 5884K, committed 6080K, reserved 1048576K +} +Event: 4.157 GC heap after +{Heap after GC invocations=10 (full 0): + garbage-first heap total 262144K, used 37091K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 45522K, committed 45952K, reserved 1114112K + class space used 5884K, committed 6080K, reserved 1048576K +} +Event: 4.268 GC heap before +{Heap before GC invocations=10 (full 0): + garbage-first heap total 262144K, used 45283K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 2 young (16384K), 1 survivors (8192K) + Metaspace used 46797K, committed 47168K, reserved 1114112K + class space used 6085K, committed 6272K, reserved 1048576K +} +Event: 4.273 GC heap after +{Heap after GC invocations=11 (full 0): + garbage-first heap total 262144K, used 37205K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 46797K, committed 47168K, reserved 1114112K + class space used 6085K, committed 6272K, reserved 1048576K +} +Event: 6.516 GC heap before +{Heap before GC invocations=11 (full 0): + garbage-first heap total 262144K, used 176469K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 18 young (147456K), 1 survivors (8192K) + Metaspace used 55389K, committed 55808K, reserved 1114112K + class space used 7288K, committed 7488K, reserved 1048576K +} +Event: 6.521 GC heap after +{Heap after GC invocations=12 (full 0): + garbage-first heap total 262144K, used 45059K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 2 young (16384K), 2 survivors (16384K) + Metaspace used 55389K, committed 55808K, reserved 1114112K + class space used 7288K, committed 7488K, reserved 1048576K +} +Event: 8.053 GC heap before +{Heap before GC invocations=12 (full 0): + garbage-first heap total 262144K, used 135171K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 15 young (122880K), 2 survivors (16384K) + Metaspace used 60370K, committed 60800K, reserved 1114112K + class space used 7985K, committed 8192K, reserved 1048576K +} +Event: 8.065 GC heap after +{Heap after GC invocations=13 (full 0): + garbage-first heap total 262144K, used 51496K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 3 young (24576K), 3 survivors (24576K) + Metaspace used 60370K, committed 60800K, reserved 1114112K + class space used 7985K, committed 8192K, reserved 1048576K +} + +Dll operation events (11 events): +Event: 0.007 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjava.dylib +Event: 0.007 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libzip.dylib +Event: 0.078 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libinstrument.dylib +Event: 0.081 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libnio.dylib +Event: 0.084 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libnet.dylib +Event: 0.124 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjimage.dylib +Event: 0.134 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libzip.dylib +Event: 0.211 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libmanagement.dylib +Event: 0.216 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libmanagement_ext.dylib +Event: 0.319 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libextnet.dylib +Event: 6.751 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libverify.dylib + +Deoptimization events (20 events): +Event: 9.084 Thread 0x000000010b808a00 DEOPT PACKING pc=0x000000010c56ea28 sp=0x000000016f37db60 +Event: 9.084 Thread 0x000000010b808a00 DEOPT UNPACKING pc=0x000000010c14777c sp=0x000000016f37d800 mode 1 +Event: 9.084 Thread 0x000000010b808a00 DEOPT PACKING pc=0x000000010c56dcbc sp=0x000000016f37dc30 +Event: 9.084 Thread 0x000000010b808a00 DEOPT UNPACKING pc=0x000000010c14777c sp=0x000000016f37d900 mode 1 +Event: 9.085 Thread 0x000000010b808a00 DEOPT PACKING pc=0x000000010c56ea28 sp=0x000000016f37db60 +Event: 9.085 Thread 0x000000010b808a00 DEOPT UNPACKING pc=0x000000010c14777c sp=0x000000016f37d800 mode 1 +Event: 9.085 Thread 0x000000010b808a00 DEOPT PACKING pc=0x000000010c56dcbc sp=0x000000016f37dc30 +Event: 9.085 Thread 0x000000010b808a00 DEOPT UNPACKING pc=0x000000010c14777c sp=0x000000016f37d900 mode 1 +Event: 9.104 Thread 0x000000010b808a00 DEOPT PACKING pc=0x000000010c56ea28 sp=0x000000016f37db80 +Event: 9.104 Thread 0x000000010b808a00 DEOPT UNPACKING pc=0x000000010c14777c sp=0x000000016f37d820 mode 1 +Event: 9.104 Thread 0x000000010b808a00 DEOPT PACKING pc=0x000000010c56dcbc sp=0x000000016f37dc50 +Event: 9.104 Thread 0x000000010b808a00 DEOPT UNPACKING pc=0x000000010c14777c sp=0x000000016f37d920 mode 1 +Event: 9.105 Thread 0x000000010b808a00 DEOPT PACKING pc=0x000000010c56ea28 sp=0x000000016f37db60 +Event: 9.105 Thread 0x000000010b808a00 DEOPT UNPACKING pc=0x000000010c14777c sp=0x000000016f37d800 mode 1 +Event: 9.105 Thread 0x000000010b808a00 DEOPT PACKING pc=0x000000010c56dcbc sp=0x000000016f37dc30 +Event: 9.105 Thread 0x000000010b808a00 DEOPT UNPACKING pc=0x000000010c14777c sp=0x000000016f37d900 mode 1 +Event: 9.106 Thread 0x000000010b808a00 DEOPT PACKING pc=0x000000010c56ea28 sp=0x000000016f37db80 +Event: 9.106 Thread 0x000000010b808a00 DEOPT UNPACKING pc=0x000000010c14777c sp=0x000000016f37d820 mode 1 +Event: 9.106 Thread 0x000000010b808a00 DEOPT PACKING pc=0x000000010c56dcbc sp=0x000000016f37dc50 +Event: 9.106 Thread 0x000000010b808a00 DEOPT UNPACKING pc=0x000000010c14777c sp=0x000000016f37d920 mode 1 + +Classes unloaded (0 events): +No events + +Classes redefined (1 events): +Event: 0.114 Thread 0x000000012b8059d0 redefined class name=java.lang.Throwable, count=1 + +Internal exceptions (20 events): +Event: 6.369 Thread 0x000000010b808a00 Exception (0x00000005c61a56a8) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 6.370 Thread 0x000000010b808a00 Exception (0x00000005c61ac0f8) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 6.371 Thread 0x000000010b808a00 Exception (0x00000005c61b00f0) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 6.388 Thread 0x000000012b45ba00 Exception (0x00000005c7a137e0) +thrown [src/hotspot/share/runtime/reflection.cpp, line 1121] +Event: 6.404 Thread 0x000000010b808a00 Exception (0x00000005c6294068) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 6.891 Thread 0x000000012b45ba00 Exception (0x00000005cbfd3b50) +thrown [src/hotspot/share/runtime/reflection.cpp, line 1121] +Event: 7.393 Thread 0x000000012b45ba00 Exception (0x00000005cbfe0578) +thrown [src/hotspot/share/runtime/reflection.cpp, line 1121] +Event: 7.899 Thread 0x000000012b45ba00 Exception (0x00000005c9409f48) +thrown [src/hotspot/share/runtime/reflection.cpp, line 1121] +Event: 8.401 Thread 0x000000012b45ba00 Exception (0x00000005e02167a0) +thrown [src/hotspot/share/runtime/reflection.cpp, line 1121] +Event: 8.927 Thread 0x000000012b45ba00 Exception (0x00000005ccc28338) +thrown [src/hotspot/share/runtime/reflection.cpp, line 1121] +Event: 8.948 Thread 0x000000010b808a00 Exception (0x00000005ccc21b10) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 8.948 Thread 0x000000010b808a00 Exception (0x00000005ccc26808) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 8.949 Thread 0x000000010b808a00 Exception (0x00000005ccc3f340) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 8.949 Thread 0x000000010b808a00 Exception (0x00000005ccc4b0d8) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 9.084 Thread 0x000000010b808a00 Exception (0x00000005cc19f8f0) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 248] +Event: 9.085 Thread 0x000000010b808a00 Exception (0x00000005cc1a9e48) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 248] +Event: 9.105 Thread 0x000000010b808a00 Exception (0x00000005cc24dc60) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 248] +Event: 9.105 Thread 0x000000010b808a00 Exception (0x00000005cc2577d0) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 248] +Event: 9.106 Thread 0x000000010b808a00 Exception (0x00000005cc2624f8) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 248] +Event: 9.126 Thread 0x000000011ebea000 Exception (0x00000005cc5769a0) +thrown [src/hotspot/share/prims/jni.cpp, line 516] + +VM Operations (20 events): +Event: 8.053 Executing VM operation: CollectForMetadataAllocation +Event: 8.070 Executing VM operation: CollectForMetadataAllocation done +Event: 8.080 Executing VM operation: G1PauseRemark +Event: 8.084 Executing VM operation: G1PauseRemark done +Event: 8.088 Executing VM operation: G1PauseCleanup +Event: 8.088 Executing VM operation: G1PauseCleanup done +Event: 8.450 Executing VM operation: HandshakeAllThreads +Event: 8.450 Executing VM operation: HandshakeAllThreads done +Event: 8.461 Executing VM operation: HandshakeAllThreads +Event: 8.462 Executing VM operation: HandshakeAllThreads done +Event: 8.462 Executing VM operation: HandshakeAllThreads +Event: 8.462 Executing VM operation: HandshakeAllThreads done +Event: 8.957 Executing VM operation: HandshakeAllThreads +Event: 8.957 Executing VM operation: HandshakeAllThreads done +Event: 8.964 Executing VM operation: HandshakeAllThreads +Event: 8.964 Executing VM operation: HandshakeAllThreads done +Event: 8.980 Executing VM operation: HandshakeAllThreads +Event: 8.980 Executing VM operation: HandshakeAllThreads done +Event: 9.027 Executing VM operation: ICBufferFull +Event: 9.033 Executing VM operation: ICBufferFull done + +Events (20 events): +Event: 9.126 loading class java/net/SocksSocketImpl$3 done +Event: 9.126 loading class sun/net/util/SocketExceptions +Event: 9.126 loading class sun/net/util/SocketExceptions done +Event: 9.127 Thread 0x000000011f24c800 Thread added: 0x000000011f24c800 +Event: 9.127 Protecting memory [0x000000032ab00000,0x000000032ab0c000] with protection modes 0 +Event: 9.127 loading class java/lang/Throwable$WrappedPrintWriter +Event: 9.127 loading class java/lang/Throwable$WrappedPrintWriter done +Event: 9.128 loading class com/intellij/rt/debugger/agent/CaptureStorage$9 +Event: 9.128 loading class com/intellij/rt/debugger/agent/CaptureStorage$Callable +Event: 9.128 loading class com/intellij/rt/debugger/agent/CaptureStorage$Callable done +Event: 9.128 loading class com/intellij/rt/debugger/agent/CaptureStorage$9 done +Event: 9.128 loading class jdk/internal/loader/BootLoader$PackageHelper$1 +Event: 9.128 loading class jdk/internal/loader/BootLoader$PackageHelper$1 done +Event: 9.128 loading class jdk/internal/loader/BootLoader$PackageHelper$2 +Event: 9.128 loading class jdk/internal/loader/BootLoader$PackageHelper$2 done +Event: 9.128 loading class java/util/jar/JarInputStream +Event: 9.128 loading class java/util/zip/ZipInputStream +Event: 9.129 loading class java/util/zip/ZipInputStream done +Event: 9.129 loading class java/util/jar/JarInputStream done +Event: 9.129 loading class com/intellij/rt/debugger/agent/CaptureStorage$StackData + + +Dynamic libraries: +0x0000000100d44000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjli.dylib +0x0000000196c18000 /usr/lib/libz.1.dylib +0x0000000196cce000 /usr/lib/libSystem.B.dylib +0x0000000196cc8000 /usr/lib/system/libcache.dylib +0x0000000196c83000 /usr/lib/system/libcommonCrypto.dylib +0x0000000196cae000 /usr/lib/system/libcompiler_rt.dylib +0x0000000196ca3000 /usr/lib/system/libcopyfile.dylib +0x0000000186bb6000 /usr/lib/system/libcorecrypto.dylib +0x0000000186cb6000 /usr/lib/system/libdispatch.dylib +0x0000000186a53000 /usr/lib/system/libdyld.dylib +0x0000000196cbe000 /usr/lib/system/libkeymgr.dylib +0x0000000196c66000 /usr/lib/system/libmacho.dylib +0x0000000195ef9000 /usr/lib/system/libquarantine.dylib +0x0000000196cbb000 /usr/lib/system/libremovefile.dylib +0x000000018d629000 /usr/lib/system/libsystem_asl.dylib +0x0000000186b3c000 /usr/lib/system/libsystem_blocks.dylib +0x0000000186d01000 /usr/lib/system/libsystem_c.dylib +0x0000000196cb2000 /usr/lib/system/libsystem_collections.dylib +0x0000000194899000 /usr/lib/system/libsystem_configuration.dylib +0x0000000193487000 /usr/lib/system/libsystem_containermanager.dylib +0x0000000196698000 /usr/lib/system/libsystem_coreservices.dylib +0x000000018ae50000 /usr/lib/system/libsystem_darwin.dylib +0x000000028c8a4000 /usr/lib/system/libsystem_darwindirectory.dylib +0x0000000196cbf000 /usr/lib/system/libsystem_dnssd.dylib +0x000000028c8a8000 /usr/lib/system/libsystem_eligibility.dylib +0x0000000186cfe000 /usr/lib/system/libsystem_featureflags.dylib +0x0000000186e83000 /usr/lib/system/libsystem_info.dylib +0x0000000196c27000 /usr/lib/system/libsystem_m.dylib +0x0000000186c65000 /usr/lib/system/libsystem_malloc.dylib +0x000000018d58c000 /usr/lib/system/libsystem_networkextension.dylib +0x000000018b2bb000 /usr/lib/system/libsystem_notify.dylib +0x000000019489e000 /usr/lib/system/libsystem_sandbox.dylib +0x000000028c8b3000 /usr/lib/system/libsystem_sanitizers.dylib +0x0000000196cb7000 /usr/lib/system/libsystem_secinit.dylib +0x0000000186e2f000 /usr/lib/system/libsystem_kernel.dylib +0x0000000186e7a000 /usr/lib/system/libsystem_platform.dylib +0x0000000186e6d000 /usr/lib/system/libsystem_pthread.dylib +0x000000018f1e2000 /usr/lib/system/libsystem_symptoms.dylib +0x0000000186b95000 /usr/lib/system/libsystem_trace.dylib +0x000000028c8bb000 /usr/lib/system/libsystem_trial.dylib +0x0000000196c91000 /usr/lib/system/libunwind.dylib +0x0000000186b40000 /usr/lib/system/libxpc.dylib +0x0000000186a00000 /usr/lib/libobjc.A.dylib +0x0000000186eb3000 /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation +0x000000019a5c3000 /usr/lib/swift/libswiftCore.dylib +0x0000000186e14000 /usr/lib/libc++abi.dylib +0x000000028ac91000 /usr/lib/libRosetta.dylib +0x0000000186d83000 /usr/lib/libc++.1.dylib +0x0000000188722000 /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation +0x00000001a41a3000 /usr/lib/swift/libswiftObjectiveC.dylib +0x000000028c10d000 /usr/lib/libswiftPrespecialized.dylib +0x0000000188391000 /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration +0x0000000191703000 /System/Library/PrivateFrameworks/CoreAutoLayout.framework/Versions/A/CoreAutoLayout +0x0000000196cd0000 /usr/lib/libfakelink.dylib +0x0000000196f79000 /usr/lib/libcompression.dylib +0x000000018d1d6000 /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork +0x0000000190b34000 /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration +0x0000000196d23000 /usr/lib/libarchive.2.dylib +0x0000000190a39000 /usr/lib/libDiagnosticMessagesClient.dylib +0x000000018ab7a000 /usr/lib/libicucore.A.dylib +0x000000019174c000 /usr/lib/libxml2.2.dylib +0x000000019f452000 /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices +0x00000001948ac000 /usr/lib/liblangid.dylib +0x000000018b1d2000 /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit +0x000000019d0c4000 /System/Library/Frameworks/Combine.framework/Versions/A/Combine +0x000000023fff3000 /System/Library/PrivateFrameworks/CollectionsInternal.framework/Versions/A/CollectionsInternal +0x000000026c039000 /System/Library/PrivateFrameworks/ReflectionInternal.framework/Versions/A/ReflectionInternal +0x000000026cf8d000 /System/Library/PrivateFrameworks/RuntimeInternal.framework/Versions/A/RuntimeInternal +0x0000000196cd2000 /System/Library/PrivateFrameworks/SoftLinking.framework/Versions/A/SoftLinking +0x00000001b488c000 /usr/lib/swift/libswiftCoreFoundation.dylib +0x00000001b164f000 /usr/lib/swift/libswiftDarwin.dylib +0x00000001a11c9000 /usr/lib/swift/libswiftDispatch.dylib +0x00000001b48ed000 /usr/lib/swift/libswiftIOKit.dylib +0x000000028c550000 /usr/lib/swift/libswiftSystem.dylib +0x00000001b489f000 /usr/lib/swift/libswiftXPC.dylib +0x000000028c582000 /usr/lib/swift/libswift_Builtin_float.dylib +0x000000028c583000 /usr/lib/swift/libswift_Concurrency.dylib +0x000000028c60f000 /usr/lib/swift/libswift_DarwinFoundation1.dylib +0x000000028c6b3000 /usr/lib/swift/libswift_StringProcessing.dylib +0x00000001a41a7000 /usr/lib/swift/libswiftos.dylib +0x000000018b152000 /System/Library/PrivateFrameworks/CoreServicesInternal.framework/Versions/A/CoreServicesInternal +0x0000000196c9b000 /usr/lib/liboah.dylib +0x000000018a75a000 /System/Library/Frameworks/Security.framework/Versions/A/Security +0x00000001a35d7000 /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages +0x00000001b10f3000 /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS +0x00000001916c8000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/FSEvents +0x000000018ae5a000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore +0x0000000190aa8000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata +0x000000019669f000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices +0x0000000196e1b000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit +0x000000018f15c000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE +0x0000000187412000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices +0x0000000198224000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices +0x00000001916d5000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SharedFileList.framework/Versions/A/SharedFileList +0x0000000196eae000 /usr/lib/libapple_nghttp2.dylib +0x000000018ed78000 /usr/lib/libsqlite3.dylib +0x000000018ef61000 /System/Library/Frameworks/Accounts.framework/Versions/A/Accounts +0x00000001a3819000 /System/Library/PrivateFrameworks/AppSupport.framework/Versions/A/AppSupport +0x00000001b363e000 /System/Library/Frameworks/AVFoundation.framework/Versions/A/AVFoundation +0x0000000190a09000 /System/Library/PrivateFrameworks/CoreAnalytics.framework/Versions/A/CoreAnalytics +0x000000018dc1c000 /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics +0x000000019b2fe000 /System/Library/Frameworks/GSS.framework/Versions/A/GSS +0x00000001996e6000 /System/Library/PrivateFrameworks/InternationalSupport.framework/Versions/A/InternationalSupport +0x000000018f0f0000 /System/Library/PrivateFrameworks/RunningBoardServices.framework/Versions/A/RunningBoardServices +0x00000001a412b000 /System/Library/PrivateFrameworks/StreamingZip.framework/Versions/A/StreamingZip +0x000000018d5a7000 /usr/lib/libenergytrace.dylib +0x000000018f1eb000 /System/Library/Frameworks/Network.framework/Versions/A/Network +0x0000000195f21000 /usr/lib/libbsm.0.dylib +0x0000000196c6a000 /usr/lib/system/libkxld.dylib +0x000000023b5c5000 /System/Library/PrivateFrameworks/AppleKeyStore.framework/Versions/A/AppleKeyStore +0x000000028a993000 /usr/lib/libCoreEntitlements.dylib +0x0000000260705000 /System/Library/PrivateFrameworks/MessageSecurity.framework/Versions/A/MessageSecurity +0x000000018ed5c000 /System/Library/PrivateFrameworks/ProtocolBuffer.framework/Versions/A/ProtocolBuffer +0x00000001a05d8000 /System/Library/PrivateFrameworks/SymptomDiagnosticReporter.framework/Versions/A/SymptomDiagnosticReporter +0x0000000198469000 /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport +0x000000018d5a9000 /usr/lib/libMobileGestalt.dylib +0x000000019667f000 /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression +0x0000000195f09000 /usr/lib/libcoretls.dylib +0x000000019829a000 /usr/lib/libcoretls_cfhelpers.dylib +0x0000000196f73000 /usr/lib/libpam.2.dylib +0x0000000198310000 /usr/lib/libxar.1.dylib +0x000000019829c000 /System/Library/PrivateFrameworks/APFS.framework/Versions/A/APFS +0x0000000278713000 /System/Library/PrivateFrameworks/SwiftASN1Internal.framework/Versions/A/SwiftASN1Internal +0x000000019831f000 /usr/lib/libutil.dylib +0x00000001948a7000 /System/Library/PrivateFrameworks/AppleSystemInfo.framework/Versions/A/AppleSystemInfo +0x0000000195bd0000 /System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/Versions/A/IOMobileFramebuffer +0x00000001934c0000 /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface +0x00000001a2f37000 /System/Library/PrivateFrameworks/CoreWiFi.framework/Versions/A/CoreWiFi +0x00000001b474c000 /System/Library/PrivateFrameworks/LoggingSupport.framework/Versions/A/LoggingSupport +0x000000019b361000 /System/Library/PrivateFrameworks/MobileAsset.framework/Versions/A/MobileAsset +0x00000001a05e8000 /System/Library/PrivateFrameworks/PowerLog.framework/Versions/A/PowerLog +0x00000001a1aaa000 /System/Library/PrivateFrameworks/Rapport.framework/Versions/A/Rapport +0x000000023416e000 /System/Library/Frameworks/SwiftData.framework/Versions/A/SwiftData +0x000000018cc0a000 /System/Library/Frameworks/UniformTypeIdentifiers.framework/Versions/A/UniformTypeIdentifiers +0x00000001918f5000 /System/Library/PrivateFrameworks/UserManagement.framework/Versions/A/UserManagement +0x000000018d0fd000 /usr/lib/libboringssl.dylib +0x000000018f1d0000 /usr/lib/libdns_services.dylib +0x00000001b3772000 /usr/lib/libquic.dylib +0x000000019a554000 /usr/lib/libusrtcp.dylib +0x000000023c47f000 /System/Library/PrivateFrameworks/AtomicsInternal.framework/Versions/A/AtomicsInternal +0x00000001dab32000 /System/Library/PrivateFrameworks/InternalSwiftProtobuf.framework/Versions/A/InternalSwiftProtobuf +0x000000028c3d7000 /usr/lib/swift/libswiftDistributed.dylib +0x000000028c400000 /usr/lib/swift/libswiftObservation.dylib +0x000000028c53c000 /usr/lib/swift/libswiftSynchronization.dylib +0x00000001948a5000 /System/Library/PrivateFrameworks/AggregateDictionary.framework/Versions/A/AggregateDictionary +0x000000023ccaf000 /System/Library/PrivateFrameworks/BiomeLibrary.framework/Versions/A/BiomeLibrary +0x00000001c38d5000 /System/Library/PrivateFrameworks/BiomeStreams.framework/Versions/A/BiomeStreams +0x00000001bf924000 /System/Library/PrivateFrameworks/BiomeFoundation.framework/Versions/A/BiomeFoundation +0x00000001c9b82000 /System/Library/PrivateFrameworks/BiomePubSub.framework/Versions/A/BiomePubSub +0x000000018e96e000 /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData +0x00000001a510e000 /System/Library/PrivateFrameworks/ProactiveSupport.framework/Versions/A/ProactiveSupport +0x00000002361cc000 /System/Library/Frameworks/_LocationEssentials.framework/Versions/A/_LocationEssentials +0x000000019827b000 /usr/lib/liblzma.5.dylib +0x000000019f6d1000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate +0x0000000195e02000 /System/Library/PrivateFrameworks/MobileKeyBag.framework/Versions/A/MobileKeyBag +0x00000001a3b2d000 /System/Library/PrivateFrameworks/InternationalTextSearch.framework/Versions/A/InternationalTextSearch +0x00000001bbdf7000 /System/Library/PrivateFrameworks/SoftwareUpdateCoreSupport.framework/Versions/A/SoftwareUpdateCoreSupport +0x00000001c4374000 /System/Library/PrivateFrameworks/SoftwareUpdateCoreConnect.framework/Versions/A/SoftwareUpdateCoreConnect +0x00000001a36d1000 /System/Library/PrivateFrameworks/RemoteServiceDiscovery.framework/Versions/A/RemoteServiceDiscovery +0x00000001bb9ce000 /System/Library/PrivateFrameworks/MSUDataAccessor.framework/Versions/A/MSUDataAccessor +0x00000001b691f000 /usr/lib/libbootpolicy.dylib +0x00000001a36e8000 /System/Library/PrivateFrameworks/RemoteXPC.framework/Versions/A/RemoteXPC +0x00000001c37a9000 /usr/lib/libFDR.dylib +0x00000001c9784000 /usr/lib/libamsupport.dylib +0x000000028ac89000 /usr/lib/libReverseProxyDevice.dylib +0x000000023ae33000 /System/Library/PrivateFrameworks/AppleDeviceQuerySupport.framework/Versions/A/AppleDeviceQuerySupport +0x00000001cc94e000 /usr/lib/libpartition2_dynamic.dylib +0x0000000196e8a000 /System/Library/PrivateFrameworks/AppleSauce.framework/Versions/A/AppleSauce +0x000000028a83e000 /usr/lib/libAppleArchive.dylib +0x000000019668b000 /usr/lib/libbz2.1.0.dylib +0x0000000190b3e000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage +0x000000019f42d000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib +0x0000000198356000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib +0x0000000187916000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib +0x00000001a3b2c000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices +0x0000000191833000 /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo +0x000000018e372000 /System/Library/Frameworks/ColorSync.framework/Versions/A/ColorSync +0x0000000189d9a000 /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText +0x0000000193fb3000 /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO +0x000000019af0e000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS +0x000000018e51a000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices +0x00000001995dc000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore +0x000000019b2c7000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD +0x000000019b2c2000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSyncLegacy.framework/Versions/A/ColorSyncLegacy +0x000000019aee0000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis +0x000000018d665000 /System/Library/PrivateFrameworks/SkyLight.framework/Versions/A/SkyLight +0x000000019398e000 /System/Library/PrivateFrameworks/FontServices.framework/libFontParser.dylib +0x000000018effe000 /System/Library/PrivateFrameworks/BaseBoard.framework/Versions/A/BaseBoard +0x00000001a152a000 /System/Library/PrivateFrameworks/BoardServices.framework/Versions/A/BoardServices +0x00000001a33f9000 /System/Library/PrivateFrameworks/BackBoardServices.framework/Versions/A/BackBoardServices +0x000000023cbb4000 /System/Library/PrivateFrameworks/BackBoardHIDEventFoundation.framework/Versions/A/BackBoardHIDEventFoundation +0x00000001898b6000 /System/Library/Frameworks/CoreDisplay.framework/Versions/A/CoreDisplay +0x0000000198f35000 /System/Library/Frameworks/VideoToolbox.framework/Versions/A/VideoToolbox +0x0000000196f71000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/MetalPerformanceShaders +0x000000026af43000 /System/Library/PrivateFrameworks/ProDisplayLibrary.framework/Versions/A/ProDisplayLibrary +0x00000001a722e000 /System/Library/PrivateFrameworks/IOSurfaceAccelerator.framework/Versions/A/IOSurfaceAccelerator +0x00000001934e8000 /System/Library/Frameworks/Metal.framework/Versions/A/Metal +0x00000001934dd000 /System/Library/PrivateFrameworks/IOAccelerator.framework/Versions/A/IOAccelerator +0x00000001937ec000 /System/Library/Frameworks/CoreMedia.framework/Versions/A/CoreMedia +0x000000018d641000 /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC +0x0000000198eed000 /System/Library/PrivateFrameworks/WatchdogClient.framework/Versions/A/WatchdogClient +0x0000000190f63000 /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore +0x0000000198eef000 /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport +0x00000001cc730000 /usr/lib/swift/libswiftAccelerate.dylib +0x00000001b486c000 /usr/lib/swift/libswiftCoreAudio.dylib +0x00000001d08c1000 /usr/lib/swift/libswiftCoreMedia.dylib +0x00000001c2862000 /usr/lib/swift/libswiftMetal.dylib +0x00000001d2074000 /usr/lib/swift/libswiftOSLog.dylib +0x00000001c7c88000 /usr/lib/swift/libswiftQuartzCore.dylib +0x00000001cc720000 /usr/lib/swift/libswiftUniformTypeIdentifiers.dylib +0x000000028c56a000 /usr/lib/swift/libswiftVideoToolbox.dylib +0x00000001b83e6000 /usr/lib/swift/libswiftsimd.dylib +0x00000001c9be3000 /System/Library/PrivateFrameworks/BiomeStorage.framework/Versions/A/BiomeStorage +0x00000002593f4000 /System/Library/PrivateFrameworks/IntelligencePlatformLibrary.framework/Versions/A/IntelligencePlatformLibrary +0x0000000269d07000 /System/Library/PrivateFrameworks/PoirotSchematizer.framework/Versions/A/PoirotSchematizer +0x000000023d56a000 /System/Library/PrivateFrameworks/BiomeSync.framework/Versions/A/BiomeSync +0x000000023cc95000 /System/Library/PrivateFrameworks/BiomeDSL.framework/Versions/A/BiomeDSL +0x00000001e2d3d000 /System/Library/PrivateFrameworks/FeatureFlags.framework/Versions/A/FeatureFlags +0x0000000269d75000 /System/Library/PrivateFrameworks/PoirotUDFs.framework/Versions/A/PoirotUDFs +0x000000028c612000 /usr/lib/swift/libswift_DarwinFoundation2.dylib +0x000000028c613000 /usr/lib/swift/libswift_DarwinFoundation3.dylib +0x00000001a1a9f000 /System/Library/PrivateFrameworks/CoreTime.framework/Versions/A/CoreTime +0x0000000196d08000 /usr/lib/libiconv.2.dylib +0x0000000196c65000 /usr/lib/libcharset.1.dylib +0x0000000269cca000 /System/Library/PrivateFrameworks/PoirotSQLite.framework/Versions/A/PoirotSQLite +0x000000028c614000 /usr/lib/swift/libswift_RegexParser.dylib +0x000000023eba0000 /System/Library/PrivateFrameworks/CascadeSets.framework/Versions/A/CascadeSets +0x000000019b4d8000 /System/Library/PrivateFrameworks/CorePhoneNumbers.framework/Versions/A/CorePhoneNumbers +0x0000000198ce7000 /System/Library/PrivateFrameworks/AppleJPEG.framework/Versions/A/AppleJPEG +0x00000001986c0000 /usr/lib/libexpat.1.dylib +0x00000001994b2000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib +0x00000001994dd000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib +0x00000001995c5000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib +0x0000000198d2c000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib +0x00000001983d0000 /usr/lib/libate.dylib +0x000000019956c000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib +0x0000000199563000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib +0x000000024f044000 /System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/32023/Libraries/libllvm-flatbuffers.dylib +0x0000000249aa3000 /System/Library/PrivateFrameworks/FramePacing.framework/Versions/A/FramePacing +0x000000022cbb3000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreFSCache.dylib +0x000000024abd1000 /System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/32023/Libraries/libGPUCompilerUtils.dylib +0x00000001a15f7000 /System/Library/PrivateFrameworks/GraphicsServices.framework/Versions/A/GraphicsServices +0x000000022cbc1000 /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL +0x000000022cc12000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib +0x000000022cbd5000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib +0x000000022cda2000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib +0x000000022cbde000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib +0x000000022cbd2000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib +0x000000022cbbb000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib +0x000000019955e000 /System/Library/PrivateFrameworks/GPUWrangler.framework/Versions/A/GPUWrangler +0x000000019953e000 /System/Library/PrivateFrameworks/IOPresentment.framework/Versions/A/IOPresentment +0x0000000199566000 /System/Library/PrivateFrameworks/DSExternalDisplay.framework/Versions/A/DSExternalDisplay +0x00000002805c9000 /System/Library/PrivateFrameworks/VideoToolboxParavirtualizationSupport.framework/Versions/A/VideoToolboxParavirtualizationSupport +0x0000000198677000 /System/Library/PrivateFrameworks/AppleVA.framework/Versions/A/AppleVA +0x000000022ec3e000 /System/Library/Frameworks/ExtensionFoundation.framework/Versions/A/ExtensionFoundation +0x00000001995cb000 /System/Library/PrivateFrameworks/CMCaptureCore.framework/Versions/A/CMCaptureCore +0x0000000198951000 /usr/lib/libspindump.dylib +0x0000000189fc4000 /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio +0x0000000198944000 /System/Library/PrivateFrameworks/AppServerSupport.framework/Versions/A/AppServerSupport +0x000000019b2d0000 /System/Library/PrivateFrameworks/perfdata.framework/Versions/A/perfdata +0x00000001899d7000 /System/Library/PrivateFrameworks/AudioToolboxCore.framework/Versions/A/AudioToolboxCore +0x00000001937c2000 /System/Library/PrivateFrameworks/caulk.framework/Versions/A/caulk +0x000000019aec6000 /usr/lib/libAudioStatistics.dylib +0x00000001b3867000 /System/Library/PrivateFrameworks/SystemPolicy.framework/Versions/A/SystemPolicy +0x000000019b174000 /usr/lib/libSMC.dylib +0x00000001bb1dd000 /usr/lib/swift/libswiftCoreMIDI.dylib +0x00000001a651d000 /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI +0x000000019948c000 /usr/lib/libAudioToolboxUtility.dylib +0x000000019b2de000 /usr/lib/libperfcheck.dylib +0x000000023c54e000 /System/Library/PrivateFrameworks/AudioAnalytics.framework/Versions/A/AudioAnalytics +0x00000001da81e000 /System/Library/Frameworks/OSLog.framework/Versions/A/OSLog +0x0000000265777000 /System/Library/PrivateFrameworks/OSEligibility.framework/Versions/A/OSEligibility +0x0000000198746000 /System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices +0x0000000230025000 /System/Library/Frameworks/LightweightCodeRequirements.framework/Versions/A/LightweightCodeRequirements +0x00000001985c0000 /System/Library/PrivateFrameworks/PlugInKit.framework/Versions/A/PlugInKit +0x0000000195e1a000 /System/Library/PrivateFrameworks/AssertionServices.framework/Versions/A/AssertionServices +0x00000001986e5000 /System/Library/PrivateFrameworks/IconFoundation.framework/Versions/A/IconFoundation +0x0000000255f80000 /System/Library/PrivateFrameworks/IconRendering.framework/Versions/A/IconRendering +0x00000001913ca000 /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI +0x00000001942f4000 /System/Library/Frameworks/CoreImage.framework/Versions/A/CoreImage +0x000000026d172000 /System/Library/PrivateFrameworks/SFSymbols.framework/Versions/A/SFSymbols +0x000000022eaf4000 /System/Library/Frameworks/DeveloperToolsSupport.framework/Versions/A/DeveloperToolsSupport +0x00000001ab7ca000 /System/Library/PrivateFrameworks/RenderBox.framework/Versions/A/RenderBox +0x0000000193f75000 /System/Library/PrivateFrameworks/CoreSVG.framework/Versions/A/CoreSVG +0x000000019964f000 /System/Library/PrivateFrameworks/TextureIO.framework/Versions/A/TextureIO +0x00000001b48ec000 /usr/lib/swift/libswiftCoreImage.dylib +0x00000001988f4000 /System/Library/PrivateFrameworks/GraphVisualizer.framework/Versions/A/GraphVisualizer +0x00000002499ae000 /System/Library/PrivateFrameworks/FontServices.framework/Versions/A/FontServices +0x0000000198904000 /System/Library/PrivateFrameworks/OTSVG.framework/Versions/A/OTSVG +0x0000000191379000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib +0x000000028b763000 /usr/lib/libhvf.dylib +0x0000000266404000 /System/Library/PrivateFrameworks/ParsingInternal.framework/Versions/A/ParsingInternal +0x00000002499b2000 /System/Library/PrivateFrameworks/FontServices.framework/libXTFontStaticRegistryData.dylib +0x00000001947df000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSCore.framework/Versions/A/MPSCore +0x00000001965ea000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSImage.framework/Versions/A/MPSImage +0x0000000195fa9000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNeuralNetwork.framework/Versions/A/MPSNeuralNetwork +0x00000001963e8000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSMatrix.framework/Versions/A/MPSMatrix +0x0000000196200000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSRayIntersector.framework/Versions/A/MPSRayIntersector +0x000000019641a000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNDArray.framework/Versions/A/MPSNDArray +0x0000000230eaa000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSFunctions.framework/Versions/A/MPSFunctions +0x0000000230e8b000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSBenchmarkLoop.framework/Versions/A/MPSBenchmarkLoop +0x0000000230ebe000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSHost.framework/Versions/A/MPSHost +0x000000018772d000 /System/Library/PrivateFrameworks/MetalTools.framework/Versions/A/MetalTools +0x00000001b9b0d000 /System/Library/PrivateFrameworks/IOAccelMemoryInfo.framework/Versions/A/IOAccelMemoryInfo +0x00000001c807b000 /System/Library/PrivateFrameworks/kperf.framework/Versions/A/kperf +0x00000001b4868000 /System/Library/PrivateFrameworks/GPURawCounter.framework/Versions/A/GPURawCounter +0x00000001a5299000 /System/Library/PrivateFrameworks/ASEProcessing.framework/Versions/A/ASEProcessing +0x00000001d618a000 /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication +0x00000002698b5000 /System/Library/PrivateFrameworks/PhotosensitivityProcessing.framework/Versions/A/PhotosensitivityProcessing +0x000000026d1f8000 /System/Library/PrivateFrameworks/SILManager.framework/Versions/A/SILManager +0x00000001a1943000 /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication +0x00000001b47db000 /System/Library/PrivateFrameworks/MallocStackLogging.framework/Versions/A/MallocStackLogging +0x00000001a1921000 /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols +0x00000001c67cc000 /System/Library/PrivateFrameworks/OSAnalytics.framework/Versions/A/OSAnalytics +0x0000000247709000 /System/Library/PrivateFrameworks/DeviceRecovery.framework/Versions/A/DeviceRecovery +0x000000027be51000 /System/Library/PrivateFrameworks/Tightbeam.framework/Versions/A/Tightbeam +0x00000001c2870000 /usr/lib/swift/libswiftCompression.dylib +0x00000001ccebd000 /System/Library/PrivateFrameworks/AFKUser.framework/Versions/A/AFKUser +0x0000000199597000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATSUI.framework/Versions/A/ATSUI +0x000000019ac6f000 /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox +0x0000000196a5c000 /System/Library/Frameworks/UserNotifications.framework/Versions/A/UserNotifications +0x00000001ba2a4000 /System/Library/PrivateFrameworks/SiriInstrumentation.framework/Versions/A/SiriInstrumentation +0x000000026f688000 /System/Library/PrivateFrameworks/SiriAnalytics.framework/Versions/A/SiriAnalytics +0x00000001b7a03000 /System/Library/PrivateFrameworks/FeedbackLogger.framework/Versions/A/FeedbackLogger +0x00000001d230d000 /usr/lib/swift/libswiftAVFoundation.dylib +0x000000027e67a000 /System/Library/PrivateFrameworks/UnifiedAssetFramework.framework/Versions/A/UnifiedAssetFramework +0x000000019ae45000 /System/Library/PrivateFrameworks/AudioSession.framework/Versions/A/AudioSession +0x0000000198805000 /System/Library/PrivateFrameworks/MediaExperience.framework/Versions/A/MediaExperience +0x000000019ac19000 /System/Library/PrivateFrameworks/AudioSession.framework/libSessionUtility.dylib +0x00000001a04cd000 /System/Library/Frameworks/CoreBluetooth.framework/Versions/A/CoreBluetooth +0x0000000195c8d000 /System/Library/PrivateFrameworks/CoreUtils.framework/Versions/A/CoreUtils +0x00000001ac4fe000 /System/Library/PrivateFrameworks/HID.framework/Versions/A/HID +0x00000002465fa000 /System/Library/PrivateFrameworks/CoreUtilsExtras.framework/Versions/A/CoreUtilsExtras +0x0000000255ed5000 /System/Library/PrivateFrameworks/IO80211.framework/Versions/A/IO80211 +0x000000019ce10000 /System/Library/Frameworks/IOBluetooth.framework/Versions/A/IOBluetooth +0x000000028c41f000 /usr/lib/swift/libswiftRegexBuilder.dylib +0x0000000198460000 /usr/lib/libIOReport.dylib +0x00000001e2dc2000 /System/Library/PrivateFrameworks/WiFiPeerToPeer.framework/Versions/A/WiFiPeerToPeer +0x0000000195e29000 /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation +0x000000023ec54000 /System/Library/PrivateFrameworks/Centauri.framework/Versions/A/Centauri +0x0000000188111000 /System/Library/PrivateFrameworks/Lexicon.framework/Versions/A/Lexicon +0x000000028bbb3000 /usr/lib/libmrc.dylib +0x0000000255f40000 /System/Library/PrivateFrameworks/IPConfiguration.framework/Versions/A/IPConfiguration +0x00000001d6961000 /System/Library/PrivateFrameworks/Netrb.framework/Versions/A/Netrb +0x00000001a1450000 /System/Library/PrivateFrameworks/FrontBoardServices.framework/Versions/A/FrontBoardServices +0x0000000195f92000 /usr/lib/libgermantok.dylib +0x00000001949ce000 /System/Library/PrivateFrameworks/LinguisticData.framework/Versions/A/LinguisticData +0x00000001a06d6000 /System/Library/PrivateFrameworks/MediaKit.framework/Versions/A/MediaKit +0x00000001a0624000 /System/Library/Frameworks/DiscRecording.framework/Versions/A/DiscRecording +0x00000001986db000 /usr/lib/libheimdal-asn1.dylib +0x00000001a4101000 /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit +0x0000000191690000 /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory +0x000000019169e000 /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory +0x000000019d1b8000 /System/Library/PrivateFrameworks/GeoServices.framework/Versions/A/GeoServices +0x000000019abdf000 /System/Library/PrivateFrameworks/LocationSupport.framework/Versions/A/LocationSupport +0x0000000252bfe000 /System/Library/PrivateFrameworks/GeoServicesCore.framework/Versions/A/GeoServicesCore +0x00000001ad402000 /System/Library/PrivateFrameworks/PhoneNumbers.framework/Versions/A/PhoneNumbers +0x000000025b386000 /System/Library/PrivateFrameworks/LocationLogEncryption.framework/Versions/A/LocationLogEncryption +0x000000022d12e000 /System/Library/Frameworks/AVFAudio.framework/Versions/A/AVFAudio +0x000000022d272000 /System/Library/Frameworks/AVRouting.framework/Versions/A/AVRouting +0x00000001ad51a000 /usr/lib/libAccessibility.dylib +0x0000000259d70000 /System/Library/PrivateFrameworks/IsolatedCoreAudioClient.framework/Versions/A/IsolatedCoreAudioClient +0x00000002423ee000 /System/Library/PrivateFrameworks/CoreAudioOrchestration.framework/Versions/A/CoreAudioOrchestration +0x0000000199ab3000 /System/Library/Frameworks/MediaToolbox.framework/Versions/A/MediaToolbox +0x00000001a07fc000 /System/Library/PrivateFrameworks/CoreAVCHD.framework/Versions/A/CoreAVCHD +0x000000019f720000 /System/Library/Frameworks/MediaAccessibility.framework/Versions/A/MediaAccessibility +0x00000001a07f8000 /System/Library/PrivateFrameworks/Mangrove.framework/Versions/A/Mangrove +0x000000023e290000 /System/Library/PrivateFrameworks/CMPhoto.framework/Versions/A/CMPhoto +0x00000001a0fc5000 /System/Library/Frameworks/CoreTelephony.framework/Versions/A/CoreTelephony +0x00000001a07eb000 /System/Library/PrivateFrameworks/CoreAUC.framework/Versions/A/CoreAUC +0x000000023b3f6000 /System/Library/PrivateFrameworks/AppleJPEGXL.framework/Versions/A/AppleJPEGXL +0x000000019b4e8000 /usr/lib/libTelephonyUtilDynamic.dylib +0x00000001dd93f000 /System/Library/Frameworks/CryptoKit.framework/Versions/A/CryptoKit +0x00000001a40fc000 /System/Library/PrivateFrameworks/CryptoKitCBridging.framework/Versions/A/CryptoKitCBridging +0x00000001a1609000 /System/Library/Frameworks/CryptoTokenKit.framework/Versions/A/CryptoTokenKit +0x0000000247179000 /System/Library/PrivateFrameworks/Dendrite.framework/Versions/A/Dendrite +0x00000001b440c000 /System/Library/Frameworks/NaturalLanguage.framework/Versions/A/NaturalLanguage +0x0000000252901000 /System/Library/PrivateFrameworks/GenerativeModels.framework/Versions/A/GenerativeModels +0x00000001e2d49000 /usr/lib/swift/libswiftNaturalLanguage.dylib +0x000000023bf6d000 /System/Library/PrivateFrameworks/AppleMobileFileIntegrity.framework/Versions/A/AppleMobileFileIntegrity +0x000000028ad01000 /usr/lib/libTLE.dylib +0x00000001b480d000 /usr/lib/libmis.dylib +0x00000001ec491000 /System/Library/PrivateFrameworks/ConfigProfileHelper.framework/Versions/A/ConfigProfileHelper +0x00000001a428b000 /System/Library/PrivateFrameworks/Espresso.framework/Versions/A/Espresso +0x0000000191e20000 /System/Library/Frameworks/CoreML.framework/Versions/A/CoreML +0x00000001e0bf5000 /usr/lib/libedit.3.dylib +0x0000000229f3c000 /System/Library/PrivateFrameworks/ANECompiler.framework/Versions/A/ANECompiler +0x00000001a6361000 /System/Library/PrivateFrameworks/AppleNeuralEngine.framework/Versions/A/AppleNeuralEngine +0x000000025b4a4000 /System/Library/PrivateFrameworks/MIL.framework/Versions/A/MIL +0x0000000230ec4000 /System/Library/Frameworks/MetalPerformanceShadersGraph.framework/Versions/A/MetalPerformanceShadersGraph +0x000000025bc13000 /System/Library/PrivateFrameworks/MLCompilerServices.framework/Versions/A/MLCompilerServices +0x00000001a50dd000 /System/Library/PrivateFrameworks/ANEServices.framework/Versions/A/ANEServices +0x00000001b9ad0000 /usr/lib/libncurses.5.4.dylib +0x000000018b2ce000 /usr/lib/libsandbox.1.dylib +0x0000000198601000 /usr/lib/libMatch.1.dylib +0x00000002654f9000 /System/Library/PrivateFrameworks/ODIE.framework/Versions/A/ODIE +0x000000025e8a0000 /System/Library/PrivateFrameworks/MLModelAsset.framework/Versions/A/MLModelAsset +0x000000025bbb9000 /System/Library/PrivateFrameworks/MLCompilerRuntime.framework/Versions/A/MLCompilerRuntime +0x0000000196255000 /System/Library/Frameworks/MLCompute.framework/Versions/A/MLCompute +0x000000025bb3b000 /System/Library/PrivateFrameworks/MLAssetIO.framework/Versions/A/MLAssetIO +0x000000028c3f1000 /usr/lib/swift/libswiftMLCompute.dylib +0x00000001a11e0000 /System/Library/PrivateFrameworks/AVFCore.framework/Versions/A/AVFCore +0x00000001aae1b000 /System/Library/PrivateFrameworks/AVFCapture.framework/Versions/A/AVFCapture +0x000000023e087000 /System/Library/PrivateFrameworks/CMImaging.framework/Versions/A/CMImaging +0x00000001ab05d000 /System/Library/PrivateFrameworks/Quagga.framework/Versions/A/Quagga +0x00000001ab18e000 /System/Library/PrivateFrameworks/CMCapture.framework/Versions/A/CMCapture +0x000000019b071000 /System/Library/Frameworks/CoreMediaIO.framework/Versions/A/CoreMediaIO +0x000000023dfc2000 /System/Library/PrivateFrameworks/CMCaptureDevice.framework/Versions/A/CMCaptureDevice +0x0000000198a3d000 /System/Library/PrivateFrameworks/CoreBrightness.framework/Versions/A/CoreBrightness +0x000000023f14b000 /System/Library/PrivateFrameworks/CinematicFraming.framework/Versions/A/CinematicFraming +0x00000002619dd000 /System/Library/PrivateFrameworks/ModelManagerServices.framework/Versions/A/ModelManagerServices +0x00000001cf375000 /System/Library/PrivateFrameworks/CPMS.framework/Versions/A/CPMS +0x0000000279581000 /System/Library/PrivateFrameworks/SystemStatus.framework/Versions/A/SystemStatus +0x00000001b323c000 /System/Library/Frameworks/CoreMotion.framework/Versions/A/CoreMotion +0x00000001c3854000 /System/Library/PrivateFrameworks/TimeSync.framework/Versions/A/TimeSync +0x0000000247b41000 /System/Library/PrivateFrameworks/DistributedSensing.framework/Versions/A/DistributedSensing +0x00000001bec33000 /System/Library/PrivateFrameworks/MobileBluetooth.framework/Versions/A/MobileBluetooth +0x00000001c5518000 /System/Library/PrivateFrameworks/IOKitten.framework/Versions/A/IOKitten +0x000000023b270000 /System/Library/PrivateFrameworks/AppleIntelligenceReporting.framework/Versions/A/AppleIntelligenceReporting +0x0000000195b9c000 /System/Library/PrivateFrameworks/CoreEmoji.framework/Versions/A/CoreEmoji +0x0000000188425000 /usr/lib/libCRFSuite.dylib +0x0000000189706000 /System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling +0x00000001948ae000 /System/Library/PrivateFrameworks/CoreNLP.framework/Versions/A/CoreNLP +0x000000018e683000 /System/Library/PrivateFrameworks/Montreal.framework/Versions/A/Montreal +0x0000000196d10000 /usr/lib/libcmph.dylib +0x0000000195f33000 /usr/lib/libmecab.dylib +0x0000000196e81000 /usr/lib/libThaiTokenizer.dylib +0x00000002529e3000 /System/Library/PrivateFrameworks/GenerativeModelsFoundation.framework/Versions/A/GenerativeModelsFoundation +0x000000027c356000 /System/Library/PrivateFrameworks/TokenGeneration.framework/Versions/A/TokenGeneration +0x00000002527b7000 /System/Library/PrivateFrameworks/GenerativeFunctions.framework/Versions/A/GenerativeFunctions +0x0000000252805000 /System/Library/PrivateFrameworks/GenerativeFunctionsFoundation.framework/Versions/A/GenerativeFunctionsFoundation +0x000000026169e000 /System/Library/PrivateFrameworks/ModelCatalog.framework/Versions/A/ModelCatalog +0x000000026e8a2000 /System/Library/PrivateFrameworks/SensitiveContentAnalysisML.framework/Versions/A/SensitiveContentAnalysisML +0x000000025289b000 /System/Library/PrivateFrameworks/GenerativeFunctionsInstrumentation.framework/Versions/A/GenerativeFunctionsInstrumentation +0x000000026b6cb000 /System/Library/PrivateFrameworks/PromptKit.framework/Versions/A/PromptKit +0x000000026b0e1000 /System/Library/PrivateFrameworks/ProactiveDaemonSupport.framework/Versions/A/ProactiveDaemonSupport +0x000000027c58e000 /System/Library/PrivateFrameworks/TokenGenerationCore.framework/Versions/A/TokenGenerationCore +0x00000001b52db000 /System/Library/PrivateFrameworks/Trial.framework/Versions/A/Trial +0x00000001b525c000 /System/Library/PrivateFrameworks/TrialProto.framework/Versions/A/TrialProto +0x000000023ae9a000 /System/Library/PrivateFrameworks/AppleFlatBuffers.framework/Versions/A/AppleFlatBuffers +0x000000026eb72000 /System/Library/PrivateFrameworks/SentencePieceInternal.framework/Versions/A/SentencePieceInternal +0x000000019f77a000 /System/Library/Frameworks/Vision.framework/Versions/A/Vision +0x0000000246298000 /System/Library/PrivateFrameworks/CoreSceneUnderstanding.framework/Versions/A/CoreSceneUnderstanding +0x00000002811df000 /System/Library/PrivateFrameworks/VisionCore.framework/Versions/A/VisionCore +0x00000001999f0000 /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore +0x00000001bdbc1000 /System/Library/Frameworks/Vision.framework/libfaceCore.dylib +0x00000001be6db000 /System/Library/PrivateFrameworks/Futhark.framework/Versions/A/Futhark +0x00000001c2629000 /System/Library/PrivateFrameworks/InertiaCam.framework/Versions/A/InertiaCam +0x00000001be468000 /System/Library/PrivateFrameworks/TextRecognition.framework/Versions/A/TextRecognition +0x000000022eadd000 /System/Library/Frameworks/DataDetection.framework/Versions/A/DataDetection +0x00000001b8674000 /System/Library/PrivateFrameworks/TextInput.framework/Versions/A/TextInput +0x000000019849e000 /System/Library/PrivateFrameworks/CVNLP.framework/Versions/A/CVNLP +0x00000001dad09000 /System/Library/PrivateFrameworks/HIDDisplay.framework/Versions/A/HIDDisplay +0x000000019b255000 /usr/lib/libcups.2.dylib +0x000000019b2ec000 /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos +0x000000019af5c000 /usr/lib/libresolv.9.dylib +0x0000000198958000 /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal +0x00000001a4100000 /System/Library/Frameworks/Kerberos.framework/Versions/A/Libraries/libHeimdalProxy.dylib +0x000000019b350000 /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth +0x00000001ad40e000 /System/Library/PrivateFrameworks/AXCoreUtilities.framework/Versions/A/AXCoreUtilities +0x00000001bda0a000 /System/Library/PrivateFrameworks/AttributeGraph.framework/Versions/A/AttributeGraph +0x000000028a801000 /usr/lib/libAXSafeCategoryBundle.dylib +0x0000000235252000 /System/Library/Frameworks/TabularData.framework/Versions/A/TabularData +0x000000023c11d000 /System/Library/PrivateFrameworks/ArgumentParserInternal.framework/Versions/A/ArgumentParserInternal +0x0000000195a5e000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib +0x0000000197053000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib +0x0000000195f95000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLinearAlgebra.dylib +0x0000000196ec7000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparseBLAS.dylib +0x000000019704e000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libQuadrature.dylib +0x00000001949d5000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBNNS.dylib +0x0000000188221000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparse.dylib +0x000000022e5c2000 /System/Library/Frameworks/CoreTransferable.framework/Versions/A/CoreTransferable +0x000000019b2b4000 /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth +0x00000001918b4000 /System/Library/PrivateFrameworks/login.framework/Versions/A/Frameworks/loginsupport.framework/Versions/A/loginsupport +0x000000018ca51000 /System/Library/PrivateFrameworks/UIFoundation.framework/Versions/A/UIFoundation +0x0000000195efd000 /usr/lib/libCheckFix.dylib +0x0000000190a3b000 /System/Library/PrivateFrameworks/MetadataUtilities.framework/Versions/A/MetadataUtilities +0x00000002569c7000 /System/Library/PrivateFrameworks/InstalledContentLibrary.framework/Versions/A/InstalledContentLibrary +0x000000018b192000 /System/Library/PrivateFrameworks/CoreServicesStore.framework/Versions/A/CoreServicesStore +0x00000001916ff000 /usr/lib/libapp_launch_measurement.dylib +0x00000001c8192000 /System/Library/PrivateFrameworks/MobileSystemServices.framework/Versions/A/MobileSystemServices +0x0000000198323000 /usr/lib/libxslt.1.dylib +0x0000000195ebc000 /System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/BackgroundTaskManagement +0x00000001a3792000 /usr/lib/libcurl.4.dylib +0x000000028b517000 /usr/lib/libcrypto.46.dylib +0x000000028c09a000 /usr/lib/libssl.48.dylib +0x00000001a346c000 /System/Library/Frameworks/LDAP.framework/Versions/A/LDAP +0x00000001a34a8000 /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent +0x000000019af79000 /usr/lib/libsasl2.2.dylib +0x00000001a6710000 /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa +0x000000018b32d000 /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit +0x000000023ffce000 /System/Library/PrivateFrameworks/CollectionViewCore.framework/Versions/A/CollectionViewCore +0x0000000193f6f000 /System/Library/PrivateFrameworks/XCTTargetBootstrap.framework/Versions/A/XCTTargetBootstrap +0x0000000199a42000 /System/Library/PrivateFrameworks/UserActivity.framework/Versions/A/UserActivity +0x0000000249ab0000 /System/Library/PrivateFrameworks/FrontBoard.framework/Versions/A/FrontBoard +0x000000027df9f000 /System/Library/PrivateFrameworks/UIIntelligenceSupport.framework/Versions/A/UIIntelligenceSupport +0x00000002342db000 /System/Library/Frameworks/SwiftUICore.framework/Versions/A/SwiftUICore +0x0000000284b4b000 /System/Library/PrivateFrameworks/WritingTools.framework/Versions/A/WritingTools +0x0000000283942000 /System/Library/PrivateFrameworks/WindowManagement.framework/Versions/A/WindowManagement +0x00000002497e0000 /System/Library/PrivateFrameworks/FocusEngine.framework/Versions/A/FocusEngine +0x00000002471e9000 /System/Library/PrivateFrameworks/DesignLibrary.framework/Versions/A/DesignLibrary +0x0000000193f5a000 /System/Library/PrivateFrameworks/DFRFoundation.framework/Versions/A/DFRFoundation +0x000000027eeec000 /System/Library/PrivateFrameworks/UpdateCycle.framework/Versions/A/UpdateCycle +0x0000000193c5e000 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox +0x000000019f040000 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition +0x0000000191686000 /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis +0x000000019f3d0000 /System/Library/Frameworks/Accessibility.framework/Versions/A/Accessibility +0x0000000235238000 /System/Library/Frameworks/Symbols.framework/Versions/A/Symbols +0x0000000252dac000 /System/Library/PrivateFrameworks/Gestures.framework/Versions/A/Gestures +0x000000028c4c2000 /usr/lib/swift/libswiftSpatial.dylib +0x00000001b164e000 /usr/lib/swift/libswiftCoreGraphics.dylib +0x000000019fe14000 /usr/lib/swift/libswiftFoundation.dylib +0x00000001ebe32000 /usr/lib/swift/libswiftSwiftOnoneSupport.dylib +0x000000028c748000 /usr/lib/swift/libswiftsys_time.dylib +0x00000001d699f000 /System/Library/PrivateFrameworks/CoreMaterial.framework/Versions/A/CoreMaterial +0x000000028acfe000 /usr/lib/libSpatial.dylib +0x000000028a71e000 /System/Library/SubFrameworks/UIUtilities.framework/Versions/A/UIUtilities +0x0000000102004000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/server/libjvm.dylib +0x0000000100db8000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjimage.dylib +0x0000000100e14000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjdwp.dylib +0x0000000100e5c000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjava.dylib +0x0000000100de8000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libinstrument.dylib +0x0000000100ed0000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libzip.dylib +0x000000028a7f3000 /usr/lib/i18n/libiconv_std.dylib +0x000000028a7e9000 /usr/lib/i18n/libUTF8.dylib +0x000000028a7f8000 /usr/lib/i18n/libmapper_none.dylib +0x0000000100f5c000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libdt_socket.dylib +0x0000000101058000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libnio.dylib +0x000000010109c000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libnet.dylib +0x0000000101038000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libmanagement.dylib +0x0000000101078000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libmanagement_ext.dylib +0x00000001010c0000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libextnet.dylib +0x0000000101200000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libverify.dylib + + +VM Arguments: +jvm_args: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50259,suspend=y,server=n -javaagent:/Users/liangxin/Library/Caches/JetBrains/IntelliJIdea2026.1/captureAgent/debugger-agent.jar=file:///var/folders/pk/drq93rk10q733kk02fgp89xh0000gn/T/capture10140205674518191061.props -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dmanagement.endpoints.jmx.exposure.include=* -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Ddebugger.agent.enable.coroutines=true -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -Ddebugger.async.stack.trace.for.all.threads=true -Dfile.encoding=UTF-8 +java_command: org.springblade.desk.DeskApplication +java_class_path (initial): /Users/liangxin/Project/JAVA/tms-erp-api/blade-service/blade-desk/target/classes:/Users/liangxin/.m2/repository/org/springblade/blade-core-boot/4.10.0.BASE-SNAPSHOT/blade-core-boot-4.10.0.BASE-SNAPSHOT.jar:/Users/liangxin/.m2/repository/org/springblade/blade-core-context/4.10.0.BASE-SNAPSHOT/blade-core-context-4.10.0.BASE-SNAPSHOT.jar:/Users/liangxin/.m2/repository/org/springblade/blade-core-db/4.10.0.BASE-SNAPSHOT/blade-core-db-4.10.0.BASE-SNAPSHOT.jar:/Users/liangxin/.m2/repository/org/springframework/boot/spring-boot-starter-jdbc/3.5.16/spring-boot-starter-jdbc-3.5.16.jar:/Users/liangxin/.m2/repository/com/zaxxer/HikariCP/6.3.3/HikariCP-6.3.3.jar:/Users/liangxin/.m2/repository/com/baomidou/mybatis-plus-spring-boot3-starter/3.5.16/mybatis-plus-spring-boot3-starter-3.5.16.jar:/Users/liangxin/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/3.5.16/spring-boot-autoconfigure-3.5.16.jar:/Users/liangxin/.m2/repository/com/alibaba/druid-spring-boot-3-starter/1.2.28/druid-spring-boot-3-starter-1.2.28.jar:/Users/liangxin/.m2/repository/com/mysql/mysql-connector-j/9.4.0/mysql-connector-j-9.4.0.jar:/Users/liangxin/.m2/repository/com/google/protobuf/protobuf-java/4.31.1/protobuf-java-4.31.1.jar:/Users/liangxin/.m2/repository/org/springblade/blade-core-secure/4.10.0.BASE-SNAPSHOT/blade-core-secure-4.10.0.BASE-SNAPSHOT.jar:/Users/liangxin/.m2/repository/org/springblade/blade-core-cloud/4.10.0.BASE-SNAPSHOT/blade-core-cloud-4.10.0.BASE-SNAPSHOT.jar:/Users/liangxin/.m2/repository/de/codecentric/spring-boot-admin-starter-client/3.5.9/spring-boot-admin-starter-client-3.5.9.jar:/Users/liangxin/.m2/repository/de/codecentric/spring-boot-admin-client/3.5.9/spring-boot-admin-client-3.5.9.jar:/Users/liangxin/.m2/repository/org/springframework/boot/spring-boot-starter-actuator/3.5.16/spring-boot-starter-actuator-3.5.16.jar:/Users/liangxin/.m2/repository/org/springframework/boot/spring-boot-actuator-autoconfigure/3.5.16/spring-boot-actuator-aut +Launcher Type: SUN_STANDARD + +[Global flags] + intx CICompilerCount = 4 {product} {ergonomic} + uint ConcGCThreads = 3 {product} {ergonomic} + uint G1ConcRefinementThreads = 10 {product} {ergonomic} + size_t G1HeapRegionSize = 8388608 {product} {ergonomic} + uintx GCDrainStackTargetSize = 64 {product} {ergonomic} + size_t InitialHeapSize = 603979776 {product} {ergonomic} + bool ManagementServer = true {product} {command line} + size_t MarkStackSize = 4194304 {product} {ergonomic} + size_t MaxHeapSize = 9663676416 {product} {ergonomic} + size_t MaxNewSize = 5796528128 {product} {ergonomic} + size_t MinHeapDeltaBytes = 8388608 {product} {ergonomic} + size_t MinHeapSize = 8388608 {product} {ergonomic} + uintx NonProfiledCodeHeapSize = 0 {pd product} {ergonomic} + bool ProfileInterpreter = false {pd product} {command line} + uintx ProfiledCodeHeapSize = 0 {pd product} {ergonomic} + size_t SoftMaxHeapSize = 9663676416 {manageable} {ergonomic} + intx TieredStopAtLevel = 1 {product} {command line} + bool UseCompressedClassPointers = true {product lp64_product} {ergonomic} + bool UseCompressedOops = true {product lp64_product} {ergonomic} + bool UseG1GC = true {product} {ergonomic} + bool UseNUMA = false {product} {ergonomic} + bool UseNUMAInterleaving = false {product} {ergonomic} + +Logging: +Log output configuration: + #0: stdout all=warning uptime,level,tags + #1: stderr all=off uptime,level,tags + +Environment Variables: +JAVA_HOME=/Users/liangxin/JDK/zulu17.48.15-ca-jdk17.0.10-macosx_aarch64/zulu-17.jdk/Contents/Home +PATH=/Users/liangxin/ai-infra/.venv/bin:/Users/liangxin/.nacos/bin:/Applications/Docker.app/Contents/Resources/bin:/Users/liangxin/Library/pnpm:/opt/homebrew/opt/ruby@3.2/bin:/opt/homebrew/opt/openssl@3/bin:/opt/miniconda3/bin:/opt/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/Users/liangxin/JDK/zulu17.48.15-ca-jdk17.0.10-macosx_aarch64/zulu-17.jdk/Contents/Home/bin:/Users/liangxin/fvm/default/bin:/Applications/MAMP/bin/php/php8.1.13/bin:/opt/homebrew/opt/ruby@3.2/bin:/Users/liangxin/.nvm/versions/node/v20.18.3/bin:/Applications/apache-tomcat-9.0.78:/Users/liangxin/JDK/zulu17.48.15-ca-jdk17.0.10-macosx_aarch64/zulu-17.jdk/Contents/Home/bin:/Users/liangxin/fvm/default/bin:/opt/homebrew/opt/libpng/bin:/Applications/pngquant:/Users/liangxin/AndroidSDK/platform-tools:/Users/liangxin/Library/Android/sdk/platform-tools:/Users/liangxin/Library/Andriod/sdk/cmdline-tools/latest/bin:/Users/liangxin/Library/Andriod/sdk:/Applications/apache-maven-3.8.1/bin:/opt/homebrew/bin:/usr/local/sbin:/usr/local/bin:/Users/liangxin/JDK/zulu17.48.15-ca-jdk17.0.10-macosx_aarch64/zulu-17.jdk/Contents/Home/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/Users/liangxin/.local/bin:/Users/liangxin/fvm/default/bin:/Applications/MAMP/bin/php/php8.1.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/pkg/env/global/bin:/Library/Apple/usr/bin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/Users/liangxin/.cargo/bin:true:/Applications/极空间.app/Contents/Resources/app.asar.unpacked/bin/platform-tools +SHELL=/bin/zsh +LANG=C.UTF-8 +TMPDIR=/var/folders/pk/drq93rk10q733kk02fgp89xh0000gn/T/ + +Active Locale: +LC_ALL=C.UTF-8 +LC_COLLATE=C.UTF-8 +LC_CTYPE=C.UTF-8 +LC_MESSAGES=C.UTF-8 +LC_MONETARY=C.UTF-8 +LC_NUMERIC=C.UTF-8 +LC_TIME=C.UTF-8 + +Signal Handlers: + SIGSEGV: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, unblocked + SIGBUS: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, unblocked + SIGFPE: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, unblocked + SIGPIPE: javaSignalHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, blocked + SIGXFSZ: javaSignalHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, blocked + SIGILL: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, unblocked + SIGUSR2: SR_handler in libjvm.dylib, mask=00000000000000000000000000000000, flags=SA_RESTART|SA_SIGINFO, blocked + SIGHUP: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, blocked + SIGINT: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, blocked + SIGTERM: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, blocked + SIGQUIT: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, blocked + SIGTRAP: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, unblocked + + +--------------- S Y S T E M --------------- + +OS: +uname: Darwin 25.6.0 Darwin Kernel Version 25.6.0: Fri Jul 31 19:16:36 PDT 2026; root:xnu-12377.161.14~5/RELEASE_ARM64_T6030 arm64 +OS uptime: 2 days 23:37 hours +rlimit (soft/hard): STACK 8176k/65520k , CORE 0k/infinity , NPROC 6000/9000 , NOFILE 10240/infinity , AS infinity/infinity , CPU infinity/infinity , DATA infinity/infinity , FSIZE infinity/infinity , MEMLOCK infinity/infinity , RSS infinity/infinity +load average: 19.31 16.17 13.60 + +CPU: total 12 (initial active 12) 0x61:0x0:0x5f4dea93:0, fp, simd, crc, lse +machdep.cpu.brand_string:Apple M3 Pro +hw.cachelinesize:128 +hw.l1icachesize:131072 +hw.l1dcachesize:65536 +hw.l2cachesize:4194304 + +Memory: 16k page, physical 37748736k(166608k free), swap 16777216k(965120k free) + +vm_info: OpenJDK 64-Bit Server VM (17.0.8+7-LTS) for bsd-aarch64 JRE (17.0.8+7-LTS) (Zulu17.44+15-CA), built on Jul 5 2023 00:50:04 by "zulu_re" with clang Apple LLVM 12.0.0 (clang-1200.0.32.28) + +END. diff --git a/hs_err_pid40988.log b/hs_err_pid40988.log new file mode 100644 index 0000000..52e4b4e --- /dev/null +++ b/hs_err_pid40988.log @@ -0,0 +1,1368 @@ +# +# A fatal error has been detected by the Java Runtime Environment: +# +# SIGBUS (0xa) at pc=0x00000001046de4c0, pid=40988, tid=36131 +# +# JRE version: OpenJDK Runtime Environment Zulu17.44+15-CA (17.0.8+7) (build 17.0.8+7-LTS) +# Java VM: OpenJDK 64-Bit Server VM Zulu17.44+15-CA (17.0.8+7-LTS, mixed mode, emulated-client, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-aarch64) +# Problematic frame: +# C [libzip.dylib+0x64c0] newEntry+0x68 +# +# No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again +# +# If you would like to submit a bug report, please visit: +# http://www.azul.com/support/ +# The crash happened outside the Java Virtual Machine in native code. +# See problematic frame for where to report the bug. +# + +--------------- S U M M A R Y ------------ + +Command Line: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:49167,suspend=y,server=n -javaagent:/Users/liangxin/Library/Caches/JetBrains/IntelliJIdea2026.1/captureAgent/debugger-agent.jar=file:///var/folders/pk/drq93rk10q733kk02fgp89xh0000gn/T/capture18007844485071508468.props -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dmanagement.endpoints.jmx.exposure.include=* -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Ddebugger.agent.enable.coroutines=true -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -Ddebugger.async.stack.trace.for.all.threads=true -Dfile.encoding=UTF-8 org.springblade.resource.ResourceApplication + +Host: "Mac15,6" arm64, 12 cores, 36G, Darwin 25.6.0, macOS 26.6.2 (25G83) +Time: Thu Sep 17 20:22:18 2026 CST elapsed time: 7.706668 seconds (0d 0h 0m 7s) + +--------------- T H R E A D --------------- + +Current thread (0x000000010fa93c00): JavaThread "sentinel-datafile-log-executor-thread-1" daemon [_thread_in_native, id=36131, stack(0x0000000318210000,0x0000000318413000)] + +Stack: [0x0000000318210000,0x0000000318413000], sp=0x00000003184119d0, free space=2054k +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +C [libzip.dylib+0x64c0] newEntry+0x68 +C [libzip.dylib+0x6390] ZIP_GetEntry2+0x14c +C [libzip.dylib+0x6d78] ZIP_FindEntry+0x3c +V [libjvm.dylib+0x25a408] ClassPathZipEntry::open_entry(JavaThread*, char const*, int*, bool)+0xb4 +V [libjvm.dylib+0x25a53c] ClassPathZipEntry::open_stream(JavaThread*, char const*)+0x20 +V [libjvm.dylib+0x25d918] ClassLoader::load_class(Symbol*, bool, JavaThread*)+0x150 +V [libjvm.dylib+0x981d60] SystemDictionary::load_instance_class_impl(Symbol*, Handle, JavaThread*)+0x2d0 +V [libjvm.dylib+0x98063c] SystemDictionary::load_instance_class(unsigned int, Symbol*, Handle, JavaThread*)+0x30 +V [libjvm.dylib+0x97fd48] SystemDictionary::resolve_instance_class_or_null(Symbol*, Handle, Handle, JavaThread*)+0x4dc +V [libjvm.dylib+0x97f334] SystemDictionary::resolve_or_fail(Symbol*, Handle, Handle, bool, JavaThread*)+0x80 +V [libjvm.dylib+0x2beb54] ConstantPool::klass_at_impl(constantPoolHandle const&, int, JavaThread*)+0x1e0 +V [libjvm.dylib+0x46d6f0] InterpreterRuntime::_new(JavaThread*, ConstantPool*, int)+0x94 +j com.intellij.rt.debugger.agent.CaptureStorage$DeepCapturedStack.collectStacks(Ljava/util/List;)Lcom/intellij/rt/debugger/agent/CaptureStorage$StackData;+89 +j com.intellij.rt.debugger.agent.CaptureStorage.getStackTrace(Lcom/intellij/rt/debugger/agent/CaptureStorage$CapturedStack;I)Ljava/util/ArrayList;+30 +j com.intellij.rt.debugger.agent.CaptureStorage.access$1000(Lcom/intellij/rt/debugger/agent/CaptureStorage$CapturedStack;I)Ljava/util/ArrayList;+2 +j com.intellij.rt.debugger.agent.CaptureStorage$9.call()[Ljava/lang/StackTraceElement;+31 +j com.intellij.rt.debugger.agent.CaptureStorage$9.call()Ljava/lang/Object;+1 +j com.intellij.rt.debugger.agent.CaptureStorage.withoutThrowableCapture(Lcom/intellij/rt/debugger/agent/CaptureStorage$Callable;)Ljava/lang/Object;+21 +j com.intellij.rt.debugger.agent.CaptureStorage.getAsyncStackTrace(Ljava/lang/Throwable;)[Ljava/lang/StackTraceElement;+19 +j java.lang.Throwable.printStackTrace(Ljava/lang/Throwable$PrintStreamOrWriter;)V+32 java.base@17.0.8 +j java.lang.Throwable.printStackTrace(Ljava/io/PrintWriter;)V+9 java.base@17.0.8 +j com.alibaba.csp.sentinel.log.jul.CspFormatter.format(Ljava/util/logging/LogRecord;)Ljava/lang/String;+103 +j java.util.logging.StreamHandler.publish(Ljava/util/logging/LogRecord;)V+14 java.logging@17.0.8 +j java.util.logging.FileHandler.publish(Ljava/util/logging/LogRecord;)V+11 java.logging@17.0.8 +j com.alibaba.csp.sentinel.log.jul.DateFileLogHandler$LogTask.run()V+8 +j java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V+92 java.base@17.0.8 +j java.util.concurrent.ThreadPoolExecutor$Worker.run()V+5 java.base@17.0.8 +j java.lang.Thread.run()V+11 java.base@17.0.8 +v ~StubRoutines::call_stub +V [libjvm.dylib+0x4781f8] JavaCalls::call_helper(JavaValue*, methodHandle const&, JavaCallArguments*, JavaThread*)+0x394 +V [libjvm.dylib+0x47720c] JavaCalls::call_virtual(JavaValue*, Klass*, Symbol*, Symbol*, JavaCallArguments*, JavaThread*)+0x11c +V [libjvm.dylib+0x4772d8] JavaCalls::call_virtual(JavaValue*, Handle, Klass*, Symbol*, Symbol*, JavaThread*)+0x64 +V [libjvm.dylib+0x52ebfc] thread_entry(JavaThread*, JavaThread*)+0xc4 +V [libjvm.dylib+0x9b22e8] JavaThread::thread_main_inner()+0x150 +V [libjvm.dylib+0x9b0990] Thread::call_run()+0xe0 +V [libjvm.dylib+0x7d0364] thread_native_entry(Thread*)+0x158 +C [libsystem_pthread.dylib+0x6c58] _pthread_start+0x88 + +Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) +j com.intellij.rt.debugger.agent.CaptureStorage$DeepCapturedStack.collectStacks(Ljava/util/List;)Lcom/intellij/rt/debugger/agent/CaptureStorage$StackData;+89 +j com.intellij.rt.debugger.agent.CaptureStorage.getStackTrace(Lcom/intellij/rt/debugger/agent/CaptureStorage$CapturedStack;I)Ljava/util/ArrayList;+30 +j com.intellij.rt.debugger.agent.CaptureStorage.access$1000(Lcom/intellij/rt/debugger/agent/CaptureStorage$CapturedStack;I)Ljava/util/ArrayList;+2 +j com.intellij.rt.debugger.agent.CaptureStorage$9.call()[Ljava/lang/StackTraceElement;+31 +j com.intellij.rt.debugger.agent.CaptureStorage$9.call()Ljava/lang/Object;+1 +j com.intellij.rt.debugger.agent.CaptureStorage.withoutThrowableCapture(Lcom/intellij/rt/debugger/agent/CaptureStorage$Callable;)Ljava/lang/Object;+21 +j com.intellij.rt.debugger.agent.CaptureStorage.getAsyncStackTrace(Ljava/lang/Throwable;)[Ljava/lang/StackTraceElement;+19 +j java.lang.Throwable.printStackTrace(Ljava/lang/Throwable$PrintStreamOrWriter;)V+32 java.base@17.0.8 +j java.lang.Throwable.printStackTrace(Ljava/io/PrintWriter;)V+9 java.base@17.0.8 +j com.alibaba.csp.sentinel.log.jul.CspFormatter.format(Ljava/util/logging/LogRecord;)Ljava/lang/String;+103 +j java.util.logging.StreamHandler.publish(Ljava/util/logging/LogRecord;)V+14 java.logging@17.0.8 +j java.util.logging.FileHandler.publish(Ljava/util/logging/LogRecord;)V+11 java.logging@17.0.8 +j com.alibaba.csp.sentinel.log.jul.DateFileLogHandler$LogTask.run()V+8 +j java.util.concurrent.ThreadPoolExecutor.runWorker(Ljava/util/concurrent/ThreadPoolExecutor$Worker;)V+92 java.base@17.0.8 +j java.util.concurrent.ThreadPoolExecutor$Worker.run()V+5 java.base@17.0.8 +j java.lang.Thread.run()V+11 java.base@17.0.8 +v ~StubRoutines::call_stub + +siginfo: si_signo: 10 (SIGBUS), si_code: 1 (BUS_ADRALN), si_addr: 0x00000001046c5e7b + +Register to memory mapping: + + x0=0x0000600000694eb0 points into unknown readable memory: 0x0000000000000000 | 00 00 00 00 00 00 00 00 + x1=0x0 is NULL + x2=0x0 is NULL + x3=0x0000600000694ec0 points into unknown readable memory: 0x0000000000000000 | 00 00 00 00 00 00 00 00 + x4=0x0000600000694f00 points into unknown readable memory: 0x0000600003c95440 | 40 54 c9 03 00 60 00 00 + x5=0x000000009d64e030 is an unknown value + x6=0x0000000000000eb0 is an unknown value + x7=0x000000000000000a is an unknown value + x8=0x00000001047ede5f: gdata+0xcbf7 in /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjdwp.dylib at 0x00000001047a8000 + x9=0x0000000000128000 is an unknown value +x10=0x0000600000694eb0 points into unknown readable memory: 0x0000000000000000 | 00 00 00 00 00 00 00 00 +x11=0x000066d8c3c50000 is an unknown value +x12=0x0000000000000050 is an unknown value +x13=0x000060000242e518 points into unknown readable memory: 0x000000009d84d82f | 2f d8 84 9d 00 00 00 00 +x14=0x00000000001ff800 is an unknown value +x15=0x00000000000007fb is an unknown value +x16=0x0000000186e7d030: __bzero+0 in /usr/lib/system/libsystem_platform.dylib at 0x0000000186e7a000 +x17=0x00000001f4ef54a8 points into unknown readable memory: 0x0000000186e7d030 | 30 d0 e7 86 01 00 00 00 +x18=0x0 is NULL +x19=0x0000600000694eb0 points into unknown readable memory: 0x0000000000000000 | 00 00 00 00 00 00 00 00 +x20=0x0 is NULL +x21=0x0000600001324000 points into unknown readable memory: 0x00006000002382a0 | a0 82 23 00 00 60 00 00 +x22=0x00000001046c5e5f points into unknown readable memory: 50 +x23=0x00000000d3a18b02 is an unknown value +x24=0x000000000000002f is an unknown value +x25=0x000000000000003d is an unknown value +x26=0x00000000000000cd is an unknown value +x27=0x0000600000694ed8 points into unknown readable memory: 0x0000000000000000 | 00 00 00 00 00 00 00 00 +x28=0x0000000105127d40 points into unknown readable memory: 0x65746e692f6d6f63 | 63 6f 6d 2f 69 6e 74 65 + + +Registers: + x0=0x0000600000694eb0 x1=0x0000000000000000 x2=0x0000000000000000 x3=0x0000600000694ec0 + x4=0x0000600000694f00 x5=0x000000009d64e030 x6=0x0000000000000eb0 x7=0x000000000000000a + x8=0x00000001047ede5f x9=0x0000000000128000 x10=0x0000600000694eb0 x11=0x000066d8c3c50000 +x12=0x0000000000000050 x13=0x000060000242e518 x14=0x00000000001ff800 x15=0x00000000000007fb +x16=0x0000000186e7d030 x17=0x00000001f4ef54a8 x18=0x0000000000000000 x19=0x0000600000694eb0 +x20=0x0000000000000000 x21=0x0000600001324000 x22=0x00000001046c5e5f x23=0x00000000d3a18b02 +x24=0x000000000000002f x25=0x000000000000003d x26=0x00000000000000cd x27=0x0000600000694ed8 +x28=0x0000000105127d40 fp=0x0000000318411a50 lr=0x00000001046de48c sp=0x00000003184119d0 +pc=0x00000001046de4c0 cpsr=0x0000000060001000 +Top of Stack: (sp=0x00000003184119d0) +0x00000003184119d0: 0000000000000000 0000000000000000 +0x00000003184119e0: 0000000000000000 0000000000000000 +0x00000003184119f0: 0000000000000000 0000000000000000 +0x0000000318411a00: 0000000105127d40 0000000107809600 +0x0000000318411a10: 00000000000000cd 000000000000003d +0x0000000318411a20: 000000000000002f 00000000d3a18b02 +0x0000000318411a30: 0000600000694f00 0000000000000000 +0x0000000318411a40: 0000000105127d80 0000600001324000 +0x0000000318411a50: 0000000318411ab0 00000001046de390 +0x0000000318411a60: 0000000105127d40 0000000000000037 +0x0000000318411a70: 0000000000000001 0000000105127d80 +0x0000000318411a80: 000000010fa93f48 0000000105127d80 +0x0000000318411a90: 0000600001324000 0000000105127d80 +0x0000000318411aa0: 0000000318411bdc 0000000318411af4 +0x0000000318411ab0: 0000000318411ae0 00000001046ded78 +0x0000000318411ac0: 0000000318411bdc 00006000028341e0 +0x0000000318411ad0: 0000000000000000 000000010fa93c00 +0x0000000318411ae0: 0000000318411bc0 0000000105a1a408 +0x0000000318411af0: 0000000106278388 0000000000000100 +0x0000000318411b00: 0000000318411b20 0000000105cee5dc +0x0000000318411b10: 0000000106278388 0000000318411ba0 +0x0000000318411b20: 0000000318411b70 0000000105aa096c +0x0000000318411b30: 0000000000000000 0000000000000000 +0x0000000318411b40: 0000000000000001 0000000158a50290 +0x0000000318411b50: 000000010fa93c00 0000000105128118 +0x0000000318411b60: 000000010628d1e2 0000000318411c68 +0x0000000318411b70: 0000000318411b90 43eef1f7fdfa0026 +0x0000000318411b80: 0000000000000001 0000000105127d80 +0x0000000318411b90: 00006000028341e0 0000000158a50290 +0x0000000318411ba0: 000000010fa93c00 0000000105128118 +0x0000000318411bb0: 0000000105127d30 00006000028341e0 +0x0000000318411bc0: 0000000318411bf0 0000000105a1a53c + +Instructions: (pc=0x00000001046de4c0) +0x00000001046de3c0: 6b0c017f 54ffff60 17ffffde d2800016 +0x00000001046de3d0: 72001ebf 54000160 b5000156 f100073f +0x00000001046de3e0: 54fff7cb 8b140328 385ff108 7100bd1f +0x00000001046de3f0: 54fff741 d2800016 14000002 f9004e7f +0x00000001046de400: f9402a60 94000451 aa1603e0 a9457bfd +0x00000001046de410: a9444ff4 a94357f6 a9425ff8 a94167fa +0x00000001046de420: a8c66ffc d65f03c0 6b03003f 540000e1 +0x00000001046de430: 71000421 540000eb 38401408 38401449 +0x00000001046de440: 6b09011f 54ffff60 52800000 d65f03c0 +0x00000001046de450: 52800020 d65f03c0 d10243ff a9036ffc +0x00000001046de460: a90467fa a9055ff8 a90657f6 a9074ff4 +0x00000001046de470: a9087bfd 910203fd aa0203f4 aa0103f6 +0x00000001046de480: aa0003f5 52800900 94000481 aa0003f3 +0x00000001046de490: b4001320 f900027f aa1303fb f8028f7f +0x00000001046de4a0: f9001a7f 3940c2a8 34000288 f9400ea8 +0x00000001046de4b0: f94006c9 8b090108 f94016a9 cb090116 +0x00000001046de4c0: 79403ad8 39407ada 39407edc 794042c8 +0x00000001046de4d0: f90017e8 b9400ec8 f9000668 b9401ac8 +0x00000001046de4e0: f9000fe8 f9000a68 794016c8 34000488 +0x00000001046de4f0: b94016c8 14000023 f94006d7 34000d54 +0x00000001046de500: f9401ea8 b4000288 f94022a9 eb17013f +0x00000001046de510: 5400022c 5283fa4a 8b0a012a eb17015f +0x00000001046de520: 540001ab 9140092a 8b170108 cb090116 +0x00000001046de530: 79403ac8 79403ec9 794042cb 8b0802e8 +0x00000001046de540: 8b090108 8b0b0108 9100b908 eb0a011f +0x00000001046de550: 54000b4d aa1503e0 aa1703e1 52840002 +0x00000001046de560: 94000384 aa0003f6 b4000aa0 f9401ea0 +0x00000001046de570: 94000429 a903deb6 17ffffd2 d2800008 +0x00000001046de580: aa0803f7 f9000e68 b94012c8 b9002268 +0x00000001046de590: b842a2c9 f9405ea8 f9000be9 8b090108 +0x00000001046de5a0: cb0803e8 f9001e68 794012c8 b9004268 +0x00000001046de5b0: 91000700 94000436 aa0003f9 f9000260 + + +Stack slot to memory mapping: +stack at sp + 0 slots: 0x0 is NULL +stack at sp + 1 slots: 0x0 is NULL +stack at sp + 2 slots: 0x0 is NULL +stack at sp + 3 slots: 0x0 is NULL +stack at sp + 4 slots: 0x0 is NULL +stack at sp + 5 slots: 0x0 is NULL +stack at sp + 6 slots: 0x0000000105127d40 points into unknown readable memory: 0x65746e692f6d6f63 | 63 6f 6d 2f 69 6e 74 65 +stack at sp + 7 slots: 0x0000000107809600 points into unknown readable memory: 0xffffffff5bbd78a2 | a2 78 bd 5b ff ff ff ff + + +--------------- P R O C E S S --------------- + +Threads class SMR info: +_java_thread_list=0x000060000217cce0, length=71, elements={ +0x0000000107808a00, 0x000000011b808200, 0x000000010f813a00, 0x0000000107009200, +0x0000000107009800, 0x000000011e014a00, 0x000000011b00c400, 0x0000000107823800, +0x000000011c00a200, 0x000000011a813c00, 0x000000011a816400, 0x000000011e80fa00, +0x000000011a0d9600, 0x000000010f812c00, 0x000000011e02fe00, 0x000000011b1b6800, +0x000000011a573600, 0x000000011c8e8800, 0x000000011b960000, 0x0000000107024a00, +0x000000011f3d8600, 0x000000011eba7600, 0x000000010f9e0600, 0x000000011f41b600, +0x000000011c068400, 0x000000011f47fc00, 0x000000011c047c00, 0x000000011f440200, +0x000000011b404800, 0x000000011f4a3a00, 0x000000011c07bc00, 0x000000011c095c00, +0x000000011b95a800, 0x000000011e499200, 0x000000011e4bd000, 0x000000011b4a8800, +0x000000011a66aa00, 0x000000011f504600, 0x000000011ad0cc00, 0x000000011f598a00, +0x000000011b9bb000, 0x000000011a693400, 0x000000011f3e9600, 0x0000000107978800, +0x0000000107973c00, 0x0000000107934000, 0x0000000107961000, 0x000000011b989600, +0x000000011ad8e400, 0x000000011ad93000, 0x000000011e4a8000, 0x000000011b52f200, +0x000000011b9a0a00, 0x000000011a69d400, 0x000000011b563c00, 0x000000010fa93c00, +0x000000011b5a3a00, 0x000000011e51f600, 0x000000011f65ba00, 0x000000011b62e600, +0x000000011edd6200, 0x000000011edf8e00, 0x000000011f67a800, 0x000000011ae25600, +0x000000011ae41800, 0x000000011ae41e00, 0x000000011edf4400, 0x000000011edef000, +0x000000011b3b4400, 0x0000000107ada400, 0x000000011b77a400 +} + +Java Threads: ( => current thread ) + 0x0000000107808a00 JavaThread "main" [_thread_in_native, id=4355, stack(0x000000016b888000,0x000000016ba8b000)] + 0x000000011b808200 JavaThread "Reference Handler" daemon [_thread_blocked, id=18179, stack(0x000000016c6dc000,0x000000016c8df000)] + 0x000000010f813a00 JavaThread "Finalizer" daemon [_thread_blocked, id=18947, stack(0x000000016c8e8000,0x000000016caeb000)] + 0x0000000107009200 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=31235, stack(0x000000016cc0c000,0x000000016ce0f000)] + 0x0000000107009800 JavaThread "Service Thread" daemon [_thread_blocked, id=30723, stack(0x000000016ce18000,0x000000016d01b000)] + 0x000000011e014a00 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=23299, stack(0x000000016d024000,0x000000016d227000)] + 0x000000011b00c400 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=30211, stack(0x000000016d230000,0x000000016d433000)] + 0x0000000107823800 JavaThread "Sweeper thread" daemon [_thread_blocked, id=24067, stack(0x000000016d43c000,0x000000016d63f000)] + 0x000000011c00a200 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=24579, stack(0x000000016d648000,0x000000016d84b000)] + 0x000000011a813c00 JavaThread "JDWP Transport Listener: dt_socket" daemon [_thread_blocked, id=25091, stack(0x000000016d854000,0x000000016da57000)] + 0x000000011a816400 JavaThread "JDWP Event Helper Thread" daemon [_thread_blocked, id=29699, stack(0x000000016da60000,0x000000016dc63000)] + 0x000000011e80fa00 JavaThread "JDWP Command Reader" daemon [_thread_in_native, id=29443, stack(0x000000016dc6c000,0x000000016de6f000)] + 0x000000011a0d9600 JavaThread "IntelliJ Suspend Helper" daemon [_thread_blocked, id=28931, stack(0x000000016de78000,0x000000016e07b000)] + 0x000000010f812c00 JavaThread "Notification Thread" daemon [_thread_blocked, id=25603, stack(0x000000016e084000,0x000000016e287000)] + 0x000000011e02fe00 JavaThread "CoarseTimer" daemon [_thread_blocked, id=28163, stack(0x000000016e290000,0x000000016e493000)] + 0x000000011b1b6800 JavaThread "RMI TCP Accept-0" daemon [_thread_in_native, id=34307, stack(0x000000016f708000,0x000000016f90b000)] + 0x000000011a573600 JavaThread "com.alibaba.nacos.client.logging.0" daemon [_thread_blocked, id=35331, stack(0x000000016fb20000,0x000000016fd23000)] + 0x000000011c8e8800 JavaThread "Attach Listener" daemon [_thread_blocked, id=42243, stack(0x000000016fd2c000,0x000000016ff2f000)] + 0x000000011b960000 JavaThread "RMI TCP Connection(1)-127.0.0.1" daemon [_thread_in_native, id=40963, stack(0x0000000318a40000,0x0000000318c43000)] + 0x0000000107024a00 JavaThread "nacos.publisher-com.alibaba.nacos.common.notify.SlowEvent" daemon [_thread_blocked, id=37635, stack(0x0000000318c4c000,0x0000000318e4f000)] + 0x000000011f3d8600 JavaThread "nacos.publisher-com.alibaba.nacos.client.config.impl.ConfigFuzzyWatchNotifyEvent" daemon [_thread_blocked, id=40451, stack(0x0000000318e58000,0x000000031905b000)] + 0x000000011eba7600 JavaThread "nacos.publisher-com.alibaba.nacos.client.config.impl.ConfigFuzzyWatchLoadEvent" daemon [_thread_blocked, id=39939, stack(0x0000000319064000,0x0000000319267000)] + 0x000000010f9e0600 JavaThread "RMI Scheduler(0)" daemon [_thread_blocked, id=38915, stack(0x0000000319688000,0x000000031988b000)] + 0x000000011f41b600 JavaThread "com.alibaba.nacos.client.auth.ram.identify.watcher.0" daemon [_thread_blocked, id=43527, stack(0x0000000319894000,0x0000000319a97000)] + 0x000000011c068400 JavaThread "com.alibaba.nacos.client.login-executor.0" daemon [_thread_blocked, id=37127, stack(0x0000000318834000,0x0000000318a37000)] + 0x000000011f47fc00 JavaThread "com.alibaba.nacos.client.listen-executor.0" daemon [_thread_blocked, id=43779, stack(0x0000000319aa0000,0x0000000319ca3000)] + 0x000000011c047c00 JavaThread "com.alibaba.nacos.client.fuzzy-watcher-executor.0" daemon [_thread_blocked, id=44291, stack(0x0000000319cac000,0x0000000319eaf000)] + 0x000000011f440200 JavaThread "com.alibaba.nacos.client.remote.worker.0" daemon [_thread_blocked, id=44803, stack(0x0000000319eb8000,0x000000031a0bb000)] + 0x000000011b404800 JavaThread "com.alibaba.nacos.client.remote.worker.1" daemon [_thread_blocked, id=64771, stack(0x000000031a0c4000,0x000000031a2c7000)] + 0x000000011f4a3a00 JavaThread "grpc-nio-worker-ELG-1-1" daemon [_thread_in_native, id=64531, stack(0x000000031a2d0000,0x000000031a4d3000)] + 0x000000011c07bc00 JavaThread "grpc-default-executor-0" daemon [_thread_blocked, id=64003, stack(0x000000031a4dc000,0x000000031a6df000)] + 0x000000011c095c00 JavaThread "nacos-grpc-client-executor-127.0.0.1-0" daemon [_thread_blocked, id=45315, stack(0x000000031a6e8000,0x000000031a8eb000)] + 0x000000011b95a800 JavaThread "nacos-grpc-client-executor-127.0.0.1-1" daemon [_thread_blocked, id=45827, stack(0x000000031a8f4000,0x000000031aaf7000)] + 0x000000011e499200 JavaThread "grpc-nio-worker-ELG-1-2" daemon [_thread_in_native, id=46083, stack(0x000000031ab00000,0x000000031ad03000)] + 0x000000011e4bd000 JavaThread "nacos-grpc-client-executor-127.0.0.1-2" daemon [_thread_blocked, id=46339, stack(0x000000031ad0c000,0x000000031af0f000)] + 0x000000011b4a8800 JavaThread "nacos-grpc-client-executor-127.0.0.1-3" daemon [_thread_blocked, id=62979, stack(0x000000031af18000,0x000000031b11b000)] + 0x000000011a66aa00 JavaThread "nacos-grpc-client-executor-127.0.0.1-4" daemon [_thread_blocked, id=62467, stack(0x000000031b124000,0x000000031b327000)] + 0x000000011f504600 JavaThread "nacos-grpc-client-executor-127.0.0.1-5" daemon [_thread_blocked, id=46851, stack(0x000000031b330000,0x000000031b533000)] + 0x000000011ad0cc00 JavaThread "nacos-grpc-client-executor-127.0.0.1-6" daemon [_thread_blocked, id=47363, stack(0x000000031b53c000,0x000000031b73f000)] + 0x000000011f598a00 JavaThread "nacos-grpc-client-executor-127.0.0.1-7" daemon [_thread_blocked, id=61955, stack(0x000000031b748000,0x000000031b94b000)] + 0x000000011b9bb000 JavaThread "nacos.publisher-com.alibaba.nacos.common.ability.AbstractAbilityControlManager$AbilityUpdateEvent" daemon [_thread_blocked, id=61443, stack(0x000000031b954000,0x000000031bb57000)] + 0x000000011a693400 JavaThread "nacos-grpc-client-executor-127.0.0.1-8" daemon [_thread_blocked, id=47875, stack(0x000000031bb60000,0x000000031bd63000)] + 0x000000011f3e9600 JavaThread "nacos-grpc-client-executor-127.0.0.1-9" daemon [_thread_blocked, id=60931, stack(0x000000031bd6c000,0x000000031bf6f000)] + 0x0000000107978800 JavaThread "nacos-grpc-client-executor-127.0.0.1-10" daemon [_thread_blocked, id=48387, stack(0x000000031bf78000,0x000000031c17b000)] + 0x0000000107973c00 JavaThread "nacos-grpc-client-executor-127.0.0.1-11" daemon [_thread_blocked, id=48643, stack(0x000000031c184000,0x000000031c387000)] + 0x0000000107934000 JavaThread "nacos-grpc-client-executor-127.0.0.1-12" daemon [_thread_blocked, id=48899, stack(0x000000031c390000,0x000000031c593000)] + 0x0000000107961000 JavaThread "nacos-grpc-client-executor-127.0.0.1-13" daemon [_thread_blocked, id=49155, stack(0x000000031c59c000,0x000000031c79f000)] + 0x000000011b989600 JavaThread "nacos-grpc-client-executor-127.0.0.1-14" daemon [_thread_blocked, id=59395, stack(0x000000031c7a8000,0x000000031c9ab000)] + 0x000000011ad8e400 JavaThread "nacos-grpc-client-executor-127.0.0.1-15" daemon [_thread_blocked, id=49667, stack(0x000000031c9b4000,0x000000031cbb7000)] + 0x000000011ad93000 JavaThread "nacos-grpc-client-executor-127.0.0.1-16" daemon [_thread_blocked, id=58883, stack(0x000000031cbc0000,0x000000031cdc3000)] + 0x000000011e4a8000 JavaThread "nacos-grpc-client-executor-127.0.0.1-17" daemon [_thread_blocked, id=58627, stack(0x000000031cdcc000,0x000000031cfcf000)] + 0x000000011b52f200 JavaThread "nacos-grpc-client-executor-127.0.0.1-18" daemon [_thread_blocked, id=50435, stack(0x000000031cfd8000,0x000000031d1db000)] + 0x000000011b9a0a00 JavaThread "nacos-grpc-client-executor-127.0.0.1-19" daemon [_thread_blocked, id=50955, stack(0x000000031d1e4000,0x000000031d3e7000)] + 0x000000011a69d400 JavaThread "nacos-grpc-client-executor-127.0.0.1-20" daemon [_thread_blocked, id=51203, stack(0x000000031d3f0000,0x000000031d5f3000)] + 0x000000011b563c00 JavaThread "nacos-grpc-client-executor-127.0.0.1-21" daemon [_thread_blocked, id=51459, stack(0x000000031d5fc000,0x000000031d7ff000)] +=>0x000000010fa93c00 JavaThread "sentinel-datafile-log-executor-thread-1" daemon [_thread_in_native, id=36131, stack(0x0000000318210000,0x0000000318413000)] + 0x000000011b5a3a00 JavaThread "sentinel-command-center-executor-thread-1" daemon [_thread_in_native, id=36635, stack(0x0000000318628000,0x000000031882b000)] + 0x000000011e51f600 JavaThread "sentinel-heartbeat-send-task-thread-1" daemon [_thread_blocked, id=41523, stack(0x000000031841c000,0x000000031861f000)] + 0x000000011f65ba00 JavaThread "C1 CompilerThread1" daemon [_thread_blocked, id=36403, stack(0x0000000318004000,0x0000000318207000)] + 0x000000011b62e600 JavaThread "nacos-grpc-client-executor-127.0.0.1-22" daemon [_thread_blocked, id=57635, stack(0x000000031d808000,0x000000031da0b000)] + 0x000000011edd6200 JavaThread "nacos-grpc-client-executor-127.0.0.1-23" daemon [_thread_blocked, id=57095, stack(0x000000031da14000,0x000000031dc17000)] + 0x000000011edf8e00 JavaThread "nacos-grpc-client-executor-127.0.0.1-24" daemon [_thread_blocked, id=56579, stack(0x000000031dc20000,0x000000031de23000)] + 0x000000011f67a800 JavaThread "nacos-grpc-client-executor-127.0.0.1-25" daemon [_thread_blocked, id=51715, stack(0x000000031de2c000,0x000000031e02f000)] + 0x000000011ae25600 JavaThread "nacos-grpc-client-executor-127.0.0.1-26" daemon [_thread_blocked, id=56067, stack(0x000000031e038000,0x000000031e23b000)] + 0x000000011ae41800 JavaThread "nacos-grpc-client-executor-127.0.0.1-27" daemon [_thread_blocked, id=55555, stack(0x000000031e244000,0x000000031e447000)] + 0x000000011ae41e00 JavaThread "nacos-grpc-client-executor-127.0.0.1-28" daemon [_thread_blocked, id=52483, stack(0x000000031e450000,0x000000031e653000)] + 0x000000011edf4400 JavaThread "nacos-grpc-client-executor-127.0.0.1-29" daemon [_thread_blocked, id=55043, stack(0x000000031e65c000,0x000000031e85f000)] + 0x000000011edef000 JavaThread "nacos-grpc-client-executor-127.0.0.1-30" daemon [_thread_blocked, id=54787, stack(0x000000031e868000,0x000000031ea6b000)] + 0x000000011b3b4400 JavaThread "nacos-grpc-client-executor-127.0.0.1-31" daemon [_thread_blocked, id=54531, stack(0x000000031ea74000,0x000000031ec77000)] + 0x0000000107ada400 JavaThread "sentinel-time-tick-thread" daemon [_thread_blocked, id=32027, stack(0x000000031ec80000,0x000000031ee83000)] + 0x000000011b77a400 JavaThread "sentinel-heartbeat-send-task-thread-2" daemon [_thread_blocked, id=53555, stack(0x000000031ee8c000,0x000000031f08f000)] + +Other Threads: + 0x0000000104d04d00 VMThread "VM Thread" [stack: 0x000000016c4d0000,0x000000016c6d3000] [id=19715] + 0x0000000104c0a4f0 WatcherThread [stack: 0x000000016f914000,0x000000016fb17000] [id=34819] + 0x0000000104e067f0 GCTaskThread "GC Thread#0" [stack: 0x000000016ba94000,0x000000016bc97000] [id=12547] + 0x00000001051109e0 GCTaskThread "GC Thread#1" [stack: 0x000000016e49c000,0x000000016e69f000] [id=25859] + 0x0000000105214660 GCTaskThread "GC Thread#2" [stack: 0x000000016e6a8000,0x000000016e8ab000] [id=27395] + 0x000000010de05990 GCTaskThread "GC Thread#3" [stack: 0x000000016e8b4000,0x000000016eab7000] [id=26883] + 0x0000000105110e70 GCTaskThread "GC Thread#4" [stack: 0x000000016eac0000,0x000000016ecc3000] [id=26115] + 0x00000001051116f0 GCTaskThread "GC Thread#5" [stack: 0x000000016eccc000,0x000000016eecf000] [id=32771] + 0x0000000105111f70 GCTaskThread "GC Thread#6" [stack: 0x000000016eed8000,0x000000016f0db000] [id=43011] + 0x00000001051127f0 GCTaskThread "GC Thread#7" [stack: 0x000000016f0e4000,0x000000016f2e7000] [id=33283] + 0x0000000105113070 GCTaskThread "GC Thread#8" [stack: 0x000000016f2f0000,0x000000016f4f3000] [id=33795] + 0x0000000104809f30 GCTaskThread "GC Thread#9" [stack: 0x000000016f4fc000,0x000000016f6ff000] [id=42755] + 0x00000001050042b0 ConcurrentGCThread "G1 Main Marker" [stack: 0x000000016bca0000,0x000000016bea3000] [id=14083] + 0x000000011df045c0 ConcurrentGCThread "G1 Conc#0" [stack: 0x000000016beac000,0x000000016c0af000] [id=13827] + 0x000000010512ad30 ConcurrentGCThread "G1 Conc#1" [stack: 0x0000000319270000,0x0000000319473000] [id=39427] + 0x0000000104e11120 ConcurrentGCThread "G1 Conc#2" [stack: 0x000000031947c000,0x000000031967f000] [id=38403] + 0x0000000105105c00 ConcurrentGCThread "G1 Refine#0" [stack: 0x000000016c0b8000,0x000000016c2bb000] [id=16643] + 0x0000000105204080 ConcurrentGCThread "G1 Service" [stack: 0x000000016c2c4000,0x000000016c4c7000] [id=21251] + +Threads with active compile tasks: + +VM state: not at safepoint (normal execution) + +VM Mutex/Monitor currently owned by a thread: None + +Heap address: 0x00000005c0000000, size: 9216 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 + +CDS archive(s) mapped at: [0x000000e000000000-0x000000e000c14000-0x000000e000c14000), size 12664832, SharedBaseAddress: 0x000000e000000000, ArchiveRelocationMode: 1. +Compressed class space mapped at: 0x000000e001000000-0x000000e041000000, reserved size: 1073741824 +Narrow klass base: 0x000000e000000000, Narrow klass shift: 0, Narrow klass range: 0x100000000 + +GC Precious Log: + CPUs: 12 total, 12 available + Memory: 36864M + Large Page Support: Disabled + NUMA Support: Disabled + Compressed Oops: Enabled (Zero based) + Heap Region Size: 8M + Heap Min Capacity: 8M + Heap Initial Capacity: 576M + Heap Max Capacity: 9G + Pre-touch: Disabled + Parallel Workers: 10 + Concurrent Workers: 3 + Concurrent Refinement Workers: 10 + Periodic GC: Disabled + +Heap: + garbage-first heap total 196608K, used 119331K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 10 young (81920K), 1 survivors (8192K) + Metaspace used 65956K, committed 66496K, reserved 1114112K + class space used 8750K, committed 9024K, reserved 1048576K + +Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, OA=open archive, CA=closed archive, TAMS=top-at-mark-start (previous, next) +| 0|0x00000005c0000000, 0x00000005c0800000, 0x00000005c0800000|100%| O| |TAMS 0x00000005c0800000, 0x00000005c0000000| Untracked +| 1|0x00000005c0800000, 0x00000005c1000000, 0x00000005c1000000|100%| O| |TAMS 0x00000005c1000000, 0x00000005c0800000| Untracked +| 2|0x00000005c1000000, 0x00000005c1800000, 0x00000005c1800000|100%| O| |TAMS 0x00000005c178d800, 0x00000005c1000000| Untracked +| 3|0x00000005c1800000, 0x00000005c1f6fc00, 0x00000005c2000000| 92%| O| |TAMS 0x00000005c1f6fc00, 0x00000005c1800000| Untracked +| 4|0x00000005c2000000, 0x00000005c2521200, 0x00000005c2800000| 64%| O| |TAMS 0x00000005c2000000, 0x00000005c2000000| Untracked +| 5|0x00000005c2800000, 0x00000005c2800000, 0x00000005c3000000| 0%| F| |TAMS 0x00000005c2800000, 0x00000005c2800000| Untracked +| 6|0x00000005c3000000, 0x00000005c3000000, 0x00000005c3800000| 0%| F| |TAMS 0x00000005c3000000, 0x00000005c3000000| Untracked +| 7|0x00000005c3800000, 0x00000005c3800000, 0x00000005c4000000| 0%| F| |TAMS 0x00000005c3800000, 0x00000005c3800000| Untracked +| 8|0x00000005c4000000, 0x00000005c4000000, 0x00000005c4800000| 0%| F| |TAMS 0x00000005c4000000, 0x00000005c4000000| Untracked +| 9|0x00000005c4800000, 0x00000005c4800000, 0x00000005c5000000| 0%| F| |TAMS 0x00000005c4800000, 0x00000005c4800000| Untracked +| 10|0x00000005c5000000, 0x00000005c5000000, 0x00000005c5800000| 0%| F| |TAMS 0x00000005c5000000, 0x00000005c5000000| Untracked +| 11|0x00000005c5800000, 0x00000005c5800000, 0x00000005c6000000| 0%| F| |TAMS 0x00000005c5800000, 0x00000005c5800000| Untracked +| 12|0x00000005c6000000, 0x00000005c64df298, 0x00000005c6800000| 60%| E| |TAMS 0x00000005c6000000, 0x00000005c6000000| Complete +| 13|0x00000005c6800000, 0x00000005c7000000, 0x00000005c7000000|100%| E|CS|TAMS 0x00000005c6800000, 0x00000005c6800000| Complete +| 14|0x00000005c7000000, 0x00000005c7800000, 0x00000005c7800000|100%| E|CS|TAMS 0x00000005c7000000, 0x00000005c7000000| Complete +| 15|0x00000005c7800000, 0x00000005c8000000, 0x00000005c8000000|100%| E|CS|TAMS 0x00000005c7800000, 0x00000005c7800000| Complete +| 16|0x00000005c8000000, 0x00000005c8800000, 0x00000005c8800000|100%| S|CS|TAMS 0x00000005c8000000, 0x00000005c8000000| Complete +| 17|0x00000005c8800000, 0x00000005c9000000, 0x00000005c9000000|100%| E|CS|TAMS 0x00000005c8800000, 0x00000005c8800000| Complete +| 18|0x00000005c9000000, 0x00000005c9800000, 0x00000005c9800000|100%| E|CS|TAMS 0x00000005c9000000, 0x00000005c9000000| Complete +| 19|0x00000005c9800000, 0x00000005ca000000, 0x00000005ca000000|100%| E|CS|TAMS 0x00000005c9800000, 0x00000005c9800000| Complete +| 68|0x00000005e2000000, 0x00000005e2800000, 0x00000005e2800000|100%| E|CS|TAMS 0x00000005e2000000, 0x00000005e2000000| Complete +| 71|0x00000005e3800000, 0x00000005e4000000, 0x00000005e4000000|100%| E|CS|TAMS 0x00000005e3800000, 0x00000005e3800000| Complete +|1150|0x00000007ff000000, 0x00000007ff778000, 0x00000007ff800000| 93%|OA| |TAMS 0x00000007ff778000, 0x00000007ff000000| Untracked +|1151|0x00000007ff800000, 0x00000007ff880000, 0x0000000800000000| 6%|CA| |TAMS 0x00000007ff880000, 0x00000007ff800000| Untracked + +Card table byte_map: [0x000000010c200000,0x000000010d400000] _byte_map_base: 0x0000000109400000 + +Marking Bits (Prev, Next): (CMBitMap*) 0x000000010f808250, (CMBitMap*) 0x000000010f808210 + Prev Bits: [0x0000000149000000, 0x0000000152000000) + Next Bits: [0x0000000140000000, 0x0000000149000000) + +Polling page: 0x0000000104698000 + +Metaspace: + +Usage: + Non-class: 55.87 MB used. + Class: 8.55 MB used. + Both: 64.41 MB used. + +Virtual space: + Non-class space: 64.00 MB reserved, 56.12 MB ( 88%) committed, 1 nodes. + Class space: 1.00 GB reserved, 8.81 MB ( <1%) committed, 1 nodes. + Both: 1.06 GB reserved, 64.94 MB ( 6%) committed. + +Chunk freelists: + Non-Class: 7.80 MB + Class: 7.22 MB + Both: 15.02 MB + +MaxMetaspaceSize: unlimited +CompressedClassSpaceSize: 1.00 GB +Initial GC threshold: 21.00 MB +Current GC threshold: 100.31 MB +CDS: on +MetaspaceReclaimPolicy: balanced + - commit_granule_bytes: 65536. + - commit_granule_words: 8192. + - virtual_space_node_default_size: 8388608. + - enlarge_chunks_in_place: 1. + - new_chunks_are_fully_committed: 0. + - uncommit_free_chunks: 1. + - use_allocation_guard: 0. + - handle_deallocations: 1. + + +Internal statistics: + +num_allocs_failed_limit: 17. +num_arena_births: 702. +num_arena_deaths: 2. +num_vsnodes_births: 2. +num_vsnodes_deaths: 0. +num_space_committed: 1039. +num_space_uncommitted: 0. +num_chunks_returned_to_freelist: 19. +num_chunks_taken_from_freelist: 2813. +num_chunk_merges: 12. +num_chunk_splits: 2108. +num_chunks_enlarged: 1687. +num_inconsistent_stats: 0. + +CodeCache: size=49152Kb used=11912Kb max_used=11912Kb free=37239Kb + bounds [0x0000000108000000, 0x0000000108bb0000, 0x000000010b000000] + total_blobs=6643 nmethods=6019 adapters=554 + compilation: enabled + stopped_count=0, restarted_count=0 + full_count=0 + +Compilation events (20 events): +Event: 7.622 Thread 0x000000011b00c400 6308 1 org.aspectj.internal.lang.reflect.PerClauseImpl::getKind (5 bytes) +Event: 7.622 Thread 0x000000011b00c400 nmethod 6308 0x0000000108b9ea10 code [0x0000000108b9eb80, 0x0000000108b9ec18] +Event: 7.622 Thread 0x000000011b00c400 6310 ! 1 jdk.proxy2.$Proxy142::annotationType (29 bytes) +Event: 7.622 Thread 0x000000011b00c400 nmethod 6310 0x0000000108b9ed10 code [0x0000000108b9eec0, 0x0000000108b9f0d8] +Event: 7.623 Thread 0x000000011b00c400 6311 1 java.lang.reflect.Field::getAnnotation (23 bytes) +Event: 7.623 Thread 0x000000011f65ba00 6312 1 org.springframework.aop.aspectj.annotation.BeanFactoryAspectInstanceFactory::getAspectMetadata (5 bytes) +Event: 7.623 Thread 0x000000011b00c400 nmethod 6311 0x0000000108b9f290 code [0x0000000108b9f480, 0x0000000108b9f778] +Event: 7.623 Thread 0x000000011f65ba00 nmethod 6312 0x0000000108b9f990 code [0x0000000108b9fb00, 0x0000000108b9fb98] +Event: 7.623 Thread 0x000000011b00c400 6313 1 org.springframework.aop.aspectj.annotation.AbstractAspectJAdvisorFactory::findAspectJAnnotationOnMethod (43 bytes) +Event: 7.623 Thread 0x000000011b00c400 nmethod 6313 0x0000000108b9fc90 code [0x0000000108b9fe40, 0x0000000108ba0018] +Event: 7.627 Thread 0x000000011b00c400 6314 ! 1 jdk.proxy2.$Proxy84::annotationType (29 bytes) +Event: 7.627 Thread 0x000000011b00c400 nmethod 6314 0x0000000108ba0190 code [0x0000000108ba0340, 0x0000000108ba0558] +Event: 7.627 Thread 0x000000011b00c400 6315 1 java.util.concurrent.atomic.AtomicInteger::getAndAdd (12 bytes) +Event: 7.627 Thread 0x000000011b00c400 nmethod 6315 0x0000000108ba0710 code [0x0000000108ba0880, 0x0000000108ba0958] +Event: 7.703 Thread 0x000000011f65ba00 6320 1 java.util.regex.Pattern::unread (11 bytes) +Event: 7.703 Thread 0x000000011b00c400 6321 1 java.util.regex.Pattern::qtype (39 bytes) +Event: 7.704 Thread 0x000000011f65ba00 nmethod 6320 0x0000000108ba1610 code [0x0000000108ba1780, 0x0000000108ba1858] +Event: 7.704 Thread 0x000000011b00c400 nmethod 6321 0x0000000108ba1910 code [0x0000000108ba1b00, 0x0000000108ba1e38] +Event: 7.704 Thread 0x000000011b00c400 6322 1 jdk.internal.misc.Unsafe::putReferenceOpaque (9 bytes) +Event: 7.704 Thread 0x000000011b00c400 nmethod 6322 0x0000000108ba2010 code [0x0000000108ba2180, 0x0000000108ba2298] + +GC Heap History (20 events): +Event: 0.685 GC heap before +{Heap before GC invocations=2 (full 0): + garbage-first heap total 606208K, used 49439K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 4 young (32768K), 1 survivors (8192K) + Metaspace used 11758K, committed 11968K, reserved 1114112K + class space used 1313K, committed 1408K, reserved 1048576K +} +Event: 0.687 GC heap after +{Heap after GC invocations=3 (full 0): + garbage-first heap total 606208K, used 28495K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 11758K, committed 11968K, reserved 1114112K + class space used 1313K, committed 1408K, reserved 1048576K +} +Event: 1.150 GC heap before +{Heap before GC invocations=3 (full 0): + garbage-first heap total 606208K, used 77647K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 7 young (57344K), 1 survivors (8192K) + Metaspace used 19291K, committed 19584K, reserved 1114112K + class space used 2462K, committed 2560K, reserved 1048576K +} +Event: 1.153 GC heap after +{Heap after GC invocations=4 (full 0): + garbage-first heap total 606208K, used 31366K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 19291K, committed 19584K, reserved 1114112K + class space used 2462K, committed 2560K, reserved 1048576K +} +Event: 1.228 GC heap before +{Heap before GC invocations=4 (full 0): + garbage-first heap total 606208K, used 47750K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 4 young (32768K), 1 survivors (8192K) + Metaspace used 21191K, committed 21504K, reserved 1114112K + class space used 2665K, committed 2816K, reserved 1048576K +} +Event: 1.231 GC heap after +{Heap after GC invocations=5 (full 0): + garbage-first heap total 606208K, used 32744K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 21191K, committed 21504K, reserved 1114112K + class space used 2665K, committed 2816K, reserved 1048576K +} +Event: 2.119 GC heap before +{Heap before GC invocations=6 (full 0): + garbage-first heap total 221184K, used 106472K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 12 young (98304K), 1 survivors (8192K) + Metaspace used 35766K, committed 36096K, reserved 1114112K + class space used 4465K, committed 4608K, reserved 1048576K +} +Event: 2.122 GC heap after +{Heap after GC invocations=7 (full 0): + garbage-first heap total 221184K, used 35490K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 2 young (16384K), 2 survivors (16384K) + Metaspace used 35766K, committed 36096K, reserved 1114112K + class space used 4465K, committed 4608K, reserved 1048576K +} +Event: 2.130 GC heap before +{Heap before GC invocations=7 (full 0): + garbage-first heap total 221184K, used 35490K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 3 young (24576K), 2 survivors (16384K) + Metaspace used 36067K, committed 36416K, reserved 1114112K + class space used 4504K, committed 4672K, reserved 1048576K +} +Event: 2.134 GC heap after +{Heap after GC invocations=8 (full 0): + garbage-first heap total 221184K, used 36545K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 36067K, committed 36416K, reserved 1114112K + class space used 4504K, committed 4672K, reserved 1048576K +} +Event: 2.147 GC heap before +{Heap before GC invocations=8 (full 0): + garbage-first heap total 221184K, used 36545K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 2 young (16384K), 1 survivors (8192K) + Metaspace used 36418K, committed 36736K, reserved 1114112K + class space used 4549K, committed 4672K, reserved 1048576K +} +Event: 2.148 GC heap after +{Heap after GC invocations=9 (full 0): + garbage-first heap total 442368K, used 35602K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 36418K, committed 36736K, reserved 1114112K + class space used 4549K, committed 4672K, reserved 1048576K +} +Event: 3.154 GC heap before +{Heap before GC invocations=10 (full 0): + garbage-first heap total 196608K, used 158482K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 17 young (139264K), 1 survivors (8192K) + Metaspace used 48508K, committed 48960K, reserved 1114112K + class space used 6329K, committed 6528K, reserved 1048576K +} +Event: 3.158 GC heap after +{Heap after GC invocations=11 (full 0): + garbage-first heap total 196608K, used 40351K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 48508K, committed 48960K, reserved 1114112K + class space used 6329K, committed 6528K, reserved 1048576K +} +Event: 4.257 GC heap before +{Heap before GC invocations=11 (full 0): + garbage-first heap total 196608K, used 138655K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 13 young (106496K), 1 survivors (8192K) + Metaspace used 54014K, committed 54464K, reserved 1114112K + class space used 7010K, committed 7232K, reserved 1048576K +} +Event: 4.263 GC heap after +{Heap after GC invocations=12 (full 0): + garbage-first heap total 196608K, used 46705K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 2 young (16384K), 2 survivors (16384K) + Metaspace used 54014K, committed 54464K, reserved 1114112K + class space used 7010K, committed 7232K, reserved 1048576K +} +Event: 5.515 GC heap before +{Heap before GC invocations=12 (full 0): + garbage-first heap total 196608K, used 136817K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 13 young (106496K), 2 survivors (16384K) + Metaspace used 58257K, committed 58624K, reserved 1114112K + class space used 7651K, committed 7808K, reserved 1048576K +} +Event: 5.523 GC heap after +{Heap after GC invocations=13 (full 0): + garbage-first heap total 196608K, used 52335K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 2 young (16384K), 2 survivors (16384K) + Metaspace used 58257K, committed 58624K, reserved 1114112K + class space used 7651K, committed 7808K, reserved 1048576K +} +Event: 6.372 GC heap before +{Heap before GC invocations=13 (full 0): + garbage-first heap total 196608K, used 85103K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 7 young (57344K), 2 survivors (16384K) + Metaspace used 61127K, committed 61568K, reserved 1114112K + class space used 8029K, committed 8256K, reserved 1048576K +} +Event: 6.376 GC heap after +{Heap after GC invocations=14 (full 0): + garbage-first heap total 196608K, used 53795K [0x00000005c0000000, 0x0000000800000000) + region size 8192K, 1 young (8192K), 1 survivors (8192K) + Metaspace used 61127K, committed 61568K, reserved 1114112K + class space used 8029K, committed 8256K, reserved 1048576K +} + +Dll operation events (11 events): +Event: 0.042 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjava.dylib +Event: 0.043 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libzip.dylib +Event: 0.145 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libinstrument.dylib +Event: 0.147 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libnio.dylib +Event: 0.149 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libnet.dylib +Event: 0.169 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjimage.dylib +Event: 0.179 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libzip.dylib +Event: 0.296 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libmanagement.dylib +Event: 0.309 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libmanagement_ext.dylib +Event: 0.423 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libextnet.dylib +Event: 5.147 Loaded shared library /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libverify.dylib + +Deoptimization events (20 events): +Event: 7.531 Thread 0x0000000107808a00 DEOPT PACKING pc=0x0000000108333ac8 sp=0x000000016ba89ac0 +Event: 7.531 Thread 0x0000000107808a00 DEOPT UNPACKING pc=0x000000010804777c sp=0x000000016ba897a0 mode 1 +Event: 7.531 Thread 0x0000000107808a00 DEOPT PACKING pc=0x00000001086c7750 sp=0x000000016ba89b60 +Event: 7.531 Thread 0x0000000107808a00 DEOPT UNPACKING pc=0x000000010804777c sp=0x000000016ba898e0 mode 1 +Event: 7.531 Thread 0x0000000107808a00 DEOPT PACKING pc=0x00000001082b8728 sp=0x000000016ba89240 +Event: 7.531 Thread 0x0000000107808a00 DEOPT UNPACKING pc=0x000000010804777c sp=0x000000016ba88ee0 mode 1 +Event: 7.531 Thread 0x0000000107808a00 DEOPT PACKING pc=0x00000001082b823c sp=0x000000016ba89310 +Event: 7.531 Thread 0x0000000107808a00 DEOPT UNPACKING pc=0x000000010804777c sp=0x000000016ba88fe0 mode 1 +Event: 7.531 Thread 0x0000000107808a00 DEOPT PACKING pc=0x0000000108333ac8 sp=0x000000016ba89ab0 +Event: 7.531 Thread 0x0000000107808a00 DEOPT UNPACKING pc=0x000000010804777c sp=0x000000016ba89790 mode 1 +Event: 7.531 Thread 0x0000000107808a00 DEOPT PACKING pc=0x00000001086c7750 sp=0x000000016ba89b50 +Event: 7.531 Thread 0x0000000107808a00 DEOPT UNPACKING pc=0x000000010804777c sp=0x000000016ba898d0 mode 1 +Event: 7.543 Thread 0x0000000107808a00 DEOPT PACKING pc=0x0000000108535ad4 sp=0x000000016ba89bb0 +Event: 7.543 Thread 0x0000000107808a00 DEOPT UNPACKING pc=0x000000010804777c sp=0x000000016ba89930 mode 1 +Event: 7.545 Thread 0x0000000107808a00 DEOPT PACKING pc=0x0000000108535ad4 sp=0x000000016ba89ba0 +Event: 7.545 Thread 0x0000000107808a00 DEOPT UNPACKING pc=0x000000010804777c sp=0x000000016ba89920 mode 1 +Event: 7.572 Thread 0x0000000107808a00 DEOPT PACKING pc=0x0000000108535ad4 sp=0x000000016ba89bb0 +Event: 7.572 Thread 0x0000000107808a00 DEOPT UNPACKING pc=0x000000010804777c sp=0x000000016ba89930 mode 1 +Event: 7.572 Thread 0x0000000107808a00 DEOPT PACKING pc=0x0000000108535ad4 sp=0x000000016ba89ba0 +Event: 7.572 Thread 0x0000000107808a00 DEOPT UNPACKING pc=0x000000010804777c sp=0x000000016ba89920 mode 1 + +Classes unloaded (1 events): +Event: 6.390 Thread 0x0000000104d04d00 Unloading class 0x000000e001554000 'SC' + +Classes redefined (1 events): +Event: 0.160 Thread 0x0000000104d04d00 redefined class name=java.lang.Throwable, count=1 + +Internal exceptions (20 events): +Event: 5.854 Thread 0x000000011b960000 Exception (0x00000005c9c7a940) +thrown [src/hotspot/share/runtime/reflection.cpp, line 1121] +Event: 6.357 Thread 0x000000011b960000 Exception (0x00000005c8b001d0) +thrown [src/hotspot/share/runtime/reflection.cpp, line 1121] +Event: 6.865 Thread 0x000000011b960000 Exception (0x00000005c9009658) +thrown [src/hotspot/share/runtime/reflection.cpp, line 1121] +Event: 7.070 Thread 0x0000000107808a00 Exception (0x00000005c8d01110) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 7.070 Thread 0x0000000107808a00 Exception (0x00000005c8d05e08) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 7.071 Thread 0x0000000107808a00 Exception (0x00000005c8d0b6a8) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 7.072 Thread 0x0000000107808a00 Exception (0x00000005c8d17440) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 7.177 Thread 0x0000000107808a00 Exception (0x00000005c7aaa528) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 248] +Event: 7.178 Thread 0x0000000107808a00 Exception (0x00000005c7ab2338) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 248] +Event: 7.187 Thread 0x0000000107808a00 Exception (0x00000005c7b50300) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 248] +Event: 7.187 Thread 0x0000000107808a00 Exception (0x00000005c7b577f8) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 248] +Event: 7.187 Thread 0x0000000107808a00 Exception (0x00000005c7b5fdb8) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 248] +Event: 7.207 Thread 0x0000000107808a00 Exception (0x00000005c7b914a8) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 248] +Event: 7.216 Thread 0x0000000107808a00 Exception (0x00000005c7b9a268) +thrown [src/hotspot/share/classfile/systemDictionary.cpp, line 248] +Event: 7.342 Thread 0x0000000107808a00 Exception (0x00000005c72e5358) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 759] +Event: 7.368 Thread 0x000000011b960000 Exception (0x00000005c7479150) +thrown [src/hotspot/share/runtime/reflection.cpp, line 1121] +Event: 7.479 Thread 0x0000000107808a00 Exception (0x00000005c69c4500) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 826] +Event: 7.525 Thread 0x0000000107808a00 Exception (0x00000005c6bbd418) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 826] +Event: 7.526 Thread 0x0000000107808a00 Exception (0x00000005c6bc3d28) +thrown [src/hotspot/share/interpreter/linkResolver.cpp, line 826] +Event: 7.704 Thread 0x000000011e51f600 Exception (0x00000005c6477ae0) +thrown [src/hotspot/share/prims/jni.cpp, line 516] + +VM Operations (20 events): +Event: 6.389 Executing VM operation: G1PauseRemark +Event: 6.394 Executing VM operation: G1PauseRemark done +Event: 6.401 Executing VM operation: G1PauseCleanup +Event: 6.401 Executing VM operation: G1PauseCleanup done +Event: 6.543 Executing VM operation: HandshakeAllThreads +Event: 6.543 Executing VM operation: HandshakeAllThreads done +Event: 6.555 Executing VM operation: HandshakeAllThreads +Event: 6.555 Executing VM operation: HandshakeAllThreads done +Event: 6.560 Executing VM operation: HandshakeAllThreads +Event: 6.560 Executing VM operation: HandshakeAllThreads done +Event: 7.076 Executing VM operation: HandshakeAllThreads +Event: 7.076 Executing VM operation: HandshakeAllThreads done +Event: 7.080 Executing VM operation: HandshakeAllThreads +Event: 7.080 Executing VM operation: HandshakeAllThreads done +Event: 7.096 Executing VM operation: HandshakeAllThreads +Event: 7.096 Executing VM operation: HandshakeAllThreads done +Event: 7.131 Executing VM operation: ICBufferFull +Event: 7.131 Executing VM operation: ICBufferFull done +Event: 7.466 Executing VM operation: ICBufferFull +Event: 7.466 Executing VM operation: ICBufferFull done + +Events (20 events): +Event: 7.703 loading class java/net/SocksSocketImpl$3 done +Event: 7.704 loading class sun/net/util/SocketExceptions +Event: 7.704 loading class sun/net/util/SocketExceptions done +Event: 7.704 Thread 0x000000011b77a400 Thread added: 0x000000011b77a400 +Event: 7.704 loading class java/lang/Throwable$WrappedPrintWriter +Event: 7.704 loading class java/lang/Throwable$WrappedPrintWriter done +Event: 7.704 Protecting memory [0x000000031ee8c000,0x000000031ee98000] with protection modes 0 +Event: 7.704 loading class com/intellij/rt/debugger/agent/CaptureStorage$9 +Event: 7.704 loading class com/intellij/rt/debugger/agent/CaptureStorage$Callable +Event: 7.704 loading class com/intellij/rt/debugger/agent/CaptureStorage$Callable done +Event: 7.704 loading class com/intellij/rt/debugger/agent/CaptureStorage$9 done +Event: 7.705 loading class jdk/internal/loader/BootLoader$PackageHelper$1 +Event: 7.705 loading class jdk/internal/loader/BootLoader$PackageHelper$1 done +Event: 7.705 loading class jdk/internal/loader/BootLoader$PackageHelper$2 +Event: 7.705 loading class jdk/internal/loader/BootLoader$PackageHelper$2 done +Event: 7.705 loading class java/util/jar/JarInputStream +Event: 7.705 loading class java/util/zip/ZipInputStream +Event: 7.705 loading class java/util/zip/ZipInputStream done +Event: 7.705 loading class java/util/jar/JarInputStream done +Event: 7.706 loading class com/intellij/rt/debugger/agent/CaptureStorage$StackData + + +Dynamic libraries: +0x0000000104638000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjli.dylib +0x0000000196c18000 /usr/lib/libz.1.dylib +0x0000000196cce000 /usr/lib/libSystem.B.dylib +0x0000000196cc8000 /usr/lib/system/libcache.dylib +0x0000000196c83000 /usr/lib/system/libcommonCrypto.dylib +0x0000000196cae000 /usr/lib/system/libcompiler_rt.dylib +0x0000000196ca3000 /usr/lib/system/libcopyfile.dylib +0x0000000186bb6000 /usr/lib/system/libcorecrypto.dylib +0x0000000186cb6000 /usr/lib/system/libdispatch.dylib +0x0000000186a53000 /usr/lib/system/libdyld.dylib +0x0000000196cbe000 /usr/lib/system/libkeymgr.dylib +0x0000000196c66000 /usr/lib/system/libmacho.dylib +0x0000000195ef9000 /usr/lib/system/libquarantine.dylib +0x0000000196cbb000 /usr/lib/system/libremovefile.dylib +0x000000018d629000 /usr/lib/system/libsystem_asl.dylib +0x0000000186b3c000 /usr/lib/system/libsystem_blocks.dylib +0x0000000186d01000 /usr/lib/system/libsystem_c.dylib +0x0000000196cb2000 /usr/lib/system/libsystem_collections.dylib +0x0000000194899000 /usr/lib/system/libsystem_configuration.dylib +0x0000000193487000 /usr/lib/system/libsystem_containermanager.dylib +0x0000000196698000 /usr/lib/system/libsystem_coreservices.dylib +0x000000018ae50000 /usr/lib/system/libsystem_darwin.dylib +0x000000028c8a4000 /usr/lib/system/libsystem_darwindirectory.dylib +0x0000000196cbf000 /usr/lib/system/libsystem_dnssd.dylib +0x000000028c8a8000 /usr/lib/system/libsystem_eligibility.dylib +0x0000000186cfe000 /usr/lib/system/libsystem_featureflags.dylib +0x0000000186e83000 /usr/lib/system/libsystem_info.dylib +0x0000000196c27000 /usr/lib/system/libsystem_m.dylib +0x0000000186c65000 /usr/lib/system/libsystem_malloc.dylib +0x000000018d58c000 /usr/lib/system/libsystem_networkextension.dylib +0x000000018b2bb000 /usr/lib/system/libsystem_notify.dylib +0x000000019489e000 /usr/lib/system/libsystem_sandbox.dylib +0x000000028c8b3000 /usr/lib/system/libsystem_sanitizers.dylib +0x0000000196cb7000 /usr/lib/system/libsystem_secinit.dylib +0x0000000186e2f000 /usr/lib/system/libsystem_kernel.dylib +0x0000000186e7a000 /usr/lib/system/libsystem_platform.dylib +0x0000000186e6d000 /usr/lib/system/libsystem_pthread.dylib +0x000000018f1e2000 /usr/lib/system/libsystem_symptoms.dylib +0x0000000186b95000 /usr/lib/system/libsystem_trace.dylib +0x000000028c8bb000 /usr/lib/system/libsystem_trial.dylib +0x0000000196c91000 /usr/lib/system/libunwind.dylib +0x0000000186b40000 /usr/lib/system/libxpc.dylib +0x0000000186a00000 /usr/lib/libobjc.A.dylib +0x0000000186eb3000 /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation +0x000000019a5c3000 /usr/lib/swift/libswiftCore.dylib +0x0000000186e14000 /usr/lib/libc++abi.dylib +0x000000028ac91000 /usr/lib/libRosetta.dylib +0x0000000186d83000 /usr/lib/libc++.1.dylib +0x0000000188722000 /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation +0x00000001a41a3000 /usr/lib/swift/libswiftObjectiveC.dylib +0x000000028c10d000 /usr/lib/libswiftPrespecialized.dylib +0x0000000188391000 /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration +0x0000000191703000 /System/Library/PrivateFrameworks/CoreAutoLayout.framework/Versions/A/CoreAutoLayout +0x0000000196cd0000 /usr/lib/libfakelink.dylib +0x0000000196f79000 /usr/lib/libcompression.dylib +0x000000018d1d6000 /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork +0x0000000190b34000 /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration +0x0000000196d23000 /usr/lib/libarchive.2.dylib +0x0000000190a39000 /usr/lib/libDiagnosticMessagesClient.dylib +0x000000018ab7a000 /usr/lib/libicucore.A.dylib +0x000000019174c000 /usr/lib/libxml2.2.dylib +0x000000019f452000 /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices +0x00000001948ac000 /usr/lib/liblangid.dylib +0x000000018b1d2000 /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit +0x000000019d0c4000 /System/Library/Frameworks/Combine.framework/Versions/A/Combine +0x000000023fff3000 /System/Library/PrivateFrameworks/CollectionsInternal.framework/Versions/A/CollectionsInternal +0x000000026c039000 /System/Library/PrivateFrameworks/ReflectionInternal.framework/Versions/A/ReflectionInternal +0x000000026cf8d000 /System/Library/PrivateFrameworks/RuntimeInternal.framework/Versions/A/RuntimeInternal +0x0000000196cd2000 /System/Library/PrivateFrameworks/SoftLinking.framework/Versions/A/SoftLinking +0x00000001b488c000 /usr/lib/swift/libswiftCoreFoundation.dylib +0x00000001b164f000 /usr/lib/swift/libswiftDarwin.dylib +0x00000001a11c9000 /usr/lib/swift/libswiftDispatch.dylib +0x00000001b48ed000 /usr/lib/swift/libswiftIOKit.dylib +0x000000028c550000 /usr/lib/swift/libswiftSystem.dylib +0x00000001b489f000 /usr/lib/swift/libswiftXPC.dylib +0x000000028c582000 /usr/lib/swift/libswift_Builtin_float.dylib +0x000000028c583000 /usr/lib/swift/libswift_Concurrency.dylib +0x000000028c60f000 /usr/lib/swift/libswift_DarwinFoundation1.dylib +0x000000028c6b3000 /usr/lib/swift/libswift_StringProcessing.dylib +0x00000001a41a7000 /usr/lib/swift/libswiftos.dylib +0x000000018b152000 /System/Library/PrivateFrameworks/CoreServicesInternal.framework/Versions/A/CoreServicesInternal +0x0000000196c9b000 /usr/lib/liboah.dylib +0x000000018a75a000 /System/Library/Frameworks/Security.framework/Versions/A/Security +0x00000001a35d7000 /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages +0x00000001b10f3000 /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS +0x00000001916c8000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/FSEvents +0x000000018ae5a000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore +0x0000000190aa8000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata +0x000000019669f000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices +0x0000000196e1b000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit +0x000000018f15c000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE +0x0000000187412000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices +0x0000000198224000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices +0x00000001916d5000 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SharedFileList.framework/Versions/A/SharedFileList +0x0000000196eae000 /usr/lib/libapple_nghttp2.dylib +0x000000018ed78000 /usr/lib/libsqlite3.dylib +0x000000018ef61000 /System/Library/Frameworks/Accounts.framework/Versions/A/Accounts +0x00000001a3819000 /System/Library/PrivateFrameworks/AppSupport.framework/Versions/A/AppSupport +0x00000001b363e000 /System/Library/Frameworks/AVFoundation.framework/Versions/A/AVFoundation +0x0000000190a09000 /System/Library/PrivateFrameworks/CoreAnalytics.framework/Versions/A/CoreAnalytics +0x000000018dc1c000 /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics +0x000000019b2fe000 /System/Library/Frameworks/GSS.framework/Versions/A/GSS +0x00000001996e6000 /System/Library/PrivateFrameworks/InternationalSupport.framework/Versions/A/InternationalSupport +0x000000018f0f0000 /System/Library/PrivateFrameworks/RunningBoardServices.framework/Versions/A/RunningBoardServices +0x00000001a412b000 /System/Library/PrivateFrameworks/StreamingZip.framework/Versions/A/StreamingZip +0x000000018d5a7000 /usr/lib/libenergytrace.dylib +0x000000018f1eb000 /System/Library/Frameworks/Network.framework/Versions/A/Network +0x0000000195f21000 /usr/lib/libbsm.0.dylib +0x0000000196c6a000 /usr/lib/system/libkxld.dylib +0x000000023b5c5000 /System/Library/PrivateFrameworks/AppleKeyStore.framework/Versions/A/AppleKeyStore +0x000000028a993000 /usr/lib/libCoreEntitlements.dylib +0x0000000260705000 /System/Library/PrivateFrameworks/MessageSecurity.framework/Versions/A/MessageSecurity +0x000000018ed5c000 /System/Library/PrivateFrameworks/ProtocolBuffer.framework/Versions/A/ProtocolBuffer +0x00000001a05d8000 /System/Library/PrivateFrameworks/SymptomDiagnosticReporter.framework/Versions/A/SymptomDiagnosticReporter +0x0000000198469000 /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport +0x000000018d5a9000 /usr/lib/libMobileGestalt.dylib +0x000000019667f000 /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression +0x0000000195f09000 /usr/lib/libcoretls.dylib +0x000000019829a000 /usr/lib/libcoretls_cfhelpers.dylib +0x0000000196f73000 /usr/lib/libpam.2.dylib +0x0000000198310000 /usr/lib/libxar.1.dylib +0x000000019829c000 /System/Library/PrivateFrameworks/APFS.framework/Versions/A/APFS +0x0000000278713000 /System/Library/PrivateFrameworks/SwiftASN1Internal.framework/Versions/A/SwiftASN1Internal +0x000000019831f000 /usr/lib/libutil.dylib +0x00000001948a7000 /System/Library/PrivateFrameworks/AppleSystemInfo.framework/Versions/A/AppleSystemInfo +0x0000000195bd0000 /System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/Versions/A/IOMobileFramebuffer +0x00000001934c0000 /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface +0x00000001a2f37000 /System/Library/PrivateFrameworks/CoreWiFi.framework/Versions/A/CoreWiFi +0x00000001b474c000 /System/Library/PrivateFrameworks/LoggingSupport.framework/Versions/A/LoggingSupport +0x000000019b361000 /System/Library/PrivateFrameworks/MobileAsset.framework/Versions/A/MobileAsset +0x00000001a05e8000 /System/Library/PrivateFrameworks/PowerLog.framework/Versions/A/PowerLog +0x00000001a1aaa000 /System/Library/PrivateFrameworks/Rapport.framework/Versions/A/Rapport +0x000000023416e000 /System/Library/Frameworks/SwiftData.framework/Versions/A/SwiftData +0x000000018cc0a000 /System/Library/Frameworks/UniformTypeIdentifiers.framework/Versions/A/UniformTypeIdentifiers +0x00000001918f5000 /System/Library/PrivateFrameworks/UserManagement.framework/Versions/A/UserManagement +0x000000018d0fd000 /usr/lib/libboringssl.dylib +0x000000018f1d0000 /usr/lib/libdns_services.dylib +0x00000001b3772000 /usr/lib/libquic.dylib +0x000000019a554000 /usr/lib/libusrtcp.dylib +0x000000023c47f000 /System/Library/PrivateFrameworks/AtomicsInternal.framework/Versions/A/AtomicsInternal +0x00000001dab32000 /System/Library/PrivateFrameworks/InternalSwiftProtobuf.framework/Versions/A/InternalSwiftProtobuf +0x000000028c3d7000 /usr/lib/swift/libswiftDistributed.dylib +0x000000028c400000 /usr/lib/swift/libswiftObservation.dylib +0x000000028c53c000 /usr/lib/swift/libswiftSynchronization.dylib +0x00000001948a5000 /System/Library/PrivateFrameworks/AggregateDictionary.framework/Versions/A/AggregateDictionary +0x000000023ccaf000 /System/Library/PrivateFrameworks/BiomeLibrary.framework/Versions/A/BiomeLibrary +0x00000001c38d5000 /System/Library/PrivateFrameworks/BiomeStreams.framework/Versions/A/BiomeStreams +0x00000001bf924000 /System/Library/PrivateFrameworks/BiomeFoundation.framework/Versions/A/BiomeFoundation +0x00000001c9b82000 /System/Library/PrivateFrameworks/BiomePubSub.framework/Versions/A/BiomePubSub +0x000000018e96e000 /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData +0x00000001a510e000 /System/Library/PrivateFrameworks/ProactiveSupport.framework/Versions/A/ProactiveSupport +0x00000002361cc000 /System/Library/Frameworks/_LocationEssentials.framework/Versions/A/_LocationEssentials +0x000000019827b000 /usr/lib/liblzma.5.dylib +0x000000019f6d1000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate +0x0000000195e02000 /System/Library/PrivateFrameworks/MobileKeyBag.framework/Versions/A/MobileKeyBag +0x00000001a3b2d000 /System/Library/PrivateFrameworks/InternationalTextSearch.framework/Versions/A/InternationalTextSearch +0x00000001bbdf7000 /System/Library/PrivateFrameworks/SoftwareUpdateCoreSupport.framework/Versions/A/SoftwareUpdateCoreSupport +0x00000001c4374000 /System/Library/PrivateFrameworks/SoftwareUpdateCoreConnect.framework/Versions/A/SoftwareUpdateCoreConnect +0x00000001a36d1000 /System/Library/PrivateFrameworks/RemoteServiceDiscovery.framework/Versions/A/RemoteServiceDiscovery +0x00000001bb9ce000 /System/Library/PrivateFrameworks/MSUDataAccessor.framework/Versions/A/MSUDataAccessor +0x00000001b691f000 /usr/lib/libbootpolicy.dylib +0x00000001a36e8000 /System/Library/PrivateFrameworks/RemoteXPC.framework/Versions/A/RemoteXPC +0x00000001c37a9000 /usr/lib/libFDR.dylib +0x00000001c9784000 /usr/lib/libamsupport.dylib +0x000000028ac89000 /usr/lib/libReverseProxyDevice.dylib +0x000000023ae33000 /System/Library/PrivateFrameworks/AppleDeviceQuerySupport.framework/Versions/A/AppleDeviceQuerySupport +0x00000001cc94e000 /usr/lib/libpartition2_dynamic.dylib +0x0000000196e8a000 /System/Library/PrivateFrameworks/AppleSauce.framework/Versions/A/AppleSauce +0x000000028a83e000 /usr/lib/libAppleArchive.dylib +0x000000019668b000 /usr/lib/libbz2.1.0.dylib +0x0000000190b3e000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage +0x000000019f42d000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib +0x0000000198356000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib +0x0000000187916000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib +0x00000001a3b2c000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices +0x0000000191833000 /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo +0x000000018e372000 /System/Library/Frameworks/ColorSync.framework/Versions/A/ColorSync +0x0000000189d9a000 /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText +0x0000000193fb3000 /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO +0x000000019af0e000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS +0x000000018e51a000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices +0x00000001995dc000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore +0x000000019b2c7000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD +0x000000019b2c2000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSyncLegacy.framework/Versions/A/ColorSyncLegacy +0x000000019aee0000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis +0x000000018d665000 /System/Library/PrivateFrameworks/SkyLight.framework/Versions/A/SkyLight +0x000000019398e000 /System/Library/PrivateFrameworks/FontServices.framework/libFontParser.dylib +0x000000018effe000 /System/Library/PrivateFrameworks/BaseBoard.framework/Versions/A/BaseBoard +0x00000001a152a000 /System/Library/PrivateFrameworks/BoardServices.framework/Versions/A/BoardServices +0x00000001a33f9000 /System/Library/PrivateFrameworks/BackBoardServices.framework/Versions/A/BackBoardServices +0x000000023cbb4000 /System/Library/PrivateFrameworks/BackBoardHIDEventFoundation.framework/Versions/A/BackBoardHIDEventFoundation +0x00000001898b6000 /System/Library/Frameworks/CoreDisplay.framework/Versions/A/CoreDisplay +0x0000000198f35000 /System/Library/Frameworks/VideoToolbox.framework/Versions/A/VideoToolbox +0x0000000196f71000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/MetalPerformanceShaders +0x000000026af43000 /System/Library/PrivateFrameworks/ProDisplayLibrary.framework/Versions/A/ProDisplayLibrary +0x00000001a722e000 /System/Library/PrivateFrameworks/IOSurfaceAccelerator.framework/Versions/A/IOSurfaceAccelerator +0x00000001934e8000 /System/Library/Frameworks/Metal.framework/Versions/A/Metal +0x00000001934dd000 /System/Library/PrivateFrameworks/IOAccelerator.framework/Versions/A/IOAccelerator +0x00000001937ec000 /System/Library/Frameworks/CoreMedia.framework/Versions/A/CoreMedia +0x000000018d641000 /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC +0x0000000198eed000 /System/Library/PrivateFrameworks/WatchdogClient.framework/Versions/A/WatchdogClient +0x0000000190f63000 /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore +0x0000000198eef000 /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport +0x00000001cc730000 /usr/lib/swift/libswiftAccelerate.dylib +0x00000001b486c000 /usr/lib/swift/libswiftCoreAudio.dylib +0x00000001d08c1000 /usr/lib/swift/libswiftCoreMedia.dylib +0x00000001c2862000 /usr/lib/swift/libswiftMetal.dylib +0x00000001d2074000 /usr/lib/swift/libswiftOSLog.dylib +0x00000001c7c88000 /usr/lib/swift/libswiftQuartzCore.dylib +0x00000001cc720000 /usr/lib/swift/libswiftUniformTypeIdentifiers.dylib +0x000000028c56a000 /usr/lib/swift/libswiftVideoToolbox.dylib +0x00000001b83e6000 /usr/lib/swift/libswiftsimd.dylib +0x00000001c9be3000 /System/Library/PrivateFrameworks/BiomeStorage.framework/Versions/A/BiomeStorage +0x00000002593f4000 /System/Library/PrivateFrameworks/IntelligencePlatformLibrary.framework/Versions/A/IntelligencePlatformLibrary +0x0000000269d07000 /System/Library/PrivateFrameworks/PoirotSchematizer.framework/Versions/A/PoirotSchematizer +0x000000023d56a000 /System/Library/PrivateFrameworks/BiomeSync.framework/Versions/A/BiomeSync +0x000000023cc95000 /System/Library/PrivateFrameworks/BiomeDSL.framework/Versions/A/BiomeDSL +0x00000001e2d3d000 /System/Library/PrivateFrameworks/FeatureFlags.framework/Versions/A/FeatureFlags +0x0000000269d75000 /System/Library/PrivateFrameworks/PoirotUDFs.framework/Versions/A/PoirotUDFs +0x000000028c612000 /usr/lib/swift/libswift_DarwinFoundation2.dylib +0x000000028c613000 /usr/lib/swift/libswift_DarwinFoundation3.dylib +0x00000001a1a9f000 /System/Library/PrivateFrameworks/CoreTime.framework/Versions/A/CoreTime +0x0000000196d08000 /usr/lib/libiconv.2.dylib +0x0000000196c65000 /usr/lib/libcharset.1.dylib +0x0000000269cca000 /System/Library/PrivateFrameworks/PoirotSQLite.framework/Versions/A/PoirotSQLite +0x000000028c614000 /usr/lib/swift/libswift_RegexParser.dylib +0x000000023eba0000 /System/Library/PrivateFrameworks/CascadeSets.framework/Versions/A/CascadeSets +0x000000019b4d8000 /System/Library/PrivateFrameworks/CorePhoneNumbers.framework/Versions/A/CorePhoneNumbers +0x0000000198ce7000 /System/Library/PrivateFrameworks/AppleJPEG.framework/Versions/A/AppleJPEG +0x00000001986c0000 /usr/lib/libexpat.1.dylib +0x00000001994b2000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib +0x00000001994dd000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib +0x00000001995c5000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib +0x0000000198d2c000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib +0x00000001983d0000 /usr/lib/libate.dylib +0x000000019956c000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib +0x0000000199563000 /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib +0x000000024f044000 /System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/32023/Libraries/libllvm-flatbuffers.dylib +0x0000000249aa3000 /System/Library/PrivateFrameworks/FramePacing.framework/Versions/A/FramePacing +0x000000022cbb3000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreFSCache.dylib +0x000000024abd1000 /System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/32023/Libraries/libGPUCompilerUtils.dylib +0x00000001a15f7000 /System/Library/PrivateFrameworks/GraphicsServices.framework/Versions/A/GraphicsServices +0x000000022cbc1000 /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL +0x000000022cc12000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib +0x000000022cbd5000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib +0x000000022cda2000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib +0x000000022cbde000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib +0x000000022cbd2000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib +0x000000022cbbb000 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib +0x000000019955e000 /System/Library/PrivateFrameworks/GPUWrangler.framework/Versions/A/GPUWrangler +0x000000019953e000 /System/Library/PrivateFrameworks/IOPresentment.framework/Versions/A/IOPresentment +0x0000000199566000 /System/Library/PrivateFrameworks/DSExternalDisplay.framework/Versions/A/DSExternalDisplay +0x00000002805c9000 /System/Library/PrivateFrameworks/VideoToolboxParavirtualizationSupport.framework/Versions/A/VideoToolboxParavirtualizationSupport +0x0000000198677000 /System/Library/PrivateFrameworks/AppleVA.framework/Versions/A/AppleVA +0x000000022ec3e000 /System/Library/Frameworks/ExtensionFoundation.framework/Versions/A/ExtensionFoundation +0x00000001995cb000 /System/Library/PrivateFrameworks/CMCaptureCore.framework/Versions/A/CMCaptureCore +0x0000000198951000 /usr/lib/libspindump.dylib +0x0000000189fc4000 /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio +0x0000000198944000 /System/Library/PrivateFrameworks/AppServerSupport.framework/Versions/A/AppServerSupport +0x000000019b2d0000 /System/Library/PrivateFrameworks/perfdata.framework/Versions/A/perfdata +0x00000001899d7000 /System/Library/PrivateFrameworks/AudioToolboxCore.framework/Versions/A/AudioToolboxCore +0x00000001937c2000 /System/Library/PrivateFrameworks/caulk.framework/Versions/A/caulk +0x000000019aec6000 /usr/lib/libAudioStatistics.dylib +0x00000001b3867000 /System/Library/PrivateFrameworks/SystemPolicy.framework/Versions/A/SystemPolicy +0x000000019b174000 /usr/lib/libSMC.dylib +0x00000001bb1dd000 /usr/lib/swift/libswiftCoreMIDI.dylib +0x00000001a651d000 /System/Library/Frameworks/CoreMIDI.framework/Versions/A/CoreMIDI +0x000000019948c000 /usr/lib/libAudioToolboxUtility.dylib +0x000000019b2de000 /usr/lib/libperfcheck.dylib +0x000000023c54e000 /System/Library/PrivateFrameworks/AudioAnalytics.framework/Versions/A/AudioAnalytics +0x00000001da81e000 /System/Library/Frameworks/OSLog.framework/Versions/A/OSLog +0x0000000265777000 /System/Library/PrivateFrameworks/OSEligibility.framework/Versions/A/OSEligibility +0x0000000198746000 /System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices +0x0000000230025000 /System/Library/Frameworks/LightweightCodeRequirements.framework/Versions/A/LightweightCodeRequirements +0x00000001985c0000 /System/Library/PrivateFrameworks/PlugInKit.framework/Versions/A/PlugInKit +0x0000000195e1a000 /System/Library/PrivateFrameworks/AssertionServices.framework/Versions/A/AssertionServices +0x00000001986e5000 /System/Library/PrivateFrameworks/IconFoundation.framework/Versions/A/IconFoundation +0x0000000255f80000 /System/Library/PrivateFrameworks/IconRendering.framework/Versions/A/IconRendering +0x00000001913ca000 /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI +0x00000001942f4000 /System/Library/Frameworks/CoreImage.framework/Versions/A/CoreImage +0x000000026d172000 /System/Library/PrivateFrameworks/SFSymbols.framework/Versions/A/SFSymbols +0x000000022eaf4000 /System/Library/Frameworks/DeveloperToolsSupport.framework/Versions/A/DeveloperToolsSupport +0x00000001ab7ca000 /System/Library/PrivateFrameworks/RenderBox.framework/Versions/A/RenderBox +0x0000000193f75000 /System/Library/PrivateFrameworks/CoreSVG.framework/Versions/A/CoreSVG +0x000000019964f000 /System/Library/PrivateFrameworks/TextureIO.framework/Versions/A/TextureIO +0x00000001b48ec000 /usr/lib/swift/libswiftCoreImage.dylib +0x00000001988f4000 /System/Library/PrivateFrameworks/GraphVisualizer.framework/Versions/A/GraphVisualizer +0x00000002499ae000 /System/Library/PrivateFrameworks/FontServices.framework/Versions/A/FontServices +0x0000000198904000 /System/Library/PrivateFrameworks/OTSVG.framework/Versions/A/OTSVG +0x0000000191379000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib +0x000000028b763000 /usr/lib/libhvf.dylib +0x0000000266404000 /System/Library/PrivateFrameworks/ParsingInternal.framework/Versions/A/ParsingInternal +0x00000002499b2000 /System/Library/PrivateFrameworks/FontServices.framework/libXTFontStaticRegistryData.dylib +0x00000001947df000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSCore.framework/Versions/A/MPSCore +0x00000001965ea000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSImage.framework/Versions/A/MPSImage +0x0000000195fa9000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNeuralNetwork.framework/Versions/A/MPSNeuralNetwork +0x00000001963e8000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSMatrix.framework/Versions/A/MPSMatrix +0x0000000196200000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSRayIntersector.framework/Versions/A/MPSRayIntersector +0x000000019641a000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNDArray.framework/Versions/A/MPSNDArray +0x0000000230eaa000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSFunctions.framework/Versions/A/MPSFunctions +0x0000000230e8b000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSBenchmarkLoop.framework/Versions/A/MPSBenchmarkLoop +0x0000000230ebe000 /System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSHost.framework/Versions/A/MPSHost +0x000000018772d000 /System/Library/PrivateFrameworks/MetalTools.framework/Versions/A/MetalTools +0x00000001b9b0d000 /System/Library/PrivateFrameworks/IOAccelMemoryInfo.framework/Versions/A/IOAccelMemoryInfo +0x00000001c807b000 /System/Library/PrivateFrameworks/kperf.framework/Versions/A/kperf +0x00000001b4868000 /System/Library/PrivateFrameworks/GPURawCounter.framework/Versions/A/GPURawCounter +0x00000001a5299000 /System/Library/PrivateFrameworks/ASEProcessing.framework/Versions/A/ASEProcessing +0x00000001d618a000 /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication +0x00000002698b5000 /System/Library/PrivateFrameworks/PhotosensitivityProcessing.framework/Versions/A/PhotosensitivityProcessing +0x000000026d1f8000 /System/Library/PrivateFrameworks/SILManager.framework/Versions/A/SILManager +0x00000001a1943000 /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication +0x00000001b47db000 /System/Library/PrivateFrameworks/MallocStackLogging.framework/Versions/A/MallocStackLogging +0x00000001a1921000 /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols +0x00000001c67cc000 /System/Library/PrivateFrameworks/OSAnalytics.framework/Versions/A/OSAnalytics +0x0000000247709000 /System/Library/PrivateFrameworks/DeviceRecovery.framework/Versions/A/DeviceRecovery +0x000000027be51000 /System/Library/PrivateFrameworks/Tightbeam.framework/Versions/A/Tightbeam +0x00000001c2870000 /usr/lib/swift/libswiftCompression.dylib +0x00000001ccebd000 /System/Library/PrivateFrameworks/AFKUser.framework/Versions/A/AFKUser +0x0000000199597000 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATSUI.framework/Versions/A/ATSUI +0x000000019ac6f000 /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox +0x0000000196a5c000 /System/Library/Frameworks/UserNotifications.framework/Versions/A/UserNotifications +0x00000001ba2a4000 /System/Library/PrivateFrameworks/SiriInstrumentation.framework/Versions/A/SiriInstrumentation +0x000000026f688000 /System/Library/PrivateFrameworks/SiriAnalytics.framework/Versions/A/SiriAnalytics +0x00000001b7a03000 /System/Library/PrivateFrameworks/FeedbackLogger.framework/Versions/A/FeedbackLogger +0x00000001d230d000 /usr/lib/swift/libswiftAVFoundation.dylib +0x000000027e67a000 /System/Library/PrivateFrameworks/UnifiedAssetFramework.framework/Versions/A/UnifiedAssetFramework +0x000000019ae45000 /System/Library/PrivateFrameworks/AudioSession.framework/Versions/A/AudioSession +0x0000000198805000 /System/Library/PrivateFrameworks/MediaExperience.framework/Versions/A/MediaExperience +0x000000019ac19000 /System/Library/PrivateFrameworks/AudioSession.framework/libSessionUtility.dylib +0x00000001a04cd000 /System/Library/Frameworks/CoreBluetooth.framework/Versions/A/CoreBluetooth +0x0000000195c8d000 /System/Library/PrivateFrameworks/CoreUtils.framework/Versions/A/CoreUtils +0x00000001ac4fe000 /System/Library/PrivateFrameworks/HID.framework/Versions/A/HID +0x00000002465fa000 /System/Library/PrivateFrameworks/CoreUtilsExtras.framework/Versions/A/CoreUtilsExtras +0x0000000255ed5000 /System/Library/PrivateFrameworks/IO80211.framework/Versions/A/IO80211 +0x000000019ce10000 /System/Library/Frameworks/IOBluetooth.framework/Versions/A/IOBluetooth +0x000000028c41f000 /usr/lib/swift/libswiftRegexBuilder.dylib +0x0000000198460000 /usr/lib/libIOReport.dylib +0x00000001e2dc2000 /System/Library/PrivateFrameworks/WiFiPeerToPeer.framework/Versions/A/WiFiPeerToPeer +0x0000000195e29000 /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation +0x000000023ec54000 /System/Library/PrivateFrameworks/Centauri.framework/Versions/A/Centauri +0x0000000188111000 /System/Library/PrivateFrameworks/Lexicon.framework/Versions/A/Lexicon +0x000000028bbb3000 /usr/lib/libmrc.dylib +0x0000000255f40000 /System/Library/PrivateFrameworks/IPConfiguration.framework/Versions/A/IPConfiguration +0x00000001d6961000 /System/Library/PrivateFrameworks/Netrb.framework/Versions/A/Netrb +0x00000001a1450000 /System/Library/PrivateFrameworks/FrontBoardServices.framework/Versions/A/FrontBoardServices +0x0000000195f92000 /usr/lib/libgermantok.dylib +0x00000001949ce000 /System/Library/PrivateFrameworks/LinguisticData.framework/Versions/A/LinguisticData +0x00000001a06d6000 /System/Library/PrivateFrameworks/MediaKit.framework/Versions/A/MediaKit +0x00000001a0624000 /System/Library/Frameworks/DiscRecording.framework/Versions/A/DiscRecording +0x00000001986db000 /usr/lib/libheimdal-asn1.dylib +0x00000001a4101000 /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit +0x0000000191690000 /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory +0x000000019169e000 /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory +0x000000019d1b8000 /System/Library/PrivateFrameworks/GeoServices.framework/Versions/A/GeoServices +0x000000019abdf000 /System/Library/PrivateFrameworks/LocationSupport.framework/Versions/A/LocationSupport +0x0000000252bfe000 /System/Library/PrivateFrameworks/GeoServicesCore.framework/Versions/A/GeoServicesCore +0x00000001ad402000 /System/Library/PrivateFrameworks/PhoneNumbers.framework/Versions/A/PhoneNumbers +0x000000025b386000 /System/Library/PrivateFrameworks/LocationLogEncryption.framework/Versions/A/LocationLogEncryption +0x000000022d12e000 /System/Library/Frameworks/AVFAudio.framework/Versions/A/AVFAudio +0x000000022d272000 /System/Library/Frameworks/AVRouting.framework/Versions/A/AVRouting +0x00000001ad51a000 /usr/lib/libAccessibility.dylib +0x0000000259d70000 /System/Library/PrivateFrameworks/IsolatedCoreAudioClient.framework/Versions/A/IsolatedCoreAudioClient +0x00000002423ee000 /System/Library/PrivateFrameworks/CoreAudioOrchestration.framework/Versions/A/CoreAudioOrchestration +0x0000000199ab3000 /System/Library/Frameworks/MediaToolbox.framework/Versions/A/MediaToolbox +0x00000001a07fc000 /System/Library/PrivateFrameworks/CoreAVCHD.framework/Versions/A/CoreAVCHD +0x000000019f720000 /System/Library/Frameworks/MediaAccessibility.framework/Versions/A/MediaAccessibility +0x00000001a07f8000 /System/Library/PrivateFrameworks/Mangrove.framework/Versions/A/Mangrove +0x000000023e290000 /System/Library/PrivateFrameworks/CMPhoto.framework/Versions/A/CMPhoto +0x00000001a0fc5000 /System/Library/Frameworks/CoreTelephony.framework/Versions/A/CoreTelephony +0x00000001a07eb000 /System/Library/PrivateFrameworks/CoreAUC.framework/Versions/A/CoreAUC +0x000000023b3f6000 /System/Library/PrivateFrameworks/AppleJPEGXL.framework/Versions/A/AppleJPEGXL +0x000000019b4e8000 /usr/lib/libTelephonyUtilDynamic.dylib +0x00000001dd93f000 /System/Library/Frameworks/CryptoKit.framework/Versions/A/CryptoKit +0x00000001a40fc000 /System/Library/PrivateFrameworks/CryptoKitCBridging.framework/Versions/A/CryptoKitCBridging +0x00000001a1609000 /System/Library/Frameworks/CryptoTokenKit.framework/Versions/A/CryptoTokenKit +0x0000000247179000 /System/Library/PrivateFrameworks/Dendrite.framework/Versions/A/Dendrite +0x00000001b440c000 /System/Library/Frameworks/NaturalLanguage.framework/Versions/A/NaturalLanguage +0x0000000252901000 /System/Library/PrivateFrameworks/GenerativeModels.framework/Versions/A/GenerativeModels +0x00000001e2d49000 /usr/lib/swift/libswiftNaturalLanguage.dylib +0x000000023bf6d000 /System/Library/PrivateFrameworks/AppleMobileFileIntegrity.framework/Versions/A/AppleMobileFileIntegrity +0x000000028ad01000 /usr/lib/libTLE.dylib +0x00000001b480d000 /usr/lib/libmis.dylib +0x00000001ec491000 /System/Library/PrivateFrameworks/ConfigProfileHelper.framework/Versions/A/ConfigProfileHelper +0x00000001a428b000 /System/Library/PrivateFrameworks/Espresso.framework/Versions/A/Espresso +0x0000000191e20000 /System/Library/Frameworks/CoreML.framework/Versions/A/CoreML +0x00000001e0bf5000 /usr/lib/libedit.3.dylib +0x0000000229f3c000 /System/Library/PrivateFrameworks/ANECompiler.framework/Versions/A/ANECompiler +0x00000001a6361000 /System/Library/PrivateFrameworks/AppleNeuralEngine.framework/Versions/A/AppleNeuralEngine +0x000000025b4a4000 /System/Library/PrivateFrameworks/MIL.framework/Versions/A/MIL +0x0000000230ec4000 /System/Library/Frameworks/MetalPerformanceShadersGraph.framework/Versions/A/MetalPerformanceShadersGraph +0x000000025bc13000 /System/Library/PrivateFrameworks/MLCompilerServices.framework/Versions/A/MLCompilerServices +0x00000001a50dd000 /System/Library/PrivateFrameworks/ANEServices.framework/Versions/A/ANEServices +0x00000001b9ad0000 /usr/lib/libncurses.5.4.dylib +0x000000018b2ce000 /usr/lib/libsandbox.1.dylib +0x0000000198601000 /usr/lib/libMatch.1.dylib +0x00000002654f9000 /System/Library/PrivateFrameworks/ODIE.framework/Versions/A/ODIE +0x000000025e8a0000 /System/Library/PrivateFrameworks/MLModelAsset.framework/Versions/A/MLModelAsset +0x000000025bbb9000 /System/Library/PrivateFrameworks/MLCompilerRuntime.framework/Versions/A/MLCompilerRuntime +0x0000000196255000 /System/Library/Frameworks/MLCompute.framework/Versions/A/MLCompute +0x000000025bb3b000 /System/Library/PrivateFrameworks/MLAssetIO.framework/Versions/A/MLAssetIO +0x000000028c3f1000 /usr/lib/swift/libswiftMLCompute.dylib +0x00000001a11e0000 /System/Library/PrivateFrameworks/AVFCore.framework/Versions/A/AVFCore +0x00000001aae1b000 /System/Library/PrivateFrameworks/AVFCapture.framework/Versions/A/AVFCapture +0x000000023e087000 /System/Library/PrivateFrameworks/CMImaging.framework/Versions/A/CMImaging +0x00000001ab05d000 /System/Library/PrivateFrameworks/Quagga.framework/Versions/A/Quagga +0x00000001ab18e000 /System/Library/PrivateFrameworks/CMCapture.framework/Versions/A/CMCapture +0x000000019b071000 /System/Library/Frameworks/CoreMediaIO.framework/Versions/A/CoreMediaIO +0x000000023dfc2000 /System/Library/PrivateFrameworks/CMCaptureDevice.framework/Versions/A/CMCaptureDevice +0x0000000198a3d000 /System/Library/PrivateFrameworks/CoreBrightness.framework/Versions/A/CoreBrightness +0x000000023f14b000 /System/Library/PrivateFrameworks/CinematicFraming.framework/Versions/A/CinematicFraming +0x00000002619dd000 /System/Library/PrivateFrameworks/ModelManagerServices.framework/Versions/A/ModelManagerServices +0x00000001cf375000 /System/Library/PrivateFrameworks/CPMS.framework/Versions/A/CPMS +0x0000000279581000 /System/Library/PrivateFrameworks/SystemStatus.framework/Versions/A/SystemStatus +0x00000001b323c000 /System/Library/Frameworks/CoreMotion.framework/Versions/A/CoreMotion +0x00000001c3854000 /System/Library/PrivateFrameworks/TimeSync.framework/Versions/A/TimeSync +0x0000000247b41000 /System/Library/PrivateFrameworks/DistributedSensing.framework/Versions/A/DistributedSensing +0x00000001bec33000 /System/Library/PrivateFrameworks/MobileBluetooth.framework/Versions/A/MobileBluetooth +0x00000001c5518000 /System/Library/PrivateFrameworks/IOKitten.framework/Versions/A/IOKitten +0x000000023b270000 /System/Library/PrivateFrameworks/AppleIntelligenceReporting.framework/Versions/A/AppleIntelligenceReporting +0x0000000195b9c000 /System/Library/PrivateFrameworks/CoreEmoji.framework/Versions/A/CoreEmoji +0x0000000188425000 /usr/lib/libCRFSuite.dylib +0x0000000189706000 /System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling +0x00000001948ae000 /System/Library/PrivateFrameworks/CoreNLP.framework/Versions/A/CoreNLP +0x000000018e683000 /System/Library/PrivateFrameworks/Montreal.framework/Versions/A/Montreal +0x0000000196d10000 /usr/lib/libcmph.dylib +0x0000000195f33000 /usr/lib/libmecab.dylib +0x0000000196e81000 /usr/lib/libThaiTokenizer.dylib +0x00000002529e3000 /System/Library/PrivateFrameworks/GenerativeModelsFoundation.framework/Versions/A/GenerativeModelsFoundation +0x000000027c356000 /System/Library/PrivateFrameworks/TokenGeneration.framework/Versions/A/TokenGeneration +0x00000002527b7000 /System/Library/PrivateFrameworks/GenerativeFunctions.framework/Versions/A/GenerativeFunctions +0x0000000252805000 /System/Library/PrivateFrameworks/GenerativeFunctionsFoundation.framework/Versions/A/GenerativeFunctionsFoundation +0x000000026169e000 /System/Library/PrivateFrameworks/ModelCatalog.framework/Versions/A/ModelCatalog +0x000000026e8a2000 /System/Library/PrivateFrameworks/SensitiveContentAnalysisML.framework/Versions/A/SensitiveContentAnalysisML +0x000000025289b000 /System/Library/PrivateFrameworks/GenerativeFunctionsInstrumentation.framework/Versions/A/GenerativeFunctionsInstrumentation +0x000000026b6cb000 /System/Library/PrivateFrameworks/PromptKit.framework/Versions/A/PromptKit +0x000000026b0e1000 /System/Library/PrivateFrameworks/ProactiveDaemonSupport.framework/Versions/A/ProactiveDaemonSupport +0x000000027c58e000 /System/Library/PrivateFrameworks/TokenGenerationCore.framework/Versions/A/TokenGenerationCore +0x00000001b52db000 /System/Library/PrivateFrameworks/Trial.framework/Versions/A/Trial +0x00000001b525c000 /System/Library/PrivateFrameworks/TrialProto.framework/Versions/A/TrialProto +0x000000023ae9a000 /System/Library/PrivateFrameworks/AppleFlatBuffers.framework/Versions/A/AppleFlatBuffers +0x000000026eb72000 /System/Library/PrivateFrameworks/SentencePieceInternal.framework/Versions/A/SentencePieceInternal +0x000000019f77a000 /System/Library/Frameworks/Vision.framework/Versions/A/Vision +0x0000000246298000 /System/Library/PrivateFrameworks/CoreSceneUnderstanding.framework/Versions/A/CoreSceneUnderstanding +0x00000002811df000 /System/Library/PrivateFrameworks/VisionCore.framework/Versions/A/VisionCore +0x00000001999f0000 /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore +0x00000001bdbc1000 /System/Library/Frameworks/Vision.framework/libfaceCore.dylib +0x00000001be6db000 /System/Library/PrivateFrameworks/Futhark.framework/Versions/A/Futhark +0x00000001c2629000 /System/Library/PrivateFrameworks/InertiaCam.framework/Versions/A/InertiaCam +0x00000001be468000 /System/Library/PrivateFrameworks/TextRecognition.framework/Versions/A/TextRecognition +0x000000022eadd000 /System/Library/Frameworks/DataDetection.framework/Versions/A/DataDetection +0x00000001b8674000 /System/Library/PrivateFrameworks/TextInput.framework/Versions/A/TextInput +0x000000019849e000 /System/Library/PrivateFrameworks/CVNLP.framework/Versions/A/CVNLP +0x00000001dad09000 /System/Library/PrivateFrameworks/HIDDisplay.framework/Versions/A/HIDDisplay +0x000000019b255000 /usr/lib/libcups.2.dylib +0x000000019b2ec000 /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos +0x000000019af5c000 /usr/lib/libresolv.9.dylib +0x0000000198958000 /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal +0x00000001a4100000 /System/Library/Frameworks/Kerberos.framework/Versions/A/Libraries/libHeimdalProxy.dylib +0x000000019b350000 /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth +0x00000001ad40e000 /System/Library/PrivateFrameworks/AXCoreUtilities.framework/Versions/A/AXCoreUtilities +0x00000001bda0a000 /System/Library/PrivateFrameworks/AttributeGraph.framework/Versions/A/AttributeGraph +0x000000028a801000 /usr/lib/libAXSafeCategoryBundle.dylib +0x0000000235252000 /System/Library/Frameworks/TabularData.framework/Versions/A/TabularData +0x000000023c11d000 /System/Library/PrivateFrameworks/ArgumentParserInternal.framework/Versions/A/ArgumentParserInternal +0x0000000195a5e000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib +0x0000000197053000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib +0x0000000195f95000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLinearAlgebra.dylib +0x0000000196ec7000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparseBLAS.dylib +0x000000019704e000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libQuadrature.dylib +0x00000001949d5000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBNNS.dylib +0x0000000188221000 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libSparse.dylib +0x000000022e5c2000 /System/Library/Frameworks/CoreTransferable.framework/Versions/A/CoreTransferable +0x000000019b2b4000 /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth +0x00000001918b4000 /System/Library/PrivateFrameworks/login.framework/Versions/A/Frameworks/loginsupport.framework/Versions/A/loginsupport +0x000000018ca51000 /System/Library/PrivateFrameworks/UIFoundation.framework/Versions/A/UIFoundation +0x0000000195efd000 /usr/lib/libCheckFix.dylib +0x0000000190a3b000 /System/Library/PrivateFrameworks/MetadataUtilities.framework/Versions/A/MetadataUtilities +0x00000002569c7000 /System/Library/PrivateFrameworks/InstalledContentLibrary.framework/Versions/A/InstalledContentLibrary +0x000000018b192000 /System/Library/PrivateFrameworks/CoreServicesStore.framework/Versions/A/CoreServicesStore +0x00000001916ff000 /usr/lib/libapp_launch_measurement.dylib +0x00000001c8192000 /System/Library/PrivateFrameworks/MobileSystemServices.framework/Versions/A/MobileSystemServices +0x0000000198323000 /usr/lib/libxslt.1.dylib +0x0000000195ebc000 /System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/BackgroundTaskManagement +0x00000001a3792000 /usr/lib/libcurl.4.dylib +0x000000028b517000 /usr/lib/libcrypto.46.dylib +0x000000028c09a000 /usr/lib/libssl.48.dylib +0x00000001a346c000 /System/Library/Frameworks/LDAP.framework/Versions/A/LDAP +0x00000001a34a8000 /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent +0x000000019af79000 /usr/lib/libsasl2.2.dylib +0x00000001a6710000 /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa +0x000000018b32d000 /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit +0x000000023ffce000 /System/Library/PrivateFrameworks/CollectionViewCore.framework/Versions/A/CollectionViewCore +0x0000000193f6f000 /System/Library/PrivateFrameworks/XCTTargetBootstrap.framework/Versions/A/XCTTargetBootstrap +0x0000000199a42000 /System/Library/PrivateFrameworks/UserActivity.framework/Versions/A/UserActivity +0x0000000249ab0000 /System/Library/PrivateFrameworks/FrontBoard.framework/Versions/A/FrontBoard +0x000000027df9f000 /System/Library/PrivateFrameworks/UIIntelligenceSupport.framework/Versions/A/UIIntelligenceSupport +0x00000002342db000 /System/Library/Frameworks/SwiftUICore.framework/Versions/A/SwiftUICore +0x0000000284b4b000 /System/Library/PrivateFrameworks/WritingTools.framework/Versions/A/WritingTools +0x0000000283942000 /System/Library/PrivateFrameworks/WindowManagement.framework/Versions/A/WindowManagement +0x00000002497e0000 /System/Library/PrivateFrameworks/FocusEngine.framework/Versions/A/FocusEngine +0x00000002471e9000 /System/Library/PrivateFrameworks/DesignLibrary.framework/Versions/A/DesignLibrary +0x0000000193f5a000 /System/Library/PrivateFrameworks/DFRFoundation.framework/Versions/A/DFRFoundation +0x000000027eeec000 /System/Library/PrivateFrameworks/UpdateCycle.framework/Versions/A/UpdateCycle +0x0000000193c5e000 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox +0x000000019f040000 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition +0x0000000191686000 /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis +0x000000019f3d0000 /System/Library/Frameworks/Accessibility.framework/Versions/A/Accessibility +0x0000000235238000 /System/Library/Frameworks/Symbols.framework/Versions/A/Symbols +0x0000000252dac000 /System/Library/PrivateFrameworks/Gestures.framework/Versions/A/Gestures +0x000000028c4c2000 /usr/lib/swift/libswiftSpatial.dylib +0x00000001b164e000 /usr/lib/swift/libswiftCoreGraphics.dylib +0x000000019fe14000 /usr/lib/swift/libswiftFoundation.dylib +0x00000001ebe32000 /usr/lib/swift/libswiftSwiftOnoneSupport.dylib +0x000000028c748000 /usr/lib/swift/libswiftsys_time.dylib +0x00000001d699f000 /System/Library/PrivateFrameworks/CoreMaterial.framework/Versions/A/CoreMaterial +0x000000028acfe000 /usr/lib/libSpatial.dylib +0x000000028a71e000 /System/Library/SubFrameworks/UIUtilities.framework/Versions/A/UIUtilities +0x00000001057c0000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/server/libjvm.dylib +0x00000001046ac000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjimage.dylib +0x00000001047a8000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjdwp.dylib +0x00000001046f4000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libjava.dylib +0x0000000104900000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libinstrument.dylib +0x00000001046d8000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libzip.dylib +0x000000028a7f3000 /usr/lib/i18n/libiconv_std.dylib +0x000000028a7e9000 /usr/lib/i18n/libUTF8.dylib +0x000000028a7f8000 /usr/lib/i18n/libmapper_none.dylib +0x00000001049d0000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libdt_socket.dylib +0x0000000104f6c000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libnio.dylib +0x0000000104fb0000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libnet.dylib +0x00000001049e4000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libmanagement.dylib +0x0000000104f4c000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libmanagement_ext.dylib +0x0000000104f8c000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libextnet.dylib +0x0000000105300000 /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/lib/libverify.dylib + + +VM Arguments: +jvm_args: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:49167,suspend=y,server=n -javaagent:/Users/liangxin/Library/Caches/JetBrains/IntelliJIdea2026.1/captureAgent/debugger-agent.jar=file:///var/folders/pk/drq93rk10q733kk02fgp89xh0000gn/T/capture18007844485071508468.props -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dmanagement.endpoints.jmx.exposure.include=* -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Ddebugger.agent.enable.coroutines=true -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -Ddebugger.async.stack.trace.for.all.threads=true -Dfile.encoding=UTF-8 +java_command: org.springblade.resource.ResourceApplication +java_class_path (initial): /Users/liangxin/Project/JAVA/tms-erp-api/blade-ops/blade-resource/target/classes:/Users/liangxin/Project/JAVA/tms-erp-api/blade-common/target/classes:/Users/liangxin/.m2/repository/org/springblade/blade-core-launch/4.10.0.BASE-SNAPSHOT/blade-core-launch-4.10.0.BASE-SNAPSHOT.jar:/Users/liangxin/.m2/repository/org/springframework/boot/spring-boot-starter-web/3.5.16/spring-boot-starter-web-3.5.16.jar:/Users/liangxin/.m2/repository/org/springframework/boot/spring-boot-starter-json/3.5.16/spring-boot-starter-json-3.5.16.jar:/Users/liangxin/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.21.4/jackson-datatype-jdk8-2.21.4.jar:/Users/liangxin/.m2/repository/com/fasterxml/jackson/module/jackson-module-parameter-names/2.18.0/jackson-module-parameter-names-2.18.0.jar:/Users/liangxin/.m2/repository/org/springframework/spring-webmvc/6.2.19/spring-webmvc-6.2.19.jar:/Users/liangxin/.m2/repository/org/springframework/spring-context/6.2.19/spring-context-6.2.19.jar:/Users/liangxin/.m2/repository/org/springframework/spring-expression/6.2.19/spring-expression-6.2.19.jar:/Users/liangxin/.m2/repository/org/springframework/boot/spring-boot-starter-undertow/3.5.16/spring-boot-starter-undertow-3.5.16.jar:/Users/liangxin/.m2/repository/io/undertow/undertow-core/2.3.24.Final/undertow-core-2.3.24.Final.jar:/Users/liangxin/.m2/repository/org/jboss/xnio/xnio-api/3.8.16.Final/xnio-api-3.8.16.Final.jar:/Users/liangxin/.m2/repository/org/wildfly/common/wildfly-common/1.5.4.Final/wildfly-common-1.5.4.Final.jar:/Users/liangxin/.m2/repository/org/wildfly/client/wildfly-client-config/1.0.1.Final/wildfly-client-config-1.0.1.Final.jar:/Users/liangxin/.m2/repository/org/jboss/xnio/xnio-nio/3.8.16.Final/xnio-nio-3.8.16.Final.jar:/Users/liangxin/.m2/repository/org/jboss/threads/jboss-threads/3.7.0.Final/jboss-threads-3.7.0.Final.jar:/Users/liangxin/.m2/repository/io/smallrye/common/smallrye-common-annotation/2.6.0/smallrye-common-annotation-2.6.0.jar:/User +Launcher Type: SUN_STANDARD + +[Global flags] + intx CICompilerCount = 4 {product} {ergonomic} + uint ConcGCThreads = 3 {product} {ergonomic} + uint G1ConcRefinementThreads = 10 {product} {ergonomic} + size_t G1HeapRegionSize = 8388608 {product} {ergonomic} + uintx GCDrainStackTargetSize = 64 {product} {ergonomic} + size_t InitialHeapSize = 603979776 {product} {ergonomic} + bool ManagementServer = true {product} {command line} + size_t MarkStackSize = 4194304 {product} {ergonomic} + size_t MaxHeapSize = 9663676416 {product} {ergonomic} + size_t MaxNewSize = 5796528128 {product} {ergonomic} + size_t MinHeapDeltaBytes = 8388608 {product} {ergonomic} + size_t MinHeapSize = 8388608 {product} {ergonomic} + uintx NonProfiledCodeHeapSize = 0 {pd product} {ergonomic} + bool ProfileInterpreter = false {pd product} {command line} + uintx ProfiledCodeHeapSize = 0 {pd product} {ergonomic} + size_t SoftMaxHeapSize = 9663676416 {manageable} {ergonomic} + intx TieredStopAtLevel = 1 {product} {command line} + bool UseCompressedClassPointers = true {product lp64_product} {ergonomic} + bool UseCompressedOops = true {product lp64_product} {ergonomic} + bool UseG1GC = true {product} {ergonomic} + bool UseNUMA = false {product} {ergonomic} + bool UseNUMAInterleaving = false {product} {ergonomic} + +Logging: +Log output configuration: + #0: stdout all=warning uptime,level,tags + #1: stderr all=off uptime,level,tags + +Environment Variables: +JAVA_HOME=/Users/liangxin/JDK/zulu17.48.15-ca-jdk17.0.10-macosx_aarch64/zulu-17.jdk/Contents/Home +PATH=/Users/liangxin/ai-infra/.venv/bin:/Users/liangxin/.nacos/bin:/Applications/Docker.app/Contents/Resources/bin:/Users/liangxin/Library/pnpm:/opt/homebrew/opt/ruby@3.2/bin:/opt/homebrew/opt/openssl@3/bin:/opt/miniconda3/bin:/opt/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/Users/liangxin/JDK/zulu17.48.15-ca-jdk17.0.10-macosx_aarch64/zulu-17.jdk/Contents/Home/bin:/Users/liangxin/fvm/default/bin:/Applications/MAMP/bin/php/php8.1.13/bin:/opt/homebrew/opt/ruby@3.2/bin:/Users/liangxin/.nvm/versions/node/v20.18.3/bin:/Applications/apache-tomcat-9.0.78:/Users/liangxin/JDK/zulu17.48.15-ca-jdk17.0.10-macosx_aarch64/zulu-17.jdk/Contents/Home/bin:/Users/liangxin/fvm/default/bin:/opt/homebrew/opt/libpng/bin:/Applications/pngquant:/Users/liangxin/AndroidSDK/platform-tools:/Users/liangxin/Library/Android/sdk/platform-tools:/Users/liangxin/Library/Andriod/sdk/cmdline-tools/latest/bin:/Users/liangxin/Library/Andriod/sdk:/Applications/apache-maven-3.8.1/bin:/opt/homebrew/bin:/usr/local/sbin:/usr/local/bin:/Users/liangxin/JDK/zulu17.48.15-ca-jdk17.0.10-macosx_aarch64/zulu-17.jdk/Contents/Home/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/Users/liangxin/.local/bin:/Users/liangxin/fvm/default/bin:/Applications/MAMP/bin/php/php8.1.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/pkg/env/global/bin:/Library/Apple/usr/bin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/Users/liangxin/.cargo/bin:true:/Applications/极空间.app/Contents/Resources/app.asar.unpacked/bin/platform-tools +SHELL=/bin/zsh +LANG=C.UTF-8 +TMPDIR=/var/folders/pk/drq93rk10q733kk02fgp89xh0000gn/T/ + +Active Locale: +LC_ALL=C.UTF-8 +LC_COLLATE=C.UTF-8 +LC_CTYPE=C.UTF-8 +LC_MESSAGES=C.UTF-8 +LC_MONETARY=C.UTF-8 +LC_NUMERIC=C.UTF-8 +LC_TIME=C.UTF-8 + +Signal Handlers: + SIGSEGV: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, unblocked + SIGBUS: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, unblocked + SIGFPE: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, unblocked + SIGPIPE: javaSignalHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, blocked + SIGXFSZ: javaSignalHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, blocked + SIGILL: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, unblocked + SIGUSR2: SR_handler in libjvm.dylib, mask=00000000000000000000000000000000, flags=SA_RESTART|SA_SIGINFO, blocked + SIGHUP: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, blocked + SIGINT: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, blocked + SIGTERM: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, blocked + SIGQUIT: UserHandler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, blocked + SIGTRAP: crash_handler in libjvm.dylib, mask=11100110000111110111111111111111, flags=SA_RESTART|SA_SIGINFO, unblocked + + +--------------- S Y S T E M --------------- + +OS: +uname: Darwin 25.6.0 Darwin Kernel Version 25.6.0: Fri Jul 31 19:16:36 PDT 2026; root:xnu-12377.161.14~5/RELEASE_ARM64_T6030 arm64 +OS uptime: 2 days 5:15 hours +rlimit (soft/hard): STACK 8176k/65520k , CORE 0k/infinity , NPROC 6000/9000 , NOFILE 10240/infinity , AS infinity/infinity , CPU infinity/infinity , DATA infinity/infinity , FSIZE infinity/infinity , MEMLOCK infinity/infinity , RSS infinity/infinity +load average: 16.89 38.96 54.23 + +CPU: total 12 (initial active 12) 0x61:0x0:0x5f4dea93:0, fp, simd, crc, lse +machdep.cpu.brand_string:Apple M3 Pro +hw.cachelinesize:128 +hw.l1icachesize:131072 +hw.l1dcachesize:65536 +hw.l2cachesize:4194304 + +Memory: 16k page, physical 37748736k(215216k free), swap 18874368k(1062912k free) + +vm_info: OpenJDK 64-Bit Server VM (17.0.8+7-LTS) for bsd-aarch64 JRE (17.0.8+7-LTS) (Zulu17.44+15-CA), built on Jul 5 2023 00:50:04 by "zulu_re" with clang Apple LLVM 12.0.0 (clang-1200.0.32.28) + +END. diff --git a/pom.xml b/pom.xml index bb5f2bf..ae708e0 100644 --- a/pom.xml +++ b/pom.xml @@ -149,6 +149,11 @@ blade-track-api ${revision} + + org.springblade + blade-wechat-api + ${revision} + org.springblade