diff --git a/nflg-qms-admin/pom.xml b/nflg-qms-admin/pom.xml
index 417ec78e..fea25650 100644
--- a/nflg-qms-admin/pom.xml
+++ b/nflg-qms-admin/pom.xml
@@ -206,6 +206,12 @@
io.minio
minio
8.5.17
+
+
+ bcprov-jdk18on
+ org.bouncycastle
+
+
diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/TestController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/TestController.java
new file mode 100644
index 00000000..0557660b
--- /dev/null
+++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/TestController.java
@@ -0,0 +1,47 @@
+package com.nflg.qms.admin.controller;
+
+import com.nflg.qms.admin.service.BasdeSerialNumberControllerService;
+import com.nflg.qms.admin.service.ISendMessageService;
+import com.nflg.wms.common.pojo.ApiResult;
+import com.nflg.wms.common.util.UserUtil;
+import com.nflg.wms.repository.entity.QmsTodoItem;
+import com.nflg.wms.starter.BaseController;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 测试
+ */
+@Slf4j
+@RestController
+@RequestMapping("/test")
+public class TestController extends BaseController {
+
+ @Resource
+ private List sendMessageServices;
+
+ @Resource
+ private BasdeSerialNumberControllerService basdeSerialNumberControllerService;
+
+ /**
+ * 发送消息
+ */
+ @GetMapping("/sendMessage")
+ public ApiResult sendMessage() {
+ QmsTodoItem qmsTodoItem = new QmsTodoItem()
+ .setCode(basdeSerialNumberControllerService.generateSerialNumber(32))
+ .setIsRead(false)
+ .setSourceTypeId(2046157760401182721L)
+ .setSourceId(0L)
+ .setCreateUserId(UserUtil.getUserId())
+ .setCreateUserName(UserUtil.getUserName())
+ .setCreateTime(java.time.LocalDateTime.now());
+ sendMessageServices.forEach(service -> service.sendSystemMessage(qmsTodoItem));
+ return ApiResult.success();
+ }
+}
diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/ISendMessageService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/ISendMessageService.java
new file mode 100644
index 00000000..09f1a565
--- /dev/null
+++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/ISendMessageService.java
@@ -0,0 +1,12 @@
+package com.nflg.qms.admin.service;
+
+import com.nflg.wms.repository.entity.QmsTodoItem;
+
+public interface ISendMessageService {
+
+ /**
+ * 发送待办消息
+ * @param item 待办事项
+ */
+ void sendSystemMessage(QmsTodoItem item);
+}
diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/impl/EmailMessageImpl.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/impl/EmailMessageImpl.java
new file mode 100644
index 00000000..03970c11
--- /dev/null
+++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/impl/EmailMessageImpl.java
@@ -0,0 +1,22 @@
+package com.nflg.qms.admin.service.impl;
+
+import com.nflg.qms.admin.service.ISendMessageService;
+import com.nflg.wms.repository.entity.QmsTodoItem;
+import com.nflg.wms.starter.service.EmailService;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+/**
+ * 邮件消息实现类
+ */
+@Service
+public class EmailMessageImpl implements ISendMessageService {
+
+ @Resource
+ private EmailService emailService;
+
+ @Override
+ public void sendSystemMessage(QmsTodoItem item) {
+
+ }
+}
\ No newline at end of file
diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/impl/RtxMessageImpl.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/impl/RtxMessageImpl.java
new file mode 100644
index 00000000..1e4c6db2
--- /dev/null
+++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/impl/RtxMessageImpl.java
@@ -0,0 +1,50 @@
+package com.nflg.qms.admin.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.nflg.qms.admin.service.ISendMessageService;
+import com.nflg.qms.admin.service.RtxSendService;
+import com.nflg.wms.common.pojo.vo.DictionaryItemTranslateVO;
+import com.nflg.wms.common.util.MultilingualUtil;
+import com.nflg.wms.repository.entity.QmsTodoItem;
+import com.nflg.wms.repository.entity.UserInterior;
+import com.nflg.wms.repository.service.IDictionaryItemTranslateService;
+import com.nflg.wms.repository.service.IUserInteriorService;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 腾讯RTX消息实现类
+ */
+@Service
+public class RtxMessageImpl implements ISendMessageService {
+
+ @Resource
+ private RtxSendService rtxSendService;
+
+ @Resource
+ private IUserInteriorService userInteriorService;
+
+ @Resource
+ private IDictionaryItemTranslateService dictionaryItemTranslateService;
+
+ @Override
+ public void sendSystemMessage(QmsTodoItem item) {
+ UserInterior userInterior = userInteriorService.lambdaQuery()
+ .eq(UserInterior::getUserId, item.getCreateUserId())
+ .one();
+ if (Objects.nonNull(userInterior) && StrUtil.isNotBlank(userInterior.getRtxCode())) {
+ DictionaryItemTranslateVO dictionaryItemTranslateVO = dictionaryItemTranslateService.getByDictionaryItemId(item.getSourceTypeId(), MultilingualUtil.getLanguage());
+ if (Objects.nonNull(dictionaryItemTranslateVO)) {
+ rtxSendService.sendNotify(List.of(userInterior.getRtxCode()),
+ dictionaryItemTranslateVO.getValue(),
+ switch (dictionaryItemTranslateVO.getDictionaryItemCode()) {
+ default -> "未定义的待办事项:" + dictionaryItemTranslateVO.getDictionaryItemCode();
+ }
+ );
+ }
+ }
+ }
+}
diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/impl/TodoItemMessageImpl.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/impl/TodoItemMessageImpl.java
new file mode 100644
index 00000000..7877ae9f
--- /dev/null
+++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/impl/TodoItemMessageImpl.java
@@ -0,0 +1,22 @@
+package com.nflg.qms.admin.service.impl;
+
+import com.nflg.qms.admin.service.ISendMessageService;
+import com.nflg.wms.repository.entity.QmsTodoItem;
+import com.nflg.wms.repository.service.IQmsTodoItemService;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+/**
+ * 待办事项消息实现类
+ */
+@Service
+public class TodoItemMessageImpl implements ISendMessageService {
+
+ @Resource
+ private IQmsTodoItemService todoItemService;
+
+ @Override
+ public void sendSystemMessage(QmsTodoItem item) {
+ todoItemService.save(item);
+ }
+}
diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/EmailConfig.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/EmailConfig.java
new file mode 100644
index 00000000..76d0f940
--- /dev/null
+++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/EmailConfig.java
@@ -0,0 +1,21 @@
+package com.nflg.wms.common.pojo.dto;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public class EmailConfig {
+
+ //SMTP 服务器地址
+ private String host;
+
+ //SMTP 服务器端口
+ private Integer port;
+
+ //发件人用户名
+ private String username;
+
+ //发件人密码
+ private String password;
+}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsTodoItem.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsTodoItem.java
index 642d877b..ab37a6cc 100644
--- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsTodoItem.java
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsTodoItem.java
@@ -31,11 +31,6 @@ public class QmsTodoItem implements Serializable {
*/
private String code;
- /**
- * 标题
- */
- private String title;
-
/**
* 来源类型ID,关联dictionary_item表(字典编码MessageType)
*/
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/UserInterior.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/UserInterior.java
index c959a2c5..f91ca94d 100644
--- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/UserInterior.java
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/UserInterior.java
@@ -44,4 +44,9 @@ public class UserInterior implements Serializable {
* 职位id
*/
private Long positionId;
+
+ /**
+ * rtx账号
+ */
+ private String rtxCode;
}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/DictionaryItemTranslateMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/DictionaryItemTranslateMapper.java
index 08b68c2d..e264a90c 100644
--- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/DictionaryItemTranslateMapper.java
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/DictionaryItemTranslateMapper.java
@@ -23,4 +23,6 @@ public interface DictionaryItemTranslateMapper extends BaseMapper getByDictionaryCode(String dictionaryCode);
+
+ DictionaryItemTranslateVO getByDictionaryItemId(Long id, String language);
}
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IDictionaryItemTranslateService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IDictionaryItemTranslateService.java
index f63024e2..a6cba9a0 100644
--- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IDictionaryItemTranslateService.java
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IDictionaryItemTranslateService.java
@@ -18,6 +18,8 @@ public interface IDictionaryItemTranslateService extends IService getListByDictionaryItemId(Long id);
+ DictionaryItemTranslateVO getByDictionaryItemId(Long id, String language);
+
Long getId(Long dictionaryItemId, String code);
List getAllByDictionaryCode(String code, String language);
diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/DictionaryItemTranslateServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/DictionaryItemTranslateServiceImpl.java
index 4cc26ff1..27780ddc 100644
--- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/DictionaryItemTranslateServiceImpl.java
+++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/DictionaryItemTranslateServiceImpl.java
@@ -45,6 +45,11 @@ public class DictionaryItemTranslateServiceImpl extends ServiceImpl
+
+
diff --git a/nflg-wms-starter/pom.xml b/nflg-wms-starter/pom.xml
index 675ea26a..4bcfab54 100644
--- a/nflg-wms-starter/pom.xml
+++ b/nflg-wms-starter/pom.xml
@@ -117,6 +117,15 @@
s3
2.39.5
+
+ org.springframework.boot
+ spring-boot-starter-mail
+
+
+ com.sun.mail
+ javax.mail
+ 1.6.2
+
diff --git a/nflg-wms-starter/src/main/java/com/nflg/wms/starter/service/EmailService.java b/nflg-wms-starter/src/main/java/com/nflg/wms/starter/service/EmailService.java
new file mode 100644
index 00000000..0d689897
--- /dev/null
+++ b/nflg-wms-starter/src/main/java/com/nflg/wms/starter/service/EmailService.java
@@ -0,0 +1,54 @@
+package com.nflg.wms.starter.service;
+
+import cn.hutool.json.JSONUtil;
+import com.nflg.wms.common.pojo.dto.EmailConfig;
+import com.nflg.wms.common.util.VUtil;
+import com.nflg.wms.repository.entity.ParamConfig;
+import com.nflg.wms.repository.service.IParamConfigService;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.mail.*;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+import java.util.Objects;
+import java.util.Properties;
+
+@Component
+@Slf4j
+public class EmailService {
+
+ @Resource
+ private IParamConfigService paramConfigService;
+
+ public void sendEmail(String to,String subject, String content) throws MessagingException {
+ log.info("准备发送邮件,to:{},subject:{},content:{}",to,subject,content);
+ ParamConfig config = paramConfigService.lambdaQuery().eq(ParamConfig::getCode, "EmailSet").one();
+ VUtil.trueThrowBusinessError(Objects.isNull(config)).throwMessage("未配置邮件参数");
+ EmailConfig emailConfig= JSONUtil.toBean(config.getValue(), EmailConfig.class);
+ VUtil.trueThrowBusinessError(Objects.isNull(emailConfig)).throwMessage("邮件参数解析失败");
+ Properties properties = new Properties();
+ properties.put("mail.smtp.host", emailConfig.getHost());
+ properties.put("mail.smtp.port", emailConfig.getPort().toString());
+ properties.put("mail.smtp.auth", "true");
+ properties.put("mail.smtp.ssl.enable", "true");
+ // 设置超时时间(单位:毫秒)
+ properties.put("mail.smtp.connectiontimeout", "5000"); // 连接超时
+ properties.put("mail.smtp.timeout", "5000"); // 读取超时
+ properties.put("mail.smtp.writetimeout", "5000"); // 写入超时
+ Session session = Session.getInstance(properties, new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(emailConfig.getUsername(), emailConfig.getPassword());
+ }
+ });
+ MimeMessage message = new MimeMessage(session);
+ message.setFrom(new InternetAddress(emailConfig.getUsername()));
+ message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
+ message.setSubject(subject);
+ message.setContent(content, "text/html; charset=UTF-8");
+ Transport.send(message);
+ log.info("发送邮件完成,to:{},subject:{},content:{}",to,subject,content);
+ }
+}