自动化立体仓库 - WMS系统
pang.jiabao
6 天以前 cfb1943832cc253f43cddd164f468dfe6a32cb35
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -4,10 +4,15 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.mes.TransTask;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.rcs.RcsReturn;
import com.zy.asrs.entity.rcs.RcsTaskSubmit;
import com.zy.asrs.entity.rcs.RcsTaskTargetRoute;
import com.zy.asrs.enums.CommonEnum;
import com.zy.asrs.enums.LocStsType;
import com.zy.asrs.mapper.LocMastMapper;
@@ -19,16 +24,19 @@
import com.zy.common.entity.Parameter;
import com.zy.common.model.DetlDto;
import com.zy.common.model.MesCombParam;
import com.zy.common.model.StartupDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
@@ -114,6 +122,181 @@
    private BasStationService basStationService;
    @Autowired
    private BasContainerService basContainerService;
    @Resource
    private RcsService rcsService;
    @Override
    @Transactional
    public R emptyBoxOutbound(int count, Long userId) {
        List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<LocMast>().setSqlSelect("TOP " + count + " *").eq("loc_sts", "D").eq("frozen", 0).orderBy("lev1").orderBy("bay1").orderBy("row1"));
        if (locMastList.size() < count) {
            return R.parse("空料箱数量不足(或冻结),剩余数量:" + locMastList.size());
        }
        for (LocMast locMast : locMastList) {
            // 获取工作号
            int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
            Date now = new Date();
            // 保存工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(110); // 入出库状态: 110.空板出库
            wrkMast.setIoPri(10D);
            wrkMast.setSourceStaNo("101"); // 源站
            wrkMast.setStaNo("103"); // 目标站
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位
            wrkMast.setBarcode(locMast.getBarcode());
            wrkMast.setFullPlt("N"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("Y"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setAppeUser(userId);
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(userId);
            wrkMast.setModiTime(now);
            wrkMastService.insert(wrkMast);
            locMast.setLocSts("R");
            locMast.setModiUser(userId);
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("更新库位状态失败");
            }
        }
        return R.ok("出库成功");
    }
    @Value("${wcs-slave.url}")
    private String WCS_URL;
    @Override
    public R inboundStart(int type) {
//        BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 103));
//        if (!basDevp.getAutoing().equals("Y") || !basDevp.getLoading().equals("Y")) {
//            return R.parse("站点103不是自动/有物状态");
//        }
        Map<String,Object> params = new HashMap<>();
        params.put("siteId",103);
        int wrkNo = type == 1 ? 9998 : 9997;
        params.put("workNo",wrkNo);
        params.put("staNo", 104);
        params.put("pakMk","Y");
        String response;
        boolean success = false;
        String message = "";
        try {
            HashMap<String, Object> headers = new HashMap<>();
            headers.put("token","1");
            response = new HttpHandler.Builder()
                    .setUri(WCS_URL)
                    .setPath("/site/detl/update")
//                    .setHeaders(headers)
                    .setParams(params)
                    .build()
                    .doPost();
            if (Cools.isEmpty(response)) {
                log.error("入库启动调用wcs给输送线下命令失败,返回值为空");
            } else {
                JSONObject jsonObject = JSONObject.parseObject(response);
                if(jsonObject.getInteger("code").equals(200)) {
                    success = true;
                    log.info("入库启动调用wcs给输送线下命成功,wrkNo:{}",wrkNo);
                } else {
                    message = String.valueOf(jsonObject.getString("msg"));
                    log.error("入库启动调用wcs给输送线下命令失败:{}",message);
                }
            }
        } catch (IOException e) {
            log.error("入库启动调用wcs给输送线下命令异常:{}",e.getMessage());
            message = e.getMessage();
            e.printStackTrace();
        }
        return success ? R.ok("下发成功") : R.parse(message);
    }
    @Override
    @Transactional
    public R djReturn(String djNo) {
        Task task = taskService.selectOne(new EntityWrapper<Task>().eq("barcode", djNo));
        if(task == null) {
            log.error("刀架号:{},不存在任务!",djNo);
            return R.parse("刀架号:"+djNo+"不存在任务");
        } else if(task.getWrkSts() == 305) {
            task.setWrkSts(301L);
            task.setModiTime(new Date());
            task.setTaskNo(task.getTaskNo()+"-1"); // 更新任务号
            String sourceStaNo = task.getSourceStaNo();
            task.setSourceStaNo(task.getStaNo());
            task.setStaNo(sourceStaNo);
            TransTask transTask = JSONObject.parseObject(task.getMemo(), TransTask.class);
            transTask.setTaskno(task.getTaskNo());
            transTask.setCurStationId(task.getSourceStaNo());
            transTask.setNextStationId(task.getStaNo());
            if(transTask.getTransType().equals("06")) {
                transTask.setTransType("01");
            } else if(transTask.getTransType().equals("02")) {
                transTask.setTransType("05");
            } else{
                log.error("刀架号:{},运输类型有误:{}",djNo,transTask.getTransType());
                return R.parse("刀架号:"+djNo+",运输类型有误:" + transTask.getTransType());
            }
            // 更新备注
            task.setMemo(JSONObject.toJSONString(transTask));
            // 下发给RCS
            RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
            // 模板名
            rcsTaskSubmit.setTaskType("DJ2");
            rcsTaskSubmit.setRobotTaskCode(transTask.getTaskno());
            rcsTaskSubmit.setInitPriority(10);  //默认10
            List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
            RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();
            startRoute.setSeq(0);
            startRoute.setCode(transTask.getCurStationId());
            startRoute.setOperation("COLLECT");
            targetRouteList.add(startRoute);
            RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();
            endRoute.setSeq(1);
            endRoute.setCode(transTask.getNextStationId());
            endRoute.setOperation("DELIVERY");
            targetRouteList.add(endRoute);
            rcsTaskSubmit.setTargetRoute(targetRouteList);
            // 转发给海康或华晓RCS
            RcsReturn rcsReturn = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
            if (rcsReturn.getCode().equals("SUCCESS")) {
                // 更新agv任务记录
                taskService.updateById(task);
                // 更新接驳位状态
                BasStation station = basStationService.selectOne(new EntityWrapper<BasStation>().eq("dev_no", task.getSourceStaNo()));
                if(station.getLocSts().equals("F")) {
                    station.setLocSts("R");
                    station.setModiTime(new Date());
                    basStationService.updateById(station);
                } else {
                    log.error("agv回调end,接驳点状态不为F,agv任务号:{},状态:{}",task.getTaskNo(),task.getWrkSts());
                }
            } else {
                log.error("下发rcs搬运命令失败:{}",rcsReturn);
                return R.parse("下发rcs失败:" + rcsReturn.getMessage());
            }
            return R.ok("RCS命令下发成功!");
        }else {
            log.error("刀架号:{},任务状态不对:{}",djNo,task.getWrkSts());
            return R.parse("刀架号:"+djNo+",任务状态不对:" + task.getWrkSts());
        }
    }
    @Override
    @Transactional
@@ -606,11 +789,12 @@
                if (Cools.isEmpty(mat)) {
                    throw new CoolException(detlDto.getMatnr() + "商品档案不存在");
                }
                if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) {
                    throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty());
                }
//                if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) {
//                    throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty());
//                }
                WaitPakin waitPakin = new WaitPakin();
                BeanUtils.copyProperties(mat, waitPakin);
                waitPakin.setMemo("");
                waitPakin.setBatch(detlDto.getBatch());
                waitPakin.setZpallet(param.getBarcode());
                waitPakin.setIoStatus("N");