zoujiajian 1 vuosi sitten
vanhempi
sitoutus
5c64a57098

+ 14 - 0
netflix-dao/src/main/java/com/cyksj/mapper/corp/kf/CorpKfAccountSessionConfigMapper.java

@@ -0,0 +1,14 @@
+package com.cyksj.mapper.corp.kf;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.CorpKfAccountSessionConfig;
+
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CorpKfAccountSessionConfigMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/12/30 18:22
+ */
+public interface CorpKfAccountSessionConfigMapper extends BaseMapper<CorpKfAccountSessionConfig> {
+}

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

@@ -1,13 +0,0 @@
-package com.cyksj.mapper.corp.kf;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.cyksj.model.entity.CorpKfAccountSession;
-
-/**
- * 项目名: yhlxj2
- * 文件名: CorpKfAccountSessionMapper
- * 创建者: JavaZou
- * 创建时间:2024/12/30 18:22
- */
-public interface CorpKfAccountSessionMapper extends BaseMapper<CorpKfAccountSession> {
-}

+ 6 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/CorpKfAccountFollow.java

@@ -16,7 +16,7 @@ public class CorpKfAccountFollow extends BaseEntity{
 	private String openKfId;
 
 	/**
-	 * 成员id list
+	 * 成员id 数组
 	 */
 	private String userIdList;
 
@@ -29,4 +29,9 @@ public class CorpKfAccountFollow extends BaseEntity{
 	 * 值班结束时间
 	 */
 	private Integer endTime;
+
+	/**
+	 * 值班星期 数组
+	 */
+	private String dutyWeek;
 }

+ 2 - 2
netflix-dao/src/main/java/com/cyksj/model/entity/CorpKfAccountSession.java → netflix-dao/src/main/java/com/cyksj/model/entity/CorpKfAccountSessionConfig.java

@@ -5,13 +5,13 @@ import lombok.Setter;
 
 /**
  * 项目名: yhlxj2
- * 文件名: CorpKfAccountSession
+ * 文件名: CorpKfAccountSessionConfig
  * 创建者: JavaZou
  * 创建时间:2024/12/30 18:20
  */
 @Getter
 @Setter
-public class CorpKfAccountSession extends BaseEntity{
+public class CorpKfAccountSessionConfig extends BaseEntity{
 	private String openKfId;
 
 	/**

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

@@ -0,0 +1,27 @@
+package com.cyksj.model.kf;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: WxCorpChatMsg
+ * 创建者: JavaZou
+ * 创建时间:2024/12/31 12:05
+ */
+@Getter
+@Setter
+public class WxCorpChatMsg {
+	private String title;
+
+	private List<Item> item;
+
+	public static class Item{
+		private Long send_time;
+		private String msgtype;
+		private String sender_name;
+		private String msg_content;
+	}
+}

+ 85 - 0
netflix-dao/src/main/java/com/cyksj/model/kf/WxCorpKfMsgSendRequest.java

@@ -0,0 +1,85 @@
+package com.cyksj.model.kf;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author chan
+ * @date 2023-05-12 12:17 PM
+ */
+@NoArgsConstructor
+@Data
+public class WxCorpKfMsgSendRequest {
+  /**
+   * (发送欢迎语等事件响应消息) 事件响应消息对应的code。通过事件回调下发,仅可使用一次。
+   */
+  private String code;
+  /**
+   * <pre>
+   *   参数:touser
+   *   是否必须:是
+   *   类型:string
+   *   说明:指定接收消息的客户UserID
+   * </pre>
+   */
+  @JsonProperty("touser")
+  private String toUser;
+  /**
+   * <pre>
+   *   参数:open_kfid
+   *   是否必须:是
+   *   类型:string
+   *   说明:指定发送消息的客服帐号ID
+   * </pre>
+   */
+  @JsonProperty("open_kfid")
+  private String openKfid;
+  /**
+   * <pre>
+   *   参数:msgid
+   *   是否必须:否
+   *   类型:string
+   *   说明:指定消息ID
+   * </pre>
+   */
+  @JsonProperty("msgid")
+  private String msgId;
+  /**
+   * <pre>
+   *   参数:msgtype
+   *   是否必须:是
+   *   类型:string
+   *   说明:消息类型,(text,image,voice,video,file,link,miniprogram,msgmenu,location)
+   * </pre>
+   */
+  @JsonProperty("msgtype")
+  private String msgType;
+  /**
+   * <pre>
+   *   参数:text
+   *   是否必须:是
+   *   类型:obj
+   *   说明:文本消息
+   * </pre>
+   */
+  private WxCpKfTextMsg text;
+
+
+  @Data
+  public static class WxCpKfTextMsg {
+
+    /**
+     * <pre>
+     *   参数:content
+     *   是否必须:是
+     *   类型:string
+     *   说明:消息内容,最长不超过2048个字节
+     * </pre>
+     */
+    private String content;
+    @JsonProperty("menu_id")
+    private String menuId;
+  }
+
+}

+ 42 - 0
netflix-dao/src/main/java/com/cyksj/model/kf/WxCpKfEventMsg.java

@@ -0,0 +1,42 @@
+package com.cyksj.model.kf;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author chan
+ * @date 2023-05-12 11:27 AM
+ */
+@NoArgsConstructor
+@Data
+public class WxCpKfEventMsg {
+  @JsonProperty("event_type")
+  private String eventType;
+  @JsonProperty("open_kfid")
+  private String openKfid;
+  @JsonProperty("external_userid")
+  private String externalUserId;
+  @JsonProperty("servicer_userid")
+  private String servicerUserId;
+  @JsonProperty("old_servicer_userid")
+  private String oldServicerUserId;
+  @JsonProperty("new_servicer_userid")
+  private String newServicerUserId;
+  private String scene;
+  @JsonProperty("scene_param")
+  private String sceneParam;
+  @JsonProperty("welcome_code")
+  private String welcomeCode;
+  @JsonProperty("fail_msgid")
+  private String failMsgId;
+  @JsonProperty("fail_type")
+  private Integer failType;
+  private Integer status;
+  @JsonProperty("change_type")
+  private Integer changeType;
+  @JsonProperty("msg_code")
+  private String msgCode;
+  @JsonProperty("recall_msgid")
+  private String recallMsgId;
+}

+ 52 - 0
netflix-dao/src/main/java/com/cyksj/model/kf/WxCpKfMsgListResp.java

@@ -0,0 +1,52 @@
+package com.cyksj.model.kf;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+
+@NoArgsConstructor
+@Data
+public class WxCpKfMsgListResp {
+
+
+  @JsonProperty("errcode")
+  protected Long errcode;
+
+  @JsonProperty("errmsg")
+  protected String errmsg;
+
+  private static final long serialVersionUID = -3115552079069452091L;
+  @JsonProperty("next_cursor")
+  private String nextCursor;
+
+  @JsonProperty("has_more")
+  private Integer hasMore;
+
+  @JsonProperty("msg_list")
+  private List<WxCpKfMsgItem> msgList;
+
+  @NoArgsConstructor
+  @Data
+  public static class WxCpKfMsgItem {
+    @JsonProperty("msgid")
+    private String msgId;
+    @JsonProperty("open_kfid")
+    private String openKfid;
+    @JsonProperty("external_userid")
+    private String externalUserId;
+    @JsonProperty("send_time")
+    private Long sendTime;
+    private Integer origin;
+    @JsonProperty("servicer_userid")
+    private String servicerUserId;
+    @JsonProperty("msgtype")
+    private String msgType;
+    private WxCpKfEventMsg event;
+    //聊天记录事件
+    @JsonProperty("msgtype")
+    private WxCorpChatMsg mergedMsg;
+  }
+}

+ 25 - 0
netflix-dao/src/main/java/com/cyksj/model/kf/WxCpKfMsgSendResp.java

@@ -0,0 +1,25 @@
+package com.cyksj.model.kf;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * The type Wx cp kf msg send resp.
+ *
+ */
+@NoArgsConstructor
+@Data
+public class WxCpKfMsgSendResp{
+
+
+  @JsonProperty("errcode")
+  protected Long errcode;
+
+  @JsonProperty("errmsg")
+  protected String errmsg;
+
+  @JsonProperty("msgid")
+  private String msgId;
+  
+}

+ 12 - 0
netflix-dao/src/main/java/com/cyksj/model/request/corp/CorpXmlMessage.java

@@ -242,6 +242,18 @@ public class CorpXmlMessage implements Serializable {
 	@JacksonXmlProperty(localName = "LinkId")
 	private String LinkId;
 
+	// kf
+	/**
+	 * 调用拉取消息接口时,需要传此token,用于校验请求的合法性
+	 */
+	@JacksonXmlProperty(localName = "Token")
+	private String token;
+
+	/**
+	 * 有新消息的客服帐号。可通过sync_msg接口指定open_kfid获取此客服帐号的消息
+	 */
+	@JacksonXmlProperty(localName = "OpenKfId")
+	private String openKfId;
 
 	public static CorpXmlMessage fromXml(String xml) {
 		//修改微信变态的消息内容格式,方便解析

+ 11 - 4
netflix-service/src/main/java/com/cyksj/service/corp/WxCorpOps.java

@@ -2,10 +2,7 @@ package com.cyksj.service.corp;
 
 import cn.hutool.json.JSONObject;
 import com.cyksj.dto.CorpOauth2UserInfo;
-import com.cyksj.model.kf.WxCpKfAccountAdd;
-import com.cyksj.model.kf.WxCpKfAccountAddResp;
-import com.cyksj.model.kf.WxCpKfAccountDel;
-import com.cyksj.model.kf.WxCpKfAccountUpd;
+import com.cyksj.model.kf.*;
 import com.cyksj.model.request.corp.CorpFollowContact;
 import com.cyksj.model.request.corp.CorpGroupConfig;
 import com.cyksj.model.request.corp.CorpMsgTemplate;
@@ -211,4 +208,14 @@ public interface WxCorpOps {
 	 * @param upd 新的客服账号信息
 	 */
 	void updAccount(String corpId, WxCpKfAccountUpd upd) throws Exception;
+
+	/**
+	 * 读取消息
+	 */
+	WxCpKfMsgListResp syncMsg(String corpId, String cursor, String token, Integer limit, String openKfId) throws Exception;
+
+	/**
+	 * 客服发送消息
+	 */
+	WxCpKfMsgSendResp sendMsgOnEvent(String corpId, WxCorpKfMsgSendRequest request) throws Exception;
 }

+ 88 - 0
netflix-service/src/main/java/com/cyksj/service/corp/impl/CorpServiceImpl.java

@@ -18,8 +18,13 @@ import com.cyksj.config.corp.YHLXWxCorpConfig;
 import com.cyksj.dto.CorpOauth2UserInfo;
 import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.corp.*;
+import com.cyksj.mapper.corp.kf.CorpKfAccountMapper;
+import com.cyksj.mapper.corp.kf.CorpKfAccountSessionConfigMapper;
 import com.cyksj.model.dto.WxCorpEncryptDto;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.kf.WxCorpKfMsgSendRequest;
+import com.cyksj.model.kf.WxCpKfEventMsg;
+import com.cyksj.model.kf.WxCpKfMsgListResp;
 import com.cyksj.model.request.corp.Attachments;
 import com.cyksj.model.request.corp.CorpXmlMessage;
 import com.cyksj.model.request.corp.CorpXmlOutMessage;
@@ -46,6 +51,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
 
 /*
  *项目名: netflix
@@ -97,6 +103,12 @@ public class CorpServiceImpl implements CorpService {
 	@Autowired
 	private CorpUserFollowRelationMapper corpUserFollowRelationMapper;
 
+	@Autowired
+	private CorpKfAccountMapper corpKfAccountMapper;
+
+	@Autowired
+	private CorpKfAccountSessionConfigMapper corpKfAccountSessionConfigMapper;
+
 	@PostConstruct
 	private void init() {
 		corpMessageRouter = new CorpMessageRouter(this)
@@ -208,6 +220,16 @@ public class CorpServiceImpl implements CorpService {
 					}
 				})
 				.end()
+				//企业微信客服 用户进入会话事件
+				.rule().async(false).msgType("event").event("kf_msg_or_event")
+				.handler(new CorpMessageHandler() {
+					@Override
+					public CorpXmlOutMessage handle(CorpXmlMessage message, Map<String, Object> context, CorpService corpService) throws Exception {
+						//
+						return kfMsgOrEvent(message, context);
+					}
+				})
+				.end()
 		;
 
 	}
@@ -489,4 +511,70 @@ public class CorpServiceImpl implements CorpService {
 		}
 
 	}
+
+	/**
+	 * 企业微信客服 时间消息回调
+	 */
+	private CorpXmlOutMessage kfMsgOrEvent(CorpXmlMessage message, Map<String, Object> context) {
+		try {
+			String openKfId = message.getOpenKfId();
+			WxCpKfMsgListResp wxCpKfMsgListResp = wxCorpOps.syncMsg(message.getToUserName(), null, message.getToken(), null, openKfId);
+			List<WxCpKfMsgListResp.WxCpKfMsgItem> msgList = wxCpKfMsgListResp.getMsgList();
+			//欢迎语
+			sendWelcomeMsg(message, msgList);
+			//消息发送失败事件
+			//拒收客户消息变更事件
+			//同步客服聊天记录
+			syncChatMsg(message, msgList);
+			//发送
+		} catch (Exception e) {
+			log.error("企业微信客服 事件消息回调 错误");
+			throw BusinessRuntimeException.getInstance(StringUtil.getErrorMsg(e));
+		}
+		return null;
+	}
+
+	/**
+	 * 微信客服欢迎语
+	 */
+	public void sendWelcomeMsg(CorpXmlMessage message, List<WxCpKfMsgListResp.WxCpKfMsgItem> msgList) throws Exception {
+		String openKfId = message.getOpenKfId();
+		List<WxCpKfMsgListResp.WxCpKfMsgItem> enterSessionList = msgList.stream()
+				.filter((item) -> item.getEvent() != null && item.getEvent().getEventType().equals("enter_session")).collect(Collectors.toList());
+		//欢迎语
+		if (enterSessionList.size() > 0) {
+			WxCpKfMsgListResp.WxCpKfMsgItem wxCpKfMsgItem = enterSessionList.get(enterSessionList.size() - 1);
+			WxCpKfEventMsg event = wxCpKfMsgItem.getEvent();
+			String welcomeCode = event.getWelcomeCode();
+			CorpKfAccount corpKfAccount = corpKfAccountMapper.selectOne(Wrappers.lambdaQuery(CorpKfAccount.class)
+					.eq(CorpKfAccount::getOpenKfId, openKfId)
+					.last("limit 1"));
+			if (corpKfAccount == null) {
+				return;
+			}
+			WxCorpKfMsgSendRequest wxCpKfMsgSendRequest = new WxCorpKfMsgSendRequest();
+			wxCpKfMsgSendRequest.setMsgType("text");
+			wxCpKfMsgSendRequest.setCode(welcomeCode);
+			WxCorpKfMsgSendRequest.WxCpKfTextMsg textMsg = new WxCorpKfMsgSendRequest.WxCpKfTextMsg();
+			//账号会话设置
+			CorpKfAccountSessionConfig corpKfAccountSessionConfig = corpKfAccountSessionConfigMapper.selectOne(Wrappers.lambdaQuery(CorpKfAccountSessionConfig.class)
+					.eq(CorpKfAccountSessionConfig::getOpenKfId, openKfId)
+					.last("limit 1"));
+			if (corpKfAccountSessionConfig == null) {
+				log.info("openKfId:{}未设置会话设置", openKfId);
+				return;
+			}
+			if (StrUtil.isEmpty(corpKfAccountSessionConfig.getWelcomeContent())) {
+				log.info("openKfId:{}未设置会话欢迎语设置", openKfId);
+				return;
+			}
+			textMsg.setContent(corpKfAccountSessionConfig.getWelcomeContent());
+			wxCpKfMsgSendRequest.setText(textMsg);
+			wxCpKfMsgSendRequest.setToUser(welcomeCode);
+			wxCpKfMsgSendRequest.setOpenKfid(event.getOpenKfid());
+			wxCorpOps.sendMsgOnEvent(message.getToUserName(), wxCpKfMsgSendRequest);
+		} else {
+			log.error("企业微信客服 事件消息回调 时间内容为空.");
+		}
+	}
 }

+ 55 - 4
netflix-service/src/main/java/com/cyksj/service/corp/impl/WxCorpOpsImpl.java

@@ -15,10 +15,7 @@ import com.cyksj.config.corp.YHLXWxCorpConfig;
 import com.cyksj.dto.CorpOauth2UserInfo;
 import com.cyksj.dto.RedisKey;
 import com.cyksj.model.entity.WxCorpApp;
-import com.cyksj.model.kf.WxCpKfAccountAdd;
-import com.cyksj.model.kf.WxCpKfAccountAddResp;
-import com.cyksj.model.kf.WxCpKfAccountDel;
-import com.cyksj.model.kf.WxCpKfAccountUpd;
+import com.cyksj.model.kf.*;
 import com.cyksj.model.request.corp.CorpFollowContact;
 import com.cyksj.model.request.corp.CorpGroupConfig;
 import com.cyksj.model.request.corp.CorpMsgTemplate;
@@ -891,4 +888,58 @@ public class WxCorpOpsImpl implements WxCorpOps {
 			throw BusinessRuntimeException.getInstance("修改客服账号出错: " + jsonObject.getStr("errmsg"));
 		}
 	}
+
+	@Override
+	public WxCpKfMsgListResp syncMsg(String corpId, String cursor, String token, Integer limit, String openKfId) throws Exception {
+		String url = "https://qyapi.weixin.qq.com/cgi-bin/kf/sync_msg?access_token=" + getKfAccessToken(corpId);
+
+		JSONObject json = new JSONObject();
+		if (cursor != null) {
+			json.putOpt("cursor", cursor);
+		}
+		if (token != null) {
+			json.putOpt("token", token);
+		}
+		if (limit != null) {
+			json.putOpt("limit", limit);
+		}
+		HttpResponse<String> res =
+				J11HttpC.custom()
+						.ofPost()
+						.url(url)
+						.headers(J11HttpC.ReqType.raw_json)
+						.body(HttpRequest.BodyPublishers.ofString(Jsons.toJson(json), IoKit.Charsets.UTF_8.getCharset()))
+						.send(HttpResponse.BodyHandlers.ofString());
+		if (200 != res.statusCode()) {
+			throw BusinessRuntimeException.getInstance("读取消息: " + res.body());
+		}
+
+		WxCpKfMsgListResp resp = Jsons.parseObject(res.body(), WxCpKfMsgListResp.class);
+		if (resp.getErrcode() != 0) {
+			throw BusinessRuntimeException.getInstance("读取消息: " + resp.getErrmsg());
+		}
+		return resp;
+	}
+
+	@Override
+	public WxCpKfMsgSendResp sendMsgOnEvent(String corpId, WxCorpKfMsgSendRequest request) throws Exception {
+		String url = "https://qyapi.weixin.qq.com/cgi-bin/kf/send_msg_on_event?access_token=" + getKfAccessToken(corpId);
+
+		HttpResponse<String> res =
+				J11HttpC.custom()
+						.ofPost()
+						.url(url)
+						.headers(J11HttpC.ReqType.raw_json)
+						.body(HttpRequest.BodyPublishers.ofString(Jsons.toJson(request), IoKit.Charsets.UTF_8.getCharset()))
+						.send(HttpResponse.BodyHandlers.ofString());
+		if (200 != res.statusCode()) {
+			throw BusinessRuntimeException.getInstance("发送欢迎语等事件响应消息: " + res.body());
+		}
+
+		WxCpKfMsgSendResp resp = Jsons.parseObject(res.body(), WxCpKfMsgSendResp.class);
+		if (resp.getErrcode() != 0) {
+			throw BusinessRuntimeException.getInstance("发送欢迎语等事件响应消息: " + resp.getErrmsg());
+		}
+		return resp;
+	}
 }

+ 9 - 1
netflix-service/src/main/java/com/cyksj/service/corp/kf/CorpKfService.java

@@ -1,6 +1,10 @@
 package com.cyksj.service.corp.kf;
 
 import com.cyksj.model.entity.CorpKfAccount;
+import com.cyksj.model.entity.CorpKfAccountFollow;
+import com.cyksj.model.entity.CorpKfAccountSessionConfig;
+
+import java.util.List;
 
 /**
  * 项目名: yhlxj2
@@ -13,5 +17,9 @@ public interface CorpKfService {
 
 	void delKfAccount(Long id) throws Exception;
 
-	void updateKfAccount(CorpKfAccount corpKfAccount);
+	void updateKfAccount(CorpKfAccount corpKfAccount) throws Exception;
+
+	void setKfAccountRuleOrAutoReply(CorpKfAccountSessionConfig CorpKfAccountSessionConfig);
+
+	void setKfAccountDuty(List<CorpKfAccountFollow> corpKfAccountFollows);
 }

+ 22 - 5
netflix-service/src/main/java/com/cyksj/service/corp/kf/impl/CorpKfServiceImpl.java

@@ -5,10 +5,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.config.corp.YHLXWxCorpConfig;
 import com.cyksj.mapper.corp.kf.CorpKfAccountFollowMapper;
 import com.cyksj.mapper.corp.kf.CorpKfAccountMapper;
-import com.cyksj.mapper.corp.kf.CorpKfAccountSessionMapper;
+import com.cyksj.mapper.corp.kf.CorpKfAccountSessionConfigMapper;
 import com.cyksj.model.entity.CorpKfAccount;
 import com.cyksj.model.entity.CorpKfAccountFollow;
-import com.cyksj.model.entity.CorpKfAccountSession;
+import com.cyksj.model.entity.CorpKfAccountSessionConfig;
 import com.cyksj.model.kf.WxCpKfAccountAdd;
 import com.cyksj.model.kf.WxCpKfAccountAddResp;
 import com.cyksj.model.kf.WxCpKfAccountDel;
@@ -18,6 +18,8 @@ import com.cyksj.service.corp.kf.CorpKfService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * 项目名: yhlxj2
  * 文件名: CorpKfServiceImpl
@@ -35,7 +37,7 @@ public class CorpKfServiceImpl implements CorpKfService {
 
 	private final CorpKfAccountFollowMapper corpKfAccountFollowMapper;
 
-	private final CorpKfAccountSessionMapper corpKfAccountSessionMapper;
+	private final CorpKfAccountSessionConfigMapper corpKfAccountSessionConfigMapper;
 
 	@Override
 	public void addKfAccount(CorpKfAccount corpKfAccount) throws Exception {
@@ -57,11 +59,11 @@ public class CorpKfServiceImpl implements CorpKfService {
 		//删除人员
 		corpKfAccountFollowMapper.delete(Wrappers.lambdaQuery(CorpKfAccountFollow.class).eq(CorpKfAccountFollow::getOpenKfId, corpKfAccount.getOpenKfId()));
 		//删除session设置
-		corpKfAccountSessionMapper.delete(Wrappers.lambdaQuery(CorpKfAccountSession.class).eq(CorpKfAccountSession::getOpenKfId, corpKfAccount.getOpenKfId()));
+		corpKfAccountSessionConfigMapper.delete(Wrappers.lambdaQuery(CorpKfAccountSessionConfig.class).eq(CorpKfAccountSessionConfig::getOpenKfId, corpKfAccount.getOpenKfId()));
 	}
 
 	@Override
-	public void updateKfAccount(CorpKfAccount corpKfAccount) {
+	public void updateKfAccount(CorpKfAccount corpKfAccount) throws Exception {
 		if(StringUtils.isNotBlank(corpKfAccount.getName()) && StringUtils.isNotBlank(corpKfAccount.getImg())){
 			CorpKfAccount kfAccount = corpKfAccountMapper.selectById(corpKfAccount.getId());
 			WxCpKfAccountUpd wxCpKfAccountUpd = new WxCpKfAccountUpd();
@@ -76,4 +78,19 @@ public class CorpKfServiceImpl implements CorpKfService {
 		}
 		corpKfAccountMapper.updateById(corpKfAccount);
 	}
+
+	@Override
+	public void setKfAccountRuleOrAutoReply(CorpKfAccountSessionConfig CorpKfAccountSessionConfig) {
+		Long id = CorpKfAccountSessionConfig.getId();
+		if (id == null) {
+			corpKfAccountSessionConfigMapper.insert(CorpKfAccountSessionConfig);
+			return;
+		}
+		corpKfAccountSessionConfigMapper.updateById(CorpKfAccountSessionConfig);
+	}
+
+	@Override
+	public void setKfAccountDuty(List<CorpKfAccountFollow> corpKfAccountFollows) {
+		corpKfAccountFollows.forEach(corpKfAccountFollow -> corpKfAccountFollowMapper.insert(corpKfAccountFollow));
+	}
 }

+ 34 - 3
netflix-web/src/main/java/com/cyksj/web/controller/manage/corp/wxkf/CorpKfController.java

@@ -3,6 +3,8 @@ package com.cyksj.web.controller.manage.corp.wxkf;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.model.entity.CorpKfAccount;
+import com.cyksj.model.entity.CorpKfAccountFollow;
+import com.cyksj.model.entity.CorpKfAccountSessionConfig;
 import com.cyksj.service.corp.kf.CorpKfService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
@@ -11,6 +13,7 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 /**
  * 项目名: yhlxj2
@@ -33,7 +36,7 @@ public class CorpKfController {
 	 * 添加客服账号
 	 */
 	@PostMapping("/account/add")
-	public Result<String> addKfAccount(@RequestBody CorpKfAccount corpKfAccount) {
+	public Result<String> addKfAccount(@RequestBody CorpKfAccount corpKfAccount) throws Exception {
 		corpKfService.addKfAccount(corpKfAccount);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
@@ -42,7 +45,7 @@ public class CorpKfController {
 	 * 删除客服账号
 	 */
 	@DeleteMapping("/account/del/{id}")
-	public Result<String> delKfAccount(@PathVariable Long id) {
+	public Result<String> delKfAccount(@PathVariable Long id) throws Exception {
 		corpKfService.delKfAccount(id);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
@@ -51,7 +54,7 @@ public class CorpKfController {
 	 * 修改客服账号
 	 */
 	@PutMapping("/account/update")
-	public Result<String> updateKfAccount(@RequestBody CorpKfAccount corpKfAccount) {
+	public Result<String> updateKfAccount(@RequestBody CorpKfAccount corpKfAccount) throws Exception {
 		corpKfService.updateKfAccount(corpKfAccount);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
@@ -64,4 +67,32 @@ public class CorpKfController {
 		SearchResult<CorpKfAccount> search = beanSearcher.search(CorpKfAccount.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
+
+
+	//===============================================账号会话设置========================================================================
+
+	/**
+	 * 设置规则
+	 */
+	@PostMapping("/set/rule")
+	public Result<String> setKfAccountRule(@RequestBody CorpKfAccountSessionConfig CorpKfAccountSessionConfig) {
+		corpKfService.setKfAccountRuleOrAutoReply(CorpKfAccountSessionConfig);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 设置自动回复
+	 */
+	@PostMapping("/set/auto/reply")
+	public Result<String> setKfAccountAutoReply(@RequestBody CorpKfAccountSessionConfig CorpKfAccountSessionConfig) {
+		corpKfService.setKfAccountRuleOrAutoReply(CorpKfAccountSessionConfig);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	//===============================================账号值班设置========================================================================
+	@PostMapping("/set/duty")
+	public Result<String> setKfAccountDuty(@RequestBody List<CorpKfAccountFollow> corpKfAccountFollows) {
+		corpKfService.setKfAccountDuty(corpKfAccountFollows);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
 }