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

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

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
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.domain.Location;
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.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 AddressService addressService;
    @Resource
    private AgvTaskService agvTaskService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private TaskFinishService taskFinishService;

    @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);
        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());
        }
        // 下发成功
        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 url = this.getUrl(model.getZoneCode()) + "TaskCancel";
        String result = HttpUtils.bodypost(url, JsonParam, QuantityConstant.WAREHOUSECODE);
        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 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);
        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);
        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);
        AjaxResultACS ajaxResultACS = JSON.parseObject(result, AjaxResultACS.class);
        if (!ajaxResultACS.state) {
            return AjaxResult.error(ajaxResultACS.getMessage());
        }
        return AjaxResult.success(ajaxResultACS.getMessage()).setData(ajaxResultACS.getData());
    }

    @Override
    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);
        }

        TaskHeader task = taskHeaderService.getById(agvTask.getTaskId());
        /*
         * if(task!=null&&StringUtils.isNotEmpty(acsStatus.getLocationCode())){
         * //当acs返回库位的时候任务库位改成acs返回的
         * task.setToLocation(acsStatus.getLocationCode());
         * taskHeaderService.updateById(task);
         * }
         */
        if (status == 100 && 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.completeTaskByWCS(taskFinishDomain);
            if (ajaxResult == null || ajaxResult.hasErr()) {
                return ajaxResult;
            }
        }
        agvTask.setState(status);
        agvTask.setAgvNo(carNo);
        agvTask.setLastUpdatedBy(updateBy);
        boolean result = agvTaskService.updateById(agvTask);
        if (StringUtils.isNotEmpty(agvTask.getLocationCode())) {
            // 更新库位信息
            Location location = locationService.getLocationByCode(agvTask.getLocationCode(), QuantityConstant.WAREHOUSECODE);
            switch (agvTask.getTaskType()) {
                case "putway":
                    location.setStatus(QuantityConstant.STATUS_LOCATION_SOME);
                    break;
                case "pick":
                    location.setStatus(QuantityConstant.STATUS_LOCATION_EMPTY);
                    break;
            }
            locationService.updateById(location);
        }
        if (!result) {
            return AjaxResult.error("更新AGV任务状态信息失败 ");
        }
        return AjaxResult.success("更新任务信息成功");
    }
}