AcsServiceImpl.java 18.9 KB
package com.huaheng.api.acs.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.fasterxml.jackson.databind.ObjectReader;
import com.huaheng.api.acs.domain.AcsReturn;
import com.huaheng.api.acs.domain.AcsStatus;
import com.huaheng.api.acs.domain.AcsWeightHeight;
import com.huaheng.api.acs.domain.AgvDomain;
import com.huaheng.api.wcs.domain.WcsTask;
import com.huaheng.api.wcs.service.warecellAllocation.WarecellAllocationService;
import com.huaheng.common.constant.HttpConstant;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.support.Convert;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.http.HttpUtils;
import com.huaheng.common.utils.http.OkHttpUtils;
import com.huaheng.framework.aspectj.lang.annotation.ApiLogger;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.service.ConfigService;
import com.huaheng.pc.config.address.service.AddressService;
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
import com.huaheng.pc.inventory.inventoryHeader.domain.InventoryHeader;
import com.huaheng.pc.inventory.inventoryHeader.service.InventoryHeaderService;
import com.huaheng.pc.system.user.controller.ProfileController;
import com.huaheng.pc.task.agvTask.domain.AgvTask;
import com.huaheng.pc.task.agvTask.service.AgvTaskService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName AcsServiceImpl
 * @Description TODO
 * @Author youjie
 * @Date 2019/12/2615:38
 */
@Service
public class AcsServiceImpl implements AcsService {
    private static final Logger log = LoggerFactory.getLogger(AcsServiceImpl.class);


    @Resource
    private AgvTaskService agvTaskService;
    @Resource
    private AddressService addressService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private ContainerService containerService;
    @Resource
    private WarecellAllocationService warecellAllocationService;
    @Resource
    private ConfigService configService;
    @Resource
    private InventoryHeaderService inventoryHeaderService;
    @Resource
    private LocationService locationService;


    @Override
    public AjaxResult createAGVTask(AgvTask agvTask) {
        AgvDomain agvDomain = new AgvDomain();
        agvDomain.setTaskNo(String.valueOf(agvTask.getId()));
        agvDomain.setTaskType(agvTask.getTaskType());
        agvDomain.setFromPort(agvTask.getFromPort());
        agvDomain.setToPort(agvTask.getToPort());
        agvDomain.setPriority(agvTask.getPriority());
        agvDomain.setCreatedBy(agvTask.getCreatedBy());
        agvDomain.setQty(agvTask.getQty());
//        agvDomain.setCreatedTime(agvTask.getCreated());
        agvDomain.setContainerCode(agvTask.getContainerCode());
        String warehouseCode = agvTask.getWarehouseCode();
        String url = addressService.selectAddress(QuantityConstant.ADDRESS_AGV_TASK_ASSIGN,
                warehouseCode, null);

        String jsonParam = JSON.toJSONString(agvDomain);
        String result = HttpUtils.bodypost(url, jsonParam, agvTask.getWarehouseCode());
        //String result = OkHttpUtils.bodypost(url, jsonParam, agvTask.getWarehouseCode());
        if(StringUtils.isEmpty(result)) {
            throw new ServiceException("接口地址错误或返回为空");
        }
        AcsReturn ajaxResult = JSON.parseObject(result, AcsReturn.class);
        if(!ajaxResult.getCode().equals("200")) {
            return AjaxResult.error(ajaxResult.getMessage());
        }
        return AjaxResult.success("创建AGV任务成功");
    }

    @Override
    public AjaxResult cancelAGVTask(AgvTask agvTask) {
        List<String> ids = new ArrayList<String>();
        ids.add(String.valueOf(agvTask.getId()));
        AgvDomain agvDomain = new AgvDomain();
        agvDomain.setTaskNo(String.valueOf(agvTask.getId()));
        String url = addressService.selectAddress(QuantityConstant.ADDRESS_AGV_TASK_CANCEL);
        String jsonParam = JSON.toJSONString(agvDomain);
        String result = HttpUtils.bodypost(url, jsonParam, agvTask.getWarehouseCode());
        //String result = OkHttpUtils.bodypost(url, jsonParam,agvTask.getWarehouseCode());
        if(StringUtils.isEmpty(result)) {
            throw new ServiceException("接口地址错误或返回为空");
        }
        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
        if(ajaxResult.getCode() != HttpConstant.OK) {
            return AjaxResult.error(ajaxResult.getMsg());
        }
        return AjaxResult.success("取消AGV任务成功");
    }

    @Override
    public AjaxResult updateAGVTask(AgvTask agvTask) {
        AgvDomain agvDomain = new AgvDomain();
        agvDomain.setTaskNo(String.valueOf(agvTask.getId()));
        agvDomain.setPriority(agvTask.getPriority());
        String url = addressService.selectAddress(QuantityConstant.ADDRESS_AGV_TASK_UPDATE);
        String jsonParam = JSON.toJSONString(agvDomain);
        String result = HttpUtils.bodypost(url, jsonParam, agvTask.getWarehouseCode());
        //String result = OkHttpUtils.bodypost(url, jsonParam, agvTask.getWarehouseCode());
        if(StringUtils.isEmpty(result)) {
            throw new ServiceException("接口地址错误或返回为空");
        }
        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
        if(ajaxResult.getCode() != HttpConstant.OK) {
            return AjaxResult.error(ajaxResult.getMsg());
        }
        return AjaxResult.success("更新AGV任务成功");
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult notifyAGVTask(String taskNo, String carNo, int status, String updateBy) {
        AgvTask agvTask = agvTaskService.getById(taskNo);
        if(agvTask == null) {
            return AjaxResult.error("没有找到对应AGV任务,任务号为" + taskNo);
        }
        if(agvTask.getStatus()<QuantityConstant.AGV_TASK_STATUS_RELEASE) {
            return AjaxResult.success("该任务状态还未下发,任务号为" + taskNo);
        }
        if(agvTask.getStatus() == status) {
            return AjaxResult.success("该任务状态已更新,任务号为" + taskNo);
        }
        agvTask.setStatus(status);
        agvTask.setCarNo(carNo);
        agvTask.setLastUpdatedBy(updateBy);
        boolean result = agvTaskService.updateById(agvTask);

        if(!result) {
            return AjaxResult.error("更新任务信息失败 ");
        }
        //当status为100时,则完成任务
        //补充入库:先出库 agvtaskid2 状态400,后入库 agvtaskid 状态300
        //分拣出库:先出库 agvtaskid 状态400,后入库 agvtaskid2 状态300
        if(status==100){
            LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery();
            taskHeaderLambdaQueryWrapper.eq(TaskHeader::getId, agvTask.getTaskNo());
            TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper);
            String[] weight = new String[]{"0"};
            if (taskHeader != null) {
                switch (taskHeader.getTaskType().intValue()){
                    case QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT:
                        //任务类型补充入库,agv类型为出库,不完成接口
                        if(agvTask.getTaskType().equals(QuantityConstant.AGV_TYPE_RELEASE)){
                        }else{
                            //补充入库判断托盘出库否,是否完成agv出库任务
                            AgvTask agvTask2 = agvTaskService.getById(taskHeader.getAgvTaskId2());
                            if(agvTask2!=null&&agvTask2.getStatus()==100){
                                taskHeaderService.completeTaskByWMS(Convert.toIntArray(
                                        String.valueOf(taskHeader.getId())), weight);
                            }else{
                                throw new ServiceException("找不到补充入库托盘出库agv任务"+taskHeader.getAgvTaskId2()+"或者该任务还未完成");
                            }
                        }
                        break;
                    case QuantityConstant.TASK_TYPE_SORTINGSHIPMENT:
                        //任务类型分拣出库,agv类型为入库,不完成接口
                        if(agvTask.getTaskType().equals(QuantityConstant.AGV_TYPE_TAKE)){
                            //更新库存重量和库位重量
                            updateInventoryWeight(agvTask,taskHeader);
                        }else{
                            taskHeaderService.completeTaskByWMS(Convert.toIntArray(
                                    String.valueOf(taskHeader.getId())), weight);
                        }
                        break;
                    default:
                        taskHeaderService.completeTaskByWMS(Convert.toIntArray(
                                String.valueOf(taskHeader.getId())), weight);
                        break;
                }

            }

        }
        return AjaxResult.success("更新任务信息成功");
    }

    public void updateInventoryWeight(AgvTask agvTask,TaskHeader taskHeader){
        LambdaQueryWrapper<InventoryHeader> inventoryLambdaQueryWrapper = Wrappers.lambdaQuery();
        inventoryLambdaQueryWrapper.eq(InventoryHeader::getContainerCode,agvTask.getContainerCode());
        inventoryLambdaQueryWrapper.last("limit 1");
        InventoryHeader inventoryHeader=inventoryHeaderService.getOne(inventoryLambdaQueryWrapper);
        Container container=containerService.getContainerByCode(taskHeader.getContainerCode());
        inventoryHeader.setTotalWeight(container.getWeight().toString());
        inventoryHeaderService.updateById(inventoryHeader);

        Location location=locationService.getLocationByCode(taskHeader.getToLocation());
        location.setWeight(container.getWeight());
        locationService.updateById(location);
    }

    @Override
    public AjaxResult notifyAGVPort(AcsStatus acsStatus) {
        if(acsStatus==null){
            return AjaxResult.error("更新AGV点位信息,传参信息为空");
        }
        if(StringUtils.isEmpty(acsStatus.getTaskNo()) ) {
            return AjaxResult.error("更新AGV点位信息,任务号为空");
        }
        if(StringUtils.isEmpty(acsStatus.getCarNo())) {
            return AjaxResult.error("更新AGV点位信息,车辆编号为空");
        }
        if(StringUtils.isEmpty(acsStatus.getOldPort())) {
            return AjaxResult.error("更新AGV点位信息,原来得出入口为空");
        }
        if(StringUtils.isEmpty(acsStatus.getNewPort())) {
            return AjaxResult.error("更新AGV点位信息,新得出入口为空");
        }
        AgvTask agvTask = agvTaskService.getById(acsStatus.getTaskNo());
        if(agvTask == null) {
            return AjaxResult.error("更新AGV点位信息,任务号为" + acsStatus.getTaskNo());
        }
        agvTask.setToPort(acsStatus.getNewPort());
        agvTask.setLastUpdatedBy(acsStatus.getCreatedBy());
        return AjaxResult.success("更新任务信息成功");
    }

    /**
     * 保存重量高度,查找任务,根据重量高度分配库位,任务库位
     * 入库更新任务主表站点
     * 更新agv任务表起点和终点
     * @param acsWeightHeight
     * @return
     */
    @Override
    @Transactional(timeout = 60,rollbackFor = Exception.class)
    public AjaxResult weightAndHeightByContainer(AcsWeightHeight acsWeightHeight){

        //检验参数
        Container container=checkParams(acsWeightHeight);
        //根据托盘号查找未完成任务
        List<TaskHeader> taskHeaders=getTaskHeader(acsWeightHeight);
        TaskHeader taskHeader=taskHeaders.get(0);
        //更新agv起点终点
        AgvTask agvTask=null;
        //补充入库:先出库 agvtaskid2 状态400,后入库 agvtaskid 状态300
        //分拣出库:先出库 agvtaskid 状态400,后入库 agvtaskid2 状态300
        if(taskHeader.getTaskType().intValue()==QuantityConstant.TASK_TYPE_SORTINGSHIPMENT){
            agvTask=agvTaskService.getById(taskHeader.getAgvTaskId2());
        }else{
            agvTask=agvTaskService.getById(taskHeader.getAgvTaskId());
        }
        if(agvTask.getStatus()>=QuantityConstant.AGV_TASK_STATUS_RELEASE){
            return AjaxResult.success(taskHeader.getAgvTaskId()+"agv任务已下发,任务已有起点中终点");
        }
        container.setWeight(acsWeightHeight.getWeight());
        container.setHeight(acsWeightHeight.getHeight());
        containerService.updateById(container);
        //分配库位,更新任务表库位,巷道信息
        taskHeader=updateTaskHeaderLocation(taskHeader,acsWeightHeight);
        //更新agv起点终点
        if(agvTask!=null){
            agvTask.setToPort(taskHeader.getToLocation());
            agvTask.setFromPort(acsWeightHeight.getFormPort());
            agvTaskService.updateById(agvTask);
        }
        return AjaxResult.success().setData(taskHeader.getToLocation());
    }

    public List<TaskHeader> getTaskHeader(AcsWeightHeight acsWeightHeight){
        LambdaQueryWrapper<TaskHeader> taskHeaderLamb = Wrappers.lambdaQuery();
        taskHeaderLamb.eq(TaskHeader::getContainerCode, acsWeightHeight.getContainerCode());
        taskHeaderLamb.eq(TaskHeader::getStatus,QuantityConstant.TASK_STATUS_BUILD);
        taskHeaderLamb.in(TaskHeader::getTaskType,QuantityConstant.TASK_TYPE_WHOLERECEIPT,
                QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT);
        taskHeaderLamb.orderByDesc(TaskHeader::getId);
        List<TaskHeader> taskHeaders = taskHeaderService.list(taskHeaderLamb);
        TaskHeader taskHeader=null;
        if(taskHeaders==null||taskHeaders.size()==0){
            LambdaQueryWrapper<TaskHeader> lam = Wrappers.lambdaQuery();
            lam.eq(TaskHeader::getContainerCode, acsWeightHeight.getContainerCode());
            lam.eq(TaskHeader::getStatus,QuantityConstant.TASK_STATUS_COMPLETED);
            lam.eq(TaskHeader::getTaskType,QuantityConstant.TASK_TYPE_SORTINGSHIPMENT);
            lam.orderByDesc(TaskHeader::getId);
            taskHeaders = taskHeaderService.list(lam);
            if(taskHeaders==null||taskHeaders.size()==0){
                throw new ServiceException("传递AGV托盘重量高度,"+acsWeightHeight.getContainerCode()+"该托盘在任务中找不到,请先生成任务");
            }

        }
        taskHeader=taskHeaders.get(0);
        //更新任务主表站点
        taskHeader.setPort(acsWeightHeight.getFormPort());
        taskHeader.setWeight(acsWeightHeight.getWeight().toString());
        taskHeaderService.updateById(taskHeader);
        return taskHeaders;
    }
    public TaskHeader updateTaskHeaderLocation(TaskHeader taskHeader,AcsWeightHeight acsWeightHeight){
        if(taskHeader.getTaskType().intValue()==QuantityConstant.TASK_TYPE_WHOLERECEIPT){
            WcsTask wcsTask=createWcsTask(taskHeader.getId().toString(),acsWeightHeight.getHeight(),acsWeightHeight.getWeight());
            AjaxResult ajaxResult=warecellAllocationService.warecellAllocation(wcsTask);
            if(ajaxResult.hasErr()){
                throw new ServiceException("传递AGV托盘重量高度,请求库位时:"+ajaxResult.getMsg());
            }
            WcsTask wcsTask1=(WcsTask)ajaxResult.getData();
            taskHeader.setRoadway(wcsTask1.getRoadWay());
            taskHeader.setToLocation(wcsTask1.getToLocationCode());
        }else{
            Location location=locationService.getLocationByCode(taskHeader.getToLocation());
            taskHeader.setRoadway(location.getRoadway());
        }
        return taskHeader;
    }

    public Container checkParams(AcsWeightHeight acsWeightHeight){
        if(acsWeightHeight == null) {
           throw  new ServiceException("传递AGV托盘重量高度,对象为空");
        }
        BigDecimal weight = acsWeightHeight.getWeight();
        if(weight == null) {
            throw  new ServiceException("传递AGV托盘重量高度,重量为空");
        }
        String weight_config = configService.getKey(QuantityConstant.CONFIG_WEGHT);//容器重量
        BigDecimal weight_bigdecimal=new BigDecimal(weight_config);
        if(weight.compareTo(weight_bigdecimal)>0){
            throw  new ServiceException("传递AGV托盘重量高度,"+weight+"重量超过单个托盘限定重量");
        }
        BigDecimal height = acsWeightHeight.getHeight();
        if(height == null) {
            throw  new ServiceException("传递AGV托盘重量高度,高度为空");
        }
        /*String height_config = configService.getKey(QuantityConstant.CONFIG_HEIGHT);//容器高度
        BigDecimal height_bigdecimal=new BigDecimal(height_config);
        if(height.compareTo(height_bigdecimal)>0){
            throw  new ServiceException("传递AGV托盘重量高度,"+height+"高度超过单个托盘限定高度");
        }*/
        String containerCode=acsWeightHeight.getContainerCode();
        if(StringUtils.isEmpty(containerCode)) {
            throw  new ServiceException("传递AGV托盘重量高度,托盘号为空");
        }
        String fromPort=acsWeightHeight.getFormPort();
        if(StringUtils.isEmpty(fromPort)) {
            throw  new ServiceException("传递AGV托盘重量高度,起点为空");
        }
        //log.info(containerCode);
        Container container=containerService.getContainerByCode(containerCode,QuantityConstant.ryTask_warehouse_code);
        //log.info(container.toString());
        if(container==null){
            throw  new ServiceException("传递AGV托盘重量高度,"+containerCode+"容器在容器管理中找不到");
        }
        return container;
    }

    public WcsTask createWcsTask(String  taskNo,BigDecimal height,BigDecimal weight){
        WcsTask wcsTask=new WcsTask();
        wcsTask.setTaskNo(taskNo);
        wcsTask.setWarehouseCode("CS0001");
        wcsTask.setArea("2");
        wcsTask.setLength("100");
        //String height_config = configService.getKey(QuantityConstant.CONFIG_AGV_HEIGHT);//容器重量
        //判断高低库位,1.4以下低库位,1.4-1。5高库位
        /*if(height.compareTo(new BigDecimal(height_config))>=0){
            wcsTask.setHeight("2");
        }else{
            wcsTask.setHeight("1");
        }*/
        wcsTask.setHeight(String.valueOf(height.intValue()));
        wcsTask.setWidth("1000");
        wcsTask.setWeight(weight.toString());
        return wcsTask;
    }


}