zoujiajian 1 жил өмнө
parent
commit
da7325abcf

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/corp/kf/CorpKfAccountSessionChatMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.corp.kf;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CorpKfAccountSessionChat;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CorpKfAccountSessionChatMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/1/2 13:51
+ */
+public interface CorpKfAccountSessionChatMapper extends BaseMapper<CorpKfAccountSessionChat> {
+}

+ 28 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CorpKfAccountSessionChat.java

@@ -0,0 +1,28 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CorpKfAccountSessionChat
+ * 创建者: JavaZou
+ * 创建时间:2025/1/2 13:45
+ */
+@Getter
+@Setter
+public class CorpKfAccountSessionChat extends BaseEntity{
+	private String openKfId;
+
+	private String servicerUserid;
+
+	private String externalUserid;
+
+	private String senderName;
+
+	private String msgType;
+
+	private String msgContent;
+
+	private Long sendTime;
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/kf/CorpKfSatisfactionMsg.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.kf;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CorpKfSatisfactionMsg
+ * 创建者: JavaZou
+ * 创建时间:2025/1/2 14:07
+ */
+@Getter
+@Setter
+public class CorpKfSatisfactionMsg {
+	private String code;
+
+	private String msgid;
+
+	private String msgtype;
+
+	private String msgmenu;
+}

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/kf/WxCorpChatMsg.java

@@ -16,8 +16,14 @@ import java.util.List;
 public class WxCorpChatMsg {
 	private String title;
 
+	private String external_userid;
+
+	private String servicer_userid;
+
 	private List<Item> item;
 
+	@Getter
+	@Setter
 	public static class Item{
 		private Long send_time;
 		private String msgtype;

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/corp/WxCorpOps.java

@@ -230,4 +230,9 @@ public interface WxCorpOps {
 	 * 变更微信客服会话状态
 	 */
 	void transCorpKfSessionToServicer(String toUserName, String openKfId, String userid, String externalUserId) throws Exception;
+
+	/**
+	 * 发送满意度调查msg
+	 */
+	void sendSatisfactionMsg() throws Exception;
 }

+ 27 - 2
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpServiceImpl.java

@@ -119,6 +119,9 @@ public class CorpServiceImpl implements CorpService {
 	@Autowired
 	private CorpKfAccountSyncMsgProgressMapper corpKfAccountSyncMsgProgressMapper;
 
+	@Autowired
+	private CorpKfAccountSessionChatMapper corpKfAccountSessionChatMapper;
+
 	@PostConstruct
 	private void init() {
 		corpMessageRouter = new CorpMessageRouter(this)
@@ -590,7 +593,10 @@ public class CorpServiceImpl implements CorpService {
 				if (mergedMsgs == null) {
 					mergedMsgs = new ArrayList<>();
 				}
-				mergedMsgs.add(item.getMergedMsg());
+				WxCorpChatMsg mergedMsg = item.getMergedMsg();
+				mergedMsg.setServicer_userid(item.getServicerUserId());
+				mergedMsg.setExternal_userid(item.getExternalUserId());
+				mergedMsgs.add(mergedMsg);
 			}
 		}
 		//进入会话事件
@@ -600,13 +606,32 @@ public class CorpServiceImpl implements CorpService {
 		//消息发送失败事件
 		//拒收客户消息变更事件
 		//同步客服聊天记录
-		syncChatMsg(mergedMsgs);
+		syncChatMsg(openKfId, mergedMsgs);
 		corpKfAccountSyncMsgProgress.setCursor(cursor);
 		while (wxCpKfMsgListResp.getHasMore() == 1) {
 			syncCorpKfMsg(corpKfAccount, corpKfAccountSessionConfig, corpId, wxCpKfMsgListResp.getNextCursor(), token, limit, corpKfAccountSyncMsgProgress);
 		}
 	}
 
+	private void syncChatMsg(String openKfId, List<WxCorpChatMsg> mergedMsgs) {
+		CorpKfAccountSessionChat corpKfAccountSessionChat = null;
+		for (WxCorpChatMsg mergedMsg : mergedMsgs) {
+			String servicerUserid = mergedMsg.getServicer_userid();
+			String externalUserid = mergedMsg.getExternal_userid();
+			for (WxCorpChatMsg.Item item : mergedMsg.getItem()) {
+				corpKfAccountSessionChat = new CorpKfAccountSessionChat();
+				corpKfAccountSessionChat.setExternalUserid(externalUserid);
+				corpKfAccountSessionChat.setServicerUserid(servicerUserid);
+				corpKfAccountSessionChat.setSenderName(item.getSender_name());
+				corpKfAccountSessionChat.setSendTime(item.getSend_time());
+				corpKfAccountSessionChat.setOpenKfId(openKfId);
+				corpKfAccountSessionChat.setMsgType(item.getMsgtype());
+				corpKfAccountSessionChat.setMsgContent(item.getMsg_content());
+				corpKfAccountSessionChatMapper.insert(corpKfAccountSessionChat);
+			}
+		}
+	}
+
 	private void sessionStatusChange(String corpId, String openKfId, List<WxCpKfMsgListResp.WxCpKfMsgItem> sessionStatusChanges) throws Exception {
 		if (CollUtil.isNotEmpty(sessionStatusChanges)) {
 			WxCpKfMsgListResp.WxCpKfMsgItem wxCpKfMsgItem = sessionStatusChanges.get(sessionStatusChanges.size() - 1);

+ 27 - 0
netflix-service/src/main/java/com/cyksj/service/corp/impl/WxCorpOpsImpl.java

@@ -60,6 +60,9 @@ public class WxCorpOpsImpl implements WxCorpOps {
 	@Autowired
 	private RedisService redisService;
 
+	//微信客服满意度内容
+	private static final String SATISFACTION_CONTENT = "{\"head_content\":\"您对本次服务是否满意呢? \",\"list\":[{\"type\":\"click\",\"click\":{\"id\":\"101\",\"content\":\"满意\"}},{\"type\":\"click\",\"click\":{\"id\":\"102\",\"content\":\"一般\"}},{\"type\":\"click\",\"click\":{\"id\":\"103\",\"content\":\"不满意\"}}]}";
+
 	@Override
 	public CorpExternalContactInfo getExternalContact(String corpId, String userId) throws Exception {
 		String url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token=" + getAccessToken(corpId) + "&external_userid=" + userId;
@@ -1014,4 +1017,28 @@ public class WxCorpOpsImpl implements WxCorpOps {
 			throw BusinessRuntimeException.getInstance("客服接入会话响应消息: " + resp.getErrmsg());
 		}
 	}
+
+	@Override
+	public void sendSatisfactionMsg() throws Exception {
+		String url = " https://qyapi.weixin.qq.com/cgi-bin/kf/send_msg_on_event?access_token=" + getKfAccessToken(yhlXWxCorpConfig.getCorpId());
+		CorpKfSatisfactionMsg corpKfSatisfactionMsg = new CorpKfSatisfactionMsg();
+		corpKfSatisfactionMsg.setCode("satisfaction");
+		corpKfSatisfactionMsg.setMsgtype("msgtype");
+		corpKfSatisfactionMsg.setMsgmenu(SATISFACTION_CONTENT);
+		HttpResponse<String> res =
+				J11HttpC.custom()
+						.ofPost()
+						.url(url)
+						.headers(J11HttpC.ReqType.raw_json)
+						.body(HttpRequest.BodyPublishers.ofString(Jsons.toJson(corpKfSatisfactionMsg), IoKit.Charsets.UTF_8.getCharset()))
+						.send(HttpResponse.BodyHandlers.ofString());
+		if (200 != res.statusCode()) {
+			throw BusinessRuntimeException.getInstance("满意度调查内容: " + res.body());
+		}
+
+		CorpKfSessionResp resp = Jsons.parseObject(res.body(), CorpKfSessionResp.class);
+		if (resp.getErrcode() != 0) {
+			throw BusinessRuntimeException.getInstance("满意度调查内容错误: " + resp.getErrmsg());
+		}
+	}
 }

+ 28 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/wxkf/CorpKfMsgController.java

@@ -0,0 +1,28 @@
+package com.cyksj.web.controller.manage.corp.wxkf;
+
+import com.cyksj.service.corp.WxCorpOps;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CorpKfMsgController
+ * 创建者: JavaZou
+ * 创建时间:2025/1/2 13:59
+ */
+@RestController
+@RequestMapping("/manage/corp/kf")
+@RequiredArgsConstructor
+public class CorpKfMsgController {
+	private final WxCorpOps wxCorpOps;
+
+	/**
+	 * 发送满意度调查消息
+	 */
+	@PostMapping("/send/satisfaction/msg")
+	public void sendSatisfactionMsg() throws Exception {
+		wxCorpOps.sendSatisfactionMsg();
+	}
+}