diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/WeComShareLinkLogisticsJobServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/WeComShareLinkLogisticsJobServiceImpl.java index 445ef02..4e82a72 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/WeComShareLinkLogisticsJobServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/WeComShareLinkLogisticsJobServiceImpl.java @@ -1,125 +1,126 @@ -package com.ruoyi.jarvis.service.impl; - -import com.ruoyi.jarvis.domain.WeComInboundTrace; -import com.ruoyi.jarvis.domain.WeComShareLinkLogisticsJob; -import com.ruoyi.jarvis.mapper.WeComInboundTraceMapper; -import com.ruoyi.jarvis.mapper.WeComShareLinkLogisticsJobMapper; -import com.ruoyi.jarvis.service.IWeComShareLinkLogisticsJobService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Service; -import org.springframework.util.StringUtils; - -import javax.annotation.Resource; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -@Service -public class WeComShareLinkLogisticsJobServiceImpl implements IWeComShareLinkLogisticsJobService { - - private static final Logger log = LoggerFactory.getLogger(WeComShareLinkLogisticsJobServiceImpl.class); - - /** 与 WeComInboundServiceImpl.replyLogisticsRemarkDone 中文案一致 */ - private static final String REPLY_MARK_SHARE_LINK_DONE = "已加入查询队列"; - - private static final Pattern JD_3CN_HTTPS = Pattern.compile("https://3\\.cn/[A-Za-z0-9\\-]+"); - private static final Pattern JD_3CN_HTTP = Pattern.compile("http://3\\.cn/[A-Za-z0-9\\-]+"); - - @Resource - private WeComShareLinkLogisticsJobMapper weComShareLinkLogisticsJobMapper; - @Resource - private WeComInboundTraceMapper weComInboundTraceMapper; - - @Override - public WeComShareLinkLogisticsJob selectByJobKey(String jobKey) { - return weComShareLinkLogisticsJobMapper.selectByJobKey(jobKey); - } - - @Override - public List selectList(WeComShareLinkLogisticsJob query) { - return weComShareLinkLogisticsJobMapper.selectWeComShareLinkLogisticsJobList(query); - } - - @Override - public Map backfillImportedFromInboundTrace() { - int imported = 0; - int skippedDuplicate = 0; - int skippedNoUrl = 0; - int scanned = 0; - - List traces = weComInboundTraceMapper.selectTracesShareLinkRemarkDone(REPLY_MARK_SHARE_LINK_DONE); - if (traces != null) { - for (WeComInboundTrace t : traces) { - if (t == null || t.getId() == null || !StringUtils.hasText(t.getFromUserName())) { - continue; - } - scanned++; - String jobKey = "tracebf" + t.getId(); - if (weComShareLinkLogisticsJobMapper.selectByJobKey(jobKey) != null) { - skippedDuplicate++; - continue; - } - String url = extractJd3cnUrl(t.getContent()); - if (url == null) { - WeComInboundTrace prior = weComInboundTraceMapper.selectLatestPriorTraceWith3cnLink( - t.getFromUserName(), t.getId()); - if (prior != null) { - url = extractJd3cnUrl(prior.getContent()); - } - } - if (!StringUtils.hasText(url)) { - skippedNoUrl++; - log.debug("补录跳过 traceId={} 无可用 3.cn", t.getId()); - continue; - } - - WeComShareLinkLogisticsJob row = new WeComShareLinkLogisticsJob(); - row.setJobKey(jobKey); - row.setFromUserName(t.getFromUserName().trim()); - row.setTrackingUrl(url.trim()); - String remark = t.getContent() != null ? t.getContent() : ""; - row.setUserRemark(remark); - row.setTouserPush(t.getFromUserName().trim()); - row.setStatus("IMPORTED"); - row.setScanAttempts(0); - row.setLastNote("from_trace_id=" + t.getId()); - if (t.getCreateTime() != null) { - row.setCreateTime(t.getCreateTime()); - row.setUpdateTime(t.getCreateTime()); - } - try { - weComShareLinkLogisticsJobMapper.insertWeComShareLinkLogisticsJob(row); - imported++; - } catch (Exception e) { - log.warn("补录插入失败 traceId={} err={}", t.getId(), e.toString()); - } - } - } - - Map r = new LinkedHashMap<>(); - r.put("scannedRemarkDoneRows", scanned); - r.put("imported", imported); - r.put("skippedDuplicate", skippedDuplicate); - r.put("skippedNoUrl", skippedNoUrl); - r.put("hint", "IMPORTED 表示仅从企微消息追踪补录,运单与是否已推送以当时为准,可与 trace_id 对照 wecom_inbound_trace"); - return r; - } - - private static String extractJd3cnUrl(String text) { - if (!StringUtils.hasText(text)) { - return null; - } - Matcher m = JD_3CN_HTTPS.matcher(text); - if (m.find()) { - return m.group(); - } - Matcher m2 = JD_3CN_HTTP.matcher(text); - if (m2.find()) { - return m2.group(); - } - return null; - } -} +package com.ruoyi.jarvis.service.impl; + +import com.ruoyi.jarvis.domain.WeComInboundTrace; +import com.ruoyi.jarvis.domain.WeComShareLinkLogisticsJob; +import com.ruoyi.jarvis.mapper.WeComInboundTraceMapper; +import com.ruoyi.jarvis.mapper.WeComShareLinkLogisticsJobMapper; +import com.ruoyi.jarvis.service.IWeComShareLinkLogisticsJobService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Service +public class WeComShareLinkLogisticsJobServiceImpl implements IWeComShareLinkLogisticsJobService { + + private static final Logger log = LoggerFactory.getLogger(WeComShareLinkLogisticsJobServiceImpl.class); + + /** 与 WeComInboundServiceImpl.replyLogisticsRemarkDone 中文案一致 */ + private static final String REPLY_MARK_SHARE_LINK_DONE = "已加入查询队列"; + + private static final Pattern JD_3CN_HTTPS = Pattern.compile("https://3\\.cn/[A-Za-z0-9\\-]+"); + private static final Pattern JD_3CN_HTTP = Pattern.compile("http://3\\.cn/[A-Za-z0-9\\-]+"); + + @Resource + private WeComShareLinkLogisticsJobMapper weComShareLinkLogisticsJobMapper; + @Resource + private WeComInboundTraceMapper weComInboundTraceMapper; + + @Override + public WeComShareLinkLogisticsJob selectByJobKey(String jobKey) { + return weComShareLinkLogisticsJobMapper.selectByJobKey(jobKey); + } + + @Override + public List selectList(WeComShareLinkLogisticsJob query) { + return weComShareLinkLogisticsJobMapper.selectWeComShareLinkLogisticsJobList(query); + } + + @Override + public Map backfillImportedFromInboundTrace() { + int imported = 0; + int skippedDuplicate = 0; + int skippedNoUrl = 0; + int scanned = 0; + + List traces = weComInboundTraceMapper.selectTracesShareLinkRemarkDone(REPLY_MARK_SHARE_LINK_DONE); + if (traces != null) { + for (WeComInboundTrace t : traces) { + if (t == null || t.getId() == null || !StringUtils.hasText(t.getFromUserName())) { + continue; + } + scanned++; + String jobKey = "tracebf" + t.getId(); + if (weComShareLinkLogisticsJobMapper.selectByJobKey(jobKey) != null) { + skippedDuplicate++; + continue; + } + String url = extractJd3cnUrl(t.getContent()); + if (url == null) { + WeComInboundTrace prior = weComInboundTraceMapper.selectLatestPriorTraceWith3cnLink( + t.getFromUserName(), t.getId()); + if (prior != null) { + url = extractJd3cnUrl(prior.getContent()); + } + } + if (!StringUtils.hasText(url)) { + skippedNoUrl++; + log.debug("补录跳过 traceId={} 无可用 3.cn", t.getId()); + continue; + } + final String trackingUrlResolved = url.trim(); + + WeComShareLinkLogisticsJob row = new WeComShareLinkLogisticsJob(); + row.setJobKey(jobKey); + row.setFromUserName(t.getFromUserName().trim()); + row.setTrackingUrl(trackingUrlResolved); + String remark = t.getContent() != null ? t.getContent() : ""; + row.setUserRemark(remark); + row.setTouserPush(t.getFromUserName().trim()); + row.setStatus("IMPORTED"); + row.setScanAttempts(0); + row.setLastNote("from_trace_id=" + t.getId()); + if (t.getCreateTime() != null) { + row.setCreateTime(t.getCreateTime()); + row.setUpdateTime(t.getCreateTime()); + } + try { + weComShareLinkLogisticsJobMapper.insertWeComShareLinkLogisticsJob(row); + imported++; + } catch (Exception e) { + log.warn("补录插入失败 traceId={} err={}", t.getId(), e.toString()); + } + } + } + + Map r = new LinkedHashMap<>(); + r.put("scannedRemarkDoneRows", scanned); + r.put("imported", imported); + r.put("skippedDuplicate", skippedDuplicate); + r.put("skippedNoUrl", skippedNoUrl); + r.put("hint", "IMPORTED 表示仅从企微消息追踪补录,运单与是否已推送以当时为准,可与 trace_id 对照 wecom_inbound_trace"); + return r; + } + + private static String extractJd3cnUrl(String text) { + if (!StringUtils.hasText(text)) { + return null; + } + Matcher m = JD_3CN_HTTPS.matcher(text); + if (m.find()) { + return m.group(); + } + Matcher m2 = JD_3CN_HTTP.matcher(text); + if (m2.find()) { + return m2.group(); + } + return null; + } +}