k94314517
2024-09-30 4229bc67c2c0adf5603c7f68a1e55e480d011d75
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformJobServiceImpl.java
@@ -4,9 +4,7 @@
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
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 +20,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 +34,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 +55,7 @@
 * @date 2024/06/28 10:03
 */
@Service
@Slf4j
public class PlatformJobServiceImpl implements PlatformJobService {
    @Autowired
@@ -256,6 +255,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 +290,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())
@@ -556,7 +560,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 +809,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 +822,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 +881,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 +913,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 +1051,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 +1072,7 @@
        //存储操作日志
        savePlatformLog(Constants.PlatformJobLogType.OVER_NUMBER.getKey(),oldPlatformJob,platformJob,
                Constants.PlatformJobLogType.OVER_NUMBER.getInfo());
        return platformJob;
    }
@@ -1267,6 +1304,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 +1494,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)
                    )
            )
        );
@@ -1488,12 +1525,30 @@
            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 = platformJobMapper.selectOne(new QueryWrapper<PlatformJob>()
//                    .select(" * , ( select pl.CREATE_DATE from platform_log pl where platform_job.id = pl.obj_id and pl.OBJ_TYPE = 5 order by pl.CREATE_DATE desc  limit 1  ) as newStartDate ," +
//                            " case when platform_job.total_num is null  then ( select sum(pwd.IO_QTY) from platform_wms_detail pwd where pwd.JOB_ID = platform_job.id  ) else platform_job.total_num end workNum ")
//                    .eq("isdeleted",Constants.ZERO)
//                    .eq("status",Constants.PlatformJobStatus.WORKING.getKey())
//                    .orderByDesc("START_DATE")
//                    .last(" limit 1")
//            );
            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)){
                platformDataListResponse.setCarCode(platformJob.getCarCodeFront());
                platformDataListResponse.setWorkType(
@@ -1506,8 +1561,52 @@
                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);
                }
        try {
            List<Platform> platformList = platformJoinMapper.selectList(
                    new MPJLambdaWrapper<Platform>().eq(Platform::getIsdeleted,Constants.ZERO)
                            .eq(Platform::getStatus,Constants.ZERO)
            );
            for (Platform platform:platformList) {
                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)
                        .last(" limit 1")
                );
                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
                    );
                    platformDataListResponse.setWorkStatus(Constants.ONE);
                    //查询作业时长
                    platformDataListResponse.setWorkTime(
                            this.getWorkTime(platformJob)
                    );
                }
            }
            platformDataListResponseList.add(platformDataListResponse);
        }catch (Exception e){
            System.out.println("===============================报错啦:\n");
            e.printStackTrace();
        }
        return platformDataListResponseList;
    }
@@ -1612,9 +1711,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 +1763,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;
    }
}