RequestContainerNumberService.java 11.4 KB
package com.huaheng.api.wcs.service;

import java.math.BigDecimal;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.wcs.domain.RobotReturn;
import com.huaheng.api.wcs.domain.RobotView;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.domain.TaskRequestContainer;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import com.huaheng.pc.task.taskHeader.service.TaskRequestContainerService;

@Service
public class RequestContainerNumberService {

    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private TaskDetailService taskDetailService;
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
    private TaskRequestContainerService taskRequestContainerService;

    //
    // 请求一个位置
    @Transactional
    public AjaxResult requestContainerNumberByWcs(String containerCode) {
        AjaxResult ajaxResult = new AjaxResult();
        if (StringUtils.isEmpty(containerCode)) {
            return AjaxResult.error("容器为空");
        }
        LambdaQueryWrapper<TaskHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(TaskHeader::getContainerCode, containerCode);
        lambdaQueryWrapper.eq(TaskHeader::getZoneCode, "B");
//        lambdaQueryWrapper.eq(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_ARRIVED_STATION);
        lambdaQueryWrapper.in(TaskHeader::getInternalTaskType, QuantityConstant.TASK_INTENERTYPE_SHIPMENT);
        lambdaQueryWrapper.lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED);
        lambdaQueryWrapper.last("limit 1");
        TaskHeader taskHeader = taskHeaderService.getOne(lambdaQueryWrapper);

        if (taskHeader == null) {
            return AjaxResult.error("容器号:" + containerCode + " 未找到未完成的出库任务。");
        }

        List<TaskDetail> list = taskDetailService.findByTaskId(taskHeader.getId());

        if (list == null || list.size() <= 0) {
            return AjaxResult.error("容器号:" + containerCode + " 未找到任务详情。");
        }
        List<TaskDetail> taskDetails1 = list.stream().sorted(Comparator.comparing(TaskDetail::getContainerDetailNumber).reversed()).collect(Collectors.toList());

        LambdaQueryWrapper<InventoryDetail> query = Wrappers.lambdaQuery();
        query.eq(InventoryDetail::getContainerCode, taskHeader.getContainerCode());
        List<InventoryDetail> inventorydetaillist = inventoryDetailService.list(query);
        Integer boxNumber = 12;
        String boxType = inventorydetaillist.get(0).getBoxType();
        if (boxType.equals("0")) {
            // 小箱子
            boxNumber = 9;
        }
        // 检查task_request_container表有无数据,没有则增加
        TaskRequestContainer taskRequestContainer = taskRequestContainerService.findTaskRequestContainer(taskHeader.getContainerCode(), taskHeader.getId());
        if (taskRequestContainer == null) {
            taskRequestContainer = new TaskRequestContainer();
            taskRequestContainer.setContainerCode(containerCode);
            taskRequestContainer.setNowNumber(boxNumber);
//            taskHeaderService.updateById(taskHeader);
        } else {
            // 未执行,则直接返回原有状态
            if (taskRequestContainer.getStatus() == 0) {
                RobotReturn robotReturn = new RobotReturn();
                robotReturn.setOperator(taskRequestContainer.getOperator());
                robotReturn.setBoxType(taskRequestContainer.getBoxType());
                robotReturn.setState(taskRequestContainer.getPreState());
                robotReturn.setContainerNumber(taskRequestContainer.getNowNumber());
                robotReturn.setFormPallet(taskRequestContainer.getFormPallet());
                return AjaxResult.success().setData(robotReturn);
            }
        }
        taskRequestContainer.setTaskId(taskHeader.getId());
        taskRequestContainer.setStatus(0);
//        if (StringUtils.isNull(taskHeader.getNowNumber())) {
//            taskHeader.setNowNumber(boxNumber);
//            taskHeaderService.updateById(taskHeader);
//        }
        taskHeader.setBoxType(boxType);
        BigDecimal taskqty = new BigDecimal(0);
        Integer[] containerNumberdata = new Integer[taskDetails1.size()];
        Integer miniNumber = 0;
        for (int a = 0; a < taskDetails1.size(); a++) {
            TaskDetail detail = taskDetails1.get(a);
            taskqty = taskqty.add(detail.getQty());
//            if (a == taskDetails1.size() - 1) {
//                miniNumber = detail.getContainerDetailNumber();
//            }
            containerNumberdata[a] = detail.getContainerDetailNumber();
        }
        LambdaQueryWrapper<TaskDetail> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(TaskDetail::getTaskId, taskHeader.getId());
        wrapper.eq(TaskDetail::getNumber, 1);
        wrapper.orderByDesc(TaskDetail::getContainerDetailNumber);
        wrapper.last("limit 1");
        TaskDetail taskDetail = taskDetailService.getOne(wrapper);

        RobotReturn robotReturn = new RobotReturn();
        robotReturn.setOperator(0);
        robotReturn.setBoxType(Integer.parseInt(boxType));
        robotReturn.setState(1);

        taskRequestContainer.setOperator(robotReturn.getOperator());
        taskRequestContainer.setBoxType(robotReturn.getBoxType());
        taskRequestContainer.setPreState(robotReturn.getState());

//        TaskHeader task = taskHeaderService.getById(taskHeader.getId());
        if (taskDetail != null) {
            AjaxResult ajaxResult1 = zhua(taskHeader, taskDetail, taskRequestContainer, robotReturn);
            return ajaxResult1;
        } else {
            // 放
            robotReturn.setOperator(1);
            robotReturn.setFormPallet(0);

            taskRequestContainer.setOperator(1);
            taskRequestContainer.setFormPallet(0);

            LambdaQueryWrapper<InventoryDetail> query1 = Wrappers.lambdaQuery();
            query1.eq(InventoryDetail::getContainerCode, taskHeader.getContainerCode());
            query1.notIn(InventoryDetail::getContainerDetailNumber, containerNumberdata);
//            query1.gt(InventoryDetail::getContainerDetailNumber, miniNumber);
            query1.orderByAsc(InventoryDetail::getContainerDetailNumber);
            List<InventoryDetail> inventoryDetails = inventoryDetailService.list(query1);

            // 放按照顺序放
            for (int a = 0; a < inventoryDetails.size(); a++) {
                InventoryDetail detail = inventoryDetails.get(a);
                Integer inventoryNumber = detail.getContainerDetailNumber();
                Integer taskNumber = taskRequestContainer.getNowNumber();
                if (inventoryNumber > taskNumber) {
                    // 放的位置
//                    robotReturn.setContainerNumber(detail.getContainerDetailNumber());
                    robotReturn.setContainerNumber(a + 1);

                    if (inventoryNumber >= taskNumber) {
                        taskRequestContainer.setNowNumber(inventoryNumber);
                    } else {
                        taskRequestContainer.setNowNumber(taskNumber + 1);
                    }

//                    taskHeaderService.updateById(task);
                    break;
                } else if (taskRequestContainer.getNowNumber() == boxNumber) {
                    // 分拣出库,托盘回库
                    robotReturn.setState(0);
                    taskRequestContainer.setPreState(robotReturn.getState());
                    break;
                }
            }
            if (inventoryDetails == null || inventoryDetails.size() == 0) {
                // 整盘出库,空托盘前进
                robotReturn.setState(100);
                taskRequestContainer.setPreState(robotReturn.getState());
                taskRequestContainerService.saveOrUpdate(taskRequestContainer);
                return AjaxResult.success().setData(robotReturn);
            }
        }
        taskRequestContainerService.saveOrUpdate(taskRequestContainer);
        return AjaxResult.success().setData(robotReturn);

    }

    // 从托盘到地上
    public AjaxResult zhua(TaskHeader task, TaskDetail taskDetail, TaskRequestContainer taskRequestContainer, RobotReturn robotReturn) {
        if (taskDetail.getContainerDetailNumber() < taskRequestContainer.getNowNumber()) {
            // 存放位置 右
            robotReturn.setFormPallet(1);
            robotReturn.setContainerNumber(taskRequestContainer.getNowNumber());
            taskRequestContainer.setFormPallet(1);
            taskRequestContainer.setOperator(0);
            if (taskRequestContainer.getNowNumber() != 1) {
//                task.setNowNumber(task.getNowNumber() - 1);
//                taskHeaderService.updateById(task);
                taskRequestContainer.setNowNumber(taskRequestContainer.getNowNumber() - 1);
            }
            taskRequestContainerService.saveOrUpdate(taskRequestContainer);
            return AjaxResult.success().setData(robotReturn);
        } else {
            // 需要抓取 左
            robotReturn.setFormPallet(0);
            robotReturn.setContainerNumber(taskRequestContainer.getNowNumber());

            taskRequestContainer.setFormPallet(robotReturn.getFormPallet());
            taskRequestContainer.setNowNumber(taskRequestContainer.getNowNumber());
            if (taskRequestContainer.getNowNumber() != 1) {
//                task.setNowNumber(task.getNowNumber() - 1);
//                taskHeaderService.updateById(task);
                taskRequestContainer.setNowNumber(taskRequestContainer.getNowNumber() - 1);
            }
            // 抓取查找还未出库的物料
            taskDetail.setNumber(2);
            taskDetailService.updateById(taskDetail);
            taskRequestContainerService.saveOrUpdate(taskRequestContainer);
            return AjaxResult.success().setData(robotReturn);
        }
    }

    public AjaxResult requestContainerNumberByWcsClear(RobotView robotView) {
        if (StringUtils.isEmpty(robotView.getTaskNo())) {
            return AjaxResult.error("机器手清除信号:任务号无");
        }
        // 检查task_request_container表有无数据,没有则增加
        TaskRequestContainer taskRequestContainer = taskRequestContainerService.findTaskRequestContainerByTaskId(Integer.parseInt(robotView.getTaskNo()));
        if (taskRequestContainer == null) {
            return AjaxResult.error("机器手清除信号:找不到该任务");
        }
        taskRequestContainer.setStatus(1);
        taskRequestContainer.setLastUpdated(new Date());
        taskRequestContainerService.updateById(taskRequestContainer);
        return AjaxResult.success();
    }

}