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

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.sap.service.ZarshService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.acs.domain.AcsStatus;
import com.huaheng.api.acs.domain.AgvDomain;
import com.huaheng.api.acs.domain.StateInfoUploadModel;
import com.huaheng.api.wcs.domain.TaskFinishDomain;
import com.huaheng.api.wcs.service.taskFinish.TaskFinishService;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.ZoneAreaUtils;
import com.huaheng.common.utils.bean.BeanUtils;
import com.huaheng.common.utils.http.HttpUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.domain.AjaxResultACS;
import com.huaheng.pc.config.address.service.AddressService;
import com.huaheng.pc.config.location.service.LocationService;
import com.huaheng.pc.task.agvTask.domain.AgvTask;
import com.huaheng.pc.task.agvTask.service.AgvTaskService;
import com.huaheng.pc.task.taskDetail.service.TaskDetailAgvService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;

/**
 * @ClassName   AcsServiceImpl
 * @Description TODO
 * @Author      Administrator
 * @Date        2019/12/2615:38
 */
@Service
public class AcsServiceImpl implements AcsService {

    private static final Logger logger = LoggerFactory.getLogger(AcsServiceImpl.class);

    @Resource
    private LocationService locationService;
    @Resource
    private ContainerService containerService;
    @Resource
    private AddressService addressService;
    @Resource
    private AgvTaskService agvTaskService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private TaskFinishService taskFinishService;
    @Resource
    private ZarshService zarshService;

    @Override
    public AjaxResult StateInfoUpload(StateInfoUploadModel model) {
        return null;
    }

    private String getUrl(String zoneCode) {
        Integer area = ZoneAreaUtils.getAreaByZoneCode(zoneCode);
        String url = addressService.selectAddress("AGV", QuantityConstant.WAREHOUSECODE, area.toString());
        return url;
    }

    /**
     * 下发任务
     * wms-acs
     * @param  model
     * @return
     */
    @Override
    public AjaxResult TaskAssign(AgvTask model) {
        String PalletNo = model.getPalletNo();
        if (StringUtils.isEmpty(PalletNo)) {
//            return AjaxResult.error("没有填写任务托盘号");
        }
        if (StringUtils.isEmpty(ShiroUtils.getLoginName())) {
            model.setPlatform("wms");
        } else {
            model.setPlatform(ShiroUtils.getLoginName());
        }
        AgvDomain domain = new AgvDomain();
        BeanUtils.copyBeanProp(domain, model);

        String url = this.getUrl(model.getZoneCode()) + "TaskAssign";
        String JsonParam = JSON.toJSONString(domain);
        logger.info("任务下发:{}", JsonParam);
        String result = HttpUtils.bodypost(url, JsonParam, QuantityConstant.WAREHOUSECODE, "AGV下发任务");
        if (StringUtils.isEmpty(result)) {
            throw new ServiceException("ACS接口地址错误或服务器连接不到或返回为空");
        }
        AjaxResultACS ajaxResultACS = JSON.parseObject(result, AjaxResultACS.class);
//        AjaxResultACS ajaxResultACS=new AjaxResultACS();
//        ajaxResultACS.setState(true);
        if (!ajaxResultACS.state) {
            model.setRemark(ajaxResultACS.getMessage());
            agvTaskService.updateById(model);
            return AjaxResult.error(ajaxResultACS.getMessage());
        } else {
            model.setRemark(ajaxResultACS.getMessage());
            agvTaskService.updateById(model);
        }
        // 下发成功
        model.setState(10);
        agvTaskService.updateById(model);
        return AjaxResult.success(ajaxResultACS.getMessage()).setData(ajaxResultACS.getData());
    }

    /**
     * 回传任务
     * acs-wms
     * @param  model
     * @return
     */
    @Override
    public AjaxResult TaskConfirm(AgvTask model) {
        Integer taskNo = model.getTaskNo();
        if (StringUtils.isNull(taskNo)) {
            return AjaxResult.error("没有填写任务托盘号");
        }
        if (StringUtils.isEmpty(model.getAgvNo())) {
            return AjaxResult.error("没有填写小车号");
        }
        if (StringUtils.isNull(model.getState())) {
            return AjaxResult.error("没有填写任务状态");
        }
        AgvTask agvTask = agvTaskService.getAgvTaskByTaskNo(taskNo);
        if (agvTask == null) {
            return AjaxResult.error("找不到该任务" + taskNo);
        }
        agvTask.setState(model.getState());
        agvTask.setLastUpdatedBy("acs");
        agvTaskService.updateById(agvTask);

        return AjaxResult.success(agvTask);
    }

    /**
     * 取消任务
     * wms-acs
     * @param  model
     * @return
     */
    @Override
    public AjaxResult TaskCancel(AgvTask model) {
        Integer taskNo = model.getTaskNo();
        if (StringUtils.isNull(taskNo)) {
            return AjaxResult.error("没有填写任务号");
        }
        Map<String, Object> map = new HashMap<>();
        map.put("TaskNo", taskNo);
        map.put("Reason", model.getRemark());
        String JsonParam = JSON.toJSONString(map);
        String zoneCode = model.getZoneCode();
        if (StringUtils.isEmpty(model.getZoneCode())) {
            zoneCode = "C";
        }
        AgvTask agvTask = agvTaskService.getById(taskNo);
        if (agvTask == null) {
            return AjaxResult.error("任务不存在");
        }
        if (agvTask.getState() >= 90) {
            return AjaxResult.success("任务已完成,不能取消");
        }
        if (agvTask.getState() >= 10) {
            String url = this.getUrl(zoneCode) + "TaskCancel";
            String result = HttpUtils.bodypost(url, JsonParam, QuantityConstant.WAREHOUSECODE, "AGV任务取消");
            AjaxResultACS ajaxResultACS = JSON.parseObject(result, AjaxResultACS.class);
            if (ajaxResultACS == null || !ajaxResultACS.state) {
//                return AjaxResult.error("取消agv任务:" + ajaxResultACS.getMessage());
            }
        }
        try{
            if(StringUtils.isNotEmpty(agvTask.getUniqueId())){
                zarshService.removeByZarshId(agvTask.getUniqueId(),null);
            }
        }catch (Exception e){

        }
        agvTaskService.removeById(agvTask.getTaskNo());
        //
        containerService.updateStatus(agvTask.getContainerCode(),QuantityConstant.STATUS_CONTAINER_EMPTY,QuantityConstant.WAREHOUSECODE);
        locationService.updateStatus(agvTask.getLocationCode(),QuantityConstant.STATUS_CONTAINER_EMPTY,QuantityConstant.WAREHOUSECODE);

        return AjaxResult.success("取消成功");
    }

    /**
     * 人工完成接口
     * wms-acs
     * @param  model
     * @return
     */
    @Override
    public AjaxResult TaskFinish(AgvTask model) {
        if (StringUtils.isEmpty(model.getPalletNo())) {
            return AjaxResult.error("没有填写任务托盘号");
        }
        Map<String, Object> map = new HashMap<>();
        // 站台
        map.put("StName", model.getToPoint());
        map.put("PalletNo", model.getPalletNo());
        map.put("StState", 99);
        String JsonParam = JSON.toJSONString(map);
        String url = this.getUrl(model.getZoneCode()) + "TaskFinish";
        String result = HttpUtils.bodypost(url, JsonParam, QuantityConstant.WAREHOUSECODE, "AGV任务完成");
        AjaxResultACS ajaxResultACS = JSON.parseObject(result, AjaxResultACS.class);
        if (!ajaxResultACS.state) {
            return AjaxResult.error(ajaxResultACS.getMessage());
        }
        return AjaxResult.success(ajaxResultACS.getMessage()).setData(ajaxResultACS.getData());
    }

    /**
     * AGV 的状态信息
     * wms-acs
     * @param  model
     * @return
     */
    @Override
    public AjaxResult AgvInfo(AgvTask model) {
        if (StringUtils.isEmpty(model.getAgvNo())) {
            return AjaxResult.error("没有填写小车号");
        }
        Map<String, Object> map = new HashMap<>();
        // 站台
        map.put("AgvNos", model.getAgvNo());
        String JsonParam = JSON.toJSONString(map);
        String url = this.getUrl(model.getZoneCode()) + "AgvInfo";
        String result = HttpUtils.bodypost(url, JsonParam, QuantityConstant.WAREHOUSECODE, "获取AGV信息");
        AjaxResultACS ajaxResultACS = JSON.parseObject(result, AjaxResultACS.class);
        if (!ajaxResultACS.state) {
            return AjaxResult.error(ajaxResultACS.getMessage());
        }
        return AjaxResult.success(ajaxResultACS.getMessage()).setData(ajaxResultACS.getData());
    }

    /**
     * 继续任务
     * wms-acs
     * @param  model
     * @return
     */
    @Override
    public AjaxResult ContinueTask(AgvTask model) {
        if (StringUtils.isNull(model.getTaskNo())) {
            return AjaxResult.error("没有填写任务号");
        }
        Map<String, Object> map = new HashMap<>();
        // 站台
        map.put("TaskNo", model.getTaskNo());
        map.put("TaskStatus", model.getState());
        String JsonParam = JSON.toJSONString(map);
        String url = this.getUrl(model.getZoneCode()) + "ContinueTask";
        String result = HttpUtils.bodypost(url, JsonParam, QuantityConstant.WAREHOUSECODE, "AGV任务继续");
        AjaxResultACS ajaxResultACS = JSON.parseObject(result, AjaxResultACS.class);
        if (!ajaxResultACS.state) {
            return AjaxResult.error(ajaxResultACS.getMessage());
        }
        return AjaxResult.success(ajaxResultACS.getMessage()).setData(ajaxResultACS.getData());
    }

    @Override
    @Transactional
    public AjaxResult notifyAGVTask(AcsStatus acsStatus) {
        if (acsStatus == null) {
            return AjaxResult.error("更新AGV状态信息为空");
        }
        String taskNo = acsStatus.getTaskNo();
        String carNo = acsStatus.getAgvNo();
        int status = acsStatus.getState();
        if (StringUtils.isNull(acsStatus.getTaskNo())) {
            return AjaxResult.error("更新AGV状态,任务号为空");
        }
        if (status == 0) {
            return AjaxResult.error("更新AGV状态,状态信息为空");
        }
        String updateBy = "acs";
        AgvTask agvTask = agvTaskService.getById(taskNo);
        if (agvTask == null) {
            return AjaxResult.error("没有找到对应AGV任务,任务号为" + taskNo);
        }
        if (agvTask.getState() < QuantityConstant.AGV_TASK_STATUS_RELEASE) {
            return AjaxResult.success("该任务状态还未下发,任务号为" + taskNo);
        }
        if (agvTask.getState() == status) {
            return AjaxResult.success("该任务状态已更新,任务号为" + taskNo);
        }
        if (status < 90) {
            return AjaxResult.success("该任务状态已更新,任务号为" + taskNo);
        }
        TaskHeader task = findTaskByAgvNo(agvTask.getTaskNo());

//        TaskHeader task = taskHeaderService.getById(agvTask.getTaskId());
        /*
         * if(task!=null&&StringUtils.isNotEmpty(acsStatus.getLocationCode())){
         * //当acs返回库位的时候任务库位改成acs返回的
         * task.setToLocation(acsStatus.getLocationCode());
         * taskHeaderService.updateById(task);
         * }
         */
        if (status == 90 && task != null && task.getSendTo().equals(QuantityConstant.TASK_SEND_TO_AGV)) {
            // 当任务时AGV任务时,调用通用完成任务接口
            TaskFinishDomain taskFinishDomain = new TaskFinishDomain();
            taskFinishDomain.setTaskNo(task.getId().toString());
            taskFinishDomain.setIsEmptyOut(0);
            AjaxResult ajaxResult = taskFinishService.completeTaskByWCSNoTransaction(taskFinishDomain);
            if (ajaxResult == null || ajaxResult.hasErr()) {
                throw new ServiceException("AGV,调用任务完成接口失败:" + ajaxResult.getMsg());
            }
        } else if (task != null && task.getSendTo().equals(QuantityConstant.TASK_SEND_TO_WCS)) {
            // 立库出库任务:agv任务完成线边库更新库存,线边库出入库才更新
        }
        agvTask.setState(status);
        agvTask.setAgvNo(carNo);
        agvTask.setLastUpdatedBy(updateBy);
        boolean result = agvTaskService.updateById(agvTask);

        if (!result) {
            return AjaxResult.error("更新AGV任务状态信息失败 ");
        }
        return AjaxResult.success("更新任务信息成功");
    }

    @Override
    @Transactional
    public AjaxResult acsCancelAGVTask(AcsStatus acsStatus) {
        if (StringUtils.isEmpty(acsStatus.getTaskNo())) {
            return AjaxResult.error("请填写任务号");
        }
        AgvTask agvTask = agvTaskService.getById(acsStatus.getTaskNo());
        if (agvTask == null) {
            return AjaxResult.error("任务不存在");
        }
        agvTaskService.removeById(agvTask.getTaskNo());
        return AjaxResult.success();
    }

    @Override
    public AjaxResultACS busTaskFinish(AgvTask agvTask) {
        Integer taskNo = agvTask.getTaskNo();
        AgvTask agvTask1 = agvTaskService.getAgvTaskByTaskNo(taskNo);
        if (agvTask1 == null) {
            return AjaxResultACS.error("任务号" + taskNo + "未找到任务");
        }
        agvTask1.setState(90);
        agvTaskService.updateById(agvTask1);
        return AjaxResultACS.success();
    }

    public AjaxResult bindContainer(AcsStatus acsStatus) {
        String taskNo = acsStatus.getTaskNo();
        if (StringUtils.isEmpty(taskNo)) {
            return AjaxResult.error("agv任务绑定托盘:未找到任务号");
        }
        if (StringUtils.isEmpty(acsStatus.getContainerCode())) {
            return AjaxResult.error("agv任务绑定托盘:未找到任务号");
        }
        AgvTask agvTask = agvTaskService.getAgvTaskByTaskNo(Integer.parseInt(taskNo));
        if (agvTask == null) {
            return AjaxResult.error("agv任务绑定托盘:agv任务号" + taskNo + "未找到任务");
        }
        TaskHeader task = findTaskByAgvNo(Integer.parseInt(taskNo));
        if (task == null) {
            return AjaxResult.error("agv任务绑定托盘:agv任务号" + taskNo + "未找到立库任务");
        }
        if (task.getStatus().intValue() == QuantityConstant.TASK_STATUS_COMPLETED) {
            return AjaxResult.error("agv任务绑定托盘:agv任务号" + taskNo + "立库任务已完成");
        }
        task.setContainerCode(acsStatus.getContainerCode());
        taskHeaderService.updateById(task);
        return AjaxResult.success();
    }

    public TaskHeader findTaskByAgvNo(Integer agvNo) {
        LambdaQueryWrapper<TaskHeader> lambdaQuery = Wrappers.lambdaQuery();
        lambdaQuery.eq(TaskHeader::getAgvNo, agvNo);
        lambdaQuery.last("limit 1");
        TaskHeader task = taskHeaderService.getOne(lambdaQuery);
        return task;
    }
}