Kaynağa Gözat

客服变更记录

zoujiajian 1 yıl önce
ebeveyn
işleme
bafa2e9a13

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

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

+ 24 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CorpKfFollowChangeRecord.java

@@ -0,0 +1,24 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: CorpKfFollowChangeRecord
+ * 创建者: JavaZou
+ * 创建时间:2025/1/15 11:18
+ */
+@Getter
+@Setter
+public class CorpKfFollowChangeRecord extends BaseEntity{
+	private String openKfId;
+
+	private String preValue;
+
+	private String backValue;
+
+	private String changeStr;
+
+	private String operator;
+}

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/request/corp/kf/CorpKfDutyReq.java

@@ -28,4 +28,6 @@ public class CorpKfDutyReq {
 	 * 删除ids
 	 */
 	private List<Long> delIds;
+
+	private Long adminId;
 }

+ 97 - 1
netflix-service/src/main/java/com/cyksj/service/corp/kf/impl/CorpKfServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -12,15 +13,21 @@ import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.StringUtil;
 import com.cyksj.config.corp.YHLXWxCorpConfig;
 import com.cyksj.mapper.corp.CorpFollowMapper;
-import com.cyksj.mapper.corp.kf.*;
+import com.cyksj.mapper.corp.kf.CorpKfAccountFollowMapper;
+import com.cyksj.mapper.corp.kf.CorpKfAccountMapper;
+import com.cyksj.mapper.corp.kf.CorpKfAccountSessionConfigMapper;
+import com.cyksj.mapper.corp.kf.CorpKfServicerSessionRecordMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.kf.*;
 import com.cyksj.model.request.corp.kf.CorpKfDutyReq;
 import com.cyksj.model.views.CorpKfDutyServicersStatusView;
+import com.cyksj.model.views.SysCorpFollowView;
 import com.cyksj.service.corp.WxCorpOps;
 import com.cyksj.service.corp.kf.CorpKfService;
 import com.cyksj.service.mange.cms.service.CmsUserService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
@@ -54,6 +61,8 @@ public class CorpKfServiceImpl implements CorpKfService {
 
 	private final CmsUserMapper cmsUserMapper;
 
+	private final BeanSearcher beanSearcher;
+
 	@Override
 	public void addKfAccount(CorpKfAccount corpKfAccount) throws Exception {
 		WxCpKfAccountAdd wxCpKfAccountAdd = new WxCpKfAccountAdd();
@@ -113,6 +122,9 @@ public class CorpKfServiceImpl implements CorpKfService {
 	@Override
 	public void setKfDuty(CorpKfDutyReq dutyReq) throws Exception {
 		String openKfId = dutyReq.getOpenKfId();
+		//记录变更记录
+		List<CorpKfAccountFollow> before = corpKfAccountFollowMapper.selectList(Wrappers.lambdaQuery(CorpKfAccountFollow.class)
+				.eq(CorpKfAccountFollow::getOpenKfId, openKfId));
 		List<CorpKfAccountFollow> dutyList = Optional.ofNullable(dutyReq.getDutyList()).orElse(new ArrayList<>());
 		//非单个 删除其他设置
 		if (!dutyReq.getIsUpdateSingle()) {
@@ -167,6 +179,69 @@ public class CorpKfServiceImpl implements CorpKfService {
 		if (delDutyFollowIds.size() > 0) {
 			wxCorpOps.delCorpKfServicer(openKfId, delDutyFollowIds);
 		}
+		List<CorpKfAccountFollow> after = corpKfAccountFollowMapper.selectList(Wrappers.lambdaQuery(CorpKfAccountFollow.class)
+				.eq(CorpKfAccountFollow::getOpenKfId, openKfId));
+		CmsUser cmsUser = cmsUserMapper.selectById(dutyReq.getAdminId());
+		recordChangeKfFollows(openKfId, cmsUser, before, after);
+	}
+
+	private void recordChangeKfFollows(String openKfId, CmsUser cmsUser, List<CorpKfAccountFollow> before, List<CorpKfAccountFollow> after) throws Exception {
+		String operator = null;
+		if (cmsUser != null) {
+			operator = cmsUser.getNickname();
+		}
+
+		CorpKfFollowChangeRecord corpKfFollowChangeRecord = new CorpKfFollowChangeRecord();
+		corpKfFollowChangeRecord.setOpenKfId(openKfId);
+		corpKfFollowChangeRecord.setPreValue(Jsons.toJson(before));
+		corpKfFollowChangeRecord.setBackValue(Jsons.toJson(after));
+		corpKfFollowChangeRecord.setOperator(operator);
+		StringBuilder changeStr = new StringBuilder();
+
+		List<SysCorpFollowView> sysCorpFollowViews = beanSearcher.searchAll(SysCorpFollowView.class, MapUtils.builder().build());
+		Map<String, List<SysCorpFollowView>> followMap = sysCorpFollowViews.stream().collect(Collectors.groupingBy(SysCorpFollowView::getFollowId));
+		Map<Integer, List<CorpKfAccountFollow>> afDutyWeekFollowMap = after.stream().collect(Collectors.groupingBy(CorpKfAccountFollow::getDutyWeek));
+
+		for (int i = 0; i < before.size(); i++) {
+			CorpKfAccountFollow bfCorpKfAccountFollow = before.get(i);
+			Integer bfDutyWeek = bfCorpKfAccountFollow.getDutyWeek();
+			List<CorpKfAccountFollow> afCorpKfAccountFollows = afDutyWeekFollowMap.get(bfDutyWeek);
+			changeStr.append(getDutyWeekName(bfDutyWeek));
+			if (CollUtil.isEmpty(afCorpKfAccountFollows)) {
+				changeStr.append("移除");
+				List<String> bfFollowIds = Jsons.parseList(bfCorpKfAccountFollow.getUserIdList(), String.class);
+				for (int i1 = 0; i1 < bfFollowIds.size(); i1++) {
+					changeStr.append(followMap.get(bfFollowIds.get(0)).get(0).getName());
+					if (i1 != bfFollowIds.size() - 1) {
+						changeStr.append("、");
+					}
+				}
+			} else {
+				String bfUserStr = bfCorpKfAccountFollow.getUserIdList();
+				String afUserStr = afCorpKfAccountFollows.get(0).getUserIdList();
+				if (StrUtil.equals(bfUserStr, afUserStr)) {
+					return;
+				}
+				List<String> bfUserIds = Jsons.parseList(bfUserStr, String.class);
+				List<String> afUserIds = Jsons.parseList(afUserStr, String.class);
+				for (String userId : bfUserIds) {
+					if (!afUserIds.contains(userId)) {
+						if (!changeStr.toString().contains("移除")) {
+							changeStr.append("移除");
+						}
+						changeStr.append(followMap.get(userId).get(0).getName()).append("、");
+					}
+				}
+				for (String afterUserId : afUserIds) {
+					if (!bfUserIds.contains(afterUserId)) {
+						if (!changeStr.toString().contains("增加")) {
+							changeStr.append("增加");
+						}
+						changeStr.append(followMap.get(afterUserId).get(0).getName()).append("、");
+					}
+				}
+			}
+		}
 	}
 
 	@Override
@@ -368,4 +443,25 @@ public class CorpKfServiceImpl implements CorpKfService {
 		}
 		return thisHourDutyFollows;
 	}
+
+	public String getDutyWeekName(Integer week) {
+		switch (week) {
+			case 1:
+				return "周日";
+			case 2:
+				return "周一";
+			case 3:
+				return "周二";
+			case 4:
+				return "周三";
+			case 5:
+				return "周四";
+			case 6:
+				return "周五";
+			case 7:
+				return "周六";
+			default:
+				return null;
+		}
+	}
 }

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

@@ -157,10 +157,21 @@ public class CorpKfController {
 	 */
 	@PostMapping("/set/duty")
 	public Result<String> setKfDuty(@RequestBody CorpKfDutyReq dutyReq) throws Exception {
+		long adminId = StpUtil.getLoginIdAsLong();
+		dutyReq.setAdminId(adminId);
 		corpKfService.setKfDuty(dutyReq);
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 
+	/**
+	 * 客服变更记录
+	 */
+	@GetMapping("/get/follow/change/logs")
+	public Result<SearchResult<CorpKfFollowChangeRecord>> getChangeLogs() {
+		SearchResult<CorpKfFollowChangeRecord> search = beanSearcher.search(CorpKfFollowChangeRecord.class, MapUtils.flatBuilder(request.getParameterMap()).orderBy(CorpKfFollowChangeRecord::getId).desc().build());
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+	}
+
 	/**
 	 * 获取账号值班设置
 	 */