jiangping
2024-10-09 c5cc7da07c7f202f336468c0cd0d2789b4775b03
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
@@ -6,7 +6,6 @@
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.CarChargeAddRequest;
import com.doumee.core.haikang.model.param.request.ParkReservationAddRequest;
import com.doumee.core.haikang.model.param.request.ParkReservationDelRequest;
import com.doumee.core.haikang.model.param.respose.ParkReservationAddResponse;
@@ -22,6 +21,7 @@
import com.doumee.dao.business.join.PlatformJobJoinMapper;
import com.doumee.dao.business.join.PlatformJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.vo.LargeScreenDataVO;
import com.doumee.dao.openapi.request.*;
import com.doumee.dao.openapi.response.*;
import com.doumee.dao.system.model.SystemUser;
@@ -35,20 +35,19 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestBody;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -57,6 +56,7 @@
 * @date 2024/06/28 10:03
 */
@Service
@Slf4j
public class PlatformJobServiceImpl implements PlatformJobService {
    @Autowired
@@ -256,6 +256,7 @@
                .eq(pageWrap.getModel().getPlatformGroupId() != null, PlatformJob::getPlatformGroupId, pageWrap.getModel().getPlatformGroupId())
                .apply(pageWrap.getModel().getQueryStatus() != null, " find_in_set(t.`STATUS`,'"+pageWrap.getModel().getQueryStatus()+"')")
                .apply(pageWrap.getModel().getQueryType() != null, " find_in_set(t.TYPE,'"+pageWrap.getModel().getQueryType()+"')")
                .ge(pageWrap.getModel().getBeginWorkDateStart() != null, PlatformJob::getStartDate, Utils.Date.getStart(pageWrap.getModel().getBeginWorkDateStart()))
                .le(pageWrap.getModel().getBeginWorkDateEnd() != null, PlatformJob::getStartDate, Utils.Date.getEnd(pageWrap.getModel().getBeginWorkDateEnd()))
@@ -290,11 +291,15 @@
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper
                .selectAll(PlatformJob.class)
                .selectAs(PlatformBooks::getId,PlatformJob::getBookId)
                .selectAs(Platform::getName,PlatformJob::getPlatformName)
                .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
                .selectAs(PlatformWmsJob::getCarrierName,PlatformJob::getCarrierName)
                .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
                .leftJoin(PlatformWmsJob.class,PlatformWmsJob::getCarryBillCode,PlatformJob::getBillCode)
                .leftJoin(PlatformBooks.class,PlatformBooks::getJobId,PlatformJob::getId)
                .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                .apply("(  t1.isdeleted = 0 or t.PLATFORM_ID is null  )")
                .eq(pageWrap.getModel().getPlatformGroupId() != null, PlatformJob::getPlatformGroupId, pageWrap.getModel().getPlatformGroupId())
                .like(pageWrap.getModel().getCarCodeFront() != null, PlatformJob::getCarCodeFront, pageWrap.getModel().getCarCodeFront())
@@ -356,12 +361,30 @@
            List<PlatformWmsDetail> platformWmsDetailList = platformWmsDetailMapper.selectList(new QueryWrapper<PlatformWmsDetail>().lambda()
                    .eq(PlatformWmsDetail::getIsdeleted,Constants.ZERO)
                    .eq(PlatformWmsDetail::getJobId,platformJob.getId()));
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(platformWmsDetailList)){
                platformJob.setTotalNum(
                        platformWmsDetailList.stream().map(m->m.getIoQty()).reduce(BigDecimal.ZERO,BigDecimal::add)
                );
                platformWmsJob.setPlatformWmsDetailList(platformWmsDetailList);
                platformJob.setPlatformWmsJob(platformWmsJob);
                if(Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.zyczh)
                        || Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.wxczh)){
                    Integer unLockCount = platformWmsDetailList.stream().filter(i->Constants.equalsInteger(i.getLockStatus(),Constants.ZERO)).collect(Collectors.toList()).size();
                    if(Constants.equalsInteger(unLockCount,Constants.ZERO)){
                        platformJob.setLockStatus(Constants.TWO);  //全部上锁
                    }else if(Constants.equalsInteger(unLockCount,platformWmsDetailList.size())){
                        platformJob.setLockStatus(Constants.ZERO);  //未上锁
                    }else{
                        platformJob.setLockStatus(Constants.ONE);   //部分上锁
                    }
                }
            }
        } 
    }
@@ -403,7 +426,7 @@
                    platformJob.setWaitTime(waitTime);
                }
            }else{
                platformJob.setWaitTime("等待叫号");
                platformJob.setWaitTime("预计等待:-小时-分钟");
            }
        }else if(Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())
        || Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.DONE.getKey())){
@@ -425,7 +448,6 @@
                    .ne(PlatformLog::getParam3,Constants.ZERO+"")
                    .orderByDesc(PlatformLog::getCreateDate));
            platformJob.setWorkTime(platformLogList.stream().map(m->Long.valueOf(m.getParam3())).reduce(Long.valueOf(0),Long::sum));
        }
    }
@@ -458,7 +480,6 @@
            //查询前方排队数量
            this.queryWaitNum(platformJob);
        }
        driverHomeVO.setPlatformJobList(platformJobList);
@@ -556,7 +577,14 @@
        || System.currentTimeMillis() < DateUtil.getDateByString(DateUtil.getCurrDate() + " " + platformGroup.getStartTime() + ":00" ).getTime()){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未在工作时间["+platformGroup.getStartTime() + "-" + platformGroup.getEndTime() +"],无法进行签到");
        }
        //查询今日最大的签到数
        List<PlatformJob> signList = platformJobMapper.selectList(new QueryWrapper<PlatformJob>().lambda().apply(" DATE(SIGN_DATE) = DATE(NOW()) and sign_date is not null  "));
        if(CollectionUtils.isEmpty(signList)){
            platformJob.setSignNum(Constants.ONE);
        } else{
            int maxNumber = Collections.max(signList.stream().map(i->i.getSignNum()).collect(Collectors.toList()));
            platformJob.setSignNum(maxNumber + Constants.ONE);
        }
        platformJob.setSignDate(new Date());
        platformJob.setSingType(signInDTO.getSignType());
        platformJob.setStatus(Constants.PlatformJobStatus.WAIT_CALL.getKey());
@@ -798,9 +826,11 @@
        return platformJob;
    }
    private Logger logger = LoggerFactory.getLogger(PlatformJobServiceImpl.class);
    @Override
    public void sendInPark(PlatformJob platformJob){
        log.info("【下发停车场权限】================开始===="+platformJob.getCarCodeFront());
        if(Constants.equalsInteger(platformJob.getType(),Constants.TWO)
                || Constants.equalsInteger(platformJob.getType(),Constants.THREE)
                || Constants.equalsInteger(platformJob.getType(),Constants.FOUR)){
@@ -809,6 +839,32 @@
                    .lambda()
                    .isNotNull(Parks::getHkId)
                    .eq(Parks::getIsdeleted,Constants.ZERO));
            //取消当前车辆所有权限
            List<VisitPark> cancelParkList = visitParkMapper.selectList(new QueryWrapper<VisitPark>().lambda()
                    .eq(VisitPark::getCarCode,platformJob.getCarCodeFront())
                    .eq(VisitPark::getObjType,Constants.ONE)
                    .eq(VisitPark::getHkStatus,Constants.ONE)
                    .isNotNull(VisitPark::getHkId)
            );
            log.info("【下发停车场权限】================开始取消当前车辆所有权限===="+JSONObject.toJSONString(cancelParkList));
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(cancelParkList)){
                for (VisitPark visitPark:cancelParkList) {
                    ParkReservationDelRequest param = new ParkReservationDelRequest();
                    param.setReserveOrderNo(visitPark.getHkId());
                    BaseResponse response =  HKService.parkReservationDeletion(param);
                    if(response!=null
                            && StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
                        visitPark.setHkStatus(Constants.THREE);
                        visitPark.setIsdeleted(Constants.ONE);
                        visitPark.setRemark("再次下发清空权限");
                        visitPark.setEditDate(new Date());
                        visitParkMapper.updateById(visitPark);
                    }
                }
            }
            List<VisitPark> visitParkList = new ArrayList<>();
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(parksList)){
                Boolean sendStatus = true;
@@ -842,10 +898,10 @@
                            ParkReservationAddResponse parkReservationAddResponse = (ParkReservationAddResponse) response.getData();
                            visitPark.setHkId(parkReservationAddResponse.getReserveOrderNo());
                            visitPark.setHkStatus(Constants.ONE);
                            visitPark.setRemark("包期成功");
                            visitPark.setRemark("车辆权限下发成功");
                        }else{
                            visitPark.setHkStatus(Constants.TWO);
                            visitPark.setRemark("包期失败~");
                            visitPark.setRemark("车辆权限下发失败~");
                            //下发失败  标记主业务状态为下发失败
                            sendStatus = false;
                        }
@@ -874,11 +930,10 @@
                || Constants.equalsInteger(platformJob.getType(),Constants.FOUR)){
            List<VisitPark> visitParkList = visitParkMapper.selectList(new QueryWrapper<VisitPark>().lambda()
                    .eq(VisitPark::getVisitApplyId,platformJob.getId())
                    .eq(VisitPark::getCarCode,platformJob.getCarCodeFront())
                    .eq(VisitPark::getObjType,Constants.ONE)
                    .eq(VisitPark::getHkStatus,Constants.ONE)
                    .isNotNull(VisitPark::getHkId)
                    .apply(" END_TIME > now() ")
            );
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(visitParkList)){
                for (VisitPark visitPark:visitParkList) {
@@ -1013,7 +1068,7 @@
     */
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void platformOverNumber(JobOperateDTO jobOperateDTO){
    public PlatformJob platformOverNumber(JobOperateDTO jobOperateDTO){
        if(Objects.isNull(jobOperateDTO)
                || Objects.isNull(jobOperateDTO.getJobId())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
@@ -1034,8 +1089,7 @@
        //存储操作日志
        savePlatformLog(Constants.PlatformJobLogType.OVER_NUMBER.getKey(),oldPlatformJob,platformJob,
                Constants.PlatformJobLogType.OVER_NUMBER.getInfo());
        return platformJob;
    }
@@ -1267,6 +1321,7 @@
            platformLog.setParam2(DateUtil.dateTypeToString(platformLog.getCreateDate(),"yyyy-MM-dd HH:mm:ss"));
            String v = Long.toString((platformLog.getCreateDate().getTime() - DateUtil.StringToDate(lastBeginPlatform.getParam1(),"yyyy-MM-dd HH:mm:ss").getTime() )/ 1000) ;
            platformLog.setParam3(v);
            platformLog.setRemark(platformJobBefor.getPlatformId().toString());
        }else if(Constants.equalsInteger(objType,Constants.PlatformJobLogType.TRANSFERING.getKey())){
            //查询最后一次日志是否为异常挂起,异常挂起后可进行转移 如果进行转移那么业务就需要重新进行开始就不需要特殊处理  ,如果不是异常挂起进行数据结束 则直接查询最后一次开始的时间
            PlatformLog lastPlatformLog = platformLogMapper.selectOne(new QueryWrapper<PlatformLog>().lambda()
@@ -1456,8 +1511,7 @@
            platformJobMapper.selectCount(new QueryWrapper<PlatformJob>().lambda()
                    .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                    .and(i->
                            i.like(PlatformJob::getDoneDate,queryDateStr)
                            .or().ne(PlatformJob::getStatus,Constants.PlatformJobStatus.DONE.getKey())
                            i.like(PlatformJob::getArriveDate,queryDateStr)
                    )
            )
        );
@@ -1482,31 +1536,50 @@
                .eq(Platform::getStatus,Constants.ZERO)
        );
        for (Platform platform:platformList) {
            PlatformDataListResponse platformDataListResponse  = new PlatformDataListResponse();
            PlatformDataListResponse platformDataListResponse = new PlatformDataListResponse();
            platformDataListResponse.setId(platform.getId());
            platformDataListResponse.setHkId(platform.getHkId());
            platformDataListResponse.setName(platform.getName());
            platformDataListResponse.setWorkStatus(Constants.ZERO);
            //查询当前作业车辆
            PlatformJob platformJob = platformJobMapper.selectOne(new QueryWrapper<PlatformJob>().lambda()
                    .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                    .eq(PlatformJob::getStatus,Constants.PlatformJobStatus.WORKING.getKey())
                    .orderByDesc(PlatformJob::getWorkTime)
            PlatformJob platformJob = platformJobJoinMapper.selectJoinOne(PlatformJob.class, new MPJLambdaWrapper<PlatformJob>()
                    .selectAll(PlatformJob.class)
                    .selectAs(Platform::getWorkRate, PlatformJob::getWorkRate)
                    .selectAs(Platform::getName, PlatformJob::getPlatformName)
                    .select(" case when t.total_num is null  then ( select sum(pwd.IO_QTY) from platform_wms_detail pwd where pwd.JOB_ID = t.id  ) else t.total_num end workNum ")
                    .select(" ( select pl.CREATE_DATE from platform_log pl where t.id = pl.obj_id and pl.OBJ_TYPE = 5 order by pl.CREATE_DATE desc  limit 1  ) as newStartDate  ")
                    .select(" ( select pl.CREATE_DATE from platform_log pl where t.id = pl.obj_id and pl.OBJ_TYPE = 4 order by pl.CREATE_DATE desc  limit 1  ) as newCallDate  ")
                    .leftJoin(Platform.class, Platform::getId, PlatformJob::getPlatformId)
                    .eq(PlatformJob::getStatus, Constants.PlatformJobStatus.WORKING.getKey())
                    .eq(PlatformJob::getPlatformId, platform.getId())
                    .orderByDesc(PlatformJob::getStatus)
                    .orderByDesc(PlatformJob::getStartDate)
                    .last(" limit 1")
            );
            if(Objects.nonNull(platformJob)){
            if (Objects.nonNull(platformJob)) {
                platformDataListResponse.setCarCode(platformJob.getCarCodeFront());
                platformDataListResponse.setWorkType(
                        Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.zycxh)
                                ||Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.wxcxh)
                        ||Constants.equalsInteger(platformJob.getType(),Constants.platformJobType.sgscxh)?Constants.ZERO:Constants.ONE
                        Constants.equalsInteger(platformJob.getType(), Constants.platformJobType.zycxh)
                                || Constants.equalsInteger(platformJob.getType(), Constants.platformJobType.wxcxh)
                                || Constants.equalsInteger(platformJob.getType(), Constants.platformJobType.sgscxh) ? Constants.ZERO : Constants.ONE
                );
                platformDataListResponse.setWorkStatus(Constants.ONE);
                //查询作业时长
                platformDataListResponse.setWorkTime(
                        this.getWorkTime(platformJob)
                );
                //计算已作业时长 根据月台工作效率 计算任务量需要时间
                if (Objects.isNull(platformJob.getWorkNum()) || Objects.isNull(platformJob.getWorkRate())) {
                    platformDataListResponse.setFinishTime(null);
                } else {
                    Integer workMinute = platformJob.getWorkNum().multiply(new BigDecimal(60)).divide(platformJob.getWorkRate()).intValue();
                    Date overDate = DateUtil.getXMinuteAfterDate(platformJob.getNewStartDate(), workMinute);
                    platformDataListResponse.setFinishTime(overDate);
                }
            }
            platformDataListResponseList.add(platformDataListResponse);
        }
        return platformDataListResponseList;
    }
@@ -1612,9 +1685,8 @@
                .selectAll(PlatformJob.class)
                .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
                .leftJoin(PlatformGroup.class,PlatformGroup::getId,PlatformJob::getPlatformGroupId)
                        .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey())
                .in(PlatformJob::getStatus,Constants.PlatformJobStatus.IN_WAIT.getKey())
                .in(PlatformJob::getStatus,Constants.PlatformJobStatus.CALLED.getKey())
                        .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CALL.getKey(),
                                Constants.PlatformJobStatus.IN_WAIT.getKey(),Constants.PlatformJobStatus.CALLED.getKey())
                .eq(PlatformJob::getIsdeleted,Constants.ZERO)
                .isNotNull(PlatformJob::getCarCodeFront)
                .orderByDesc(PlatformJob::getCreateDate)
@@ -1665,5 +1737,53 @@
    }
    @Override
    public LargeScreenDataVO getLargeScreenData(){
        LargeScreenDataVO largeScreenDataVO = new LargeScreenDataVO();
        List<PlatformJob> platformJobList = platformJobJoinMapper.selectJoinList(PlatformJob.class,new MPJLambdaWrapper<PlatformJob>()
                .selectAll(PlatformJob.class)
                .selectAs(Platform::getWorkRate,PlatformJob::getWorkRate)
                .selectAs(Platform::getName,PlatformJob::getPlatformName)
                .select(" case when t.total_num is null  then ( select sum(pwd.IO_QTY) from platform_wms_detail pwd where pwd.JOB_ID = t.id  ) else t.total_num end workNum ")
                .select(" ( select pl.CREATE_DATE from platform_log pl where t.id = pl.obj_id and pl.OBJ_TYPE = 5 order by pl.CREATE_DATE desc  limit 1  ) as newStartDate  ")
                .select(" ( select pl.CREATE_DATE from platform_log pl where t.id = pl.obj_id and pl.OBJ_TYPE = 4 order by pl.CREATE_DATE desc  limit 1  ) as newCallDate  ")
                .leftJoin(Platform.class,Platform::getId,PlatformJob::getPlatformId)
                .in(PlatformJob::getStatus,
                        Constants.PlatformJobStatus.WAIT_CALL.getKey(),
                        Constants.PlatformJobStatus.WORKING.getKey(),
                        Constants.PlatformJobStatus.CALLED.getKey(),
                        Constants.PlatformJobStatus.IN_WAIT.getKey()
                )
                .orderByDesc(PlatformJob::getStatus)
                .orderByAsc(PlatformJob::getSignDate)
        );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(platformJobList)){
            for (PlatformJob platformJob:platformJobList) {
                if(Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())){
                    //计算已作业时长 根据月台工作效率 计算任务量需要时间
                    if(Objects.isNull(platformJob.getWorkNum()) || Objects.isNull(platformJob.getWorkRate())){
                        platformJob.setOptTime(0L);
                    }else{
                        Integer workMinute = platformJob.getWorkNum().multiply(new BigDecimal(60)).divide(platformJob.getWorkRate()).intValue();
                        Date overDate = DateUtil.getXMinuteAfterDate(platformJob.getNewStartDate(),workMinute);
                        platformJob.setOptTime(overDate.getTime());
                    }
                }else if(Constants.equalsInteger(platformJob.getStatus(),Constants.PlatformJobStatus.CALLED.getKey())){
                    //计算已叫号时间
                    platformJob.dealTime();
                }
            }
            largeScreenDataVO.setAllList(platformJobList);
            List<PlatformJob> calledList = platformJobList.stream().filter(i->Constants.equalsInteger(i.getStatus(),Constants.PlatformJobStatus.CALLED.getKey())).collect(Collectors.toList());
            largeScreenDataVO.setWaitWorkList(calledList);
        }
        largeScreenDataVO.setQrCode(systemDictDataBiz.queryByCode(Constants.PLATFORM,Constants.SIGN_IN_QRCODE).getCode());
        return largeScreenDataVO;
    }
}