1
9 小时以前 e711c834aec2293c53b07efe53e81e3573c289b6
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
@@ -19,18 +19,22 @@
import com.vincent.rsf.server.api.controller.erp.params.TaskInParam;
import com.vincent.rsf.server.api.entity.dto.SyncLocsDto;
import com.vincent.rsf.server.api.entity.enums.CallBackEvent;
import com.vincent.rsf.server.api.entity.params.CommonRequest;
import com.vincent.rsf.server.api.entity.params.ExMsgParams;
import com.vincent.rsf.server.api.entity.params.WcsTaskParams;
import com.vincent.rsf.server.api.entity.enums.WcsMsgTypeEvent;
import com.vincent.rsf.server.api.entity.params.*;
import com.vincent.rsf.server.manager.controller.params.GenerateTaskParams;
import com.vincent.rsf.server.manager.enums.*;
import com.vincent.rsf.server.api.service.WcsService;
import com.vincent.rsf.server.api.utils.LocUtils;
import com.vincent.rsf.server.api.utils.SlaveProperties;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.mapper.LocItemMapper;
import com.vincent.rsf.server.manager.service.*;
import com.vincent.rsf.server.manager.service.impl.LocServiceImpl;
import com.vincent.rsf.server.manager.utils.WarehouseLocationRetrievalUtil;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.manager.enums.LocStsType;
import com.vincent.rsf.server.system.entity.*;
import com.vincent.rsf.server.system.service.impl.*;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -44,6 +48,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Random;
@@ -64,7 +69,7 @@
    @Autowired
    private LocServiceImpl locService;
    @Autowired
    private LocItemService locItemService;
    private LocItemMapper locItemMapper;
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
@@ -81,6 +86,16 @@
    private RestTemplate restTemplate;
    @Autowired
    private RemotesInfoProperties.RcsApi rcsApi;
    @Autowired
    private UserServiceImpl userService;
    @Autowired
    private TaskInstanceServiceImpl taskInstanceService;
    @Autowired
    private TaskInstanceNodeServiceImpl taskInstanceNodeService;
    @Autowired
    private FlowStepInstanceServiceImpl flowStepInstanceService;
    @Autowired
    private FlowInstanceServiceImpl flowInstanceService;
    @Override
@@ -116,7 +131,7 @@
    public InTaskMsgDto createInTask(TaskInParam param) {
        // 验证设备站点
        DeviceSite deviceSite = validateDeviceSite(param);
//        DeviceSite deviceSite = validateDeviceSite(param);
        // 验证组拖状态
        WaitPakin waitPakin = validateWaitPakin(param.getBarcode());
@@ -134,7 +149,7 @@
        // 创建并保存任务
        Task task = createTask(ruleCode, locNo.getLocNo(), waitPakin.getBarcode(),
                deviceSite.getDeviceSite(), param.getSourceStaNo().toString(), param.getUser());
                null, param.getSourceStaNo().toString(), param.getUser());
        // 更新库位状态
        updateLocStatus(task.getTargLoc(), waitPakin.getBarcode());
@@ -157,16 +172,16 @@
    /**
     * 验证设备站点
     */
    private DeviceSite validateDeviceSite(TaskInParam param) {
        DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
                .eq(DeviceSite::getSite, param.getSourceStaNo())
                .eq(DeviceSite::getType, param.getIoType()));
        if (Objects.isNull(deviceSite)) {
            throw new CoolException("站点不存在!!");
        }
        return deviceSite;
    }
//    private DeviceSite validateDeviceSite(TaskInParam param) {
//        DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
//                .eq(DeviceSite::getSite, param.getSourceStaNo())
//                .eq(DeviceSite::getType, param.getIoType()));
//
//        if (Objects.isNull(deviceSite)) {
//            throw new CoolException("站点不存在!!");
//        }
//        return deviceSite;
//    }
    /**
     * 验证组拖状态
@@ -200,7 +215,7 @@
                            String targetSite, String sourceSiteNo, Long loginUserId) {
        Task task = new Task();
        task.setTaskCode(ruleCode)
                .setTaskStatus(TaskStsType.GENERATE_IN.id)
                .setTaskStatus(TaskStsType.MISSION_INITIAL.id)
                .setTaskType(TaskType.TASK_TYPE_IN.type)
                .setWarehType(WarehType.WAREHOUSE_TYPE_CRN.val)
                .setTargLoc(targetLoc)
@@ -220,10 +235,17 @@
     * 更新库位状态
     */
    private void updateLocStatus(String locCode, String barcode) {
        boolean updated = locService.update(new LambdaUpdateWrapper<Loc>()
                .eq(Loc::getCode, locCode)
                .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type)
                .set(Loc::getBarcode, barcode));
        Loc current = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, locCode));
        if (Objects.isNull(current)) {
            throw new CoolException("库位预约失败!!");
        }
        Loc update = new Loc();
        update.setId(current.getId());
        update.setVersion(current.getVersion());
        update.setUseStatus(LocStsType.LOC_STS_TYPE_S.type);
        update.setBarcode(barcode);
        boolean updated = locService.update(update, new LambdaUpdateWrapper<Loc>()
                .eq(Loc::getId, current.getId()));
        if (!updated) {
            throw new CoolException("库位预约失败!!");
        }
@@ -255,6 +277,9 @@
                    .setCreateBy(loginUserId)
                    .setUpdateBy(loginUserId)
                    .setOrderId(item.getAsnId())
                    .setSplrBatch(item.getBatch())
                    .setPlatWorkCode(item.getPlatWorkCode())
                    .setPlatItemId(item.getPlatItemId())
                    .setOrderItemId(item.getAsnItemId());
        }).collect(Collectors.toList());
@@ -267,11 +292,19 @@
     * 更新组托状态
     */
    private void updateWaitPakinStatus(String barcode, Long loginUserId) {
        boolean updated = waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>()
                .eq(WaitPakin::getBarcode, barcode)
                .set(WaitPakin::getUpdateBy, loginUserId)
                .set(WaitPakin::getCreateBy, loginUserId)
                .set(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
        WaitPakin current = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
                .eq(WaitPakin::getBarcode, barcode));
        if (Objects.isNull(current)) {
            throw new CoolException("组托状态修改失败!!");
        }
        WaitPakin update = new WaitPakin();
        update.setId(current.getId());
        update.setVersion(current.getVersion());
        update.setUpdateBy(loginUserId);
        update.setCreateBy(loginUserId);
        update.setIoStatus(PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val);
        boolean updated = waitPakinService.update(update, new LambdaUpdateWrapper<WaitPakin>()
                .eq(WaitPakin::getId, current.getId()));
        if (!updated) {
            throw new CoolException("组托状态修改失败!!");
@@ -361,6 +394,42 @@
//        return locNo;
//    }
    @Override
    public InTaskMsgDto getLocNoArea(TaskInParam param) throws Exception {
        String matnr = null;
        String batch = null;
        List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, param.getBarcode()));
        if (Cools.isEmpty(waitPakins) && param.getIoType().equals(TaskType.TASK_TYPE_IN.type)) {
            throw new CoolException("未找到组托信息,请组托");
        } else if (!Cools.isEmpty(waitPakins)) {
            matnr = waitPakins.get(0).getCode();
            batch = waitPakins.get(0).getCode();
        }
        DeviceBind deviceBind = deviceBindService.getById(LocUtils.getAreaType(param.getSourceStaNo()));
        if (Cools.isEmpty(deviceBind)) {
            throw new CoolException("数据异常,请联系管理员===>库位规则未知");
        }
        WarehouseAreas warehouseArea = warehouseAreasService.getById(deviceBind.getTypeId());
        if (Cools.isEmpty(warehouseArea)) {
            throw new CoolException("未找到所属库区信息");
        }
        LocTypeDto locTypeDto = new LocTypeDto(param);
        InTaskMsgDto dto = null;
        //根据立库类型获取获取库位
        if (warehouseArea.getType().equals(WarehType.WAREHOUSE_TYPE_CRN.val)) {
            //堆垛机
            dto = getLocNoCrn(param.getOrgLoc(), deviceBind, warehouseArea.getId(), param.getSourceStaNo(), matnr, batch, locTypeDto, 0, param.getIoType());
        } else if (warehouseArea.getType().equals(WarehType.WAREHOUSE_TYPE_FOUR_DIRECTIONS.val)) {
            //四向库
        } else {
            //CTU 库以及其它
            dto = getLocNoCtu(deviceBind, warehouseArea.getId(), param.getSourceStaNo(), matnr, batch, locTypeDto, 0, param.getIoType());
        }
        return dto;
    }
    @Override
    public InTaskMsgDto getLocNo(TaskInParam param) throws Exception {
        String matnr = null;
        String batch = null;
@@ -371,13 +440,13 @@
            matnr = waitPakins.get(0).getCode();
            batch = waitPakins.get(0).getCode();
        }
        List<DeviceSite> deviceSites = deviceSiteService.list(new LambdaQueryWrapper<DeviceSite>()
                .eq(DeviceSite::getSite, param.getSourceStaNo())
                .eq(DeviceSite::getType, param.getIoType())
        );
        if (Cools.isEmpty(deviceSites)) {
            throw new CoolException("未找到站点路径信息");
        }
//        List<DeviceSite> deviceSites = deviceSiteService.list(new LambdaQueryWrapper<DeviceSite>()
//                .eq(DeviceSite::getSite, param.getSourceStaNo())
//                .eq(DeviceSite::getType, param.getIoType())
//        );
//        if (Cools.isEmpty(deviceSites)) {
//            throw new CoolException("未找到站点路径信息");
//        }
        DeviceBind deviceBind = deviceBindService.getById(LocUtils.getAreaType(param.getSourceStaNo()));
        if (Cools.isEmpty(deviceBind)) {
            throw new CoolException("数据异常,请联系管理员===>库位规则未知");
@@ -428,7 +497,7 @@
                for (SyncLocsDto dto : dtos) {
                    Loc loc = new Loc();
                    String string = new Random().nextInt(10000000) + "";
                    Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, string));
                    Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, dto.getLocNo()));
                    if (!Objects.isNull(one)) {
                        string = new Random().nextInt(10000000) + "";
                    }
@@ -437,11 +506,11 @@
                            .setRow(dto.getRow())
                            .setLev(dto.getLev())
                            .setId(null)
                            .setAreaId(41L)
                            .setWarehouseId(27L)
                            .setAreaId(42L)
                            .setWarehouseId(29L)
                            .setBarcode(string)
                            .setCol(dto.getBay())
                            .setType(dto.getLocType())
                            .setType(dto.getLocType().equals("16") ? "17" : "15")
                            .setStatus(dto.getStatusBool())
                            .setUseStatus(LocStsType.getLocSts(dto.getLocSts()));
                    if (!locService.save(loc)) {
@@ -467,57 +536,112 @@
        }
        Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, params.getSeqNum()));
        if (Objects.isNull(task)) {
            throw new CoolException("任务不存在可已结束!!");
            throw new CoolException("任务不存在可以结束!!");
        }
        /**取箱完成*/
        if (params.getEventType().equals(CallBackEvent.CALL_BACK_EVENT_END.event)) {
        FlowStepInstance flowStepInstance = flowStepInstanceService.getOne(new LambdaQueryWrapper<FlowStepInstance>()
                .eq(FlowStepInstance::getTaskNo, task.getTaskCode())
                .eq(FlowStepInstance::getWmsNowTaskStatus, task.getTaskStatus())
                .eq(FlowStepInstance::getStatus, (short) 1).last("limit 1"));
        if (Cools.isEmpty(flowStepInstance)){
            return R.error(task.getTaskCode()+"任务号==>未查询到相关任务执行流程!!!");
        }
        if (!MissionStepType.getTaskRECEIVE().contains(flowStepInstance.getStepType())){
            return R.error(task.getTaskCode()+"任务号==>相关任务类型非接收型,步骤错乱!!!");
        }
        FlowInstance flowInstance = flowInstanceService.getById(flowStepInstance.getFlowInstanceId());
        if (Cools.isEmpty(flowInstance)) {
            return R.error(task.getTaskCode()+"任务号==>未查询到相关任务执行流程!!!");
        }
        List<FlowStepInstance> flowStepInstances = flowStepInstanceService.list(new LambdaQueryWrapper<FlowStepInstance>()
                .eq(FlowStepInstance::getFlowInstanceId, flowInstance.getId()).eq(FlowStepInstance::getStatus, (short) 0));
        flowInstance.setStatus(flowStepInstances.isEmpty()? (short) 2:(short) 1);
        TaskInstanceNode taskInstanceNode = taskInstanceNodeService.getById(flowInstance.getNodeInstanceId());
        if (Cools.isEmpty(taskInstanceNode)) {
            return R.error(task.getTaskCode()+"任务号==>未查询到相关任务执行流程!!!");
        }
        taskInstanceNode.setStatus(flowInstance.getStatus());
        TaskInstance taskInstance = taskInstanceService.getById(flowInstance.getTaskId());
        if (Cools.isEmpty(taskInstance)) {
            return R.error(task.getTaskCode()+"任务号==>未查询到相关任务执行流程!!!");
        }
        /**料箱搬运中, 修改站点状态*/
        if (params.getEventType().equals(CallBackEvent.CALL_BACK_EVENT_BIN.event)) {
            if (!flowStepInstance.getStepType().equals(MissionStepType.MISSION_STEP_TYPE_RECEIVE_BIN.type)) {
                return R.error(task.getTaskCode()+"任务号==>未查询到相关任务执行流程!!!");
            }
            if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
                if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode())
                        .set(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id))) {
                    throw new CoolException("任务状态修改失败!!");
                    || task.getTaskType().equals(TaskType.TASK_TYPE_EMPTY_IN.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type)) {
                /**修改出库站点状态*/
                BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
                        .eq(BasStation::getStationName, task.getOrgSite()));
                if (Objects.isNull(station)) {
                    throw new CoolException("数据错误,站点不存在!!");
                }
                if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
                    BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getOrgSite()));
                    if (Objects.isNull(station)) {
                        throw new CoolException("数据错误,站点不存在!!");
                    }
                    if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
                        station.setUseStatus(LocStsType.LOC_STS_TYPE_O.type);
                        if (!basStationService.updateById(station)) {
                            throw new CoolException("站点状态修改失败!!");
                        }
                if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
                    station.setUseStatus(LocStsType.LOC_STS_TYPE_O.type);
                    station.setBarcode(null);
                    if (!basStationService.updateById(station)) {
                        throw new CoolException("站点状态修改失败!!");
                    }
                }
            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)
                    || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type)) {
                if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode())
                        .set(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id))) {
                    throw new CoolException("任务状态修改失败!!");
                }
                /**修改出库站点状态*/
                BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
                        .eq(BasStation::getStationName, task.getTargSite()));
                if (Objects.isNull(station)) {
                    throw new CoolException("数据错误,站点不存在!!");
                }
                if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
                    station.setUseStatus(LocStsType.LOC_STS_TYPE_F.type);
                    if (!basStationService.updateById(station)) {
                        throw new CoolException("站点状态修改失败!!");
                    }
                }
                    || task.getTaskType().equals(TaskType.TASK_TYPE_EMPTY_OUT.type)) {
//                /**修改出库站点状态*/
//                BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
//                        .eq(BasStation::getStationName, task.getOrgLoc()));
//                if (Objects.isNull(station)) {
//                    throw new CoolException("数据错误,站点不存在!!");
//                }
//                if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
//                    station.setUseStatus(LocStsType.LOC_STS_TYPE_O.type);
//                    station.setBarcode(null);
//                    if (!basStationService.updateById(station)) {
//                        throw new CoolException("站点状态修改失败!!");
//                    }
//                }
            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)){
                //查询步骤  清楚源库位或者中间站点数据
                //待修改  先默认清除源库位
            }
            /**取箱完成, 修改任务状态*/
        } else if (params.getEventType().equals(CallBackEvent.CALL_BACK_EVENT_END.event)) {
            if (flowStepInstance.getStepType().equals(MissionStepType.MISSION_STEP_TYPE_RECEIVE_BIN.type)) {
                return R.error(task.getTaskCode()+"任务号==>请先出站请求!!!");
            }
        }
        task.setTaskStatus(flowStepInstance.getWmsNextTaskStatus());
        flowStepInstance.setStatus((short)3);
        flowStepInstanceService.updateById(flowStepInstance);
        taskService.updateById(task);
        if (flowStepInstance.getWmsNextTaskStatus() != 9999) {
            FlowStepInstance nextFlowStepInstance = flowStepInstanceService.getOne(new LambdaQueryWrapper<FlowStepInstance>()
                    .eq(FlowStepInstance::getStatus, (short)0)
                    .eq(FlowStepInstance::getTaskNo, flowStepInstance.getTaskNo())
                    .eq(FlowStepInstance::getStepOrder, flowStepInstance.getStepOrder() + 1)
                    .eq(FlowStepInstance::getWmsNowTaskStatus, flowStepInstance.getWmsNextTaskStatus()));
            if (Cools.isEmpty(nextFlowStepInstance)) {
                return R.error(task.getTaskCode()+"任务号==>未查询到相关任务执行流程!!!");
            }
            nextFlowStepInstance.setStatus((short)1);
            flowStepInstanceService.updateById(nextFlowStepInstance);
        } else {
            taskInstance.setStatus((short)2);
            taskInstanceService.updateById(taskInstance);
        }
        log.info(JSONObject.toJSONString(params));
        return R.ok(JSONObject.toJSONString(params));
    }
@@ -623,7 +747,7 @@
        //入库靠近摆放
        if (ioType == 1 && deviceBind.getBeSimilar().equals("1") && !Cools.isEmpty(matnr) && Cools.isEmpty(orgLoc)) {
            if (nearRow != curRow) {
                List<LocItem> locItems = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getMatnrCode, matnr));
                List<LocItem> locItems = locItemMapper.selectList(new LambdaQueryWrapper<LocItem>().eq(LocItem::getMatnrCode, matnr));
                for (LocItem locItem : locItems) {
                    Loc loc1 = locService.getById(locItem.getLocId());
                    if (LocUtils.isShallowLoc(loc1.getCode())) {
@@ -631,7 +755,7 @@
                    }
                    String shallowLocNo = LocUtils.getShallowLoc(loc1.getCode());
                    // 检测目标库位是否为空库位
                    Loc shallowLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLocNo));
                    Loc shallowLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLocNo).last("limit 1"));
                    if (shallowLoc != null && shallowLoc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) {
                        if (LocUtils.locMoveCheckLocTypeComplete(shallowLoc, locTypeDto)) {
                            loc = shallowLoc;
@@ -643,40 +767,22 @@
            }
        }
//        // 靠近摆放规则 --- 空托 //互通版
//        if (ioType == 10 && deviceBind.getEmptySimilar().equals("1")) {
//            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
//                    .eq("loc_sts", "D").ge("row1", sRow).le("row1", eRow).eq("whs_type", rowLastnoType.getType().longValue()));
//            if (!locMasts.isEmpty()) {
//                for (LocMast loc : locMasts) {
//                    if (Utils.isShallowLoc(slaveProperties, loc.getLocNo())) {
//                        continue;
//                    }
//                    String shallowLocNo = Utils.getShallowLoc(slaveProperties, loc.getLocNo());
//                    // 检测目标库位是否为空库位
//                    LocMast shallowLoc = locMastService.selectById(shallowLocNo);
//                    if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) {
//                        if (VersionUtils.locMoveCheckLocTypeComplete(shallowLoc, locTypeDto)) {
//                            if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) {
//                                locMast = shallowLoc;
//                                crnNo = locMast.getCrnNo();
//                                break;
//                            }
//                        }
//                    }
//                }
//            }
//        }
        //查找路径
        DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
                .eq(DeviceSite::getType, ioType)
                .eq(DeviceSite::getSite, sourceStaNo)
                .eq(DeviceSite::getChannel, channel)
        );
        if (Cools.isEmpty(deviceSite)) {
            channel = 0;
        } else {
            inTaskMsgDto.setStaNo(deviceSite.getDeviceSite());
        if (loc != null) {
            //查找路径
            boolean available = new WarehouseLocationRetrievalUtil().queryPathIsItAvailableInArea(sourceStaNo, loc.getAreaId().toString() ,loc.getBarcode(),"in");
//            DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
//                    .eq(DeviceSite::getType, ioType)
//                    .eq(DeviceSite::getSite, sourceStaNo)
//                    .eq(DeviceSite::getChannel, channel).last("limit 1")
//            );
            if (!available) {
                channel = 0;
                loc = null;
            } else {
                inTaskMsgDto.setStaNo(sourceStaNo);
            }
        }
        //更新当前排
@@ -804,6 +910,23 @@
                }
            }
        }
        if (loc != null) {
            //查找路径
            boolean available = new WarehouseLocationRetrievalUtil().queryPathIsItAvailableInArea(sourceStaNo, loc.getAreaId().toString() ,loc.getBarcode(),"in");
//            DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
//                    .eq(DeviceSite::getType, ioType)
//                    .eq(DeviceSite::getSite, sourceStaNo)
//                    .eq(DeviceSite::getChannel, channel).last("limit 1")
//            );
            if (!available) {
                channel = 0;
                loc = null;
            } else {
                inTaskMsgDto.setStaNo(sourceStaNo);
            }
        }
        //查询当前库位类型空库位 小于5个则locmast = null
        List<Loc> locTypeLocMasts = locService.list(new LambdaQueryWrapper<Loc>()
                .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type)
@@ -867,18 +990,34 @@
            loc = loc2;
            break;
        }
        //查找路径
        DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
                .eq(DeviceSite::getType, ioType)
                .eq(DeviceSite::getSite, sourceStaNo)
                .eq(!Objects.isNull(loc.getDeviceNo()), DeviceSite::getDeviceCode, loc.getDeviceNo())
        );
        if (Cools.isEmpty(deviceSite)) {
            deviceNo = 0;
            loc = null;
        } else {
            inTaskMsgDto.setStaNo(deviceSite.getDeviceSite());
        if (loc != null) {
            //查找路径
            boolean available = new WarehouseLocationRetrievalUtil().queryPathIsItAvailableInArea(sourceStaNo, loc.getAreaId().toString() ,loc.getBarcode(),"in");
//            DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
//                    .eq(DeviceSite::getType, ioType)
//                    .eq(DeviceSite::getSite, sourceStaNo)
//                    .eq(DeviceSite::getChannel, channel).last("limit 1")
//            );
            if (!available) {
                deviceNo = 0;
                loc = null;
            } else {
                inTaskMsgDto.setStaNo(sourceStaNo);
            }
        }
//        DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
//                .eq(DeviceSite::getType, ioType)
//                .eq(DeviceSite::getSite, sourceStaNo)
//                .eq(!Objects.isNull(loc.getDeviceNo()), DeviceSite::getDeviceCode, loc.getDeviceNo())
//        );
//        if (Cools.isEmpty(deviceSite)) {
//            deviceNo = 0;
//            loc = null;
//        } else {
//            inTaskMsgDto.setStaNo(deviceSite.getDeviceSite());
//        }
        // 递归查询
        if (Cools.isEmpty(loc) || !loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) {
            // 当前巷道无空库位时,递归调整至下一巷道,检索全部巷道无果后,跳出递归
@@ -905,4 +1044,232 @@
        inTaskMsgDto.setLocNo(locNo);
        return inTaskMsgDto;
    }
    /**
     * WCS入库任务申请
     *
     * @return
     */
    @Override
    public R wcsCreateInTask(CreateInTaskParam params) {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
        }
        BasStation basStation = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, params.getSourceStaNo()).orderByDesc(BasStation::getId), false);
        if (Objects.isNull(basStation)) {
            throw new CoolException(params.getSourceStaNo()+"站点不存在!!");
        }
        if (!basStation.getType().equals(StationTypeEnum.STATION_TYPE_MUTI.type)) {
            throw new CoolException(params.getSourceStaNo()+"站点非智能站点!!请使用PDA绑定入库");
        }
        Task one = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, params.getBarcode()));
        if (!Cools.isEmpty(one)) {
            if (one.getTaskStatus().equals(TaskStsType.MISSION_TRANSFER.id)) {
                return R.error("任务已存在但是状态不一致!!!").add("任务已存在但是状态不一致!!!任务已完成!!!");
            }
            InTaskWcsReportParam inTaskWcsReportParam = new InTaskWcsReportParam();
            inTaskWcsReportParam.setTaskNo(one.getTaskCode());
            inTaskWcsReportParam.setLocNo(one.getTargLoc());
            inTaskWcsReportParam.setTaskPri(one.getSort());
            return R.ok("任务已存在直接下发!").add(inTaskWcsReportParam);
        }
        List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, params.getBarcode()));
        if (waitPakins.isEmpty()) {
            throw new CoolException("组托单据不存在 !!");
        }
        GenerateTaskParams taskParams = new GenerateTaskParams();
        taskParams.setWaitPakins(waitPakins)
                .setSiteId(basStation.getId());
        User wcs = userService.getByUsername("wcs", 1L);
        Long wcsId = 1111L;
        if (!Cools.isEmpty(wcs)) {
            wcsId = wcs.getId();
        }
        R r = taskService.generateTasksWcs(taskParams, wcsId,params.getRowList());
        if (r.get("msg").equals("任务生成完毕!")) {
            one = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, params.getBarcode()));
            InTaskWcsReportParam inTaskWcsReportParam = new InTaskWcsReportParam();
            inTaskWcsReportParam.setTaskNo(one.getTaskCode());
            inTaskWcsReportParam.setLocNo(one.getTargLoc());
            inTaskWcsReportParam.setTaskPri(one.getSort());
            return R.ok("任务生成完毕!").add(inTaskWcsReportParam);
        }
        return R.error();
//        return R.ok("任务生成完毕!");
//        log.info(JSONObject.toJSONString(params));
//        return R.ok(JSONObject.toJSONString(params));
    }
    /**
     * WCS任务上报通知
     *
     * @return
     */
    @Override
    public R wcsTaskReport(TaskReportParam params) {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
        }
        Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, params.getSuperTaskNo()));
        if (Cools.isEmpty(task)) {
            return R.error(params.getSuperTaskNo()+"任务号==>未查询到相关任务!!!");
        }
        if (params.getMsgType().equals(WcsMsgTypeEvent.TASK_COMPLETE.event)){
            if (!Cools.isEmpty(task)) {
                FlowStepInstance flowStepInstance = flowStepInstanceService.getOne(new LambdaQueryWrapper<FlowStepInstance>()
                        .eq(FlowStepInstance::getTaskNo, task.getTaskCode())
                        .eq(FlowStepInstance::getWmsNowTaskStatus, task.getTaskStatus())
                        .eq(FlowStepInstance::getStatus, (short) 1).last("limit 1"));
                if (Cools.isEmpty(flowStepInstance)){
                    return R.error(params.getSuperTaskNo()+"任务号==>未查询到相关任务执行流程!!!");
                }
                if (!MissionStepType.getTaskRECEIVE().contains(flowStepInstance.getStepType())){
                    return R.error(params.getSuperTaskNo()+"任务号==>相关任务类型非接收型,步骤错乱!!!");
                }
                FlowInstance flowInstance = flowInstanceService.getById(flowStepInstance.getFlowInstanceId());
                if (Cools.isEmpty(flowInstance)) {
                    return R.error(params.getSuperTaskNo()+"任务号==>未查询到相关任务执行流程!!!");
                }
                List<FlowStepInstance> flowStepInstances = flowStepInstanceService.list(new LambdaQueryWrapper<FlowStepInstance>()
                        .eq(FlowStepInstance::getFlowInstanceId, flowInstance.getId()).eq(FlowStepInstance::getStatus, (short) 0));
                flowInstance.setStatus(flowStepInstances.isEmpty()? (short) 2:(short) 1);
                TaskInstanceNode taskInstanceNode = taskInstanceNodeService.getById(flowInstance.getNodeInstanceId());
                if (Cools.isEmpty(taskInstanceNode)) {
                    return R.error(params.getSuperTaskNo()+"任务号==>未查询到相关任务执行流程!!!");
                }
                taskInstanceNode.setStatus(flowInstance.getStatus());
                TaskInstance taskInstance = taskInstanceService.getById(flowInstance.getTaskId());
                if (Cools.isEmpty(taskInstance)) {
                    return R.error(params.getSuperTaskNo()+"任务号==>未查询到相关任务执行流程!!!");
                }
                task.setTaskStatus(flowStepInstance.getWmsNextTaskStatus());
                flowStepInstance.setStatus((short)3);
                flowStepInstanceService.updateById(flowStepInstance);
                taskService.updateById(task);
                // 盘点再入库任务经 WCS 上报变为 100(库存更新完成)时,同步将盘点差异单置为已审核
                if (TaskType.TASK_TYPE_CHECK_IN.type.equals(task.getTaskType())
                        && flowStepInstance.getWmsNextTaskStatus() != null
                        && flowStepInstance.getWmsNextTaskStatus().equals(TaskStsType.UPDATED_IN.id)) {
                    taskService.markCheckDiffApprovedWhenCheckInDone(task);
                }
                if (flowStepInstance.getWmsNextTaskStatus() != 9999) {
                    FlowStepInstance nextFlowStepInstance = flowStepInstanceService.getOne(new LambdaQueryWrapper<FlowStepInstance>()
                            .eq(FlowStepInstance::getStatus, (short)0)
                            .eq(FlowStepInstance::getTaskNo, flowStepInstance.getTaskNo())
                            .eq(FlowStepInstance::getStepOrder, flowStepInstance.getStepOrder() + 1)
                            .eq(FlowStepInstance::getWmsNowTaskStatus, flowStepInstance.getWmsNextTaskStatus()));
                    if (Cools.isEmpty(nextFlowStepInstance)) {
                        return R.error(task.getTaskCode()+"任务号==>未查询到相关任务执行流程!!!");
                    }
                    nextFlowStepInstance.setStatus((short)1);
                    flowStepInstanceService.updateById(nextFlowStepInstance);
                } else {
                    taskInstance.setStatus((short)2);
                    taskInstanceService.updateById(taskInstance);
                }
                return R.ok("任务完成成功").add(task);
//                one.setTaskStatus(one.getTaskType() < 100 ? TaskStsType.COMPLETE_IN.id : TaskStsType.AWAIT.id);
//                if (!taskService.updateById(one)) {
////                    throw new CoolException("完成任务失败");
//                    return R.error("完成任务失败").add(one);
//                }
            }
        } else if (params.getMsgType().equals(WcsMsgTypeEvent.TASK_CANCEL.event)){
//            if (!Cools.isEmpty(one)) {
//                one.setTaskStatus(one.getTaskType() < 100 ? TaskStsType.COMPLETE_IN.id : TaskStsType.AWAIT.id);
//                return R.ok("!").add(one);
//            }
            return R.error("暂不允许取消");
        }
        return R.error("数据异常");
    }
    /**
     * WCS任务上报通知
     *
     * @return
     */
    @Override
    public R wcsTaskReport2(TaskReportParam params) {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
        }
        Task one = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, params.getSuperTaskNo()));
        if (Cools.isEmpty(one)) {
            return R.error(params.getSuperTaskNo()+"任务号==>未查询到相关任务!!!");
        }
        if (params.getMsgType().equals(WcsMsgTypeEvent.TASK_COMPLETE.event)){
            if (!Cools.isEmpty(one)) {
                one.setTaskStatus(TaskStsType.MISSION_INITIAL.id);
                one.setOrgSite(one.getTargSite());
                if (!taskService.updateById(one)) {
//                    throw new CoolException("完成任务失败");
                    return R.error("完成任务失败").add(one);
                }
                return R.ok("任务完成成功").add(one);
            }
        } else if (params.getMsgType().equals(WcsMsgTypeEvent.TASK_CANCEL.event)){
//            if (!Cools.isEmpty(one)) {
//                one.setTaskStatus(one.getTaskType() < 100 ? TaskStsType.COMPLETE_IN.id : TaskStsType.AWAIT.id);
//                return R.ok("!").add(one);
//            }
            return R.error("暂不允许取消");
        }
        return R.error("数据异常");
    }
    /**
     * WCS申请任务重新分配入库
     *
     * @return
     */
    @Override
    public R wcsReassignLoc(ReassignLocParam params) {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
        }
        List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, params.getBarcode()));
        if (waitPakins.isEmpty()) {
            throw new CoolException("单据不存在 !!");
        }
        GenerateTaskParams taskParams = new GenerateTaskParams();
        taskParams.setWaitPakins(waitPakins)
                .setSiteId(params.getSourceStaNo().longValue());
        return R.ok(taskService.generateTasks(taskParams, 111L));
//        return R.ok("任务生成完毕!");
//        log.info(JSONObject.toJSONString(params));
//        return R.ok(JSONObject.toJSONString(params));
    }
    /**
     * WCS申请在库库位更换库位
     *
     * @return
     */
    @Override
    public R wcsChangeLoc(ChangeLocParam params) {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
        }
        List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>().eq(WaitPakin::getBarcode, params.getBarcode()));
        if (waitPakins.isEmpty()) {
            throw new CoolException("单据不存在 !!");
        }
        GenerateTaskParams taskParams = new GenerateTaskParams();
        taskParams.setWaitPakins(waitPakins)
                .setSiteId(params.getSourceStaNo().longValue());
        return R.ok(taskService.generateTasks(taskParams, 111L));
//        return R.ok("任务生成完毕!");
//        log.info(JSONObject.toJSONString(params));
//        return R.ok(JSONObject.toJSONString(params));
    }
}