AcsService.java 16.3 KB
package com.huaheng.api.ACS.service;

import com.alibaba.fastjson.JSON;
import com.huaheng.api.ACS.domain.Points;
import com.huaheng.api.ACS.domain.StateInfoUploadModel;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.http.HttpUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.inventory.inventory.domain.Inventory;
import com.huaheng.pc.inventory.inventory.service.IInventoryService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.IReceiptDetailService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.IReceiptHeaderService;
import com.huaheng.pc.shipment.shipmentDetail.domain.ShipmentDetail;
import com.huaheng.pc.shipment.shipmentDetail.service.IShipmentDetailService;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.shipment.shipmentHeader.service.IShipmentHeaderService;
import com.huaheng.pc.task.agvTask.domain.AgvTask;
import com.huaheng.pc.task.agvTask.mapper.AgvStateInfoMapper;
import com.huaheng.pc.task.agvTask.mapper.AgvTaskMapper;
import com.huaheng.pc.task.task.domain.Task;
import com.huaheng.pc.task.task.service.ITaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class AcsService {

    @Autowired
    private ITaskService taskService;
    @Resource
    private AgvTaskMapper agvTaskMapper;
    @Resource
    private AgvStateInfoMapper agvStateInfoMapper;
    @Resource
    private PointsService pointsService;
    @Autowired
    private IReceiptHeaderService receiptHeaderService;
    @Autowired
    private IShipmentHeaderService shipmentHeaderService;
    @Autowired
    private IReceiptDetailService receiptDetailService;
    @Autowired
    private IShipmentDetailService shipmentDetailService;
    @Autowired
    private IInventoryService iInventoryService;



    final String interactionId = "6EAB7794-CFD7-449A-A754-FFDB98CE44C7";

    //pick任务下发
    @Transactional
     public AjaxResult Task(String code,String station){
         //查找下发任务
        AgvTask agvTask=new AgvTask();
        agvTask.setTaskType("pick");
        agvTask.setStation(station);
         ReceiptHeader receiptHeader=new ReceiptHeader();
         ReceiptDetail receiptDetail=new ReceiptDetail();
         ShipmentHeader shipmentHeader=new ShipmentHeader();
         ShipmentDetail shipmentDetail=new ShipmentDetail();
         Inventory inventory=new Inventory();
         receiptHeader.setCode(code);
         receiptHeader=receiptHeaderService.selectFirstEntity(receiptHeader);
         //判断code是否属于入库单,不属于则查找出库单
         if(receiptHeader==null){
             shipmentHeader.setCode(code);
             shipmentHeader=shipmentHeaderService.selectFirstEntity(shipmentHeader);
             shipmentDetail.setShipmentCode(code);
             shipmentDetail.setWarehouseId(ShiroUtils.getWarehouseId());
             //查找AGV的子单
             List<ShipmentDetail> shipmentDetails=shipmentDetailService.selectListAgvDetail(shipmentDetail);
             for(ShipmentDetail item:shipmentDetails){
                 if(item.getQty().compareTo(item.getQtyCompleted())!=0) {
                     inventory.setMaterialCode(item.getMaterialCode());
                     inventory.setWarehouseCode(ShiroUtils.getWarehouseCode());
                     //查找物料对应的满盘的库存,没有则查找不满盘的库存
                     inventory.setContainerStatus("full");
                     Inventory inventorie = iInventoryService.selectFirstEntity(inventory);
                     if (inventorie == null) {
                         inventory.setContainerStatus("some");
                         inventorie = iInventoryService.selectFirstEntity(inventory);
                         if (inventorie == null) {
                             throw new ServiceException(item.getMaterialCode() + "没有库存,无法出库");
                         }
                     }
                     agvTask.setTaskHeaderId(shipmentHeader.getId());
                     agvTask.setTaskDetailId(item.getId());
                     agvTask.setWarehouseId(item.getWarehouseId());
                     agvTask.setWarehouseCode(item.getWarehouseCode());
                     agvTask.setCompanyId(item.getCompanyId());
                     agvTask.setCompanyCode(item.getCompanyCode());
                     this.TaskModel(inventorie.getContainerCode(),agvTask);
                 }
             }
         }else {
            receiptDetail.setReceiptCode(code);
            receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
            List<ReceiptDetail> receiptDetails=receiptDetailService.selectListAgvEntity(receiptDetail);
            for(ReceiptDetail item: receiptDetails){
                if(item.getQty().compareTo(item.getQtyCompleted())!=0) {
                    inventory.setMaterialCode(item.getMaterialCode());
                    inventory.setWarehouseCode(ShiroUtils.getWarehouseCode());
                    //查找物料对应的不满盘的库存
                    inventory.setContainerStatus("some");
                    Inventory inventorie = iInventoryService.selectFirstEntity(inventory);
                    if (inventorie == null) {
                        throw new ServiceException("请用出库查看手动叫车");
                    }
                    agvTask.setTaskHeaderId(receiptHeader.getId());
                    agvTask.setTaskDetailId(item.getId());
                    agvTask.setWarehouseId(item.getWarehouseId());
                    agvTask.setWarehouseCode(item.getWarehouseCode());
                    agvTask.setCompanyId(item.getCompanyId());
                    agvTask.setCompanyCode(item.getCompanyCode());
                    this.TaskModel(inventorie.getContainerCode(),agvTask);
                }
            }
         }
        return AjaxResult.success("成功");
     }

    /**
     * 设置agv下发任务的实体
     *
     */
    @Transactional
    public AjaxResult TaskModel(String containerCode,AgvTask agvTask){
        AjaxResult ajaxResult=new AjaxResult();
        AgvTask model=new AgvTask();
        String code=containerCode.substring(0,4);
        Points points=new Points();
        points=pointsService.selectEntity(code);

        //任务下发实体
        model.setTaskHeaderId(agvTask.getTaskHeaderId());
        model.setTaskDetailId(agvTask.getTaskDetailId());
        model.setTaskType(agvTask.getTaskType());
        model.setStation(agvTask.getStation());
        if(containerCode.substring(5,7).equals("1")) {
            model.setOrientation("A");
        }else {
            model.setOrientation("C");
        }
        //判断货架是否处于1阶段,1阶段为pick阶段。
        if (points == null) {
            throw new ServiceException("货架不存在!");
        }
        if(points.getIsLocked()!=1){
            model.setShelfNo(points.getGoodsShelfNo());
            model.setFromLocationNo(points.getXpos().toString());
            model.setToLocationNo(points.getYpos().toString());
            ajaxResult=this.TaskAssign(model);
            if(!ajaxResult.hasErr()){
                points.setIsLocked(1);
                pointsService.updatePoints(points);
                model.setCompanyId(agvTask.getCompanyId());
                model.setCompanyCode(agvTask.getCompanyCode());
                model.setWarehouseId(agvTask.getWarehouseId());
                model.setCompanyCode(agvTask.getCompanyCode());
                if(agvTaskMapper.insertModel(model)<1){
                    throw new ServiceException("agv任务下发失败");
                }
            }
        }
       return  ajaxResult;
    }

    /**
     * AGV 任务下发
     */

    public AjaxResult TaskAssign(AgvTask model)
    {
//            AvgTaskModel model = new AvgTaskModel();
            model.setInteractionId(interactionId);
//            model.setTaskHeaderId(100);
//            model.setTaskDetailId(200);
//            model.setTaskType("pick");
//            model.setShelfNo("H0001");
//            model.setStation("ws01");
//            model.setFromLocationNo("14");
//            model.setToLocationNo("54");
//            model.setOrientation("A");
            model.setPlatform("wms");
            String url = "http://172.16.30.48:8081/api/TaskAssign";
            String JsonParam = JSON.toJSONString(model);
            String result = HttpUtils.sendPost(url, JsonParam);
            AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
            return ajaxResult;
    }
//    public AjaxResult TaskAssign(String url)
//    {
//            AvgTaskModel model = new AvgTaskModel();
//        model.setInteractionId(interactionId);
//            model.setTaskHeaderId(100);
//            model.setTaskDetailId(200);
//            model.setTaskType("pick");
//            model.setShelfNo("H0001");
//            model.setStation("ws01");
//            model.setFromLocationNo("14");
//            model.setToLocationNo("54");
//            model.setOrientation("A");
//        model.setPlatform("wms");
////        String url = "http://172.16.30.48:8081/api/TaskAssign";
//        String JsonParam = JSON.toJSONString(model);
//        String result = HttpUtils.sendPost(url, JsonParam);
//        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
//        return ajaxResult;
//    }

    /**
     * agv  putway任务下发
     *
     */
    @Transactional
    public AjaxResult TaskAssigns(String code,String containerCode,String materialCode,String station)
    {
        //查找下发任务
        ReceiptHeader receiptHeader=new ReceiptHeader();
        ReceiptDetail receiptDetail=new ReceiptDetail();
        ShipmentHeader shipmentHeader=new ShipmentHeader();
        ShipmentDetail shipmentDetail=new ShipmentDetail();
        AgvTask agvTask=new AgvTask();
        agvTask.setTaskType("putway");
        receiptHeader.setCode(code);
        receiptHeader=receiptHeaderService.selectFirstEntity(receiptHeader);

        //判断code是否属于入库单,不属于则查找出库单
        if(receiptHeader==null){
            shipmentHeader.setCode(code);
            shipmentHeader=shipmentHeaderService.selectFirstEntity(shipmentHeader);
            shipmentDetail.setShipmentCode(code);
            shipmentDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
            shipmentDetail.setMaterialCode(materialCode);
            shipmentDetail=shipmentDetailService.selectFirstEntity(shipmentDetail);
            agvTask.setTaskHeaderId(shipmentHeader.getId());
            agvTask.setTaskDetailId(shipmentDetail.getId());
            agvTask.setWarehouseId(shipmentDetail.getWarehouseId());
            agvTask.setWarehouseCode(shipmentDetail.getWarehouseCode());
            agvTask.setCompanyId(shipmentDetail.getCompanyId());
            agvTask.setCompanyCode(shipmentDetail.getCompanyCode());
        }else {
            receiptDetail.setReceiptCode(code);
            receiptDetail.setMaterialCode(materialCode);
            receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
            receiptDetail=receiptDetailService.selectFirstEntity(receiptDetail);
            agvTask.setTaskHeaderId(receiptHeader.getId());
            agvTask.setTaskDetailId(receiptDetail.getId());
            agvTask.setWarehouseId(receiptDetail.getWarehouseId());
            agvTask.setWarehouseCode(receiptDetail.getWarehouseCode());
            agvTask.setCompanyId(receiptDetail.getCompanyId());
            agvTask.setCompanyCode(receiptDetail.getCompanyCode());
        }
        AjaxResult ajaxResult = new AjaxResult();
        //查找对应的货架
        String containCode=containerCode.substring(0,4);
        Points points=new Points();
        points=pointsService.selectEntity(code);
        if(points.getIsLocked()==1) {
            AgvTask model = new AgvTask();
            model.setTaskHeaderId(agvTask.getTaskHeaderId());
            model.setTaskDetailId(agvTask.getTaskDetailId());
            model.setTaskType("putway");
            model.setShelfNo(points.getGoodsShelfNo());
            model.setStation(station);
            model.setFromLocationNo(points.getXpos().toString());
            model.setToLocationNo(points.getYpos().toString());
            if (containerCode.substring(5, 7).equals("1")) {
                model.setOrientation("A");
            } else {
                model.setOrientation("C");
            }
            ajaxResult = this.TaskAssign(model);
            if (!ajaxResult.hasErr()) {
                points.setIsLocked(2);
                pointsService.updatePoints(points);
                model.setCompanyId(agvTask.getCompanyId());
                model.setCompanyCode(agvTask.getCompanyCode());
                model.setWarehouseId(agvTask.getWarehouseId());
                model.setCompanyCode(agvTask.getCompanyCode());
                if (agvTaskMapper.insertModel(model) < 1) {
                    throw new ServiceException("agv任务下发失败");
                }
            }
        }
      return ajaxResult;
    }


    /**
     * AGV 任务取消
     */
    public AjaxResult TaskCancel(String message)
    {
        Map<String, Object> map = new HashMap<>();
        map.put("interactionId", interactionId);
        map.put("reason", message);
        String JsonParam = JSON.toJSONString(map);
        String url= "http://172.16.30.48:8081/api/TaskCancel";
        String result = HttpUtils.sendPost(url, JsonParam);
        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
        return ajaxResult;
    }

    /**
     * AGV 信息查询
     */

    public AjaxResult StateInfoGET(String carNo)
    {
        Map<String, String> map = new HashMap<>();
        map.put("carNo", carNo);
        map.put("interactionId", interactionId);
        String JsonParam = JSON.toJSONString(map);
        String url= "http://172.16.30.48:8081/api/StateInfoGET";
        String result = HttpUtils.sendPost(url, JsonParam);
        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
        return ajaxResult;
    }

    /**
     * AGV 旋转方向
     */
    public AjaxResult TurnOriention(String carNo,String orientation)
    {
        Map<String, String> map = new HashMap<>();
        map.put("carNo", carNo);
        map.put("orientation", orientation);
        String JsonParam = JSON.toJSONString(map);
        String url= "http://172.16.30.48:8081/api/TurnOriention";
        String result = HttpUtils.sendPost(url, JsonParam);
        AjaxResult ajaxResult = JSON.parseObject(result, AjaxResult.class);
        return ajaxResult;
    }

    /**
     * AGV 任务回传
     */
    public AjaxResult TaskConfirm(AgvTask model)
    {
        try {
            model.getTaskHeaderId();
            model.getTaskDetailId();
            model.getTaskType();
            AgvTask avgTaskModel=agvTaskMapper.selectModel(model);
            if(avgTaskModel!=null){
                model.setId(avgTaskModel.getId());
                agvTaskMapper.updateModel(model);
                //回传任务为putway时,查找到改货架中物料为agv的任务,并完成任务。
                if(model.getTaskType().equals("putway")){
                    String shelfNo=model.getShelfNo().substring(1,5);
                    String warehouseCode=ShiroUtils.getWarehouseCode();
                    List<Task> list = taskService.selectAgvListByLike(shelfNo,warehouseCode);
                    Integer[] ids = list.stream().map(x->x.getId()).toArray(Integer[]::new);
                    taskService.completeTaskByWMS(ids);
                }
            }
        }catch (Exception e){
            return AjaxResult.error("没有数据");
        }
        return AjaxResult.success(model);
    }

    /**
     * AGV 信息上传
     */
    public AjaxResult StateInfoUpload(@RequestBody StateInfoUploadModel model)
    {
        try {
            agvStateInfoMapper.insertModel(model);
        }catch (Exception e){
            return AjaxResult.error("没有数据");
        }
        return AjaxResult.success("收到");
    }
}