package com.cyksj.service.sys.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.cyksj.common.constant.Constant; import com.cyksj.common.util.Jsons; import com.cyksj.mapper.SysConfigMapper; import com.cyksj.model.dto.DefaultShopConfig; import com.cyksj.model.dto.YhServiceDto; import com.cyksj.model.entity.ShopConfig; import com.cyksj.model.entity.SysConfig; import com.cyksj.service.sys.SysConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.DayOfWeek; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; /** * @author chan * @date 2022/10/20 10:07 AM */ @Slf4j @Service public class SysConfigServiceImpl extends ServiceImpl implements SysConfigService { @Override public String getDefaultShopConfigByType(String type) { SysConfig shopConfig = this.getOne(Wrappers.lambdaQuery(SysConfig.class) .eq(SysConfig::getSysKey, Constant.SYS_DEFAULT_SHOP_KEY).last("limit 1")); if (shopConfig == null) { return getShopIdByType(type); } String sysValue = shopConfig.getSysValue(); try { DefaultShopConfig defaultShopConfig = Jsons.parseObject(sysValue, DefaultShopConfig.class); String wxDefaultAppId = defaultShopConfig.getWxDefaultAppId(); String zfbDefaultAppId = defaultShopConfig.getZfbDefaultAppId(); if ("wx".equals(type)) { return Optional.ofNullable(wxDefaultAppId).orElse(ShopConfig.WX_DEFAULT_APP_ID); } return Optional.ofNullable(zfbDefaultAppId).orElse(ShopConfig.ZFB_DEFAULT_APP_ID); } catch (Exception e) { } return getShopIdByType(type); } public String getShopIdByType(String type) { if ("wx".equals(type)) { return ShopConfig.WX_DEFAULT_APP_ID; } return ShopConfig.ZFB_DEFAULT_APP_ID; } @Override public List getDutyServices() { SysConfig sysConfig = this.getOne(Wrappers.lambdaQuery(SysConfig.class) .eq(SysConfig::getSysKey, Constant.serviceKeys.get(0)) .last("limit 1")); // 用当前日期时间创建一个 LocalDateTime 对象 LocalDateTime now = LocalDateTime.now(); // 获取当前时间 LocalTime currentTime = now.toLocalTime(); if (sysConfig != null) { String sysValue = sysConfig.getSysValue(); if (StrUtil.isNotEmpty(sysValue)) { try { List yhServiceDtos = Jsons.parseList(sysValue, YhServiceDto.class); Map> dutyServices = yhServiceDtos.stream().collect(Collectors.groupingBy(YhServiceDto::getSign)); DayOfWeek currentDayOfWeek = now.getDayOfWeek(); List workdayService = dutyServices.get("workday"); if (CollUtil.isNotEmpty(workdayService)) { List saturdayService = dutyServices.get("Saturday"); List sundayServices = dutyServices.get("Sunday"); List carryServices = getDutyService(currentDayOfWeek, workdayService, saturdayService, sundayServices); //获取值班客服 YhServiceDto dutyServiceCode = getDutyServiceCode(carryServices, workdayService, saturdayService, sundayServices, currentDayOfWeek, currentTime); if (CollUtil.isNotEmpty(dutyServiceCode.getSelect())) { return dutyServiceCode.getSelect().stream().filter(e -> StrUtil.isNotBlank(e.getFollowId())).map(YhServiceDto.CustomerServiceDto::getFollowId).collect(Collectors.toList()); } } } catch (Exception e) { } } } return null; } /** * 返回明天星期几 用户获取对应周期工作客服 */ private static DayOfWeek getNextWorkDay(DayOfWeek currentDay) { // 如果当前是周五,下一个工作日是周一;否则,是当前星期的下一天 if (currentDay == java.time.DayOfWeek.FRIDAY) { return java.time.DayOfWeek.SATURDAY; } if (currentDay == DayOfWeek.SATURDAY) { return DayOfWeek.SUNDAY; } return DayOfWeek.MONDAY; } private List getDutyService(DayOfWeek nextWorkDay, List workday, List saturday, List sunday) { if (nextWorkDay == DayOfWeek.SATURDAY) { return Optional.ofNullable(saturday).orElse(Optional.ofNullable(sunday).orElse(workday)); } if (nextWorkDay == DayOfWeek.SUNDAY) { return Optional.ofNullable(sunday).orElse(workday); } return workday; } /** * 获取工作日 */ public YhServiceDto getDutyServiceCode(List carryServices, List workday, List saturday, List sunday, DayOfWeek currentDayOfWeek, LocalTime currentTime) { List collect = carryServices.stream().filter(time -> time.isBetween(currentTime)).collect(Collectors.toList()); if (CollUtil.isEmpty(collect)) { collect = carryServices.stream().filter(time -> time.isAfter(currentTime)).collect(Collectors.toList()); if (CollUtil.isEmpty(collect)) { // 如果没有下一个时间段,获取下一个工作时间段的开始时间 DayOfWeek nextWorkDay = getNextWorkDay(currentDayOfWeek); List nextServices = getDutyService(nextWorkDay, workday, saturday, sunday); //获取下一天的早时 return nextServices.get(0); } } return collect.get(RandomUtil.randomInt(collect.size())); } }