RobotController.java 17.8 KB
package com.huaheng.api.robot.controller;

import com.alibaba.druid.support.spring.stat.annotation.Stat;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.general.domain.InventoryQueryDomain;
import com.huaheng.api.robot.domain.RobotInfo;
import com.huaheng.api.wcs.service.emptyOutHandle.EmptyOutHandleService;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.framework.aspectj.lang.annotation.ApiLogger;
import com.huaheng.framework.aspectj.lang.annotation.Log;
import com.huaheng.framework.aspectj.lang.constant.BusinessType;
import com.huaheng.framework.web.controller.BaseController;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.station.domain.Station;
import com.huaheng.pc.config.station.service.StationService;
import com.huaheng.pc.config.zone.domain.Zone;
import com.huaheng.pc.config.zone.service.ZoneService;
import com.huaheng.pc.inventory.InventoryMaterialSummary.domain.InventoryMaterialSummary;
import com.huaheng.pc.inventory.InventoryMaterialSummary.service.InventoryMaterialSummaryService;
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.ReceiptTaskService;
import com.huaheng.pc.task.taskHeader.service.ShipmentTaskService;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.lang.ref.WeakReference;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/API/WMS/v2")

@Api(tags = {"机器人对接接口"}, value = "机器人对接接口RobotController")
public class RobotController  extends BaseController {

    @Resource
    private EmptyOutHandleService emptyOutHandleService;
    @Resource
    private ZoneService zoneService;
    @Resource
    private InventoryDetailService inventoryDetailService;
    @Resource
    private ContainerService containerService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private StationService stationService;
    @Resource
    private ReceiptTaskService receiptTaskService;
    @Resource
    private ShipmentTaskService shipmentTaskService;
    @Resource
    private InventoryDetailService inventoryHeaderService;
    @Resource
    private InventoryMaterialSummaryService inventoryMaterialSummaryService;
    @Resource
    private TaskDetailService taskDetailService;
    @Resource
    private MaterialService materialService;

    @Log(title = "生产叫料", action = BusinessType.INSERT)
    @PostMapping("/callShipment")
    @ApiOperation("生产叫料")
    @ApiLogger(apiName = "生产叫料", from="robot")
    @ResponseBody
    public AjaxResult callShipment(@RequestBody Map<String,String> map) {
        String warehouseCode = "CS0001";
        String line = map.get("line");
        String materialCode = map.get("materialCode");
        String qty = map.get("qty");
        String area = map.get("area");
        if(line == null) {
            return AjaxResult.error("没有line");
        }
        if(materialCode == null) {
            return AjaxResult.error("没有materialCode");
        }
        if(qty == null) {
            return AjaxResult.error("没有qty");
        }
        if(area == null) {
            return AjaxResult.error("没有area");
        }
        LambdaQueryWrapper<Zone> zoneLambdaQueryWrapper = Wrappers.lambdaQuery();
        zoneLambdaQueryWrapper.eq(Zone::getArea, area);
        Zone zone = zoneService.getOne(zoneLambdaQueryWrapper);
        String zoneCode = zone.getCode();
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getMaterialCode, materialCode)
                                        .eq(InventoryDetail::getTaskQty, 0)
                                        .eq(InventoryDetail::getZoneCode, zoneCode);
        List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper);
        if(inventoryDetailList == null || inventoryDetailList.size() == 0) {
            return AjaxResult.error("没有对应库存");
        }
        LambdaQueryWrapper<Station> stationLambdaQueryWrapper = Wrappers.lambdaQuery();
        stationLambdaQueryWrapper.eq(Station::getArea, area)
                                .eq(Station::getLine, line);
        List<Station> stationList = stationService.list(stationLambdaQueryWrapper);
        List<String> portCodeList = stationList.stream().map(t->t.getCode()).collect(Collectors.toList());
        RobotInfo robotInfo = new RobotInfo();
        List<String> containerList = inventoryDetailList.stream().
                map(t -> t.getContainerCode()).collect(Collectors.toList());
        containerList = containerList.stream().distinct().collect(Collectors.toList());
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        taskHeaderLambdaQueryWrapper.in(TaskHeader::getPort, portCodeList)
                                .lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED)
                                .in(TaskHeader::getContainerCode, containerList);
        List<TaskHeader> taskHeaderList = taskHeaderService.list(taskHeaderLambdaQueryWrapper);
        if(taskHeaderList != null) {
            TaskHeader taskHeader = taskHeaderList.get(0);
            return AjaxResult.success(robotInfo);
        } else {

        }
        String port = null;
        if(portCodeList.size() > 1) {
            for (String portCode : portCodeList) {
                LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper2 = Wrappers.lambdaQuery();
                taskHeaderLambdaQueryWrapper2.eq(TaskHeader::getPort, portCode)
                        .lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED);
                TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper2);
                if (taskHeader == null) {
                    port = portCode;
                    break;
                }
            }
        } else {
            port = portCodeList.get(0);
        }
        if(port == null) {
            return AjaxResult.error("没有对应库存");
        }
        String containerCode = containerList.get(0);
        Container container = containerService.getContainerByCode(containerCode, warehouseCode);
        String locationCode = container.getLocationCode();
        AjaxResult ajaxResult = shipmentTaskService.createPickingTask(
                containerCode, locationCode, warehouseCode, port);
        return ajaxResult;
    }

//    @Log(title = "生产入库", action = BusinessType.INSERT)
//    @PostMapping("/callReceipt")
//    @ApiOperation("生产入库")
//    @ApiLogger(apiName = "生产入库", from="robot")
//    @ResponseBody
//    public AjaxResult callReceipt(@RequestBody Map<String,String> map) {
//        String warehouseCode = "CS0001";
//        String port = map.get("port");
//        String materialCode = map.get("materialCode");
//        String qty = map.get("qty");
//        String area = map.get("area");
//        if(port == null) {
//            return AjaxResult.error("没有port");
//        }
//        if(materialCode == null) {
//            return AjaxResult.error("没有materialCode");
//        }
//        if(qty == null) {
//            return AjaxResult.error("没有qty");
//        }
//        if(area == null) {
//            return AjaxResult.error("没有area");
//        }
//        LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery();
//        containerLambdaQueryWrapper.eq(Container::getStatus, QuantityConstant.STATUS_CONTAINER_EMPTY)
//                                    .ne(Container::getLocationCode, "")
//                                    .eq(Container::getArea, area);
//        List<Container> containerList = containerService.list(containerLambdaQueryWrapper);
//        if(containerList != null && containerList.size() > 0) {
//            Container container = containerList.get(0);
//            String containerCode = container.getCode();
//            String locationCode = container.getLocationCode();
//            receiptTaskService.createSuppleReceiptTask(containerCode, locationCode, warehouseCode, port);
//        }
//
//    }

    /**
     * 查询托盘库存
     */
    @Log(title = "查询托盘库存", action = BusinessType.INSERT)
    @PostMapping("/searchContainerInventory")
    @ApiOperation("查询托盘库存")
    @ApiLogger(apiName = "查询托盘库存", from="robot")
    @ResponseBody
    public AjaxResult searchContainerInventory(@RequestBody InventoryQueryDomain inventoryQueryDomain)
    {
        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
        inventoryDetailLambdaQueryWrapper.eq(StringUtils.isNotEmpty(inventoryQueryDomain.getWarehouseCode()),
                InventoryDetail::getWarehouseCode, inventoryQueryDomain.getWarehouseCode())
                .eq(StringUtils.isNotEmpty(inventoryQueryDomain.getContainerCode()),
                        InventoryDetail::getContainerCode, inventoryQueryDomain.getContainerCode())
                .eq(StringUtils.isNotEmpty(inventoryQueryDomain.getLocationCode()),
                        InventoryDetail::getLocationCode, inventoryQueryDomain.getLocationCode())
                .eq(StringUtils.isNotEmpty(inventoryQueryDomain.getCompanyCode()),
                        InventoryDetail::getCompanyCode, inventoryQueryDomain.getCompanyCode())
                .eq(StringUtils.isNotEmpty(inventoryQueryDomain.getMaterialCode()),
                        InventoryDetail::getMaterialCode, inventoryQueryDomain.getMaterialCode());
        List<InventoryDetail> inventoryDetailList = inventoryHeaderService.list(inventoryDetailLambdaQueryWrapper);
        return AjaxResult.success(inventoryDetailList);
    }

    /**
     * 查询库存
     */
    @Log(title = "查询库存", action = BusinessType.INSERT)
    @PostMapping("/searchInventory")
    @ApiOperation("查询库存")
    @ResponseBody
    @ApiLogger(apiName = "查询库存", from="ERP")
    public AjaxResult searchInventory(@RequestBody InventoryMaterialSummary inventoryMaterialSummary)
    {
        LambdaQueryWrapper<InventoryMaterialSummary> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper
                .eq(StringUtils.isNotEmpty(inventoryMaterialSummary.getWarehouseCode()),
                        InventoryMaterialSummary::getWarehouseCode, inventoryMaterialSummary.getWarehouseCode())
                //物料编码
                .eq(StringUtils.isNotEmpty(inventoryMaterialSummary.getMaterialCode()),
                        InventoryMaterialSummary::getMaterialCode, inventoryMaterialSummary.getMaterialCode())
                //物料名称
                .eq(StringUtils.isNotEmpty(inventoryMaterialSummary.getMaterialName()),
                        InventoryMaterialSummary::getMaterialName, inventoryMaterialSummary.getMaterialName())
                .eq(StringUtils.isNotEmpty(inventoryMaterialSummary.getZoneCode()),
                        InventoryMaterialSummary::getZoneCode, inventoryMaterialSummary.getZoneCode())
                //货主
                .eq(!StringUtils.isEmpty(inventoryMaterialSummary.getCompanyCode()),
                        InventoryMaterialSummary::getCompanyCode, inventoryMaterialSummary.getCompanyCode());
        List<InventoryMaterialSummary> list = inventoryMaterialSummaryService.list(lambdaQueryWrapper);
        if (list == null) {
            list = Collections.emptyList();
        }
        //筛选库存汇总数据的专用方法
        List<InventoryMaterialSummary> details = inventoryMaterialSummaryService.duplicateRemoval(list);
        return AjaxResult.success(details);
    }

    /**
     * 出库抓取信息
     */
    @Log(title = "出库抓取信息", action = BusinessType.INSERT)
    @PostMapping("/addShipmentDetail")
    @ApiOperation("出库抓取信息")
    @ResponseBody
    @ApiLogger(apiName = "出库抓取信息", from="ERP")
    public AjaxResult addShipmentDetail(@RequestBody Map<String,String> map)
    {
        String containerCode = map.get("containerCode");
        String port = map.get("port");
        String materialCode = map.get("materialCode");
        String qty = map.get("qty");
        String sn = map.get("sn");
        String position = map.get("position");
        String area = map.get("area");
        if(containerCode == null) {
            return AjaxResult.error("没有containerCode");
        }
        if(port == null) {
            return AjaxResult.error("没有port");
        }
        if(materialCode == null) {
            return AjaxResult.error("没有materialCode");
        }
        if(qty == null) {
            return AjaxResult.error("没有qty");
        }
        if(sn == null) {
            return AjaxResult.error("没有sn");
        }
        if(position == null) {
            return AjaxResult.error("没有position");
        }
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getContainerCode, containerCode);
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getPort, port);
        TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
        if(taskHeader == null) {
            return AjaxResult.error("没有找到任务");
        }
        BigDecimal taskQty = new BigDecimal(qty);
        taskQty = taskQty.negate();
        Material material = materialService.findAllByCode(materialCode);
        TaskDetail taskDetail = new TaskDetail();
        taskDetail.setQty(taskQty);
        taskDetail.setSerialNum(sn);
        taskDetail.setPosition(position);
        taskDetail.setMaterialCode(materialCode);
        taskDetail.setMaterialName(material.getName());
        taskDetail.setTaskType(taskHeader.getTaskType());
        taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
        taskDetail.setCompanyCode(taskHeader.getCompanyCode());
        taskDetail.setFromLocation(taskHeader.getFromLocation());
        taskDetail.setToLocation(taskHeader.getToLocation());
        taskDetail.setInternalTaskType(taskHeader.getInternalTaskType());
        taskDetail.setContainerCode(taskHeader.getContainerCode());
        boolean result = taskDetailService.save(taskDetail);
        if(!result) {
            return AjaxResult.error("增加物料失败");
        }
        return AjaxResult.success("增加物料成功");
    }

    /**
     * 入库抓取信息
     */
    @Log(title = "入库抓取信息", action = BusinessType.INSERT)
    @PostMapping("/addReceiptDetail")
    @ApiOperation("入库抓取信息")
    @ResponseBody
    @ApiLogger(apiName = "入库抓取信息", from="ERP")
    public AjaxResult addReceiptDetail(@RequestBody Map<String,String> map)
    {
        String containerCode = map.get("containerCode");
        String port = map.get("port");
        String materialCode = map.get("materialCode");
        String qty = map.get("qty");
        String sn = map.get("sn");
        String position = map.get("position");
        String area = map.get("area");
        if(containerCode == null) {
            return AjaxResult.error("没有containerCode");
        }
        if(port == null) {
            return AjaxResult.error("没有port");
        }
        if(materialCode == null) {
            return AjaxResult.error("没有materialCode");
        }
        if(qty == null) {
            return AjaxResult.error("没有qty");
        }
        if(sn == null) {
            return AjaxResult.error("没有sn");
        }
        if(position == null) {
            return AjaxResult.error("没有position");
        }
        LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getContainerCode, containerCode);
        taskHeaderLambdaQueryWrapper.eq(TaskHeader::getPort, port);
        TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
        if(taskHeader == null) {
            return AjaxResult.error("没有找到任务");
        }
        BigDecimal taskQty = new BigDecimal(qty);
        Material material = materialService.findAllByCode(materialCode);
        TaskDetail taskDetail = new TaskDetail();
        taskDetail.setQty(taskQty);
        taskDetail.setSerialNum(sn);
        taskDetail.setPosition(position);
        taskDetail.setMaterialCode(materialCode);
        taskDetail.setMaterialName(material.getName());
        taskDetail.setTaskType(taskHeader.getTaskType());
        taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());
        taskDetail.setCompanyCode(taskHeader.getCompanyCode());
        taskDetail.setFromLocation(taskHeader.getFromLocation());
        taskDetail.setToLocation(taskHeader.getToLocation());
        taskDetail.setInternalTaskType(taskHeader.getInternalTaskType());
        taskDetail.setContainerCode(taskHeader.getContainerCode());
        boolean result = taskDetailService.save(taskDetail);
        if(!result) {
            return AjaxResult.error("增加物料失败");
        }
        return AjaxResult.success("增加物料成功");
    }
}