AppSignExceptionController.java 6.51 KB
package com.ruoyi.controller.app;

import cn.hutool.core.convert.Convert;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.ResponseResult;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.domain.driver.NewDriver;
import com.ruoyi.domain.dss.sign.exception.dto.SignExceptionDTO;
import com.ruoyi.domain.dss.sign.exception.vo.SignExceptionVo;
import com.ruoyi.domain.scheduling.LinggangScheduling;
import com.ruoyi.domain.sign.in.exception.report.EquipmentExceptionReport;
import com.ruoyi.in.domain.SignIn;
import com.ruoyi.in.service.ISignInService;
import com.ruoyi.service.driver.NewDriverService;
import com.ruoyi.service.scheduling.LinggangSchedulingService;
import com.ruoyi.service.sign.in.exception.report.EquipmentExceptionReportService;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.utils.DateUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author liujun
 * @date 2024年08月20日 10:44
 */
@Slf4j
@RestController
@RequestMapping("/app")
@Api(tags = "【App对接】打卡异常")
public class AppSignExceptionController extends BaseController {
    @Autowired
    private NewDriverService driverService;
    @Autowired
    private LinggangSchedulingService schedulingService;

    @Autowired
    private EquipmentExceptionReportService equipmentExceptionReportService;
    @Autowired
    private ISignInService signInService;
    @Autowired
    private ISysDictDataService dictDataService;

    @ApiOperation("酒测签到异常")
    @PostMapping("/sign/exception/list")
    public ResponseResult<List<SignExceptionVo>> list(@RequestBody SignExceptionDTO dto) {

        SignIn signIn = new SignIn();
        if (Objects.nonNull(dto.getSignTime())) {
            signIn.setStartCreateTime(DateUtil.shortDate(dto.getSignTime()));
            signIn.setEndCreateTime(DateUtils.addDays(signIn.getStartCreateTime(), 1));
        } else {
            signIn.setEndCreateTime(DateUtil.shortDate(DateUtils.addDays(new Date(),1)));
            signIn.setStartCreateTime(DateUtils.addMonths(signIn.getEndCreateTime(), -2));

        }


        List<SignIn> signIns = signInService.list(signIn);
        if (CollectionUtils.isEmpty(signIns)) {
            log.info("signIns is null");
            return ResponseResult.success();
        }
        long drunkenness = queryDrunkenness();
        BigDecimal decimal = new BigDecimal(drunkenness);
        signIns = signIns.stream().filter(s -> Objects.nonNull(s.getAlcoholIntake()) && s.getAlcoholIntake().compareTo(decimal) >= 0).collect(Collectors.toList());
        if (CollectionUtils.isEmpty(signIns)) {
            log.info("signIns filter after is null");
            return ResponseResult.success();
        }

        Set<Long> signInIds = signIns.stream().map(SignIn::getId).collect(Collectors.toSet());
        if (CollectionUtils.isEmpty(signInIds)) {
            log.info("signInIds is null");
            return ResponseResult.success();
        }

        Set<Long> schedulingIds = signIns.stream().map(SignIn::getSchedulingId).collect(Collectors.toSet());
        List<LinggangScheduling> schedulings = schedulingService.list(null, schedulingIds);

        EquipmentExceptionReport report = new EquipmentExceptionReport();
        report.setSignIds(signInIds);
        report.setFleetName(dto.getFleetName());
        report.setLineName(dto.getLineName());

        List<EquipmentExceptionReport> reportList = equipmentExceptionReportService.list(report);
        if (CollectionUtils.isEmpty(reportList)) {
            log.info("reportList is null");
            return ResponseResult.success();
        }

        Set<String> jobCodes = reportList.stream().map(EquipmentExceptionReport::getJobCode).collect(Collectors.toSet());
        List<NewDriver> drivers = driverService.list(jobCodes);

        List<SignExceptionVo> vos = convertSignExceptionVo(reportList,drivers,signIns,schedulings);
        return ResponseResult.success(vos);
    }

    private long queryDrunkenness() {
        SysDictData dictData = new SysDictData();
        dictData.setDictType("drunkenness");
        dictData.setDiscKey("drunkenness_key");
        SysDictData sourceDic = dictDataService.getOne(dictData);
        return Objects.isNull(sourceDic) || Objects.isNull(sourceDic.getDictValue()) ? 28L : Convert.toLong(sourceDic.getDictValue());
    }

    private List<SignExceptionVo> convertSignExceptionVo(List<EquipmentExceptionReport> reportList, List<NewDriver> drivers, List<SignIn> signIns, List<LinggangScheduling> schedulings) {
        int driverSize = CollectionUtils.size(drivers);
        int schedulingSize = CollectionUtils.size(schedulings);

        return reportList.stream().map(r -> {
            SignExceptionVo vo = new SignExceptionVo();
            vo.setFleetName(r.getFleetName());
            vo.setLineName(r.getLineName());

            Optional<SignIn> optSign = signIns.stream().filter(s -> Objects.equals(s.getId(), r.getSignId())).findFirst();
            if (optSign.isPresent()) {
                vo.setSignTime(optSign.get().getCreateTime());
                vo.setSignStatus(optSign.get().getStatus());
                vo.setAlcoholIntake(optSign.get().getAlcoholIntake());

                if (schedulingSize > 0) {
                    Optional<LinggangScheduling> scheOpt = schedulings.stream().filter(s -> Objects.equals(s.getId(), optSign.get().getSchedulingId())).findFirst();
                    if (scheOpt.isPresent()) {
                        vo.setNbbm(scheOpt.get().getNbbm());
                    }
                }
            }

            if (driverSize > 0) {
                Optional<NewDriver> driverOpt = drivers.stream().filter(d -> Objects.equals(r.getJobCode(), d.getJobCode())).findFirst();
                if (driverOpt.isPresent()) {
                    vo.setJobCode(driverOpt.get().getJobCode());
                    vo.setPersonnelName(driverOpt.get().getPersonnelName());
                }
            }

            return vo;
        }).collect(Collectors.toList());
    }
}