|
|
@@ -0,0 +1,136 @@
|
|
|
+package com.storlead.sales.mail.mkt.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
+import com.storlead.framework.common.constant.CommonConstant;
|
|
|
+import com.storlead.framework.mybatis.service.impl.MyBaseServiceImpl;
|
|
|
+import com.storlead.sales.mail.mkt.entity.MktMailMessageEntity;
|
|
|
+import com.storlead.sales.mail.mkt.entity.MktMailStatusEntity;
|
|
|
+import com.storlead.sales.mail.mkt.mapper.MktMailStatusMapper;
|
|
|
+import com.storlead.sales.mail.mkt.service.MktMailStatusService;
|
|
|
+import lombok.extern.log4j.Log4j2;
|
|
|
+import org.springframework.dao.DuplicateKeyException;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.Date;
|
|
|
+
|
|
|
+/**
|
|
|
+ * mkt_mail_status 埋点:发送态 / 打开 / 回复。
|
|
|
+ */
|
|
|
+@Log4j2
|
|
|
+@Service
|
|
|
+public class MktMailStatusServiceImpl extends MyBaseServiceImpl<MktMailStatusMapper, MktMailStatusEntity>
|
|
|
+ implements MktMailStatusService {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void ensureStatus(MktMailMessageEntity mail) {
|
|
|
+ if (mail == null || mail.getId() == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ MktMailStatusEntity existing = getByMailId(mail.getId());
|
|
|
+ if (existing != null) {
|
|
|
+ if (mail.getStatus() != null && !mail.getStatus().equals(existing.getSendStatus())) {
|
|
|
+ markSendStatus(mail.getId(), mail.getStatus());
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Date now = new Date();
|
|
|
+ MktMailStatusEntity row = new MktMailStatusEntity();
|
|
|
+ row.setMailId(mail.getId());
|
|
|
+ row.setSendStatus(mail.getStatus() == null ? 0 : mail.getStatus());
|
|
|
+ row.setOpened(0);
|
|
|
+ row.setIsRead(0);
|
|
|
+ row.setReplied(0);
|
|
|
+ row.setStatusUpdatedAt(now);
|
|
|
+ row.setOwnerBy(mail.getOwnerBy());
|
|
|
+ row.setCreateBy(mail.getCreateBy() == null ? mail.getOwnerBy() : mail.getCreateBy());
|
|
|
+ row.setIsDelete(CommonConstant.DEL_FLAG_0);
|
|
|
+ row.setEnabled(Boolean.TRUE);
|
|
|
+ try {
|
|
|
+ this.save(row);
|
|
|
+ } catch (DuplicateKeyException e) {
|
|
|
+ log.debug("mkt_mail_status already exists, mailId={}", mail.getId());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("ensureStatus error, mailId={}", mail.getId(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void markSendStatus(Long mailId, Integer sendStatus) {
|
|
|
+ if (mailId == null || sendStatus == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ ensureMinimalRow(mailId);
|
|
|
+ Date now = new Date();
|
|
|
+ LambdaUpdateWrapper<MktMailStatusEntity> update = new LambdaUpdateWrapper<>();
|
|
|
+ update.eq(MktMailStatusEntity::getMailId, mailId);
|
|
|
+ update.eq(MktMailStatusEntity::getIsDelete, CommonConstant.DEL_FLAG_0);
|
|
|
+ update.set(MktMailStatusEntity::getSendStatus, sendStatus);
|
|
|
+ update.set(MktMailStatusEntity::getStatusUpdatedAt, now);
|
|
|
+ this.update(update);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void markOpened(Long mailId) {
|
|
|
+ if (mailId == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ ensureMinimalRow(mailId);
|
|
|
+ Date now = new Date();
|
|
|
+ LambdaUpdateWrapper<MktMailStatusEntity> update = new LambdaUpdateWrapper<>();
|
|
|
+ update.eq(MktMailStatusEntity::getMailId, mailId);
|
|
|
+ update.eq(MktMailStatusEntity::getIsDelete, CommonConstant.DEL_FLAG_0);
|
|
|
+ update.set(MktMailStatusEntity::getOpened, 1);
|
|
|
+ update.set(MktMailStatusEntity::getIsRead, 1);
|
|
|
+ update.setSql("first_open_time = IFNULL(first_open_time, NOW())");
|
|
|
+ update.setSql("first_read_time = IFNULL(first_read_time, NOW())");
|
|
|
+ update.set(MktMailStatusEntity::getStatusUpdatedAt, now);
|
|
|
+ this.update(update);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void markReplied(Long mailId) {
|
|
|
+ if (mailId == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ ensureMinimalRow(mailId);
|
|
|
+ Date now = new Date();
|
|
|
+ LambdaUpdateWrapper<MktMailStatusEntity> update = new LambdaUpdateWrapper<>();
|
|
|
+ update.eq(MktMailStatusEntity::getMailId, mailId);
|
|
|
+ update.eq(MktMailStatusEntity::getIsDelete, CommonConstant.DEL_FLAG_0);
|
|
|
+ update.set(MktMailStatusEntity::getReplied, 1);
|
|
|
+ update.setSql("first_reply_time = IFNULL(first_reply_time, NOW())");
|
|
|
+ update.set(MktMailStatusEntity::getStatusUpdatedAt, now);
|
|
|
+ this.update(update);
|
|
|
+ }
|
|
|
+
|
|
|
+ private MktMailStatusEntity getByMailId(Long mailId) {
|
|
|
+ return this.getOne(new LambdaQueryWrapper<MktMailStatusEntity>()
|
|
|
+ .eq(MktMailStatusEntity::getMailId, mailId)
|
|
|
+ .eq(MktMailStatusEntity::getIsDelete, CommonConstant.DEL_FLAG_0)
|
|
|
+ .last("limit 1"));
|
|
|
+ }
|
|
|
+
|
|
|
+ private void ensureMinimalRow(Long mailId) {
|
|
|
+ if (getByMailId(mailId) != null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Date now = new Date();
|
|
|
+ MktMailStatusEntity row = new MktMailStatusEntity();
|
|
|
+ row.setMailId(mailId);
|
|
|
+ row.setSendStatus(0);
|
|
|
+ row.setOpened(0);
|
|
|
+ row.setIsRead(0);
|
|
|
+ row.setReplied(0);
|
|
|
+ row.setStatusUpdatedAt(now);
|
|
|
+ row.setIsDelete(CommonConstant.DEL_FLAG_0);
|
|
|
+ row.setEnabled(Boolean.TRUE);
|
|
|
+ try {
|
|
|
+ this.save(row);
|
|
|
+ } catch (DuplicateKeyException ignore) {
|
|
|
+ // concurrent insert
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("ensureMinimalRow error, mailId={}", mailId, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|