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

import java.math.BigDecimal;
import java.util.Comparator;
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.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.service.TaskHeaderService;

@Service
public class RequestContainerNumberService {

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

    // 请求一个位置
    @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;
        }
        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);
        TaskHeader task = taskHeaderService.getById(taskHeader.getId());
        if (taskDetail != null) {
            if (taskDetail.getContainerDetailNumber() < task.getNowNumber()) {
                // 存放位置 右
                robotReturn.setFormPallet(1);
                robotReturn.setContainerNumber(task.getNowNumber());

                if (task.getNowNumber() != 1) {
                    task.setNowNumber(task.getNowNumber() - 1);
                    taskHeaderService.updateById(task);
                }
                return AjaxResult.success().setData(robotReturn);
            } else {
                // 需要抓取 左
                robotReturn.setFormPallet(0);
                robotReturn.setContainerNumber(task.getNowNumber());

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

        } else {
            // 放
            robotReturn.setOperator(1);
            robotReturn.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++) {
//            for (InventoryDetail detail : inventoryDetails) {
                InventoryDetail detail = inventoryDetails.get(a);
                Integer inventoryNumber = detail.getContainerDetailNumber();
                Integer taskNumber = task.getNowNumber();
                if (inventoryNumber > taskNumber) {
                    // 放的位置
//                    robotReturn.setContainerNumber(detail.getContainerDetailNumber());
                    robotReturn.setContainerNumber(a + 1);
                    if (inventoryNumber >= taskNumber) {
                        task.setNowNumber(inventoryNumber);
                    } else {
                        task.setNowNumber(taskNumber + 1);
                    }

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

//        BigDecimal qty = new BigDecimal(0);
//
//        for (InventoryDetail detail : inventorydetaillist) {
//            qty = qty.add(detail.getQty());
//        }
//        System.out.println("=======" + qty);
//        System.out.println("=======" + taskqty);
//        if (qty.subtract(taskqty).compareTo(BigDecimal.ZERO) > 0) {
//            // 分拣出库,托盘回库
//            return AjaxResult.success(0);
//        } else {
//            // 整盘出库,空托盘前进
//            return AjaxResult.success(100);
//        }
    }

}