NowSchedulingCache.java 6.5 KB
package com.ruoyi.common.cache;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.map.MapUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.driver.mapper.DriverSchedulingMapper;
import com.ruoyi.errorScheduling.domain.ErrorJobcode;
import com.ruoyi.errorScheduling.service.IErrorJobcodeService;
import com.ruoyi.in.domain.SignIn;
import com.ruoyi.domain.DriverScheduling;
import com.ruoyi.service.ThreadJobService;
import com.ruoyi.utils.ConstDateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class NowSchedulingCache {
    private final DriverSchedulingMapper schedulingMapper;
    static Logger log = LoggerFactory.getLogger(SchedulingCache.class);
    /**
     * 当天初版排班
     */
    private static ConcurrentHashMap<String, Map<String, List<DriverScheduling>>> cacheNowDayScheduling = new ConcurrentHashMap<>();
    private IErrorJobcodeService errorJobcodeService;

    public NowSchedulingCache(DriverSchedulingMapper driverSchedulingMapper, IErrorJobcodeService errorJobcodeService) {
        this.schedulingMapper = driverSchedulingMapper;
        this.errorJobcodeService = errorJobcodeService;
        log.info("项目启动加载中获取排班表并存入缓存-----");
        cacheNowDaySchedulingInit();
    }

    /**
     * 初始化签到报表数据并存入缓存
     */
    private void cacheNowDaySchedulingInit() {
        // 查询今天和昨天
        for (int i = 0; i > -2; i--) {
            Map<String, List<DriverScheduling>> resultMap = new HashMap<>(800);
            String date = ConstDateUtil.formatDate("yyyy-MM-dd", ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(i));
            List<DriverScheduling> schedulingList = schedulingMapper.queryToDay(date, null, null, null);
            handlerResultMap(resultMap, schedulingList);
            // 获取错误排班
            List<ErrorJobcode> errorScheduling = ThreadJobService.getErrorScheduling(resultMap);
            // 插入错误排班
            errorJobcodeService.insertBatchErrorJobcode(errorScheduling);
            // 更新缓存
            cacheNowDayScheduling.put(date.replaceAll("-", ""), resultMap);
        }
    }

    /***
     *
     *  刷新打卡缓本地存信息
     * @author liujun
     * @date 2024/6/12 10:37
     * @param driverScheduling
     * @param date
     * @return int 0 为刷新成功、1为传入对象值为空或工号为空或传入的DriverScheduling的ID为空
     */
    public  int refreshDriveScheDulingCacheByDateAndJobCode(DriverScheduling driverScheduling, Date date) {
        if (Objects.isNull(driverScheduling) || Objects.isNull(date) || StringUtils.isEmpty(driverScheduling.getJobCode())
                || Objects.isNull(driverScheduling.getId())) {
            log.warn("刷新本地打卡缓存信息失败,传入的对象为空。传入的时间:{},传入的数据对象:{}", date, driverScheduling);
            return 1;
        }

        String dateStr = ConstDateUtil.FAST_YYYY_MM_DD.format(date);
        Map<String, List<DriverScheduling>> resultMap = cacheNowDayScheduling.get(dateStr);
        if (MapUtil.isEmpty(resultMap)) {
            return 0;
        }

        List<DriverScheduling> driverSchedulings = resultMap.get(driverScheduling.getJobCode());
        int size = CollectionUtils.size(driverSchedulings);
        if (0 == size) {
            return 0;
        }

        for (int i = 0; i < size; i++) {
            DriverScheduling scheduling = driverSchedulings.get(i);
            if (Objects.nonNull(scheduling) && Objects.equals(scheduling.getId(), driverScheduling.getId())) {
                driverSchedulings.set(i, driverScheduling);
                break;
            }
        }
        return 0;
    }


    public static void handlerResultMap(Map<String, List<DriverScheduling>> resultMap, List<DriverScheduling> schedulingList) {
        for (DriverScheduling scheduling : schedulingList) {
            List<DriverScheduling> list = resultMap.get(scheduling.getJobCode());
            if (CollectionUtil.isEmpty(list)) {
                resultMap.put(scheduling.getJobCode(), new ArrayList<>(Arrays.asList(scheduling)));
            } else {
                list.add(scheduling);
            }
        }
    }

    public void setCacheScheduling(String key, Map<String, List<DriverScheduling>> mapValue) {
        cacheNowDayScheduling.put(key, mapValue);
    }

    public Map<String, List<DriverScheduling>> getCacheScheduling(String key) {
        return cacheNowDayScheduling.get(key);
    }

    public void removeCacheSchedulingByKey(String key) {
        cacheNowDayScheduling.remove(key);
    }

    public List<String> getKeys() {
        return new ArrayList<>(cacheNowDayScheduling.keySet());
    }

    public Integer size() {
        return cacheNowDayScheduling.size();
    }

    public List<DriverScheduling> getCacheSchedulingMapValueByHKey(String key, String HKey) {
        if (Objects.isNull(cacheNowDayScheduling.get(key))) {
            return null;
        }
        List<DriverScheduling> list = cacheNowDayScheduling.get(key).get(HKey);

        return Objects.isNull(list) ? null : list;
    }

    public List<String> getHKeysByKey(String key) {
        return new ArrayList<>(cacheNowDayScheduling.get(key).keySet());
    }

    public List<String> getKes() {
        return new ArrayList<>(cacheNowDayScheduling.keySet());
    }

    /**
     * 更新缓存
     *
     * @param remark
     * @param key
     * @param index
     * @param signIn
     */
    public void updateCacheByJobCode(String remark, String key, Integer index, SignIn signIn) {
        if (key.equals(ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(0)))
                || key.equals(ConstDateUtil.formatDate(ConstDateUtil.getTheSpecifiedNumberOfDaysOfTime(-1)))) {
            DriverScheduling scheduling = cacheNowDayScheduling.get(key).get(signIn.getJobCode()).get(index);
            scheduling.setSignInId(signIn.getId());
            scheduling.setRemark(remark);
            scheduling.setExType(signIn.getExType());
            scheduling.setSignTime(signIn.getCreateTime());
            scheduling.setSignType(signIn.getType());
            scheduling.setAlcoholFlag(signIn.getAlcoholFlag());
            scheduling.setAlcoholIntake(signIn.getAlcoholIntake());
        }
    }
}