This commit is contained in:
van
2026-04-03 00:35:59 +08:00
parent c841990b49
commit 2e5540904f

View File

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