jiangping
2024-08-19 a4fb6a1f15ffabfc13506a183ca5f69306e85e08
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
@@ -1,31 +1,66 @@
package com.doumee.service.business.impl;
import cn.hutool.crypto.asymmetric.Sign;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.PositionUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.PlatformJobMapper;
import com.doumee.dao.business.PlatformMapper;
import com.doumee.dao.business.join.PlatformJobJoinMapper;
import com.doumee.dao.business.model.Platform;
import com.doumee.dao.business.model.PlatformBooks;
import com.doumee.dao.business.model.PlatformJob;
import com.doumee.dao.business.model.PlatformReason;
import com.doumee.dao.web.reqeust.JobDetailDTO;
import com.doumee.dao.web.reqeust.LineUpDetailDTO;
import com.doumee.dao.web.reqeust.SignInDTO;
import com.doumee.dao.web.response.DriverHomeVO;
import com.doumee.dao.web.response.LineUpVO;
import com.doumee.service.business.PlatformJobService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
 * 月台调度作业信息表Service实现
 * @author 江蹄蹄
 * @since 2024/04/28 16:06
 * @date 2024/06/28 10:03
 */
@Service
public class PlatformJobServiceImpl implements PlatformJobService {
    @Autowired
    private PlatformJobMapper platformJobMapper;
    @Autowired
    private PlatformJobJoinMapper platformJobJoinMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private PlatformMapper platformMapper;
    @Override
    public Integer create(PlatformJob platformJob) {
@@ -102,23 +137,22 @@
                .eq(pageWrap.getModel().getRemark() != null, PlatformJob::getRemark, pageWrap.getModel().getRemark())
                .eq(pageWrap.getModel().getStatus() != null, PlatformJob::getStatus, pageWrap.getModel().getStatus())
                .eq(pageWrap.getModel().getSortnum() != null, PlatformJob::getSortnum, pageWrap.getModel().getSortnum())
                .eq(pageWrap.getModel().getStartTime() != null, PlatformJob::getStartTime, pageWrap.getModel().getStartTime())
                .eq(pageWrap.getModel().getEndTime() != null, PlatformJob::getEndTime, pageWrap.getModel().getEndTime())
                .eq(pageWrap.getModel().getDeviceIds() != null, PlatformJob::getDeviceIds, pageWrap.getModel().getDeviceIds())
                .eq(pageWrap.getModel().getScreenIds() != null, PlatformJob::getScreenIds, pageWrap.getModel().getScreenIds())
                .eq(pageWrap.getModel().getWorkingNum() != null, PlatformJob::getWorkingNum, pageWrap.getModel().getWorkingNum())
                .eq(pageWrap.getModel().getBroadcastNum() != null, PlatformJob::getBroadcastNum, pageWrap.getModel().getBroadcastNum())
                .eq(pageWrap.getModel().getBroadcastIds() != null, PlatformJob::getBroadcastIds, pageWrap.getModel().getBroadcastIds())
                .eq(pageWrap.getModel().getBroadcastInfo() != null, PlatformJob::getBroadcastInfo, pageWrap.getModel().getBroadcastInfo())
                .eq(pageWrap.getModel().getBroadcastHkstatus() != null, PlatformJob::getBroadcastHkstatus, pageWrap.getModel().getBroadcastHkstatus())
                .ge(pageWrap.getModel().getBroadcastHkdate() != null, PlatformJob::getBroadcastHkdate, Utils.Date.getStart(pageWrap.getModel().getBroadcastHkdate()))
                .le(pageWrap.getModel().getBroadcastHkdate() != null, PlatformJob::getBroadcastHkdate, Utils.Date.getEnd(pageWrap.getModel().getBroadcastHkdate()))
                .eq(pageWrap.getModel().getBroadcastHkinfo() != null, PlatformJob::getBroadcastHkinfo, pageWrap.getModel().getBroadcastHkinfo())
                .eq(pageWrap.getModel().getCode() != null, PlatformJob::getCode, pageWrap.getModel().getCode())
                .eq(pageWrap.getModel().getBillCode() != null, PlatformJob::getBillCode, pageWrap.getModel().getBillCode())
                .eq(pageWrap.getModel().getDriverId() != null, PlatformJob::getDriverId, pageWrap.getModel().getDriverId())
                .eq(pageWrap.getModel().getDriverName() != null, PlatformJob::getDriverName, pageWrap.getModel().getDriverName())
                .eq(pageWrap.getModel().getPlateNum() != null, PlatformJob::getPlateNum, pageWrap.getModel().getPlateNum())
                .eq(pageWrap.getModel().getDrivierPhone() != null, PlatformJob::getDrivierPhone, pageWrap.getModel().getDrivierPhone())
                .ge(pageWrap.getModel().getSignDate() != null, PlatformJob::getSignDate, Utils.Date.getStart(pageWrap.getModel().getSignDate()))
                .le(pageWrap.getModel().getSignDate() != null, PlatformJob::getSignDate, Utils.Date.getEnd(pageWrap.getModel().getSignDate()))
                .eq(pageWrap.getModel().getSingType() != null, PlatformJob::getSingType, pageWrap.getModel().getSingType())
                .eq(pageWrap.getModel().getSignDistance() != null, PlatformJob::getSignDistance, pageWrap.getModel().getSignDistance())
                .eq(pageWrap.getModel().getPlatformNames() != null, PlatformJob::getPlatformNames, pageWrap.getModel().getPlatformNames())
                .eq(pageWrap.getModel().getPlatforms() != null, PlatformJob::getPlatforms, pageWrap.getModel().getPlatforms())
                .eq(pageWrap.getModel().getPlatformId() != null, PlatformJob::getPlatformId, pageWrap.getModel().getPlatformId())
                .ge(pageWrap.getModel().getInwaitDate() != null, PlatformJob::getInwaitDate, Utils.Date.getStart(pageWrap.getModel().getInwaitDate()))
                .le(pageWrap.getModel().getInwaitDate() != null, PlatformJob::getInwaitDate, Utils.Date.getEnd(pageWrap.getModel().getInwaitDate()))
                .eq(pageWrap.getModel().getInwaitUserId() != null, PlatformJob::getInwaitUserId, pageWrap.getModel().getInwaitUserId())
                .ge(pageWrap.getModel().getCallDate() != null, PlatformJob::getCallDate, Utils.Date.getStart(pageWrap.getModel().getCallDate()))
                .le(pageWrap.getModel().getCallDate() != null, PlatformJob::getCallDate, Utils.Date.getEnd(pageWrap.getModel().getCallDate()))
                .eq(pageWrap.getModel().getCallUserId() != null, PlatformJob::getCallUserId, pageWrap.getModel().getCallUserId())
@@ -158,6 +192,11 @@
                .eq(pageWrap.getModel().getCancelUserId() != null, PlatformJob::getCancelUserId, pageWrap.getModel().getCancelUserId())
                .eq(pageWrap.getModel().getCancelInfo() != null, PlatformJob::getCancelInfo, pageWrap.getModel().getCancelInfo())
                .eq(pageWrap.getModel().getReason() != null, PlatformJob::getReason, pageWrap.getModel().getReason())
                .eq(pageWrap.getModel().getContractNum() != null, PlatformJob::getContractNum, pageWrap.getModel().getContractNum())
                .ge(pageWrap.getModel().getArriveDate() != null, PlatformJob::getArriveDate, Utils.Date.getStart(pageWrap.getModel().getArriveDate()))
                .le(pageWrap.getModel().getArriveDate() != null, PlatformJob::getArriveDate, Utils.Date.getEnd(pageWrap.getModel().getArriveDate()))
                .eq(pageWrap.getModel().getInType() != null, PlatformJob::getInType, pageWrap.getModel().getInType())
                .eq(pageWrap.getModel().getTotalNum() != null, PlatformJob::getTotalNum, pageWrap.getModel().getTotalNum())
        ;
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
@@ -174,4 +213,203 @@
        QueryWrapper<PlatformJob> wrapper = new QueryWrapper<>(platformJob);
        return platformJobMapper.selectCount(wrapper);
    }
    //TODO
    @Override
    public DriverHomeVO getDriverHome(Integer memberId){
        DriverHomeVO driverHomeVO = new DriverHomeVO();
        //TODO 轮播图
        List<PlatformJob> platformJobList =  platformJobMapper.selectList(new QueryWrapper<PlatformJob>()
                .lambda()
                .eq(PlatformJob::getDriverId,memberId)
//                        .like(PlatformJob::get)
                .orderByDesc(PlatformJob::getId));
        driverHomeVO.setPlatformJobList(platformJobList);
        return driverHomeVO;
    }
    /**
     * 距离签到
     * @param signInDTO
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void signIn(SignInDTO signInDTO){
        if(Objects.isNull(signInDTO)
            || Objects.isNull(signInDTO.getSignType())
            || Objects.isNull(signInDTO.getJobId())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        PlatformJob platformJob = platformJobMapper.selectById(signInDTO.getJobId());
        if(Objects.isNull(platformJob)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WART_SIGN_IN.getKey())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"业务状态已流转,请刷新查看");
        }
        if(Constants.equalsInteger(signInDTO.getSignType(),Constants.ZERO)){
            this.distanceSignIn(signInDTO,platformJob);
        }else if(Constants.equalsInteger(signInDTO.getSignType(),Constants.ONE)){
            this.sceneSignIn(signInDTO);
        }
        platformJob.setSignDate(new Date());
        platformJob.setSingType(Constants.ZERO);
        platformJob.setStatus(Constants.PlatformJobStatus.WAIT_CALL.getKey());
        platformJobMapper.updateById(platformJob);
    }
    public void distanceSignIn(SignInDTO signInDTO , PlatformJob platformJob){
        if(Objects.isNull(signInDTO.getLat())
                || Objects.isNull(signInDTO.getLnt())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"经纬度信息异常");
        }
        //获取签到点的经纬度
        Double lat = Double.parseDouble(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_PLACE_LAT).getCode());
        Double lnt = Double.parseDouble(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_PLACE_LNT).getCode());
        BigDecimal distance = new BigDecimal(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_PLACE_DISTANCE).getCode());
        //获取2个点的距离X米
        Double getDistanceDouble = PositionUtil.getDistance(signInDTO.getLnt(),signInDTO.getLat(),lnt,lat);
        //转换km
        BigDecimal getDistance = BigDecimal.valueOf(getDistanceDouble).divide(new BigDecimal(1000),2,BigDecimal.ROUND_HALF_UP);
        if(distance.compareTo(getDistance)<Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"超出可签到距离,可签到距离["+distance+"]公里]");
        }
        platformJob.setSignDistance(BigDecimal.valueOf(getDistanceDouble));
    }
    public void sceneSignIn(SignInDTO signInDTO){
        if( StringUtils.isNotBlank(signInDTO.getQrCodeKey())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(!signInDTO.getQrCodeKey().equals(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_QRCODE).getCode())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"二维码已过期,请刷新重试");
        }
    }
    @Override
    public PlatformJob getDetail(JobDetailDTO jobDetailDTO){
        if(Objects.isNull(jobDetailDTO)
        || Objects.isNull(jobDetailDTO.getJobId())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        PlatformJob platformJob  = platformJobMapper.selectById(jobDetailDTO.getJobId());
        if(Objects.isNull(platformJob)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WART_SIGN_IN.getKey())){
            //待签到 计算距离
            if(Objects.nonNull(jobDetailDTO.getLnt())&&Objects.nonNull(jobDetailDTO.getLat())){
                //获取签到点的经纬度
                Double lat = Double.parseDouble(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_PLACE_LAT).getCode());
                Double lnt = Double.parseDouble(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_PLACE_LNT).getCode());
                //获取2个点的距离X米
                Double getDistanceDouble = PositionUtil.getDistance(jobDetailDTO.getLnt(),jobDetailDTO.getLat(),lnt,lat);
                //转换km
                BigDecimal getDistance = BigDecimal.valueOf(getDistanceDouble).divide(new BigDecimal(1000),2,BigDecimal.ROUND_HALF_UP);
                platformJob.setGetDistance(getDistance);
            }
        }else if( Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WAIT_CALL.getKey())
                || Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.IN_WAIT.getKey())
        ){//查询排队情况
            Long lineUpNum =  platformJobMapper.selectCount(new QueryWrapper<PlatformJob>().lambda()
                    .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                    .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey()
                            ,Constants.PlatformJobStatus.IN_WAIT.getKey()
                            ,Constants.PlatformJobStatus.TRANSFERING.getKey())
                    .gt(PlatformJob::getSignDate,platformJob.getSignDate())
                    .like(PlatformJob::getArriveDate,DateUtil.getDate(platformJob.getArriveDate(),"yyyy-MM-dd")));
            platformJob.setLineUpNum(lineUpNum);
        }else if(Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())){
            //作业月台信息
            Platform platform = platformMapper.selectById(platformJob.getPlatformId());
            if(Objects.nonNull(platform)){
                platformJob.setPlatformName(platform.getName());
            }
        }
        return platformJob;
    }
    @Override
    public LineUpVO lineUpDetail(LineUpDetailDTO lineUpDetailDTO){
        if(Objects.isNull(lineUpDetailDTO)
        || Objects.isNull(lineUpDetailDTO.getQueryType())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LineUpVO lineUpVO = new LineUpVO();
        //查询所有任务
        List<PlatformJob> platformJobList = platformJobJoinMapper.selectJoinList(PlatformJob.class,
                new MPJLambdaWrapper<PlatformJob>()
                        .selectAll(PlatformJob.class)
                        .selectAs(PlatformReason::getGroupId,PlatformJob::getGroupId)
                        .leftJoin(PlatformBooks.class,PlatformBooks::getJobId,PlatformJob::getId)
                        .leftJoin(PlatformReason.class,PlatformReason::getId,PlatformBooks::getReasonId)
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                        .eq(Constants.equalsInteger(lineUpDetailDTO.getQueryType(),Constants.ZERO)
                                ,PlatformJob::getDrivierPhone,lineUpDetailDTO.getMobile())
                        .eq(Constants.equalsInteger(lineUpDetailDTO.getQueryType(),Constants.ONE)
                                ,PlatformJob::getId,lineUpDetailDTO.getJobId())
                        .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey(),
                                Constants.PlatformJobStatus.IN_WAIT.getKey(),
                                Constants.PlatformJobStatus.CALLED.getKey())
                        .orderByAsc(PlatformJob::getSignDate)
        );
        //获取所有月台
        List<Integer> platformIdList = platformJobList.stream().map(m->m.getGroupId()).collect(Collectors.toList());
        List<Platform> platformList = platformMapper.selectList(new QueryWrapper<Platform>().lambda()
                .eq(Platform::getIsdeleted,Constants.ZERO)
                .in(Platform::getId,platformIdList));
        for (Platform platform:platformList) {
            //查询本月台下 自己的数据 最早签到的
            PlatformJob platformJob = platformJobList.stream().filter(i->Constants.equalsInteger(i.getGroupId(),platform.getId())).findFirst().orElse(null);
            //查询在当前月台下 签到排队车辆数据
            List<PlatformJob> platformJobSignInList = platformJobJoinMapper.selectJoinList(PlatformJob.class,
                    new MPJLambdaWrapper<PlatformJob>()
                            .selectAll(PlatformJob.class)
                            .selectAs(PlatformReason::getGroupId,PlatformJob::getGroupId)
                            .leftJoin(PlatformBooks.class,PlatformBooks::getJobId,PlatformJob::getId)
                            .leftJoin(PlatformReason.class,PlatformReason::getId,PlatformBooks::getReasonId)
                            .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                            .ge(Objects.nonNull(platformJob),PlatformJob::getSignDate,DateUtil.getDate(platformJob.getSignDate(),"yyyy-MM-dd HH:mm:ss"))
                            .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey(),
                                    Constants.PlatformJobStatus.IN_WAIT.getKey(),
                                    Constants.PlatformJobStatus.CALLED.getKey())
                            .orderByDesc(PlatformJob::getSignDate));
            platform.setSignJobList(platformJobSignInList);
            //查询当前月台下
            List<PlatformJob> platformJobWorkList = platformJobJoinMapper.selectJoinList(PlatformJob.class,
                    new MPJLambdaWrapper<PlatformJob>()
                            .selectAll(PlatformJob.class)
                            .selectAs(PlatformReason::getGroupId,PlatformJob::getGroupId)
                            .leftJoin(PlatformBooks.class,PlatformBooks::getJobId,PlatformJob::getId)
                            .leftJoin(PlatformReason.class,PlatformReason::getId,PlatformBooks::getReasonId)
                            .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                            .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.WORKING.getKey())
                            .orderByDesc(PlatformJob::getSignDate));
            platform.setSignJobList(platformJobSignInList);
            platform.setWorkJobList(platformJobWorkList);
        }
        lineUpVO.setPlatformList(platformList);
        return lineUpVO;
    }
}