AcsController.java 13 KB
package com.huaheng.api.acs.controller;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.acs.domain.*;
import com.huaheng.api.wcs.controller.EmptyContainerController;
import com.huaheng.api.wcs.domain.ManyEmptyDomain;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.framework.multi.service.IHuahengMultiHandlerService;
import com.huaheng.framework.web.service.ConfigService;
import com.huaheng.pc.task.agvTask.domain.AgvTask;
import com.huaheng.pc.task.agvTask.domain.AgvTaskAssignSort;
import com.huaheng.pc.task.agvTask.service.AgvTaskService;
import com.huaheng.pc.task.agvTask.service.IAgvTaskAssignSortService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.springframework.web.bind.annotation.*;

import com.huaheng.api.acs.service.AcsReceiptService;
import com.huaheng.api.acs.service.AcsService;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.http.OkHttpUtils;
import com.huaheng.framework.aspectj.lang.annotation.ApiLogger;
import com.huaheng.framework.web.controller.BaseController;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.sap.domain.WeightRollNumberInfo;
import com.huaheng.pc.sap.service.WeightRollNumberInfoService;

import io.swagger.annotations.ApiOperation;

@RestController
@RequestMapping("/agv")
public class AcsController extends BaseController {

    @Resource
    private AcsService acsService;
    @Resource
    private WeightRollNumberInfoService weightRollNumberInfoService;
    @Resource
    private AcsReceiptService acsReceiptService;
    @Resource
    private EmptyContainerController emptyContainerController;
    @Resource
    private ConfigService configService;
    @Resource
    private AgvTaskService agvTaskService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private IHuahengMultiHandlerService huahengMultiHandlerService;
    @Resource
    private IAgvTaskAssignSortService agvTaskAssignSortService;
    @Resource
    private StackCaller stackCaller;

    /**
     * status 20 任务执行中;
     * 50 取货完成;
     * 90 任务完成;
     * @param  acsStatus
     * @return
     */
    @PostMapping("/notifyAGVTask")
    @ApiOperation("更新AGV状态")
    @ResponseBody
    @ApiLogger(apiName = "更新AGV状态", from = "acs")
    public AjaxResult notifyAGVTask(@RequestBody AcsStatus acsStatus) {

        if(acsStatus.getStatus() > 0){
            switch (acsStatus.getStatus()){
                case 100:
                    AgvTask agvTask = new AgvTask();
                    agvTask.setTaskNo(Integer.valueOf(acsStatus.getTaskNo()));
                    agvTask.setState(acsStatus.getStatus());
                    agvTask.setZoneCode("AGV");
                    return huahengMultiHandlerService.busTaskFinish(agvTask);
                default:
                    return AjaxResult.success();
            }
        }

        AjaxResult ajaxResult = handleMultiProcess("notifyAGVTask", new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = acsService.notifyAGVTask(acsStatus);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }

    /**
     * status 20 任务执行中;
     * 50 取货完成;
     * 90 任务完成;
     * @param  acsStatus
     * @return
     */
    @PostMapping("/bindContainer")
    @ApiOperation("玻璃布物料绑定托盘")
    @ResponseBody
    @ApiLogger(apiName = "玻璃布物料绑定托盘", from = "acs")
    public AjaxResult bindContainer(@RequestBody AcsStatus acsStatus) {
        AjaxResult ajaxResult = handleMultiProcess("bindContainer", new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AjaxResult ajaxResult = acsService.bindContainer(acsStatus);
                return ajaxResult;
            }
        });
        return ajaxResult;
    }



    /**
     * pltype 1->片状托架0->卷状托架,2->特殊托架
     * containerType 1.请求入库卷托盘;2.请求入库片托盘;
     * 3.请求出库卷托盘;0.请求出片状托盘
     * @param  param
     * @return
     */

    @PostMapping("/agvCallEmptyOut")
    @ApiOperation("ACS呼叫空托盘出库")
    @ResponseBody
    @ApiLogger(apiName = "ACS呼叫空托盘出库", from = "acs")
    public AjaxResult agvCallEmptyOut(@RequestBody AGVCallParam param) {
        Integer containerType = param.getContainerType();
        Integer taskId = param.getTaskId();
        String port = param.getPort();
        int area = param.getArea();
        String warehouseCode = param.getWarehouseCode();
        if (area == 0) {
            return AjaxResult.error("库区不嫩为空");
        }
//        if (area == 1) {
//            containerType = 0;
//        }
        if (containerType == null) {
            return AjaxResult.error("容器类型不存在");
        }
        if (StringUtils.isEmpty(port)) {
            return AjaxResult.error("站台不能为空");
        }
        if (StringUtils.isEmpty(warehouseCode)) {
            return AjaxResult.error("仓库不能为空");
        }
        if(area == 2){
            containerType = 1;
        }
        AjaxResult ajaxResult = null;
        Integer finalContainerType = containerType;
        if(area == 1){
            //判断AGV回库任务是否有保留托盘
            AgvTask agvTask = agvTaskService.getById(taskId);
            if(agvTask == null){
                return AjaxResult.error("AGV任务id;"+taskId+"不存在。");
            }
            if(agvTask.getTaskId() > 0){
                return AjaxResult.success();
            }
            LambdaQueryWrapper<TaskHeader> queryWrapper = Wrappers.lambdaQuery();
            queryWrapper.lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED)
                    .eq(TaskHeader::getPort,port)
                    .eq(TaskHeader::getInternalTaskType,QuantityConstant.TASK_INTENERTYPE_SHIPMENT);
            List<TaskHeader> list = taskHeaderService.list(queryWrapper);
            if(!list.isEmpty()){
                return AjaxResult.error("有未出库完成的出库任务,等待托盘到达");
            }
            ManyEmptyDomain domain = new ManyEmptyDomain();
            domain.setWarehouseCode(QuantityConstant.WAREHOUSECODE);
            domain.setArea("1");
            domain.setPort(port);
            domain.setTaskId(taskId);
            ajaxResult = emptyContainerController.wcsCallEmptyOut(domain);

            if(!ajaxResult.hasErr()){
                Integer taskHeaderId = (Integer)ajaxResult.getData();
                TaskHeader taskHeader = taskHeaderService.getById(taskHeaderId);
                agvTask.setPalletNo(taskHeader.getContainerCode());
                agvTask.setTaskId(taskHeaderId);
                agvTaskService.updateById(agvTask);
            }
        }else{
            ajaxResult = handleQuest("agvCallEmptyOut", new MultiProcessListener() {
                @Override
                public AjaxResult doProcess() {
                    AjaxResult ajaxResult = acsService.agvCallEmptyOut(area, port, warehouseCode, finalContainerType);
                    return ajaxResult;
                }
            });
        }

        return ajaxResult;
    }

    @PostMapping("/getReceiptContainerByB")
    @ApiOperation("ACS传入入库数据")
    @ResponseBody
    @ApiLogger(apiName = "ACS传入入库数据", from = "acs")
    public AjaxResult getReceiptContainerByB(@RequestBody RobotDomain robotDomain) {
        if(robotDomain == null){
            return AjaxResult.error("请求内容不能为空");
        }
        // 容器
        String containerCode = robotDomain.getContainerCode();
        // 位置
        Integer position = robotDomain.getPosition();
        Integer palletType = robotDomain.getPalletType();
        Integer height = robotDomain.getHeight();
        Integer boxType = robotDomain.getBoxType();
        Integer stackTypeTotal = robotDomain.getStackTypeTotal();

        String allCode = robotDomain.getAllCode();
        if(StringUtils.isEmpty(allCode)){
            return AjaxResult.error("条码为空!");
        }
        String[] codes = allCode.split(" ");
        if(codes.length != 3){
            throw new ServiceException("解析条码规则不正确(例子 '物料 数量 批次 = 4ANN7628M195N1900A 150 1600LHHS01A'):"+allCode);
        }
        if(StringUtils.isNull(stackTypeTotal)){
            return AjaxResult.error("码垛总数不能为空!");
        }
        if(stackTypeTotal == null || stackTypeTotal.intValue() <= 0){
            return AjaxResult.error("码垛总数为空!");
        }
        if(StringUtils.isEmpty(containerCode)){
            return AjaxResult.error("托盘号不能为空!");
        }
        if(StringUtils.isNull(position)){
            return AjaxResult.error("位置号不能为空!");
        }
        if(position.intValue() <= 0){
            return AjaxResult.error("位置号不能小于0!");
        }
        if(StringUtils.isNull(height)){
            return AjaxResult.error("木托高度不能为空!");
        }
        if(height.intValue() <= 0){
            return AjaxResult.error("木托高度不能小于0!");
        }
        robotDomain.setMaterialCode(codes[0]);
        robotDomain.setQty(Convert.convert(BigDecimal.class,codes[1]));
        robotDomain.setLot(codes[2]);
        String stackType = StackProcessor.processStack(boxType, stackTypeTotal, palletType, stackCaller);
        robotDomain.setStackType(Integer.valueOf(stackType));
        robotDomain.setSapPort("2B03");
        AjaxResult ajaxResult = handleQuest("getReceiptContainerByB", new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                return acsReceiptService.saveReceiptDetail(robotDomain);
            }
        });
        return ajaxResult;
    }

    @PostMapping("/pushWeightRollNumber")
    @ApiOperation("推送卷号重量信息")
    @ResponseBody
    @ApiLogger(apiName = "推送卷号重量信息", from = "acs")
    public AjaxResult pushWeightRollNumber(@RequestBody WeightRollNumberInfo weightRollNumberInfo) {
        String rollNumber = weightRollNumberInfo.getRollNumber();
        if (StringUtils.isEmpty(rollNumber)) {
            return AjaxResult.error("卷号不为空:");
        }
        AjaxResult ajaxResult = handleQuest("pushWeightRollNumber", new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                boolean save = weightRollNumberInfoService.save(weightRollNumberInfo);
                Map<String,String> headerBodyPost = null;
                try {
                    String url = configService.getKey(QuantityConstant.WEIGHT_ROLLNUMBER_URL);
                    url = url + "?charg="+rollNumber+"&werks=SC00";
                    headerBodyPost = OkHttpUtils.sendGet(url);
                    weightRollNumberInfo.setSend(1);
                    weightRollNumberInfoService.updateById(weightRollNumberInfo);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    return AjaxResult.toAjax(save).setData(headerBodyPost);
                }
            }
        });
        return ajaxResult;
    }

    @PostMapping("/sortAGVTask")
    @ApiOperation("排序AGV任务")
    @ResponseBody
    @ApiLogger(apiName = "排序AGV任务", from = "acs")
    public AjaxResult sortAGVTask(@RequestBody RobotDomain robotDomain) {
        String containerCode = robotDomain.getContainerCode();

        LambdaQueryWrapper<AgvTask> lambdaQuery = Wrappers.lambdaQuery();
        lambdaQuery.eq(AgvTask::getFromPoint,"P31152")
                .eq(AgvTask::getPalletNo,containerCode)
                .lt(AgvTask::getState,90);
        AgvTask task = agvTaskService.getOne(lambdaQuery);
        if(task == null){
            return AjaxResult.error("未查询到托盘号为:"+containerCode+"的任务。清补充任务");
        }
        AjaxResult result = handleMultiProcess("sortAGVTask", new MultiProcessListener() {
            @Override
            public AjaxResult doProcess() {
                AgvTaskAssignSort taskAssignSort = agvTaskAssignSortService.findByTaskNo(task.getTaskNo());
                if(StringUtils.isNull(taskAssignSort)){
                    AgvTaskAssignSort agvTaskAssignSort = new AgvTaskAssignSort();
                    agvTaskAssignSort.setTaskNo(task.getTaskNo());
                    agvTaskAssignSort.setCreatedBy("ACS");
                    AjaxResult result = agvTaskAssignSortService.saveAgvTaskAssignSort(agvTaskAssignSort);
                    return result;
                }
                return AjaxResult.success();
            }
        });
        return result;
    }

}