This commit is contained in:
van
2026-04-01 15:52:55 +08:00
parent 6a88a68320
commit 921c8a2374
9 changed files with 399 additions and 1 deletions

View File

@@ -0,0 +1,134 @@
package com.ruoyi.jarvis.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import java.util.Date;
/**
* 企微 inbound 消息追踪 wecom_inbound_trace
*/
public class WeComInboundTrace extends BaseEntity {
private static final long serialVersionUID = 1L;
private Long id;
@Excel(name = "消息ID")
private String msgId;
@Excel(name = "AgentID")
private String agentId;
@Excel(name = "CorpId")
private String corpId;
@Excel(name = "发送人UserID")
private String fromUserName;
private String content;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "微信发送时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date wxMsgTime;
private String replyContent;
@Excel(name = "会话进行中", readConverterExp = "0=否,1=是")
private Integer sessionActive;
@Excel(name = "会话场景")
private String sessionScene;
@Excel(name = "会话步骤")
private String sessionStep;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getMsgId() {
return msgId;
}
public void setMsgId(String msgId) {
this.msgId = msgId;
}
public String getAgentId() {
return agentId;
}
public void setAgentId(String agentId) {
this.agentId = agentId;
}
public String getCorpId() {
return corpId;
}
public void setCorpId(String corpId) {
this.corpId = corpId;
}
public String getFromUserName() {
return fromUserName;
}
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getWxMsgTime() {
return wxMsgTime;
}
public void setWxMsgTime(Date wxMsgTime) {
this.wxMsgTime = wxMsgTime;
}
public String getReplyContent() {
return replyContent;
}
public void setReplyContent(String replyContent) {
this.replyContent = replyContent;
}
public Integer getSessionActive() {
return sessionActive;
}
public void setSessionActive(Integer sessionActive) {
this.sessionActive = sessionActive;
}
public String getSessionScene() {
return sessionScene;
}
public void setSessionScene(String sessionScene) {
this.sessionScene = sessionScene;
}
public String getSessionStep() {
return sessionStep;
}
public void setSessionStep(String sessionStep) {
this.sessionStep = sessionStep;
}
}

View File

@@ -15,6 +15,8 @@ public class WeComInboundRequest {
private String toUserName;
private String agentId;
private String msgId;
/** 企微 XML CreateTime秒级 Unix 时间戳wxSend 传入) */
private Long wxCreateTime;
public String getFromUserName() {
return fromUserName;
@@ -55,4 +57,12 @@ public class WeComInboundRequest {
public void setMsgId(String msgId) {
this.msgId = msgId;
}
public Long getWxCreateTime() {
return wxCreateTime;
}
public void setWxCreateTime(Long wxCreateTime) {
this.wxCreateTime = wxCreateTime;
}
}

View File

@@ -0,0 +1,16 @@
package com.ruoyi.jarvis.mapper;
import com.ruoyi.jarvis.domain.WeComInboundTrace;
import java.util.List;
public interface WeComInboundTraceMapper {
int insertWeComInboundTrace(WeComInboundTrace trace);
WeComInboundTrace selectWeComInboundTraceById(Long id);
List<WeComInboundTrace> selectWeComInboundTraceList(WeComInboundTrace query);
int deleteWeComInboundTraceByIds(Long[] ids);
}

View File

@@ -0,0 +1,17 @@
package com.ruoyi.jarvis.service;
import com.ruoyi.jarvis.domain.WeComInboundTrace;
import com.ruoyi.jarvis.domain.dto.WeComInboundRequest;
import java.util.List;
public interface IWeComInboundTraceService {
void recordInbound(WeComInboundRequest request, String reply);
WeComInboundTrace selectWeComInboundTraceById(Long id);
List<WeComInboundTrace> selectWeComInboundTraceList(WeComInboundTrace query);
int deleteWeComInboundTraceByIds(Long[] ids);
}

View File

@@ -0,0 +1,73 @@
package com.ruoyi.jarvis.service.impl;
import com.ruoyi.jarvis.domain.WeComInboundTrace;
import com.ruoyi.jarvis.domain.dto.WeComChatSession;
import com.ruoyi.jarvis.domain.dto.WeComInboundRequest;
import com.ruoyi.jarvis.mapper.WeComInboundTraceMapper;
import com.ruoyi.jarvis.service.IWeComChatSessionService;
import com.ruoyi.jarvis.service.IWeComInboundTraceService;
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.Date;
import java.util.List;
@Service
public class WeComInboundTraceServiceImpl implements IWeComInboundTraceService {
private static final Logger log = LoggerFactory.getLogger(WeComInboundTraceServiceImpl.class);
@Resource
private WeComInboundTraceMapper weComInboundTraceMapper;
@Resource
private IWeComChatSessionService weComChatSessionService;
@Override
public void recordInbound(WeComInboundRequest request, String reply) {
if (request == null || !StringUtils.hasText(request.getFromUserName())) {
return;
}
try {
String from = request.getFromUserName().trim();
WeComInboundTrace trace = new WeComInboundTrace();
trace.setMsgId(request.getMsgId());
trace.setAgentId(request.getAgentId());
trace.setCorpId(request.getToUserName());
trace.setFromUserName(from);
trace.setContent(request.getContent());
Long wxSec = request.getWxCreateTime();
if (wxSec != null && wxSec > 0) {
trace.setWxMsgTime(new Date(wxSec * 1000L));
}
trace.setReplyContent(reply != null ? reply : "");
WeComChatSession session = weComChatSessionService.get(from);
trace.setSessionActive(session != null ? 1 : 0);
if (session != null) {
trace.setSessionScene(session.getScene());
trace.setSessionStep(session.getStep());
}
weComInboundTraceMapper.insertWeComInboundTrace(trace);
} catch (Exception e) {
log.warn("企微消息追踪落库失败: {}", e.toString());
}
}
@Override
public WeComInboundTrace selectWeComInboundTraceById(Long id) {
return weComInboundTraceMapper.selectWeComInboundTraceById(id);
}
@Override
public List<WeComInboundTrace> selectWeComInboundTraceList(WeComInboundTrace query) {
return weComInboundTraceMapper.selectWeComInboundTraceList(query);
}
@Override
public int deleteWeComInboundTraceByIds(Long[] ids) {
return weComInboundTraceMapper.deleteWeComInboundTraceByIds(ids);
}
}

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.jarvis.mapper.WeComInboundTraceMapper">
<resultMap id="WeComInboundTraceResult" type="WeComInboundTrace">
<id property="id" column="id"/>
<result property="msgId" column="msg_id"/>
<result property="agentId" column="agent_id"/>
<result property="corpId" column="corp_id"/>
<result property="fromUserName" column="from_user_name"/>
<result property="content" column="content"/>
<result property="wxMsgTime" column="wx_msg_time"/>
<result property="replyContent" column="reply_content"/>
<result property="sessionActive" column="session_active"/>
<result property="sessionScene" column="session_scene"/>
<result property="sessionStep" column="session_step"/>
<result property="createTime" column="create_time"/>
</resultMap>
<sql id="selectVo">
select id, msg_id, agent_id, corp_id, from_user_name, content, wx_msg_time,
reply_content, session_active, session_scene, session_step, create_time
from wecom_inbound_trace
</sql>
<insert id="insertWeComInboundTrace" parameterType="WeComInboundTrace" useGeneratedKeys="true" keyProperty="id">
insert into wecom_inbound_trace (
msg_id, agent_id, corp_id, from_user_name, content, wx_msg_time,
reply_content, session_active, session_scene, session_step
) values (
#{msgId}, #{agentId}, #{corpId}, #{fromUserName}, #{content}, #{wxMsgTime},
#{replyContent}, #{sessionActive}, #{sessionScene}, #{sessionStep}
)
</insert>
<select id="selectWeComInboundTraceById" resultMap="WeComInboundTraceResult">
<include refid="selectVo"/>
where id = #{id}
</select>
<select id="selectWeComInboundTraceList" parameterType="WeComInboundTrace" resultMap="WeComInboundTraceResult">
<include refid="selectVo"/>
<where>
<if test="msgId != null and msgId != ''">and msg_id = #{msgId}</if>
<if test="fromUserName != null and fromUserName != ''">and from_user_name like concat('%', #{fromUserName}, '%')</if>
<if test="agentId != null and agentId != ''">and agent_id = #{agentId}</if>
<if test="sessionActive != null">and session_active = #{sessionActive}</if>
<if test="params.beginTime != null and params.beginTime != ''">
and create_time &gt;= #{params.beginTime}
</if>
<if test="params.endTime != null and params.endTime != ''">
and create_time &lt;= concat(#{params.endTime}, ' 23:59:59')
</if>
</where>
order by id desc
</select>
<delete id="deleteWeComInboundTraceByIds" parameterType="Long">
delete from wecom_inbound_trace where id in
<foreach collection="array" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>