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

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

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

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/CorpKfAccountFollowDutyStatus.java

@@ -0,0 +1,20 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: CorpKfAccountFollowDutyStatus
+ * 创建者: JavaZou
+ * 创建时间:2025/1/3 11:17
+ */
+@Getter
+@Setter
+public class CorpKfAccountFollowDutyStatus extends BaseEntity{
+	private String openKfId;
+
+	private Long cmsUserId;
+
+	private String followId;
+}

+ 0 - 3
netflix-dao/src/main/java/com/cyksj/model/entity/CorpKfServicerStatistic.java

@@ -9,9 +9,6 @@ import java.math.BigDecimal;
 @Setter
 public class CorpKfServicerStatistic extends BaseEntity {
 
-	/** 主键 ID */
-	private Long id;
-
 	/** openkfid */
 	private String openKfId;
 

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

@@ -767,7 +767,7 @@ public class CorpServiceImpl implements CorpService {
 			if (corpKfAccountSessionConfig != null && StrUtil.isNotEmpty(corpKfAccountSessionConfig.getNoDutyTips())) {
 				DateTime now = DateTime.now();
 				String thisHourDate = DateUtil.format(now, "HH:mm:ss");
-				//0-6 0周一
+				//星期天为1
 				int dayOfWeek = DateUtil.dayOfWeek(now);
 				//是否值班期
 				Integer dutyHourCount = corpKfAccountFollowMapper.selectCount(Wrappers.lambdaQuery(CorpKfAccountFollow.class)

+ 7 - 0
netflix-service/src/main/java/com/cyksj/service/corp/kf/CorpKfService.java

@@ -1,9 +1,12 @@
 package com.cyksj.service.corp.kf;
 
 import com.cyksj.model.entity.CorpKfAccount;
+import com.cyksj.model.entity.CorpKfAccountFollowDutyStatus;
 import com.cyksj.model.entity.CorpKfAccountSessionConfig;
 import com.cyksj.model.request.corp.kf.CorpKfDutyReq;
 
+import java.util.List;
+
 /**
  * 项目名: yhlxj2
  * 文件名: CorpKfService
@@ -20,4 +23,8 @@ public interface CorpKfService {
 	void setKfAccountRuleOrAutoReply(CorpKfAccountSessionConfig CorpKfAccountSessionConfig);
 
 	void setKfDuty(CorpKfDutyReq dutyReq);
+
+	void servicerCommute(long cmsUserId, String openKfId);
+
+	List<CorpKfAccountFollowDutyStatus> getDutyFollowByOpenKfId(long cmsUserId, String openKfId) throws Exception;
 }

+ 70 - 3
netflix-service/src/main/java/com/cyksj/service/corp/kf/impl/CorpKfServiceImpl.java

@@ -1,14 +1,18 @@
 package com.cyksj.service.corp.kf.impl;
 
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.config.corp.YHLXWxCorpConfig;
+import com.cyksj.mapper.corp.CorpFollowMapper;
+import com.cyksj.mapper.corp.kf.CorpKfAccountFollowDutyStatusMapper;
 import com.cyksj.mapper.corp.kf.CorpKfAccountFollowMapper;
 import com.cyksj.mapper.corp.kf.CorpKfAccountMapper;
 import com.cyksj.mapper.corp.kf.CorpKfAccountSessionConfigMapper;
-import com.cyksj.model.entity.CorpKfAccount;
-import com.cyksj.model.entity.CorpKfAccountFollow;
-import com.cyksj.model.entity.CorpKfAccountSessionConfig;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.kf.WxCpKfAccountAdd;
 import com.cyksj.model.kf.WxCpKfAccountAddResp;
 import com.cyksj.model.kf.WxCpKfAccountDel;
@@ -16,10 +20,14 @@ import com.cyksj.model.kf.WxCpKfAccountUpd;
 import com.cyksj.model.request.corp.kf.CorpKfDutyReq;
 import com.cyksj.service.corp.WxCorpOps;
 import com.cyksj.service.corp.kf.CorpKfService;
+import com.cyksj.service.mange.cms.service.CmsUserService;
+import com.google.common.collect.Lists;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * 项目名: yhlxj2
@@ -40,6 +48,12 @@ public class CorpKfServiceImpl implements CorpKfService {
 
 	private final CorpKfAccountSessionConfigMapper corpKfAccountSessionConfigMapper;
 
+	private final CorpKfAccountFollowDutyStatusMapper corpKfAccountFollowDutyStatusMapper;
+
+	private final CmsUserService cmsUserService;
+
+	private final CorpFollowMapper corpFollowMapper;
+
 	@Override
 	public void addKfAccount(CorpKfAccount corpKfAccount) throws Exception {
 		WxCpKfAccountAdd wxCpKfAccountAdd = new WxCpKfAccountAdd();
@@ -104,4 +118,57 @@ public class CorpKfServiceImpl implements CorpKfService {
 			corpKfAccountFollowMapper.insert(duty);
 		});
 	}
+
+	@Override
+	public void servicerCommute(long cmsUserId, String openKfId) {
+		String thisHourDate = DateUtil.format(DateTime.now(), "HH:mm:ss");
+		corpKfAccountFollowMapper.selectOne(Wrappers.lambdaQuery(CorpKfAccountFollow.class)
+				.eq(CorpKfAccountFollow::getOpenKfId, openKfId)
+				.le(CorpKfAccountFollow::getStartTime, thisHourDate)
+				.ge(CorpKfAccountFollow::getEndTime, thisHourDate)
+				.apply(""));
+		CorpKfAccountFollowDutyStatus corpKfAccountFollowDutyStatus = corpKfAccountFollowDutyStatusMapper.selectOne(Wrappers.lambdaQuery(CorpKfAccountFollowDutyStatus.class)
+				.eq(CorpKfAccountFollowDutyStatus::getCmsUserId, cmsUserId)
+				.eq(CorpKfAccountFollowDutyStatus::getOpenKfId, openKfId)
+				.last("limit 1"));
+		if (corpKfAccountFollowDutyStatus == null) {
+			corpKfAccountFollowDutyStatus = new CorpKfAccountFollowDutyStatus();
+		}
+	}
+
+	@Override
+	public List<CorpKfAccountFollowDutyStatus> getDutyFollowByOpenKfId(long cmsUserId, String openKfId) throws Exception {
+		DateTime now = DateTime.now();
+		String thisHourDate = DateUtil.format(now, "HH:mm:ss");
+		//星期天为1
+		int dayOfWeek = DateUtil.dayOfWeek(now);
+		//是否值班期
+		List<CorpKfAccountFollow> corpKfAccountFollows = corpKfAccountFollowMapper.selectList(Wrappers.lambdaQuery(CorpKfAccountFollow.class)
+				.eq(CorpKfAccountFollow::getOpenKfId, openKfId)
+				.le(CorpKfAccountFollow::getStartTime, thisHourDate)
+				.ge(CorpKfAccountFollow::getEndTime, thisHourDate)
+				.apply(" and JSON_CONTAINS(duty_week,'\"%s\"')", dayOfWeek));
+
+		if (corpKfAccountFollows.isEmpty()) {
+			return Lists.newArrayList();
+		}
+		//目前时间段需要值班的客服
+		Set<String> follows = new HashSet<>();
+		for (CorpKfAccountFollow corpKfAccountFollow : corpKfAccountFollows) {
+			follows.addAll(Jsons.parseList(corpKfAccountFollow.getUserIdList(), String.class));
+		}
+		List<CorpFollow> cmsUserFollows = corpFollowMapper.selectList(Wrappers.lambdaQuery(CorpFollow.class)
+				.in(CorpFollow::getUserid, follows)
+				.eq(CorpFollow::getCmsUserId, cmsUserId));
+
+
+
+		LambdaQueryWrapper<CorpKfAccountFollowDutyStatus> queryWrapper = Wrappers.lambdaQuery(CorpKfAccountFollowDutyStatus.class)
+				.eq(CorpKfAccountFollowDutyStatus::getOpenKfId, openKfId);
+		if (!cmsUserService.isRootRole(cmsUserId)) {
+			queryWrapper.eq(CorpKfAccountFollowDutyStatus::getCmsUserId, cmsUserId);
+		}
+		List<CorpKfAccountFollowDutyStatus> dutyStatuses = corpKfAccountFollowDutyStatusMapper.selectList(queryWrapper);
+		return dutyStatuses;
+	}
 }

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

@@ -151,7 +151,6 @@ public class CorpKfController {
 	}
 
 
-
 	/**
 	 * 获取聊天记录
 	 */
@@ -162,4 +161,24 @@ public class CorpKfController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
+	/**
+	 * 客服上下班
+	 */
+	@PutMapping("/servicer/commute/{openKfId}")
+	public Result<String> servicerCommute(@PathVariable String openKfId) {
+		long cmsUserId = StpUtil.getLoginIdAsLong();
+		corpKfService.servicerCommute(cmsUserId, openKfId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 目前值班人员变化
+	 */
+	@GetMapping("/get/duty/{openKfId}")
+	public Result<List<CorpKfAccountFollowDutyStatus>> getDutyFollowByOpenKfId(@PathVariable String openKfId) {
+		long cmsUserId = StpUtil.getLoginIdAsLong();
+		List<CorpKfAccountFollowDutyStatus> dutyStatuses= corpKfService.getDutyFollowByOpenKfId(cmsUserId, openKfId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(dutyStatuses);
+	}
+
 }