From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/service/impl/EmailReceiveServiceImpl.java |  332 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 332 insertions(+), 0 deletions(-)

diff --git a/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/service/impl/EmailReceiveServiceImpl.java b/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/service/impl/EmailReceiveServiceImpl.java
new file mode 100644
index 0000000..8704a8b
--- /dev/null
+++ b/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/service/impl/EmailReceiveServiceImpl.java
@@ -0,0 +1,332 @@
+package jnpf.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import feign.Response;
+import jnpf.base.PaginationTime;
+import jnpf.base.entity.EmailConfigEntity;
+import jnpf.base.service.SuperServiceImpl;
+import jnpf.config.ConfigValueUtil;
+import jnpf.constant.FileTypeConstant;
+import jnpf.constant.MsgCode;
+import jnpf.entity.EmailReceiveEntity;
+import jnpf.entity.EmailSendEntity;
+import jnpf.exception.DataException;
+import jnpf.file.FileApi;
+import jnpf.file.FileUploadApi;
+import jnpf.mapper.EmailConfigMapper;
+import jnpf.mapper.EmailReceiveMapper;
+import jnpf.mapper.EmailSendMapper;
+import jnpf.message.model.mail.*;
+import jnpf.model.upload.UploadFileModel;
+import jnpf.service.EmailReceiveService;
+import jnpf.util.*;
+import jnpf.util.type.StringNumber;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 閭欢鎺ユ敹
+ *
+ * @author JNPF寮�鍙戝钩鍙扮粍
+ * @version V3.1.0
+ * @copyright 寮曡繄淇℃伅鎶�鏈湁闄愬叕鍙革紙https://www.jnpfsoft.com锛�
+ * @date 2019骞�9鏈�26鏃� 涓婂崍9:18
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class EmailReceiveServiceImpl extends SuperServiceImpl<EmailReceiveMapper, EmailReceiveEntity> implements EmailReceiveService {
+
+
+    private final EmailSendMapper emailSendMapper;
+
+    private final EmailConfigMapper emailConfigMapper;
+
+    private final Pop3Util pop3Util;
+
+    private final ConfigValueUtil configValueUtil;
+
+    private final FileApi fileApi;
+
+    private final FileUploadApi fileUploadApi;
+
+    @Override
+    public List<EmailReceiveEntity> getReceiveList(PaginationTime paginationTime) {
+        return this.baseMapper.getReceiveList(paginationTime);
+    }
+
+    @Override
+    public List<EmailReceiveEntity> getDashboardReceiveList() {
+        return this.baseMapper.getDashboardReceiveList();
+    }
+
+    @Override
+    public List<EmailReceiveEntity> getStarredList(PaginationTime paginationTime) {
+        return this.baseMapper.getStarredList(paginationTime);
+    }
+
+    @Override
+    public List<EmailSendEntity> getDraftList(PaginationTime paginationTime) {
+        return emailSendMapper.getDraftList(paginationTime);
+    }
+
+    @Override
+    public List<EmailSendEntity> getSentList(PaginationTime paginationTime) {
+        return emailSendMapper.getSentList(paginationTime);
+    }
+
+    @Override
+    public EmailConfigEntity getConfigInfo() {
+        String userId = UserProvider.getUser().getUserId();
+        QueryWrapper<EmailConfigEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(EmailConfigEntity::getCreatorUserId, userId);
+        return emailConfigMapper.selectOne(queryWrapper);
+    }
+
+    @Override
+    public EmailConfigEntity getConfigInfo(String userId) {
+        QueryWrapper<EmailConfigEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(EmailConfigEntity::getCreatorUserId, userId);
+        return emailConfigMapper.selectOne(queryWrapper);
+    }
+
+    @Override
+    public Object getInfo(String id) {
+        EmailReceiveEntity receiveInfo = this.getById(id);
+        Object object;
+        if (receiveInfo != null) {
+            //瑙f瀽鍐呭
+            receiveInfo.setBodyText(receiveInfo.getBodyText());
+            //鏇存柊宸茶
+            receiveInfo.setIsRead(1);
+            receiveInfo.setLastModifyTime(new Date());
+            receiveInfo.setLastModifyUserId(UserProvider.getUser().getUserId());
+            this.updateById(receiveInfo);
+            object = receiveInfo;
+        } else {
+            object = emailSendMapper.selectById(id);
+        }
+        return object;
+    }
+
+    @Override
+    public boolean delete(String id) {
+        Object object = getInfo(id);
+        if (object instanceof EmailReceiveEntity) {
+            //鍒犻櫎閭欢
+            EmailConfigEntity mailConfig = getConfigInfo();
+            EmailReceiveEntity mailReceiveEntity = (EmailReceiveEntity) object;
+            MailAccount mailAccount = new MailAccount();
+            mailAccount.setAccount(mailConfig.getAccount());
+            mailAccount.setPassword(mailConfig.getPassword());
+            mailAccount.setPop3Port(mailConfig.getPop3Port());
+            mailAccount.setPop3Host(mailConfig.getPop3Host());
+            pop3Util.deleteMessage(mailAccount, mailReceiveEntity.getMID());
+            this.removeById(mailReceiveEntity.getId());
+            return true;
+        } else if (object != null) {
+            //鍒犻櫎鏁版嵁
+            EmailSendEntity entity = (EmailSendEntity) object;
+            emailSendMapper.deleteById(entity.getId());
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    @DSTransactional
+    public void saveDraft(EmailSendEntity entity) {
+        entity.setState(-1);
+        if (StringUtil.isNotEmpty(entity.getId())) {
+            entity.setLastModifyTime(new Date());
+            entity.setLastModifyUserId(UserProvider.getUser().getUserId());
+            emailSendMapper.updateById(entity);
+        } else {
+            entity.setId(RandomUtil.uuId());
+            entity.setCreatorUserId(UserProvider.getUser().getUserId());
+            emailSendMapper.insert(entity);
+        }
+    }
+
+    @Override
+    public boolean receiveRead(String id, int isRead) {
+        EmailReceiveEntity entity = (EmailReceiveEntity) getInfo(id);
+        if (entity != null) {
+            entity.setIsRead(isRead);
+            return this.updateById(entity);
+        }
+        return false;
+    }
+
+    @Override
+    public boolean receiveStarred(String id, int isStarred) {
+        EmailReceiveEntity entity = (EmailReceiveEntity) getInfo(id);
+        if (entity != null) {
+            entity.setStarred(isStarred);
+            return this.updateById(entity);
+        }
+        return false;
+    }
+
+    @Override
+    public String checkLogin(EmailConfigEntity configEntity) {
+        MailAccount mailAccount = new MailAccount();
+        mailAccount.setAccount(configEntity.getAccount());
+        mailAccount.setPassword(configEntity.getPassword());
+        mailAccount.setPop3Host(configEntity.getPop3Host());
+        mailAccount.setPop3Port(configEntity.getPop3Port());
+        mailAccount.setSmtpHost(configEntity.getSmtpHost());
+        mailAccount.setSmtpPort(configEntity.getSmtpPort());
+        mailAccount.setSsl("1".equals(String.valueOf(configEntity.getEmailSsl())));
+        if (mailAccount.getSmtpHost() != null) {
+            return SmtpUtil.checkConnected(mailAccount);
+        }
+        if (mailAccount.getPop3Host() != null) {
+            return pop3Util.checkConnected(mailAccount);
+        }
+        return "false";
+    }
+
+    @Override
+    public void saveConfig(EmailConfigEntity configEntity) throws DataException {
+        EmailConfigEntity emailConfigEntity = getConfigInfo(UserProvider.getUser().getUserId());
+        if (emailConfigEntity == null && UserProvider.getUser().getUserId() != null) {
+            configEntity.setId(RandomUtil.uuId());
+            configEntity.setCreatorTime(new Date());
+            configEntity.setCreatorUserId(UserProvider.getUser().getUserId());
+            emailConfigMapper.insert(configEntity);
+        } else if (UserProvider.getUser().getUserId() != null) {
+            if (emailConfigEntity != null) {
+                configEntity.setId(emailConfigEntity.getId());
+            }
+            emailConfigMapper.updateById(configEntity);
+        } else {
+            throw new DataException(MsgCode.ETD114.get());
+        }
+    }
+
+    @Override
+    @DSTransactional
+    public int saveSent(EmailSendEntity entity, EmailConfigEntity mailConfig) {
+        int flag = 1;
+        //鎷疯礉鏂囦欢,娉ㄦ剰锛氫粠涓存椂鏂囦欢澶规嫹璐濆埌閭欢鏂囦欢澶�
+        List<MailFile> attachmentList = JsonUtil.getJsonToList(entity.getAttachment(), MailFile.class);
+        //閭欢璺緞
+        String mailFilePath = configValueUtil.getEmailFilePath();
+        try {
+            //鍐欏叆鏁版嵁
+            //鍙戦�侀偖浠�
+            //閭欢鍙戦�佷俊鎭�
+            List<File> attachmentFile = new ArrayList<>();
+            MailModel mailModel = new MailModel();
+            mailModel.setFrom(entity.getSender());
+            mailModel.setRecipient(entity.getRecipient());
+            mailModel.setCc(entity.getCc());
+            mailModel.setBcc(entity.getBcc());
+            mailModel.setSubject(entity.getSubject());
+            mailModel.setBodyText(entity.getBodyText());
+            mailModel.setAttachment(attachmentList);
+            mailModel.setFromName(mailConfig.getSenderName());
+            for (MailFile mailFile : mailModel.getAttachment()) {
+                File file = new File(XSSEscape.escapePath(mailFilePath + mailFile.getFileId()));
+                copy(mailFile, mailFilePath, file);
+                attachmentFile.add(file);
+            }
+            mailModel.setAttachmentFile(attachmentFile);
+            //璐﹀彿楠岃瘉淇℃伅
+            MailAccount mailAccount = new MailAccount();
+            mailAccount.setAccount(mailConfig.getAccount());
+            mailAccount.setPassword(mailConfig.getPassword());
+            mailAccount.setPop3Host(mailConfig.getPop3Host());
+            mailAccount.setPop3Port(mailConfig.getPop3Port());
+            mailAccount.setSmtpHost(mailConfig.getSmtpHost());
+            mailAccount.setSmtpPort(mailConfig.getSmtpPort());
+            mailAccount.setSsl(mailConfig.getEmailSsl() == 1);
+            mailAccount.setAccountName(mailConfig.getSenderName());
+            SmtpUtil smtpUtil = new SmtpUtil(mailAccount);
+            smtpUtil.sendMail(mailModel);
+            flag = 0;
+            //鎻掑叆鏁版嵁搴�
+            if (entity.getId() != null) {
+                entity.setState(1);
+                emailSendMapper.updateById(entity);
+            } else {
+                entity.setId(RandomUtil.uuId());
+                entity.setCreatorUserId(UserProvider.getUser().getUserId());
+                if (mailConfig.getAccount() != null) {
+                    entity.setSender(mailConfig.getAccount());
+                }
+                entity.setState(1);
+                emailSendMapper.insert(entity);
+            }
+        } catch (Exception e) {
+            for (MailFile mailFile : attachmentList) {
+                FileUtil.deleteFile(mailFilePath + mailFile.getFileId());
+            }
+            log.error(e.getMessage());
+        }
+        return flag;
+    }
+
+    private void copy(MailFile mailFile, String mailFilePath, File file) {
+        try (Response response = fileUploadApi.downFile(new UploadFileModel(mailFilePath, fileApi.getPath(FileTypeConstant.MAIL), mailFile.getFileId()));
+             InputStream inputStream = response.body().asInputStream()) {
+            cn.hutool.core.io.FileUtil.copyFile(inputStream, file, StandardCopyOption.REPLACE_EXISTING);
+        } catch (IOException e) {
+            throw new IllegalArgumentException(e);
+        }
+    }
+
+    @Override
+    @DSTransactional
+    public int receive(EmailConfigEntity mailConfig) {
+        //璐﹀彿楠岃瘉淇℃伅
+        MailAccount mailAccount = new MailAccount();
+        mailAccount.setAccount(mailConfig.getAccount());
+        mailAccount.setPassword(mailConfig.getPassword());
+        mailAccount.setPop3Host(mailConfig.getPop3Host());
+        mailAccount.setPop3Port(mailConfig.getPop3Port());
+        mailAccount.setSmtpHost(mailConfig.getSmtpHost());
+        mailAccount.setSmtpPort(mailConfig.getSmtpPort());
+        mailAccount.setDestDir(FileUploadUtils.getLocalBasePath() + FilePathUtil.getFilePath(FileTypeConstant.MAIL));
+        mailAccount.setSsl(StringNumber.ONE.equals(mailConfig.getEmailSsl().toString()));
+        PopMailModel popMailModel = pop3Util.popMail(mailAccount);
+
+        int receiveCount = popMailModel.getReceiveCount();
+        List<ReceiveModel> mailList = popMailModel.getMailList();
+        if (!mailList.isEmpty()) {
+            List<String> mids = mailList.stream().map(u -> u.getMID()).collect(Collectors.toList());
+            //鏌ヨ鏁版嵁搴撶姸鎬�
+            QueryWrapper<EmailReceiveEntity> wrapper = new QueryWrapper<>();
+            wrapper.lambda().in(EmailReceiveEntity::getMID, mids);
+            List<EmailReceiveEntity> emails = this.list(wrapper);
+            this.remove(wrapper);
+            //閭欢璧嬪�肩姸鎬�
+            for (ReceiveModel receiveModel : mailList) {
+                EmailReceiveEntity entity = JsonUtil.getJsonToBean(receiveModel, EmailReceiveEntity.class);
+                entity.setCreatorUserId(UserProvider.getUser().getUserId());
+                //閫氳繃鏁版嵁搴撹繘琛岃祴鍊硷紝娌℃湁灏遍粯璁�0
+                int stat = emails.stream().anyMatch(m -> m.getMID().equals(entity.getMID())) ? emails.stream().filter(m -> m.getMID().equals(entity.getMID())).findFirst().get().getIsRead() : 0;
+                long count = emails.stream().filter(m -> m.getMID().equals(entity.getMID())).count();
+                entity.setIsRead(stat);
+                if (count != 0) {
+                    receiveCount--;
+                }
+                this.save(entity);
+            }
+        }
+        return receiveCount;
+    }
+}

--
Gitblit v1.8.0