From b8d656b15fc11074c0a1d86001b02323f446c13b Mon Sep 17 00:00:00 2001 From: "@jyuhsin" <729757837@qq.com> Date: Fri, 20 Mar 2026 11:03:10 +0800 Subject: [PATCH] commit --- .../app/base/constant/RedisConstant.java | 1 + .../app/base/sms/WechatEnterpriseService.java | 135 ++++++++++++++ .../app/base/sms/impl/SmsWhcpServiceImpl.java | 4 + .../sms/impl/WechatEnterpriseServiceImpl.java | 171 ++++++++++++++++++ .../sms/util/WechatEnterpriseTokenUtil.java | 67 +++++++ .../ProcessTaskStartEventListener.java | 18 +- .../WechatEnterpriseMessageSendStrategy.java | 88 +++++++++ .../controller/TooltipCommonController.java | 24 +++ .../views/platform/zhghh5/tooltip/index.html | 55 ++++++ 9 files changed, 561 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/budwk/app/base/sms/WechatEnterpriseService.java create mode 100644 src/main/java/com/budwk/app/base/sms/impl/WechatEnterpriseServiceImpl.java create mode 100644 src/main/java/com/budwk/app/base/sms/util/WechatEnterpriseTokenUtil.java create mode 100644 src/main/java/com/budwk/app/zhgh/dayofficework/message/strategy/impl/WechatEnterpriseMessageSendStrategy.java create mode 100644 src/main/java/com/budwk/app/zhgh/tooltip/controller/TooltipCommonController.java create mode 100644 src/main/resources/views/platform/zhghh5/tooltip/index.html diff --git a/src/main/java/com/budwk/app/base/constant/RedisConstant.java b/src/main/java/com/budwk/app/base/constant/RedisConstant.java index 6920246..b5fce9f 100644 --- a/src/main/java/com/budwk/app/base/constant/RedisConstant.java +++ b/src/main/java/com/budwk/app/base/constant/RedisConstant.java @@ -32,6 +32,7 @@ public class RedisConstant { public final static String REDIS_KEY_API_SIGN_DEPLOY_NONCE = PLATFORM_REDIS_PREFIX + "api:sign:deploy:nonce:"; public final static String REDIS_KEY_API_SIGN_OPEN_NONCE = PLATFORM_REDIS_PREFIX + "api:sign:open:nonce:"; + public final static String REDIS_WECHAT_ENTERPRISE_TOKEN_KEY = PLATFORM_REDIS_PREFIX + "platfrom:wechatenterprise:token:"; /** * Token 缓存前缀 diff --git a/src/main/java/com/budwk/app/base/sms/WechatEnterpriseService.java b/src/main/java/com/budwk/app/base/sms/WechatEnterpriseService.java new file mode 100644 index 0000000..a73111e --- /dev/null +++ b/src/main/java/com/budwk/app/base/sms/WechatEnterpriseService.java @@ -0,0 +1,135 @@ +package com.budwk.app.base.sms; + +import java.util.List; + +/** + * @ClassName WechatEnterpriseService + * @Author JyuHsin + * @Date 2026/3/19 15:48 + * @Version 1.0 + * @Description TODO + */ +public interface WechatEnterpriseService { + + /** + * 单发普通消息(无标题) + * @param loginName 接收人工号(必填) + * @param content 消息内容(必填) + * @return + */ + void sendSingleMessage(String loginName, String content); + + /** + * 单发普通消息(带标题) + * @param loginName 接收人工号(必填) + * @param title 消息标题(可选,可为null) + * @param content 消息内容(必填) + * @return + */ + void sendSingleMessage(String loginName, String title, String content); + + /** + * 单发文本卡片消息 + * @param loginName 接收人工号(必填) + * @param content 卡片内容(必填) + * @param pcUrl PC端跳转链接(必填) + * @param mobileUrl 移动端跳转链接(必填) + * @return + */ + void sendSingleTextCard(String loginName, String content, String pcUrl, String mobileUrl); + + /** + * 单发文本卡片消息(带标题) + * @param loginName 接收人工号(必填) + * @param title 卡片标题(可选,可为null) + * @param content 卡片内容(必填) + * @param pcUrl PC端跳转链接(必填) + * @param mobileUrl 移动端跳转链接(必填) + * @return + */ + void sendSingleTextCard(String loginName, String title, String content, String pcUrl, String mobileUrl); + + /** + * 单发图文卡片消息 + * @param loginName 接收人工号(必填) + * @param content 卡片内容(必填) + * @param pcUrl PC端跳转链接(必填) + * @param mobileUrl 移动端跳转链接(必填) + * @param picUrl 图片链接(必填) + * @return + */ + void sendSinglePicTextCard(String loginName, String content, String pcUrl, String mobileUrl, String picUrl); + + /** + * 单发图文卡片消息(带标题) + * @param loginName 接收人工号(必填) + * @param title 卡片标题(可选,可为null) + * @param content 卡片内容(必填) + * @param pcUrl PC端跳转链接(必填) + * @param mobileUrl 移动端跳转链接(必填) + * @param picUrl 图片链接(必填) + * @return + */ + void sendSinglePicTextCard(String loginName, String title, String content, String pcUrl, String mobileUrl, String picUrl); + + /** + * 群发普通消息(多人接收相同内容) + * @param loginNames 接收人工号列表(必填,不能为空列表) + * @param content 消息内容(必填) + * @return void + */ + void massSendMessage(List loginNames, String content); + + /** + * 群发普通消息(多人接收相同内容) + * @param loginNames 接收人工号列表(必填,不能为空列表) + * @param title 消息标题(可选,可为null) + * @param content 消息内容(必填) + * @return void + */ + void massSendMessage(List loginNames, String title, String content); + + /** + * 群发短信文本卡片消息 + * @param loginNames 接收人工号列表(必填,不能为空列表) + * @param content 卡片内容(必填) + * @param pcUrl PC端跳转链接(必填) + * @param mobileUrl 移动端跳转链接(必填) + * @return + */ + void massSendTextCard(List loginNames, String content, String pcUrl, String mobileUrl); + + /** + * 群发短信文本卡片消息 + * @param loginNames 接收人工号列表(必填,不能为空列表) + * @param title 卡片标题(可选,可为null) + * @param content 卡片内容(必填) + * @param pcUrl PC端跳转链接(必填) + * @param mobileUrl 移动端跳转链接(必填) + * @return + */ + void massSendTextCard(List loginNames, String title, String content, String pcUrl, String mobileUrl); + + /** + * 群发图文卡片消息 + * @param loginNames 接收人工号列表(必填,不能为空列表) + * @param content 卡片内容(必填) + * @param pcUrl PC端跳转链接(必填) + * @param mobileUrl 移动端跳转链接(必填) + * @param picUrl 图片链接(必填) + * @return + */ + void massSendPicTextCard(List loginNames, String content, String pcUrl, String mobileUrl, String picUrl); + + /** + * 群发图文卡片消息 + * @param loginNames 接收人工号列表(必填,不能为空列表) + * @param title 卡片标题(可选,可为null) + * @param content 卡片内容(必填) + * @param pcUrl PC端跳转链接(必填) + * @param mobileUrl 移动端跳转链接(必填) + * @param picUrl 图片链接(必填) + * @return + */ + void massSendPicTextCard(List loginNames, String title, String content, String pcUrl, String mobileUrl, String picUrl); +} diff --git a/src/main/java/com/budwk/app/base/sms/impl/SmsWhcpServiceImpl.java b/src/main/java/com/budwk/app/base/sms/impl/SmsWhcpServiceImpl.java index 4491839..fb496ca 100644 --- a/src/main/java/com/budwk/app/base/sms/impl/SmsWhcpServiceImpl.java +++ b/src/main/java/com/budwk/app/base/sms/impl/SmsWhcpServiceImpl.java @@ -45,6 +45,10 @@ public class SmsWhcpServiceImpl implements SmsService { log.info("【log】本地开发环境,不允许调用短信消息接口"); return; } + if(!Globals.MyConfig.getBoolean("AppSms", false)) { + log.error("【log】消息配置未开启"); + return; + } String urls = "https://api-shss.zthysms.com/v2/sendSms"; diff --git a/src/main/java/com/budwk/app/base/sms/impl/WechatEnterpriseServiceImpl.java b/src/main/java/com/budwk/app/base/sms/impl/WechatEnterpriseServiceImpl.java new file mode 100644 index 0000000..0fff724 --- /dev/null +++ b/src/main/java/com/budwk/app/base/sms/impl/WechatEnterpriseServiceImpl.java @@ -0,0 +1,171 @@ +package com.budwk.app.base.sms.impl; + +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.budwk.app.base.sms.WechatEnterpriseService; +import com.budwk.app.base.sms.util.WechatEnterpriseTokenUtil; +import com.budwk.app.web.commons.base.Globals; +import lombok.extern.slf4j.Slf4j; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; +import org.nutz.lang.Lang; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @ClassName WechatEnterpriseServiceImpl + * @Author JyuHsin + * @Date 2026/3/19 15:48 + * @Version 1.0 + * @Description TODO + */ +@Slf4j +@IocBean +public class WechatEnterpriseServiceImpl implements WechatEnterpriseService { + + @Inject + private WechatEnterpriseTokenUtil tokenUtil; + private static final String SEND_MSG_URL = "http://xxzx.whcp.edu.cn/api/v4/oauth/message"; + + @Override + public void sendSingleMessage(String loginName, String content) { + this.sendSingleMessage(loginName, "智慧工会", content); + } + + @Override + public void sendSingleMessage(String loginName, String title, String content) { + this.massSendMessage(List.of(loginName), title, content); + } + + @Override + public void sendSingleTextCard(String loginName, String content, String pcUrl, String mobileUrl) { + this.sendSingleTextCard(loginName, "智慧工会", content, pcUrl, mobileUrl); + } + + @Override + public void sendSingleTextCard(String loginName, String title, String content, String pcUrl, String mobileUrl) { + this.massSendTextCard(List.of(loginName), title, content, pcUrl, mobileUrl); + } + + @Override + public void sendSinglePicTextCard(String loginName, String content, String pcUrl, String mobileUrl, String picUrl) { + this.sendSinglePicTextCard(loginName, "智慧工会", content, pcUrl, mobileUrl, picUrl); + } + + @Override + public void sendSinglePicTextCard(String loginName, String title, String content, String pcUrl, String mobileUrl, String picUrl) { + this.massSendPicTextCard(List.of(loginName), title, content, pcUrl, mobileUrl, picUrl); + } + + @Override + public void massSendMessage(List loginNames, String content) { + this.massSendMessage(loginNames, "智慧工会", content); + } + + @Override + public void massSendMessage(List loginNames, String title, String content) { + List> list = loginNames.stream().map(loginName -> Map.of("id", loginName)).toList(); + this.doSend("text", list, title, content, null, null, null); + } + + @Override + public void massSendTextCard(List loginNames, String content, String pcUrl, String mobileUrl) { + this.massSendTextCard(loginNames, "智慧工会", content, pcUrl, mobileUrl); + } + + @Override + public void massSendTextCard(List loginNames, String title, String content, String pcUrl, String mobileUrl) { + List> list = loginNames.stream().map(loginName -> Map.of("id", loginName)).toList(); + this.doSend("textCard", list, title, content, pcUrl, mobileUrl, null); + } + + @Override + public void massSendPicTextCard(List loginNames, String content, String pcUrl, String mobileUrl, String picUrl) { + this.massSendPicTextCard(loginNames, "智慧工会", content, pcUrl, mobileUrl, picUrl); + } + + @Override + public void massSendPicTextCard(List loginNames, String title, String content, String pcUrl, String mobileUrl, String picUrl) { + List> list = loginNames.stream().map(loginName -> Map.of("id", loginName)).toList(); + this.doSend("news", list, title, content, pcUrl, mobileUrl, picUrl); + } + + private void doSend(String sendType, + List> receivers, + String title, + String content, + String pcUrl, + String mobileUrl, + String picUrl) { + + if (!Globals.sso) { + log.error("【log】开发模式不允许发送企业微信通知"); + return; + } + if(!Globals.MyConfig.getBoolean("AppSms", false)) { + log.error("【log】消息配置未开启"); + return; + } + + if (Lang.isEmpty(receivers)) { + log.error("send fail by receivers is null"); + return; + } + try { + String token = tokenUtil.getToken(); + if (Lang.isEmpty(token)) { + log.error("【log】send fail by token is null"); + return; + } + + Map params = new HashMap<>(); + params.put("title", title); + params.put("content", content); + params.put("timing", true); + params.put("channels", List.of("ly_qywx")); + params.put("receiver", receivers); + params.put("crowdType", "C"); + params.put("applyMsgType", "ghxx"); + + if ("text".equals(sendType)) { + params.put("msgType", "T"); + } + if ("textCard".equals(sendType)) { + params.put("msgType", "TC"); + params.put("fileType", "TC"); + params.put("fileTitle", title); + params.put("description", content); + params.put("url", mobileUrl); + params.put("btntxt", "查看详情"); + } + if ("news".equals(sendType)) { + params.put("msgType", "M"); + params.put("fileType", "M"); + params.put("fileTitle", title); + params.put("url", mobileUrl); + params.put("filePath", picUrl); + } + + log.info("【log】发送企业微信通知,请求参数:{}", Json.toJson(params)); + String body = HttpUtil.createPost(SEND_MSG_URL + "?token=" + token) + .header("Content-Type", "application/json") + .body(Json.toJson(params)).execute().body(); + JSONObject resultJsonBody = JSONUtil.parseObj(body); + log.info("【log】发送企业微信通知,接口响应数据:{}", body); + + if (resultJsonBody.getInt("code") == 200) { + log.info("【log】发送企业微信通知成功"); + String msgId = resultJsonBody.getStr("data"); + System.out.println(msgId); + } else { + log.info("【log】发送企业微信通知失败:{}", resultJsonBody.getStr("message")); + } + } catch (Exception e) { + log.error("发送企业微信通知失败", e); + } + } +} diff --git a/src/main/java/com/budwk/app/base/sms/util/WechatEnterpriseTokenUtil.java b/src/main/java/com/budwk/app/base/sms/util/WechatEnterpriseTokenUtil.java new file mode 100644 index 0000000..c14a6e6 --- /dev/null +++ b/src/main/java/com/budwk/app/base/sms/util/WechatEnterpriseTokenUtil.java @@ -0,0 +1,67 @@ +package com.budwk.app.base.sms.util; + +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.budwk.app.base.constant.RedisConstant; +import lombok.extern.slf4j.Slf4j; +import org.nutz.integration.jedis.RedisService; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.json.Json; + +import java.util.HashMap; +import java.util.Map; + +/** + * @ClassName WechatEnterpriseTokenUtil + * @Author JyuHsin + * @Date 2026/3/19 15:51 + * @Version 1.0 + * @Description TODO + */ +@Slf4j +@IocBean +public class WechatEnterpriseTokenUtil { + + @Inject + private RedisService redisService; + + private static final String TOKEN_URL = "http://xxzx.whcp.edu.cn/api/v4/oauth/token"; + private static final String CLINT_ID = "gh"; + private static final String CLINT_SECRET = "0a5fb006ee64060799aec6403707eb4d"; + private static final String GRANT_TYPE = "authorization_code"; + + public String getToken() { + String key = RedisConstant.REDIS_WECHAT_ENTERPRISE_TOKEN_KEY; + String token = redisService.get(key); + if (StrUtil.isBlank(token)) { + // 构造表单参数 + Map param = new HashMap<>(); + param.put("client_id", CLINT_ID); + param.put("client_secret", CLINT_SECRET); + param.put("grant_type", GRANT_TYPE); + + String body = HttpUtil.createGet(TOKEN_URL).formStr(param).execute().body(); + + JSONObject resultJsonBody = JSONUtil.parseObj(body); + log.info("【log】获取企业微信消息token接口回调数据:{}", Json.toJson(resultJsonBody)); + if (resultJsonBody.getInt("code") == 200) { + + JSONObject entries = resultJsonBody.getJSONObject("data"); + + String accessToken = entries.getStr("access_token"); + String refreshToken = entries.getStr("refresh_token"); + Long expiresIn = entries.getLong("expires_in"); + + int seconds = (int) DateUtil.between(DateUtil.date(), DateUtil.date(expiresIn), DateUnit.SECOND); + redisService.setex(key, seconds, accessToken); + return accessToken; + } + } + return token; + } +} diff --git a/src/main/java/com/budwk/app/flow/listenter/ProcessTaskStartEventListener.java b/src/main/java/com/budwk/app/flow/listenter/ProcessTaskStartEventListener.java index fecf2eb..59dfdc3 100644 --- a/src/main/java/com/budwk/app/flow/listenter/ProcessTaskStartEventListener.java +++ b/src/main/java/com/budwk/app/flow/listenter/ProcessTaskStartEventListener.java @@ -1,6 +1,7 @@ package com.budwk.app.flow.listenter; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; import com.budwk.app.flow.constant.FlowConst; import com.budwk.app.flow.engine.event.ProcessEvent; import com.budwk.app.flow.engine.event.ProcessEventListener; @@ -8,6 +9,7 @@ import com.budwk.app.flow.entity.ProcessInstance; import com.budwk.app.flow.entity.ProcessTask; import com.budwk.app.flow.entity.ProcessTaskActor; import com.budwk.app.flow.enums.ProcessEventTypeEnum; +import com.budwk.app.web.commons.base.Globals; import com.budwk.app.zhgh.dayofficework.message.service.GlobalMessageSendService; import lombok.extern.slf4j.Slf4j; import org.nutz.dao.Cnd; @@ -58,10 +60,22 @@ public class ProcessTaskStartEventListener implements ProcessEventListener { List taskActors = dao.query(ProcessTaskActor.class, Cnd.where(ProcessTaskActor::getProcessTaskId, "=", task.getId())); for (ProcessTaskActor taskActor : taskActors) { + + JSONObject config = new JSONObject(); + config.set("pcUrl", Globals.AppDomain + task.getFormKey()); + // 模拟发送消息 - String message = StrUtil.format("您有一条待办任务,实例:{},处理环节:{}", instanceName, taskDisplayName); + String message = ""; + if(StrUtil.isNotBlank(task.getH5FormKey())) { + config.set("mobileUrl", Globals.AppDomain + task.getH5FormKey()); + message = StrUtil.format("您有一条待办任务,实例:{},处理环节:{}。", instanceName, taskDisplayName); + } else { + config.set("mobileUrl", Globals.AppDomain + "/platform/tooltip/h5"); + message = StrUtil.format("您有一条待办任务,实例:{},处理环节:{},请到电脑端智慧工会系统审核。", instanceName, taskDisplayName); + } log.info(message); - globalMessageSendService.sendMessage(taskDisplayName, message, 2, List.of(taskActor.getActorId()), null); + + globalMessageSendService.sendMessage(taskDisplayName, message, 2, List.of(taskActor.getActorId()), config); } } } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/message/strategy/impl/WechatEnterpriseMessageSendStrategy.java b/src/main/java/com/budwk/app/zhgh/dayofficework/message/strategy/impl/WechatEnterpriseMessageSendStrategy.java new file mode 100644 index 0000000..0a9db2c --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/message/strategy/impl/WechatEnterpriseMessageSendStrategy.java @@ -0,0 +1,88 @@ +package com.budwk.app.zhgh.dayofficework.message.strategy.impl; + +import cn.hutool.json.JSONObject; +import com.budwk.app.base.sms.SmsService; +import com.budwk.app.base.sms.WechatEnterpriseService; +import com.budwk.app.sys.models.Sys_user; +import com.budwk.app.zhgh.dayofficework.message.enums.GlobalMessageChannel; +import com.budwk.app.zhgh.dayofficework.message.strategy.GlobalMessageSendStrategy; +import lombok.extern.slf4j.Slf4j; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Lang; + +import java.util.List; + +/** + * @ClassName WechatEnterpriseMessageSendStrategy + * @Author JyuHsin + * @Date 2026/2/27 15:42 + * @Version 1.0 + * @Description TODO + */ +@IocBean +@Slf4j +public class WechatEnterpriseMessageSendStrategy implements GlobalMessageSendStrategy { + + @Inject + private Dao dao; + @Inject + private WechatEnterpriseService wechatService; + + @Override + public GlobalMessageChannel getChannel() { + return GlobalMessageChannel.WECHAT_ENTERPRISE; + } + + @Override + public boolean supportAsync() { + return GlobalMessageSendStrategy.super.supportAsync(); + } + + @Override + public boolean isEnabled() { + return true; + } + + @Override + public void send(String title, String content, Integer type, List receiverIds, JSONObject config) { + try { + log.info("开始发送企业微信消息,标题:{},接收人数量:{}", title, receiverIds.size()); + + // 查询用户手机号 + List users = dao.query(Sys_user.class, Cnd.where(Sys_user::getId, "in", receiverIds)); + sendMessage(title, content, type, users, config); + + log.info("企业微信消息发送完成,标题:{},接收人数量:{}", title, users.size()); + } catch (Exception e) { + log.error("企业微信消息发送失败,标题:{},错误:{}", title, e.getMessage(), e); + throw new RuntimeException("企业微信消息发送失败:" + e.getMessage(), e); + } + } + + @Override + public void sendByLoginName(String title, String content, Integer type, List receiverLoginNames, JSONObject config) { + try { + log.info("开始发送企业微信消息(按登录名),标题:{},接收人数量:{}", title, receiverLoginNames.size()); + + // 查询用户手机号 + List users = dao.query(Sys_user.class, Cnd.where(Sys_user::getLoginname, "in", receiverLoginNames)); + sendMessage(title, content, type, users, config); + + log.info("企业微信消息发送完成(按登录名),标题:{},接收人数量:{}", title, users.size()); + } catch (Exception e) { + log.error("企业微信消息发送失败(按登录名),标题:{},错误:{}", title, e.getMessage(), e); + throw new RuntimeException("企业微信消息发送失败:" + e.getMessage(), e); + } + } + + private void sendMessage(String title, String content, Integer type, List users, JSONObject config) { + if(Lang.isEmpty(users)) { + return; + } + List list = users.stream().map(Sys_user::getLoginname).toList(); + wechatService.massSendTextCard(list, "智慧工会", content, config.getStr("pcUrl"), config.getStr("mobileUrl")); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/tooltip/controller/TooltipCommonController.java b/src/main/java/com/budwk/app/zhgh/tooltip/controller/TooltipCommonController.java new file mode 100644 index 0000000..b085766 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/tooltip/controller/TooltipCommonController.java @@ -0,0 +1,24 @@ +package com.budwk.app.zhgh.tooltip.controller; + +import cn.dev33.satoken.annotation.SaCheckLogin; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; + +/** + * @ClassName TooltipCommonController + * @Author JyuHsin + * @Date 2026/3/10 16:14 + * @Version 1.0 + * @Description TODO + */ +@IocBean +@Ok("json:full") +@At("/platform/tooltip") +public class TooltipCommonController { + + @At("/h5") + @Ok("beetl:platform/zhghh5/tooltip/index.html") + @SaCheckLogin + public void index() {} +} diff --git a/src/main/resources/views/platform/zhghh5/tooltip/index.html b/src/main/resources/views/platform/zhghh5/tooltip/index.html new file mode 100644 index 0000000..ab49a35 --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/tooltip/index.html @@ -0,0 +1,55 @@ + + + + +
+
+
+ +
+
+
温馨提醒
+
请到电脑端智慧工会系统审核
+
+
+
+ + + +