BigViewServiceV1Impl.java 7.7 KB
package com.ruoyi.service.impl;

import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.SignStatusEnum;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.domain.DriverScheduling;
import com.ruoyi.driver.domain.Driver;
import com.ruoyi.driver.service.IDriverService;
import com.ruoyi.in.domain.SignIn;
import com.ruoyi.in.domain.SignInV1;
import com.ruoyi.in.service.SignInServiceV1;
import com.ruoyi.pojo.vo.bigViewVo.FleetInfoVo;
import com.ruoyi.pojo.vo.bigViewVo.FleetState;
import com.ruoyi.pojo.vo.bigViewVo.LineInfo;
import com.ruoyi.scheduling.service.SchedulingServiceV1;
import com.ruoyi.service.BigViewServiceV1;
import com.ruoyi.template.service.IFleetLineTemplateService;
import com.ruoyi.utils.ConstDateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Service;

import java.text.MessageFormat;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

import static com.ruoyi.common.ConstSignInConstSignInProperties.SIGN_IN_ERROR_COUNT;
import static com.ruoyi.common.ErrorTypeProperties.SIGN_IN_ERROR;
import static com.ruoyi.common.redispre.GlobalRedisPreName.REDIS_SIGN_IN_DRIVER_ALCOHOL_OVERFLOW;

/**
 * @author liujun
 * @date 2024年09月25日 14:38
 */
@Slf4j
@Service
@EnableAsync
public class BigViewServiceV1Impl implements BigViewServiceV1 {
    @Autowired
    private IFleetLineTemplateService fleetLineTemplateService;
    @Autowired
    private SchedulingServiceV1 schedulingServiceV1;
    @Autowired
    private IDriverService driverService;
    @Autowired
    private SignInServiceV1 signInServiceV1;

    @Autowired
    private RedisCache redisCache;


    private static final String LINE_SIGN_NBBM_KEY = "sign:report:nbbm:{0}:{1}";
    private static final String LINE_SIGN_NBBM_LOCK_KEY = "sign:report:lock:nbbm:{0}:{1}";

    private static final String LINE_SIGN_STATUS_KEY = "sign:report:status:{0}:{1}";
    private static final String LINE_SIGN_STATUS_LOCK_KEY = "sign:report:lock:status:{0}:{1}";

    private static final String LINE_SIGN_REPORT_FLEET_KEY = "sign:report:fleet:{0}";

    private static final String BIG_VIEW_LINE_KEY = "big:view:line:{0}";


    @Override
    public void asyncRefreshRedisValue(SignIn signIn, Driver driver, DriverScheduling driverScheduling, String dateStr, Date date) throws InterruptedException {

    }

    @Override
    public AjaxResult queryBigViewQueryLineInfo(Date date) {
        return null;
    }


    @Override
    public LineInfo refreshRedisDriver(SignIn signIn, Driver driver, String dateStr, DriverScheduling driverScheduling, Date date) {
        return null;
    }


    @Override
    public FleetState refreshRedisLine(SignIn signIn, DriverScheduling driverScheduling, String dateStr) throws InterruptedException {

        return null;
    }

    @Override
    public AjaxResult getAjaxResultByDriverSignInfo(SignIn signIn,SignInV1 signInV1) {
        String key = StringUtils.join(REDIS_SIGN_IN_DRIVER_ALCOHOL_OVERFLOW, ConstDateUtil.FAST_YYYY_MM_DD.format(new Date()), ":", signIn.getJobCode());
        // 驾驶员酒精测试连续超标两次则提示换人
        Integer count = redisCache.getCacheObject(key);
        if (Objects.isNull(count) || count.equals(0)) {
            count = 1;
            redisCache.setCacheObject(key, count, 1, TimeUnit.DAYS);
        } else {
            redisCache.setCacheObject(key, ++count, 1, TimeUnit.DAYS);
        }
        if (SIGN_IN_ERROR_COUNT.compareTo(count) <= 0) {

            return AjaxResult.success(SIGN_IN_ERROR + ": " + (StringUtils.isEmpty(signIn.getRemark()) ? "" : signIn.getRemark()) + "酒精测试不通过" + count + "次请更换车辆驾驶员。", signInV1);
        }
        return null;
    }


    @Override
    public boolean isEarly(SignIn signIn) {
        return Objects.nonNull(signIn) && signIn.getExType() >= 20 && signIn.getExType() < 30;
    }


    @Override
    public boolean isSignStatusWineEnum(SignIn signIn) {
        return Objects.nonNull(signIn) && (Objects.equals(3, signIn.getExType()) || Objects.equals(23, signIn.getExType()) || Objects.equals(33, signIn.getExType()));
    }


    @Override
    public boolean isSignStatusDelayEnum(SignIn signIn) {
        return Objects.nonNull(signIn) && Objects.nonNull(signIn.getExType()) && signIn.getExType() >= 30 && signIn.getExType() < 40;
    }

    @Override
    public boolean isSignStatusZoneEnum(SignIn signIn) {
        return Objects.nonNull(signIn) && Objects.nonNull(signIn.getExType()) && signIn.getExType() % 10 == 3;
    }

    @Override
    public boolean isDriver(Driver driver) {
        return Objects.nonNull(driver) && StringUtils.isNotEmpty(driver.getPosts()) && StringUtils.indexOf(driver.getPosts(), "驾驶员") > -1;
    }


    private List<FleetInfoVo> getFleetInfoVoOfRedis(String key) {
        try {
            String jsonStr = redisCache.getCacheObject(key);
            if (StringUtils.isEmpty(jsonStr)) {

                log.info("redis中没有当天的数据[{}]", key);
                return Collections.emptyList();
            }
            return JSON.parseArray(jsonStr, FleetInfoVo.class);
        } catch (Exception e) {
            log.error("从redis中获取数据异常,[{}]", key, e);
        }
        return null;
    }


    private LineInfo getLineInfoByRedis(String key) {
        try {
            String jsonStr = redisCache.getCacheObject(key);
            if (StringUtils.isEmpty(jsonStr)) {
                return null;
            }
            return JSON.parseObject(jsonStr, LineInfo.class);
        } catch (Exception e) {
            log.error("从redis中获取LineInfo 异常:[{}]", key, e);
        }
        return null;
    }


    private Integer switchSignStatus(SignIn signIn) {
        if (Objects.isNull(signIn.getExType())) {
            return null;
        }
        if (isSignStatusWineEnum(signIn)) {
            return SignStatusEnum.SIGN_STATUS_WINE_ENUM.getStatus();
        }

        if (isSignStatusDelayEnum(signIn)) {
            return SignStatusEnum.SIGN_STATUS_DELAY_ENUM.getStatus();
        }

        if (isSignStatusZoneEnum(signIn)) {
            return SignStatusEnum.SIGN_STATUS_ZONE_ENUM.getStatus();
        }
        return SignStatusEnum.SIGN_STATUS_EMPTY_ENUM.getStatus();

    }

    private void setDriverByPost(Driver driver, LineInfo lineInfo, LineInfo.PersonInfoVo personInfoVo) {
        if (isDriver(driver)) {
            lineInfo.setDriverInfoVo(personInfoVo);
        } else {
            lineInfo.setDriverInfoVo(personInfoVo);
        }
    }

    private <T> List<T> getRedisData(String key, String dateStr, Class<T> calzz) {
        key = MessageFormat.format(key, dateStr, "*");
        List<String> jsonStrs = redisCache.getCacheList(key);
        if (CollectionUtils.isEmpty(jsonStrs)) {
            return Collections.emptyList();
        }
        return jsonStrs.stream().map(json -> {
            T t = JSON.parseObject(json, calzz);
            return t;
        }).collect(Collectors.toList());
    }

    private List<FleetInfoVo> getFleetInfoVoBtRedis(String key) {
        try {
            String json = redisCache.getCacheObject(key);
            if (StringUtils.isEmpty(json)) {
                return Collections.emptyList();
            }
            return JSON.parseArray(json, FleetInfoVo.class);
        } catch (Exception e) {
            log.error("[{}]从redis中获取页面数据异常", key, e);
        }
        return Collections.emptyList();
    }


}