diff --git a/zdxt-modules/zdxt-enforcement-code/pom.xml b/zdxt-modules/zdxt-enforcement-code/pom.xml
index 2ba4dfe9..7ad5a716 100644
--- a/zdxt-modules/zdxt-enforcement-code/pom.xml
+++ b/zdxt-modules/zdxt-enforcement-code/pom.xml
@@ -159,5 +159,12 @@
2.18.0
+
+
+ axis
+ axis
+ 1.4
+
+
diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/CommonController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/CommonController.java
new file mode 100644
index 00000000..61e0a67f
--- /dev/null
+++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/CommonController.java
@@ -0,0 +1,79 @@
+package com.zdxt.enforcementcode.controller.web.supervision;
+
+import com.zdxt.enforcementcode.common.util.ZwSmsClient;
+import com.zdxt.enforcementcode.domain.bo.thirdparty.SIQMsgParamBo;
+import com.zdxt.enforcementcode.service.thirdparty.ISIQService;
+import jakarta.validation.constraints.NotBlank;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.web.core.BaseController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 监督端-通用接口
+ */
+@Slf4j
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/web/common")
+public class CommonController extends BaseController {
+
+ private final ZwSmsClient zwSmsClient;
+ private final ISIQService siqService;
+
+ /**
+ * 直接发送短信(内容写死,用于联调测试)
+ *
+ *
+ */
+ @GetMapping("/sendSms")
+ public R sendSmsTest() {
+ String content = "【测试短信】尊敬的用户,您有一条执法预约提醒信息,请查收。";
+ String phone = "13751146725";
+ try {
+ String result = zwSmsClient.sendMessage(phone, content);
+ log.info("测试短信发送完成,phone={},平台返回:{}", phone, result);
+ return R.ok("发送成功", result);
+ } catch (Exception e) {
+ log.error("测试短信发送失败,phone={}", phone, e);
+ return R.fail("短信发送失败:" + e.getMessage());
+ }
+ }
+
+ /**
+ * 直接发送站内信(内容写死,用于联调测试)
+ *
+ * @param receiveAccount 接收账号(深i企登录名)
+ */
+ @GetMapping("/sendSiqMsg")
+ public R sendSiqMsgTest(@NotBlank(message = "接收账号不能为空") @RequestParam String receiveAccount) {
+ SIQMsgParamBo paramBo = new SIQMsgParamBo();
+ paramBo.setCreateBy(LoginHelper.getUsername());
+ paramBo.setReceiveAccount(receiveAccount);
+ paramBo.setSourceId("0");
+ Map variables = new HashMap<>();
+ variables.put("enterName", "测试");
+ variables.put("dept", "深圳市司法局");
+ variables.put("time", "2026-10-25 上午");
+ paramBo.setAdditionalData(variables);
+ try {
+ siqService.sendMsg(paramBo);
+ log.info("测试站内信发送完成,receiveAccount={}", paramBo.getReceiveAccount());
+ return R.ok("发送成功", null);
+ } catch (Exception e) {
+ log.error("测试站内信发送失败,receiveAccount={}", paramBo.getReceiveAccount(), e);
+ return R.fail("站内信发送失败:" + e.getMessage());
+ }
+ }
+
+}
diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeServiceImpl.java
index 2926778f..b969fe9d 100644
--- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeServiceImpl.java
+++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeServiceImpl.java
@@ -4,6 +4,7 @@ import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.zdxt.enforcementcode.common.commonenum.MsgSourceTypeEnum;
+import com.zdxt.enforcementcode.common.util.ZwSmsClient;
import com.zdxt.enforcementcode.domain.EnterpriseInformation;
import com.zdxt.enforcementcode.domain.bean.EnforcementEducationServices;
import com.zdxt.enforcementcode.domain.bo.thirdparty.YuGaoMsgParamBo;
@@ -20,6 +21,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.dromara.system.service.ISysConfigService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.zdxt.enforcementcode.domain.bo.EfcodeCpNoticeBo;
@@ -50,7 +52,10 @@ public class EfcodeCpNoticeServiceImpl implements IEfcodeCpNoticeService {
private final EfcodeCpNoticeMessageMapper noticeMessageMapper;
private final ISysMessageViewLogService sysMessageViewLogService;
private final ISIQService siqService;
+ private final ZwSmsClient zwSmsClient;
private final EnterpriseInformationMapper enterpriseInformationMapper;
+
+ private final ISysConfigService sysConfigService;
/**
* 查询行政执法检查计划-预告
*/
@@ -145,9 +150,7 @@ public class EfcodeCpNoticeServiceImpl implements IEfcodeCpNoticeService {
syncNoticeUsers(entity.getId(), bo.getEnforceUserNames(), bo.getEnforceUserIds(), bo.getEnforceUserTels());
// 发布时自动生成系统提示消息
if (entity.getStatus() != null && entity.getStatus() == 1L) {
- generateSystemMessage(entity);
-
- // 调用站内信发送预告消息
+ // 调用站内信发送预告消息(发送前内部校验系统参数 sns.send)
getSendYuGaoMsg(entity);
}
@@ -164,15 +167,53 @@ public class EfcodeCpNoticeServiceImpl implements IEfcodeCpNoticeService {
*/
public void getSendYuGaoMsg(EfcodeCpNotice entity){
- YuGaoMsgParamBo paramBo = new YuGaoMsgParamBo();
- paramBo.setSourceId(entity.getId());
- paramBo.setEnterpriseId(entity.getEnterpriseId());
- paramBo.setEnterpriseName(entity.getEnterpriseName());
- paramBo.setCreateByName(LoginHelper.getUsername());
- paramBo.setDeptName(entity.getDeptName());
- paramBo.setEnforceDate(entity.getEnforceDate());
- siqService.sendYuGaoMsg(paramBo);
+ // 发送前校验系统参数开关
+ if (!isSnsSendEnabled()) {
+ log.info("系统参数[sns.send]未开启,跳过预告消息(站内信/短信)发送,预告ID:{}", entity.getId());
+ return;
+ }
+
+ generateSystemMessage(entity);
+ try{
+ YuGaoMsgParamBo paramBo = new YuGaoMsgParamBo();
+ paramBo.setSourceId(entity.getId());
+ paramBo.setEnterpriseId(entity.getEnterpriseId());
+ paramBo.setEnterpriseName(entity.getEnterpriseName());
+ paramBo.setCreateByName(LoginHelper.getUsername());
+ paramBo.setDeptName(entity.getDeptName());
+ paramBo.setEnforceDate(entity.getEnforceDate());
+ siqService.sendYuGaoMsg(paramBo);
+
+ }catch (Exception e){
+ log.error("发送预告消息异常:{}", e.getMessage());
+ }
+
+ try {
+ // 异步发送预告短信
+ sendYuGaoSms(entity);
+ }catch (Exception e){
+ log.error("发送预告短信异常:{}", e.getMessage());
+ }
+
}
+
+ /**
+ * 异步发送预告短信,通知企业联系人
+ */
+ private void sendYuGaoSms(EfcodeCpNotice entity) {
+ String enforceTimeText = switch (entity.getEnforceTime() == null ? 0 : entity.getEnforceTime().intValue()) {
+ case 1 -> "上午";
+ case 2 -> "下午";
+ case 3 -> "其他";
+ default -> "";
+ };
+ String content =
+ "您好! "+entity.getEnterpriseName()+", " +
+ entity.getContactPerson()
+ +", 您有一条于: "+ entity.getEnforceDate() + enforceTimeText+" 的执法预约信息, 请查收";
+ zwSmsClient.asyncSendSms(entity.getContactPhone(), content);
+ }
+
/**
* 修改预告(仅草稿可修改)并同步更新 notice_users 表
*/
@@ -446,4 +487,12 @@ public class EfcodeCpNoticeServiceImpl implements IEfcodeCpNoticeService {
.set(EfcodeCpNoticeMessage::getUpdateTime, new Date());
return noticeMessageMapper.update(null, wrapper) > 0;
}
+
+ /**
+ * 校验系统参数 sns.send 是否开启(1=true=Y 视为开启)
+ */
+ private boolean isSnsSendEnabled() {
+ String value = sysConfigService.selectConfigByKey("sns.send");
+ return "1".equals(value) || "true".equalsIgnoreCase(value) || "Y".equalsIgnoreCase(value);
+ }
}
diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/impl/SIQServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/impl/SIQServiceImpl.java
index 10e95367..e5b9134b 100644
--- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/impl/SIQServiceImpl.java
+++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/thirdparty/impl/SIQServiceImpl.java
@@ -93,9 +93,15 @@ public class SIQServiceImpl implements ISIQService {
}
for (EnterpriseUserRefVo userRef : userRefList) {
+ // 账号为空则跳过,不发送该用户的消息
+ if (userRef == null || userRef.getUserId() != null) {
+ log.warn("企业[{}]关联用户[{}]登录账号为空,跳过预告消息发送", enterpriseId,
+ userRef == null ? "" : userRef.getUserId());
+ continue;
+ }
SIQMsgParamBo siqMsgParamBo = new SIQMsgParamBo();
siqMsgParamBo.setCreateBy(paramBo.getCreateByName());
- siqMsgParamBo.setReceiveAccount(String.valueOf(userRef.getLoginName()));
+ siqMsgParamBo.setReceiveAccount(userRef.getUserId() + "");
Map variables = new HashMap<>();
variables.put("enterName", paramBo.getEnterpriseName());
variables.put("dept", paramBo.getDeptName());