自动化立体仓库 - WMS系统
zyx
2023-08-04 3f30983db5b3cd2b25cb215579501a2ef134883c
agv 订单出库功能完善
19个文件已修改
759 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvBasDevpController.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvOpenController.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvWrkMastController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvWorkService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvWrkMastService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvBasDevpServiceImpl.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java 116 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/AgvBasDevpDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvBasDevp/basDevp.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/agvBasDevp/basDevpWaitPakinDetail.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/agvBasDevpVisualized/basDevp.html 101 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/mat/mat.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvBasDevpController.java
@@ -10,15 +10,17 @@
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.entity.BasDevp;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.LocMastInitParam;
import com.zy.asrs.service.AgvBasDevpService;
import com.zy.asrs.service.*;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/agv")
@@ -26,6 +28,14 @@
    @Autowired
    AgvBasDevpService agvBasDevpService;
    @Autowired
    AgvWrkMastService agvWrkMastService;
    @Autowired
    AgvWrkDetlService agvWrkDetlService;
    @Autowired
    AgvWaitPakinService agvWaitPakinService;
    @Autowired
    AgvWorkService agvWorkService;
    @RequestMapping(value = "/basDevp/list/auth")
    @ManagerAuth
@@ -148,6 +158,36 @@
        return R.ok();
    }
    @RequestMapping(value = "/basDevp/detail/list/auth")
    public R basDevpDetailList(@RequestParam(defaultValue = "1")Integer curr,
                               @RequestParam(defaultValue = "10")Integer limit,
                               @RequestParam Map<String, Object> param){
        String devNo = param.get("devNo").toString();
        AgvBasDevp agvBasDevp = agvBasDevpService.selectById(devNo);
        if("F".equals(agvBasDevp.getLocSts()) || "R".equals(agvBasDevp.getLocSts())){
            //先去入库通知档找明细
            Page<AgvWaitPakin> agvWaitPakinPage = agvWaitPakinService.selectPage(new Page<>(curr, limit), new EntityWrapper<AgvWaitPakin>()
                    .eq("zpallet", agvBasDevp.getBarcode()));
            if(agvWaitPakinPage.getRecords().size()>0){
                return R.ok(agvWaitPakinPage);
            }else {
                //如果入库通档明细为空,则去工作档找明细
                AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>()
                        .eq("loc_no", agvBasDevp.getDevNo())
                        .or().eq("source_loc_no",agvBasDevp.getDevNo()));
                Page<AgvWrkDetl> agvWrkDetlPage = agvWrkDetlService.selectPage(new Page<>(curr, limit), new EntityWrapper<AgvWrkDetl>()
                        .eq("wrk_no", agvWrkMast.getWrkNo()));
                if(agvWrkDetlPage.getRecords().size()>0){
                    return R.ok(agvWrkDetlPage);
                }
            }
        }
        return R.error("数据异常");
    }
    @RequestMapping(value = "/basDevp/visualized/list/auth")
    public R visualizedList(@RequestBody JSONObject param){
@@ -159,6 +199,64 @@
        return R.ok(result);
    }
    /*
    容器离场
     */
    @RequestMapping(value = "/basDevp/visualized/container/moveOut")
    public R visualiZedContainerMoveOut(@RequestBody Map<String,Object> map) {
        List<String> devNos = (List<String>) map.get("devNo");
        List<AgvWrkMast> agvWrkMastList = devNos.stream().map(devNo -> {
            AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo));
            if(agvWrkMast.getIoType() == 103){
                throw new CoolException("工作号为" + agvWrkMast.getWrkNo() + "类型为103.拣料入库,无法执行容器离场任务,请重新选择站点。");
            }
            return agvWrkMast;
        }).collect(Collectors.toList());
        try {
           int code = agvWrkMastService.containerMoveOut(agvWrkMastList);
           if(code == 0){
               //将工作党状态改为容器离场
               agvWrkMastList.forEach(agvWrkMast -> {
                   agvWrkMast.setWrkSts(207L);
                   agvWrkMastService.updateById(agvWrkMast);
               });
               //修改站点状态
               devNos.forEach(devNo -> {
                   AgvBasDevp agvBasDevp = agvBasDevpService.selectById(devNo);
                   agvBasDevp.setBarcode("");
                   agvBasDevp.setLocSts("O");
                   agvBasDevpService.updateById(agvBasDevp);
               });
           }
        } catch (IOException e) {
            e.printStackTrace();
            return R.error("容器离场失败");
        }
        return R.ok("容器离场成功");
    }
    /*
    拣料入库
     */
    @RequestMapping(value = "/basDevp/visualized/container/pickIn")
    public R visualiZedPickIn(@RequestBody Map<String,Object> map){
        List<String> devNos = (List<String>) map.get("devNo");
        List<AgvWrkMast> agvWrkMastList = devNos.stream().map(devNo -> {
            AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo));
            if(agvWrkMast.getIoType() == 101){
                throw new CoolException("工作号为" + agvWrkMast.getWrkNo() + "类型为101.入库,无法执行拣料入库任务,请重新选择站点。");
            }
            return agvWrkMast;
        }).collect(Collectors.toList());
        agvWorkService.pickIn(agvWrkMastList);
        return R.ok("生成拣料出库任务成功");
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
src/main/java/com/zy/asrs/controller/AgvOpenController.java
@@ -70,8 +70,8 @@
        AgvTask agvTask = AgvTask.valueOf(param.getEventType());
        Class<AgvTask> clz = AgvTask.class;
        try {
            Method method = clz.getDeclaredMethod(param.getStatus(),AgvTaskCallBackParam.class);
            method.invoke(agvTask,param);
            Method method = clz.getDeclaredMethod(param.getStatus(), AgvWrkMast.class, AgvTaskCallBackParam.class);
            method.invoke(agvTask,agvWrkMast,param);
        } catch (NoSuchMethodException e) {
            return R.error("任务状态status参数有误");
        } catch (InvocationTargetException e) {
@@ -103,20 +103,26 @@
     */
    task{
        @Transactional
        public void success(AgvTaskCallBackParam param) {
        public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
            //修改AGV工作档的工作状态为205.工作完成
            agvWrkMastService.updateWrkStsByWrkNo(Integer.valueOf(param.getTaskCode()),205);
            agvWrkMastService.updateWrkStsByWrkNo(agvWrkMast.getWrkNo(),205);
            //出库任务 101.出库 || 103.拣料出库
            if(agvWrkMast.getIoType() == 101 || agvWrkMast.getIoType() == 103){
                //修改出库站点状态
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(),"F",agvWrkMast.getBarcode());
            }
        }
        public void fail(AgvTaskCallBackParam param) {
        public void fail(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void cancel(AgvTaskCallBackParam param) {
        public void cancel(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void suspend(AgvTaskCallBackParam param) {
        public void suspend(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
    },
@@ -125,19 +131,19 @@
     */
    task_allocated{
        @Transactional
        public void success(AgvTaskCallBackParam param) {
        public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void fail(AgvTaskCallBackParam param) {
        public void fail(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void cancel(AgvTaskCallBackParam param) {
        public void cancel(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void suspend(AgvTaskCallBackParam param) {
        public void suspend(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
    },
@@ -146,25 +152,36 @@
     */
    tote_load{
        @Transactional
        public void success(AgvTaskCallBackParam param) {
            //修改源站点状态为O.空,以及解绑托盘条码
            agvBasDevpService.updateLocStsAndBarcodeByDevNo(param.getStationCode(),"O","");
        public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
            //入库任务 || 拣料入库任务
            if(agvWrkMast.getIoType() == 1 || agvWrkMast.getIoType() == 53){
                //修改源站点状态为O.空,以及解绑托盘条码
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(),"O","");
            }
            //出库任务 101.出库 || 103.拣料出库
            if(agvWrkMast.getIoType() == 101 || agvWrkMast.getIoType() == 103){
                //修改源库位状态
            }
            //修改AGV工作档的工作状态为203.RCS放货中
            agvWrkMastService.updateWrkStsByWrkNo(Integer.valueOf(param.getTaskCode()),203);
            //修改AGV入库通知档状态
            //agvWaitPakinService.updateIoStatus(Integer.valueOf(param.getTaskCode()),"Y");
            agvWrkMastService.updateWrkStsByWrkNo(agvWrkMast.getWrkNo(),203);
        }
        public void fail(AgvTaskCallBackParam param) {
        public void fail(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void cancel(AgvTaskCallBackParam param) {
        public void cancel(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void suspend(AgvTaskCallBackParam param) {
        public void suspend(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
    },
@@ -173,86 +190,86 @@
     */
    tote_unload{
        @Transactional
        public void success(AgvTaskCallBackParam param) {
        public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
            //修改工作档状态为204.放货完成
            agvWrkMastService.updateWrkStsByWrkNo(Integer.valueOf(param.getTaskCode()),204);
            agvWrkMastService.updateWrkStsByWrkNo(agvWrkMast.getWrkNo(),204);
        }
        public void fail(AgvTaskCallBackParam param) {
        public void fail(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void cancel(AgvTaskCallBackParam param) {
        public void cancel(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void suspend(AgvTaskCallBackParam param) {
        public void suspend(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
    },
    robot_reach{
        @Transactional
        public void success(AgvTaskCallBackParam param) {
        public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void fail(AgvTaskCallBackParam param) {
        public void fail(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void cancel(AgvTaskCallBackParam param) {
        public void cancel(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void suspend(AgvTaskCallBackParam param) {
        public void suspend(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
    },
    weight{
        @Transactional
        public void success(AgvTaskCallBackParam param) {
        public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void fail(AgvTaskCallBackParam param) {
        public void fail(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void cancel(AgvTaskCallBackParam param) {
        public void cancel(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void suspend(AgvTaskCallBackParam param) {
        public void suspend(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
    },
    rfid{
        @Transactional
        public void success(AgvTaskCallBackParam param) {
        public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void fail(AgvTaskCallBackParam param) {
        public void fail(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void cancel(AgvTaskCallBackParam param) {
        public void cancel(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
        public void suspend(AgvTaskCallBackParam param) {
        public void suspend(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
        }
    };
    //任务状态为成功
    public abstract void success(AgvTaskCallBackParam param);
    public abstract void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param);
    //任务状态为失败
    public abstract void fail(AgvTaskCallBackParam param);
    public abstract void fail(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param);
    //任务状态为取消
    public abstract void cancel(AgvTaskCallBackParam param);
    public abstract void cancel(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param);
    //任务状态为挂起
    public abstract void suspend(AgvTaskCallBackParam param);
    public abstract void suspend(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param);
    @Setter
    AgvBasDevpService agvBasDevpService;
src/main/java/com/zy/asrs/controller/AgvWrkMastController.java
@@ -165,9 +165,9 @@
        if (Cools.isEmpty(agvWrkMastList)){
            return R.error();
        }
        Map<String, List<Map<String, String>>> containerMoveParam = agvWrkMastService.startWrk(agvWrkMastList);
        int startWrkCode = agvWrkMastService.startWrk(agvWrkMastList,"putaway");
        int code = agvWrkMastService.containerMove(containerMoveParam);
        int code = agvWrkMastService.containerMove(agvWrkMastList);
        if(code == 0){
            agvWrkMastList.forEach(agvWrkMast -> {
src/main/java/com/zy/asrs/controller/OutController.java
@@ -287,12 +287,12 @@
                continue;
            }
            //先找AGV的库存,如果返回的issued大于0,则去四项库找
            issued = agvLocDetlService.queryStockAndSetLocDto(vo.getMatnr(),vo.getBatch(),null,locDtoList,issued);
            issued = agvLocDetlService.queryStockAndSetLocDto(vo.getMatnr(),vo.getBatch(),JSON.toJSONString(vo.getOrderDtos()),locDtoList,issued);
            //从四项库的库存里面找,
            issued = locDetlService.queryStockAndSetLocDto(vo.getMatnr(),vo.getBatch(),null,locDtoList,issued);
            issued = locDetlService.queryStockAndSetLocDto(vo.getMatnr(),vo.getBatch(),JSON.toJSONString(vo.getOrderDtos()),locDtoList,issued);
            if (issued > 0) {
                LocDto locDto = new LocDto(null, vo.getMatnr(), vo.getMaktx(), vo.getBatch(), null, issued);
                LocDto locDto = new LocDto(null, vo.getMatnr(), vo.getMaktx(), vo.getBatch(), JSON.toJSONString(vo.getOrderDtos()), issued);
                locDto.setLack(Boolean.TRUE);
                locDtoList.add(locDto);
            }
@@ -377,6 +377,8 @@
            //TODO 假如出库站点不足,记录未出库的库位;
            return;
        }
        agvBasDevp.setLocSts("S");
        agvBasDevpService.updateById(agvBasDevp);
        TaskDto taskDto = new TaskDto(locDto.getLocNo(), agvBasDevp.getDevNo(), locDto);
        //TODO 暂不考虑库位混载状态(后续看情况是否需要判断)
        agvTaskDtos.add(taskDto);
src/main/java/com/zy/asrs/service/AgvWorkService.java
@@ -1,6 +1,7 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.entity.AgvWrkMast;
import com.zy.common.model.StartupDto;
import com.zy.common.model.TaskDto;
@@ -18,5 +19,10 @@
     */
    void stockOutWrkMast(List<TaskDto> agvTaskDtos, Long userId);
    /*
    生成拣料入库任务
     */
    void pickIn(List<AgvWrkMast> agvWrkMastList);
}
src/main/java/com/zy/asrs/service/AgvWrkMastService.java
@@ -5,13 +5,14 @@
import java.io.IOException;
import java.util.List;
import java.util.Map;
public interface AgvWrkMastService extends IService<AgvWrkMast> {
    public void updateWrkStsByWrkNo(int wrkNo, long wrkSts);
    public Map<String,List<Map<String,String>>> startWrk(List<AgvWrkMast> agvWrkMastList) throws IOException;
    public int startWrk(List<AgvWrkMast> agvWrkMastList, String taskType) throws IOException;
    public int containerMove(Map<String, List<Map<String, String>>> containerMoveParam) throws IOException;
    public int containerMove(List<AgvWrkMast> agvWrkMastList) throws IOException;
    public int containerMoveOut(List<AgvWrkMast> agvWrkMastList) throws IOException;
}
src/main/java/com/zy/asrs/service/impl/AgvBasDevpServiceImpl.java
@@ -5,6 +5,7 @@
import com.core.common.Cools;
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.entity.AgvWaitPakin;
import com.zy.asrs.entity.AgvWrkDetl;
import com.zy.asrs.entity.AgvWrkMast;
import com.zy.asrs.mapper.AgvBasDevpMapper;
import com.zy.asrs.service.AgvBasDevpService;
@@ -108,20 +109,36 @@
                AgvBasDevpDto agvBasDevpDto = new AgvBasDevpDto();
                BeanUtils.copyProperties(agvBasDevp, agvBasDevpDto);
                if (Cools.isEmpty(agvBasDevpDto.getBarcode())) {
//                if (Cools.isEmpty(agvBasDevpDto.getBarcode())) {
//                    return agvBasDevpDto;
//                }
                if("O".equals(agvBasDevpDto.getLocSts())){
                    return agvBasDevpDto;
                }
                AgvWaitPakin agvWaitPakin = agvWaitPakinService.selectOne(new EntityWrapper<AgvWaitPakin>()
                        .eq("zpallet", agvBasDevpDto.getBarcode()));
                agvBasDevpDto.setAgvWaitPakin(agvWaitPakin);
//              AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>()
//                        .eq("barcode", agvBasDevpDto.getBarcode()));
                AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>()
                        .eq("barcode", agvBasDevpDto.getBarcode()));
                        .eq("loc_no", agvBasDevpDto.getDevNo())
                        .or().eq("source_loc_no",agvBasDevpDto.getDevNo()));
                agvBasDevpDto.setAgvWrkMast(agvWrkMast);
                if("F".equals(agvBasDevpDto.getLocSts()) || "R".equals(agvBasDevpDto.getLocSts())){
                    AgvWaitPakin agvWaitPakin = agvWaitPakinService.selectOne(new EntityWrapper<AgvWaitPakin>()
                            .eq("zpallet", agvBasDevpDto.getBarcode()));
                    agvBasDevpDto.setAgvWaitPakin(agvWaitPakin);
                    if(Cools.isEmpty(agvWaitPakin)){
                        AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectOne(new EntityWrapper<AgvWrkDetl>().
                                eq("wrk_no",agvWrkMast.getWrkNo()));
                        agvBasDevpDto.setAgvWrkDetl(agvWrkDetl);
                    }
                }
                return agvBasDevpDto;
            }).collect(Collectors.toList());
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -105,13 +105,14 @@
        agvTaskDtos.forEach(taskDto -> {
            AgvLocMast agvLocMast = agvLockMastService.selectById(taskDto.getLocNo());
            AgvLocDetl agvLocDetl = agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("loc_no", taskDto.getLocNo()));
            //工作档所需参数
            double anfme = taskDto.getLocDtos().get(0).getAnfme();
            long wrkSts = 21L;
            String sourceLocNo = taskDto.getLocNo();
            String targetLocNo = taskDto.getAgvStaNo();
            String barcode = agvLocMast.getBarcode();
            String barcode = agvLocDetl.getZpallet();
            //明细档所需参数
            String mantr = taskDto.getLocDtos().get(0).getMatnr();
            String orderNo = taskDto.getLocDtos().get(0).getOrderNo();
@@ -126,9 +127,45 @@
            //修改订单信息
            modifyOrderDetl(taskDto.getLocDtos().get(0), userId);
            //更新源站点信息
            updateAgvLocMast(agvLockMastService.selectById(sourceLocNo),"R");
            String locSts = ioType == 101 ? "R" : "P";
            updateAgvLocMast(agvLockMastService.selectById(sourceLocNo),locSts);
            //更新目标站点状态
            //locSts = ioType == 101 ? "S" : "Q";
            updateAgvBasDevp(agvBasDevpService.selectById(targetLocNo),"S");
        });
    }
    //拣料入库
    @Transactional
    public void pickIn(List<AgvWrkMast> agvWrkMastList){
        Date now = new Date();
        agvWrkMastList.forEach(agvWrkMast -> {
            //修改工作党
            agvWrkMast.setWrkSts(201L);
            agvWrkMast.setIoType(53);
            String locNo = agvWrkMast.getLocNo();
            agvWrkMast.setLocNo(agvWrkMast.getSourceLocNo());
            agvWrkMast.setSourceLocNo(locNo);
            agvWrkMast.setIoTime(now);
            agvWrkMastService.updateById(agvWrkMast);
            AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectOne(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", agvWrkMast.getWrkNo()));
            AgvLocMast agvLocMast = agvLockMastService.selectById(agvWrkMast.getLocNo());
            AgvLocDetl agvLocDetl = agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvLocMast.getLocNo()));
            AgvBasDevp agvBasDevp = agvBasDevpService.selectById(agvWrkMast.getSourceLocNo());
            //修改工作党明细
            agvWrkDetl.setAnfme(agvLocDetl.getAnfme() - agvWrkDetl.getAnfme());
            agvWrkDetlService.update(agvWrkDetl,new EntityWrapper<AgvWrkDetl>().eq("wrk_no",agvWrkDetl.getWrkNo()));
            //修改库存信息
            agvLocDetl.setAnfme(agvWrkDetl.getAnfme());
            agvLocDetlService.update(agvLocDetl,new EntityWrapper<AgvLocDetl>().eq("loc_no",agvLocDetl.getLocNo()));
            //修改库位信息
            agvLocMast.setLocSts("Q");
            agvLockMastService.selectById(agvLocMast);
            //修改站点信息
            agvBasDevp.setLocSts("R");
            agvBasDevpService.updateById(agvBasDevp);
        });
    }
@@ -309,12 +346,26 @@
        }else {
            //合并出库
            List<OrderDto> orderDtoList = JSON.parseArray(locDto.getOrderNo(), OrderDto.class);
            //实际出库数量
            Double locAnfme = locDto.getAnfme();
            //订单实际出库数量
            Double orderAnfme;
            for (OrderDto orderDto : orderDtoList) {
                OrderDetl orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch());
                if (orderDetl == null) {
                    orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), null);
                }
                if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDto.getAnfme())) {
                if(locAnfme > orderDetl.getAnfme()){
                    orderAnfme = orderDetl.getAnfme();
                    locAnfme -= orderAnfme;
                }else {
                    orderAnfme = locAnfme;
                }
                if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), orderAnfme)) {
                    throw new CoolException("修改订单明细数量失败");
                }
                orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java
@@ -9,6 +9,8 @@
import com.zy.asrs.entity.param.AgvTaskParam;
import com.zy.asrs.entity.param.AgvTaskkDescribeParam;
import com.zy.asrs.mapper.AgvWrkMastMapper;
import com.zy.asrs.service.AgvLocMastService;
import com.zy.asrs.service.AgvWrkDetlService;
import com.zy.asrs.service.AgvWrkMastService;
import com.zy.asrs.service.ApiLogService;
import com.zy.common.utils.HttpHandler;
@@ -40,6 +42,10 @@
    @Autowired
    AgvWrkMastMapper agvWrkMastMapper;
    @Autowired
    AgvWrkDetlService agvWrkDetlService;
    @Autowired
    AgvLocMastService agvLocMastService;
    @Autowired
    ApiLogService apiLogService;
    public void updateWrkStsByWrkNo(int wrkNo, long wrkSts) {
@@ -50,37 +56,66 @@
        this.updateById(agvWrkMast);
    }
    // TODO 判断规则
    private boolean checkWrkSts(AgvWrkMast agvWrkMast,long wrkSts){
        // 判断规则TODO
        return true;
    }
    public Map<String,List<Map<String,String>>> startWrk(List<AgvWrkMast> agvWrkMastList) throws IOException {
    public int startWrk(List<AgvWrkMast> agvWrkMastList, String taskType) throws IOException {
        AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam();
        agvTaskCreateParam.setTaskType("putaway");
        agvTaskCreateParam.setTaskType(taskType);
//        //调用容器入场时所需要参数
//        Map<String,List<Map<String,String>>> containerMoveParam = new HashMap<>();
//        List<Map<String,String>> positionCodeMapList = new ArrayList<>();
//        containerMoveParam.put("containerMoveIns",positionCodeMapList);
        getRequestParam(agvTaskCreateParam,agvWrkMastList);
        return doHttpRequest(agvTaskCreateParam,"上架任务下发",url, taskCreatePath,null,"127.0.0.1");
        //return containerMoveParam;
    }
    //容器入场
    public int containerMove(List<AgvWrkMast> agvWrkMastList) throws IOException {
        //调用容器入场时所需要参数
        Map<String,List<Map<String,String>>> containerMoveParam = new HashMap<>();
        List<Map<String,String>> positionCodeMapList = new ArrayList<>();
        containerMoveParam.put("containerMoveIns",positionCodeMapList);
        getRequestParam(agvTaskCreateParam,agvWrkMastList,positionCodeMapList);
        doHttpRequest(agvTaskCreateParam,"上架任务下发",url, taskCreatePath,null,"127.0.0.1");
        return containerMoveParam;
    }
    public int containerMove(Map<String, List<Map<String, String>>> containerMoveParam) throws IOException {
        getContainerMoveParam(agvWrkMastList,positionCodeMapList);
        return doHttpRequest(containerMoveParam,"容器入场任务下发",url, containerMoveInPath,null,"127.0.0.1");
    }
    private void getRequestParam(AgvTaskCreateParam agvTaskCreateParam,List<AgvWrkMast> agvWrkMastList,List<Map<String,String>> positionCodeMapList){
    //容器离场
    public int containerMoveOut(List<AgvWrkMast> agvWrkMastList){
        Map<String,List<Map<String,String>>> containerMoveParam = new HashMap<>();
        List<Map<String,String>> positionCodeMapList = new ArrayList<>();
        containerMoveParam.put("containerMoveOuts",positionCodeMapList);
        for(AgvWrkMast agvWrkMast : agvWrkMastList){
            Map<String,String> positionCodeMap = new HashMap<>();
            positionCodeMap.put("positionCode",agvWrkMast.getLocNo());
            positionCodeMapList.add(positionCodeMap);
        }
        return doHttpRequest(containerMoveParam,"容器入场任务下发",url, containerMoveInPath,null,"127.0.0.1");
    }
    private void getContainerMoveParam(List<AgvWrkMast> agvWrkMastList,List<Map<String,String>> positionCodeMapList){
        //往容器入场参数中放入源站点位置
        for(AgvWrkMast agvWrkMast : agvWrkMastList){
            Map<String,String> positionCodeMap = new HashMap<>();
            positionCodeMap.put("positionCode",agvWrkMast.getSourceLocNo());
            positionCodeMapList.add(positionCodeMap);
        }
    }
    private void getRequestParam(AgvTaskCreateParam agvTaskCreateParam,List<AgvWrkMast> agvWrkMastList){
        List<AgvTaskParam> agvTaskParamList = agvWrkMastList.stream().map(agvWrkMast -> {
            AgvTaskParam agvTaskParam = new AgvTaskParam();
            AgvTaskkDescribeParam agvTaskkDescribeParam = new AgvTaskkDescribeParam();
@@ -88,11 +123,6 @@
            //AgvTaskParam
            agvTaskParam.setTaskCode(agvWrkMast.getWrkNo().toString());
            agvTaskParam.setTaskPriority(agvWrkMast.getIoPri().intValue());
            //往容器入场参数中放入源站点位置
            Map<String,String> positionCodeMap = new HashMap<>();
            positionCodeMap.put("positionCode",agvWrkMast.getSourceLocNo());
            positionCodeMapList.add(positionCodeMap);
            //AgvTaskkDescribeParam
            agvTaskkDescribeParam.setFromLocationCode(agvWrkMast.getSourceLocNo());
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java
@@ -85,32 +85,32 @@
        }
        // 如果 作业数量等于单据总数量 && 工作明细档中无该单据的数据 && AGV工作明细档中无该单据的数据
        if (complete
                && wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("order_no", orderNo)) < 1
                && agvWrkDetlService.selectCount(new EntityWrapper<AgvWrkDetl>().eq("order_no",orderNo)) < 1) {
                && wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().like("order_no", orderNo)) < 1
                && agvWrkDetlService.selectCount(new EntityWrapper<AgvWrkDetl>().like("order_no",orderNo)) < 1) {
            // 出库订单重新整理明细
            DocType docType = docTypeService.selectById(order.getDocType());
            if (null != docType && docType.getPakout() == 1) {
                // 重组明细
                if (!orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_id", order.getId()))) {
                    throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败");
                }
                List<WrkDetl> wrkDetls = wrkDetlService.selectAndLogByOrderNo(orderNo);
                for (WrkDetl wrkDetl : wrkDetls) {
                    OrderDetl orderDetl = new OrderDetl();
                    orderDetl.sync(wrkDetl);
                    orderDetl.setQty(orderDetl.getAnfme());
                    orderDetl.setOrderId(order.getId());
                    orderDetl.setOrderNo(orderNo);
                    orderDetl.setStatus(1);
                    orderDetl.setCreateTime(order.getCreateTime());
                    orderDetl.setCreateBy(order.getCreateBy());
                    orderDetl.setUpdateTime(order.getUpdateTime());
                    orderDetl.setUpdateBy(order.getUpdateBy());
                    if (!orderDetlService.insert(orderDetl)) {
                        throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败");
                    }
                }
            }
//            DocType docType = docTypeService.selectById(order.getDocType());
//            if (null != docType && docType.getPakout() == 1) {
//                // 重组明细
//                if (!orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_id", order.getId()))) {
//                    throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败");
//                }
//                List<WrkDetl> wrkDetls = wrkDetlService.selectAndLogByOrderNo(orderNo);
//                for (WrkDetl wrkDetl : wrkDetls) {
//                    OrderDetl orderDetl = new OrderDetl();
//                    orderDetl.sync(wrkDetl);
//                    orderDetl.setQty(orderDetl.getAnfme());
//                    orderDetl.setOrderId(order.getId());
//                    orderDetl.setOrderNo(orderNo);
//                    orderDetl.setStatus(1);
//                    orderDetl.setCreateTime(order.getCreateTime());
//                    orderDetl.setCreateBy(order.getCreateBy());
//                    orderDetl.setUpdateTime(order.getUpdateTime());
//                    orderDetl.setUpdateBy(order.getUpdateBy());
//                    if (!orderDetlService.insert(orderDetl)) {
//                        throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败");
//                    }
//                }
//            }
            if (!this.updateSettle(order.getId(), 4L, null)) {
                throw new CoolException("修改订单【orderNo = " + order.getOrderNo() + "】状态为已完成失败");
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -27,7 +27,6 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.swing.*;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -446,12 +445,26 @@
            } else {
                // 订单合并出库
                List<OrderDto> orderDtoList = JSON.parseArray(locDto.getOrderNo(), OrderDto.class);
                //实际出库数量
                Double locAnfme = locDto.getAnfme();
                //订单实际出库数量
                Double orderAnfme;
                for (OrderDto orderDto : orderDtoList) {
                    OrderDetl orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch());
                    if (orderDetl == null) {
                        orderDetl = orderDetlService.selectItem(orderDto.getOrderNo(), locDto.getMatnr(), null);
                    }
                    if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDto.getAnfme())) {
                    if(locAnfme > orderDetl.getAnfme()){
                        orderAnfme = orderDetl.getAnfme();
                        locAnfme -= orderAnfme;
                    }else {
                        orderAnfme = locAnfme;
                    }
                    if (!orderDetlService.increase(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), orderAnfme)) {
                        throw new CoolException("修改订单明细数量失败");
                    }
                    orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
@@ -947,9 +960,23 @@
                    }
                } else {
                    // 订单合并出库
                    //实际取消的出库数量
                    Double wrkDetlAnfme = wrkDetl.getAnfme();
                    //订单实际出库数量
                    Double orderAnfme;
                    List<OrderDto> orderDtoList = JSON.parseArray(wrkDetl.getOrderNo(), OrderDto.class);
                    for (OrderDto orderDto : orderDtoList) {
                        if (!orderDetlService.decrease(orderDto.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), orderDto.getAnfme())) {
                        if(wrkDetlAnfme > orderDto.getAnfme()){
                            orderAnfme = orderDto.getAnfme();
                            wrkDetlAnfme -= orderAnfme;
                        }else {
                            orderAnfme = wrkDetlAnfme;
                        }
                        if (!orderDetlService.decrease(orderDto.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), orderAnfme)) {
                            throw new CoolException("订单数据回滚失败");
                        }
                    }
src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java
@@ -16,7 +16,12 @@
import java.util.List;
/**
 * 定时处理AGV工作档中工作状态为205.工作完成的数据
 * 任务类型:
 *  putaway:上架。
 *  carry:搬运,统指出库、移库、点到点搬运等。
 *  scan:扫描盘点。
 *  weight:称重盘点。
 *  rfid:rfid盘点。
 */
@Slf4j
@Component
@@ -27,11 +32,16 @@
    @Autowired
    AgvWrkMastService agvWrkMastService;
    /*
    定时处理AGV工作档中工作状态为205.工作完成 且 (1.入库 || 53,拣料入库)的数据
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    public void excutePutwayWrk(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 205)
                .eq("io_type",1));
                .andNew().eq("io_type",53)
                .or().eq("io_type",1));
        if(!Cools.isEmpty(agvWrkMastList)){
            agvWrkMastList.stream().forEach(agvWrkMast -> {
                ReturnT<String> returnT = agvWrkMastHandler.completedPutWayWrk(agvWrkMast);
@@ -39,12 +49,31 @@
        }
    }
    /*
    定时处理AGV工作档中工作状态为205.工作完成 且 101出库类型的数据
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    public void excuteCarryWrk(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 207)
                .eq("io_type",101));
        if(!Cools.isEmpty(agvWrkMastList)){
            agvWrkMastList.stream().forEach(agvWrkMast -> {
                ReturnT<String> returnT = agvWrkMastHandler.completedCarryWrk(agvWrkMast);
            });
        }
    }
    /*
    putaway:上架
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    public void startPutwayWrk(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectPage(new Page<>(1, 50)
                ,new EntityWrapper<AgvWrkMast>()
                .eq("wrk_sts", 201)
                .eq("wrk_sts", 201)   //201.生成入库任务ID
                .andNew().eq("io_type", 53).or() //53.拣料再入库
                .eq("io_type", 1)).getRecords();
        if(!Cools.isEmpty(agvWrkMastList)){
@@ -55,4 +84,25 @@
            }
        }
    }
    /*
    carry:搬运,统指出库、移库、点到点搬运等
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    public void startCarryWrk(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectPage(new Page<>(1, 50)
                ,new EntityWrapper<AgvWrkMast>()
                        .eq("wrk_sts", 21)   //21.生成出库任务
                        .andNew().eq("io_type", 101).or()
                        .eq("io_type", 103)).getRecords();
        if(!Cools.isEmpty(agvWrkMastList)){
            try {
                ReturnT<String> returnT = agvWrkMastHandler.startCarryWrk(agvWrkMastList);
            } catch (IOException e) {
                log.error(e.getMessage());
            }
        }
    }
}
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -1,6 +1,9 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.AgvLocDetl;
import com.zy.asrs.entity.AgvWaitPakin;
import com.zy.asrs.entity.AgvWrkDetl;
import com.zy.asrs.entity.AgvWrkMast;
@@ -48,39 +51,102 @@
        agvWrkMastService.updateById(agvWrkMast);
        //修改目标库位状态为F.在库
        agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"F");
        //更新目标库位明细
        agvLocDetlService.addLocDetlInfo(agvWrkMast.getLocNo(),wrkNo);
        //生成AGV工作历史档
        agvWrkMastLogService.save(wrkNo);
        //生成AGV工作明细历史档
        agvWrkDetlLogService.save(wrkNo);
        //生成入库通知历史档
        agvWaitPakinLogService.save(barcode);
        //删除AGV工作档
        agvWrkMastService.deleteById(wrkNo);
        //删除AGV工作明细档
        agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo));
        //删除入库通知档
        agvWaitPakinService.delete(new EntityWrapper<AgvWaitPakin>().eq("zpallet",barcode));
        if(agvWrkMast.getIoType() == 1){
            //更新目标库位明细
            agvLocDetlService.addLocDetlInfo(agvWrkMast.getLocNo(),wrkNo);
            //生成入库通知历史档
            agvWaitPakinLogService.save(barcode);
            //删除入库通知档
            agvWaitPakinService.delete(new EntityWrapper<AgvWaitPakin>().eq("zpallet",barcode));
        //检查订单是否已完成
        orderService.checkComplete(orderNo);
        }
        if(!isJSON(orderNo)){
            //检查订单是否已完成
            orderService.checkComplete(orderNo);
        }else{
            List<Map> maps = JSONArray.parseArray(orderNo, Map.class);
            maps.forEach(map -> {
                String o = map.get("orderNo").toString();
                orderService.checkComplete(o);
            });
        }
        return SUCCESS;
    }
    @Transactional
    public ReturnT<String> startPutWayWrk(List<AgvWrkMast> agvWrkMastList) throws IOException {
        Map<String, List<Map<String, String>>> containerMoveParam = agvWrkMastService.startWrk(agvWrkMastList);
    public ReturnT<String> completedCarryWrk(AgvWrkMast agvWrkMast) {
        int wrkNo = agvWrkMast.getWrkNo();
        String orderNo = getOrderNoByWrkNo(wrkNo);
        //修改工作档状态为206.库存更新完成
        agvWrkMast.setWrkSts(206L);
        agvWrkMastService.updateById(agvWrkMast);
        //修改源库位状态为O
        agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O");
        //更新目标库位明细
        agvLocDetlService.delete(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvWrkMast.getSourceLocNo()));
        //生成AGV工作历史档
        agvWrkMastLogService.save(wrkNo);
        //生成AGV工作明细历史档
        agvWrkDetlLogService.save(wrkNo);
        //删除AGV工作档
        agvWrkMastService.deleteById(wrkNo);
        //删除AGV工作明细档
        agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo));
        if(!isJSON(orderNo)){
            //检查订单是否已完成
            orderService.checkComplete(orderNo);
        }else{
            List<Map> maps = JSONArray.parseArray(orderNo, Map.class);
            maps.forEach(map -> {
                String o = map.get("orderNo").toString();
                orderService.checkComplete(o);
            });
        }
        return SUCCESS;
    }
        int code = agvWrkMastService.containerMove(containerMoveParam);
    @Transactional
    public ReturnT<String> startPutWayWrk(List<AgvWrkMast> agvWrkMastList) throws IOException {
        int startWwrkCode = agvWrkMastService.startWrk(agvWrkMastList,"putaway");
        int code = agvWrkMastService.containerMove(agvWrkMastList);
        if(code == 0){
            agvWrkMastList.forEach(agvWrkMast -> {
                //202.RCS取货中
                agvWrkMast.setWrkSts((long)202);
                //修改AGV入库通知档状态入出状态为Y
                agvWaitPakinService.updateIoStatus(agvWrkMast.getWrkNo(),"Y");
                agvWrkMastService.updateById(agvWrkMast);
                if(agvWrkMast.getIoType() == 1){
                    //修改AGV入库通知档状态入出状态为Y
                    agvWaitPakinService.updateIoStatus(agvWrkMast.getWrkNo(),"Y");
                }
            });
            //agvWrkMastService.updateBatchById(agvWrkMastList);
            return SUCCESS;
        }
        return FAIL;
    }
    @Transactional
    public ReturnT<String> startCarryWrk(List<AgvWrkMast> agvWrkMastList) throws IOException {
        int code = agvWrkMastService.startWrk(agvWrkMastList,"carry");
        if(code == 0){
            agvWrkMastList.forEach(agvWrkMast -> {
                //202.RCS取货中
                agvWrkMast.setWrkSts((long)202);
                agvWrkMastService.updateById(agvWrkMast);
            });
            //agvWrkMastService.updateBatchById(agvWrkMastList);
@@ -95,4 +161,28 @@
        AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectOne(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", wrkNo));
        return agvWrkDetl.getOrderNo();
    }
    public static void main(String[] args) {
        String order = "[{\"anfme\":50.0,\"orderNo\":\"CS110011001111\"},{\"anfme\":50.0,\"orderNo\":\"CS110011001110\"}]";
        List<Map> maps = JSONArray.parseArray(order, Map.class);
        maps.forEach(map -> {
            Object orderNo = map.get("orderNo");
            System.out.println(orderNo );
        });
    }
    private boolean isJSON(String str) {
        if (Cools.isEmpty(str)) {
            return false;
        } else {
            str = str.trim();
            if (str.startsWith("{") && str.endsWith("}")) {
                return true;
            } else if (str.startsWith("[") && str.endsWith("]")) {
                return true;
            } else {
                return false;
            }
        }
    }
}
src/main/java/com/zy/common/model/AgvBasDevpDto.java
@@ -2,6 +2,7 @@
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.entity.AgvWaitPakin;
import com.zy.asrs.entity.AgvWrkDetl;
import com.zy.asrs.entity.AgvWrkMast;
import lombok.Data;
@@ -15,4 +16,6 @@
    private AgvWaitPakin agvWaitPakin;
    private AgvWrkDetl agvWrkDetl;
}
src/main/webapp/static/js/agvBasDevp/basDevp.js
@@ -385,7 +385,7 @@
                    layer.msg("此站点的状态不存在物料");
                    return;
                }
                locDetlToLayer(data.barcode);
                locDetlToLayer(data.devNo,data.barcode);
                break;
            case 'unbind':
                // locDetl(data.locNo);
@@ -572,8 +572,9 @@
    }
    // iframe物料详情
    function locDetlToLayer(val) {
        barcode = val;
    function locDetlToLayer(val1,val2) {
        devNo = val1;
        barcode = val2;
        layer.open({
            type: 2,
            title: '站点明细',
src/main/webapp/static/js/common.js
@@ -220,7 +220,8 @@
]
var detlCols = [
    ,{field: 'zpallet', align: 'center',title: '托盘条码', width: 110}
    ,{field: 'zpallet', align: 'center',title: '托盘条码', hide: true}
    ,{field: 'zpallet', align: 'center',title: '托盘条码', hide: false}
    ,{field: 'matnr', align: 'center',title: '物料号'}
    ,{field: 'batch', align: 'center',title: '序列码', width: 300, sort:true, hide: false}
    ,{field: 'maktx', align: 'center',title: '物料名称'}
src/main/webapp/views/agvBasDevp/basDevpWaitPakinDetail.html
@@ -52,16 +52,16 @@
        }else {
            $('#zpallet').val(tmp);
        }
        // 数据渲染
        tableIns = table.render({
            elem: '#locDetlByMap',
            headers: {token: localStorage.getItem('token')},
            url: baseUrl+'/agv/waitPakin/list/auth',
            url: baseUrl+'/agv/basDevp/detail/list/auth',
            page: true,
            limit: 20,
            skin: 'line',
            where: {zpallet: $('#zpallet').val()},
            //where: {zpallet: $('#zpallet').val()},
            where: {devNo: parent.devNo},
            even: true,
            cellMinWidth: 50,
            cols: [getCol()],
src/main/webapp/views/agvBasDevpVisualized/basDevp.html
@@ -57,6 +57,19 @@
                    <input type="checkbox" lay-skin="primary" name="cardCheckBox" value="{{devNo}}"/>
                </div>
                <div style="float:right; width:85%;">
<!--                    <div>-->
<!--                        <button type="button" class="layui-btn layui-btn-normal" value="{{devNo}}">拣料入库</button>-->
<!--                    </div>-->
                    {{#if agvWrkDetl}}
                    <div style=" padding-bottom: 20px">
                        <button type="button" class="layui-btn layui-btn-normal" value="{{devNo}}" lay-submit lay-filter="containerMoveOut">容器离场</button>
                        <button type="button" class="layui-btn layui-btn-normal" value="{{devNo}}" lay-submit lay-filter="pickIn">拣料入库</button>
                    </div>
                    {{/if}}
                    <div>
                        工作站编码:{{devNo}} </br>
                        站点状态:{{locSts$}}
@@ -76,6 +89,16 @@
                        工作号:{{agvWrkMast.wrkNo}} </br>
                        工作状态:{{agvWrkMast.wrkSts$ }} </br>
                        工作类型:{{agvWrkMast.ioType$}}
                    </div>
                    {{/if}}
                    {{#if agvWrkDetl}}
                    <div style="padding-top: 10px;">
                        物料号:{{agvWrkDetl.matnr}} </br>
                        {{#if agvWrkDetl.batch}}
                        序列码:{{agvWrkDetl.batch}} </br>
                        {{/if}}
                        托盘码:{{agvWrkDetl.zpallet}} </br>
                        数量:{{agvWrkDetl.anfme}}
                    </div>
                    {{/if}}
                </div>
@@ -114,6 +137,7 @@
        var table = layui.table;
        var layer = layui.layer;
        var param = {'stationCode' : 'CS-101'};
        loadData(param);
        form.on('select(floorSelect)', function (data) {
@@ -136,26 +160,6 @@
            param = null;
            param = {'stationCode' : $('#rowSelect').val()};
            loadData(param);
            // $.ajax({
            //     url: baseUrl+"/agv/basDevp/visualized/list/auth",
            //     headers: {'token': localStorage.getItem('token')},
            //     data: JSON.stringify(param),
            //     dataType:'json',
            //     contentType:'application/json;charset=UTF-8',
            //     method: 'POST',
            //     success: function (res) {
            //         if (res.code === 200){
            //             var tpl = $("#basDevpMapTemplate").html();
            //             var template = Handlebars.compile(tpl);
            //             var html = template(res.data);
            //             $('#basDevpMap').html(html);
            //         } else if (res.code === 403){
            //             top.location.href = baseUrl+"/";
            //         }else {
            //             layer.msg(res.msg)
            //         }
            //     }
            // })
        });
        //全选
@@ -172,6 +176,57 @@
            for (var i = 0; i < cks.length; i++) {
                cks[i].checked = !cks[i].checked;
            }
        });
        //容器离场
        form.on('submit(containerMoveOut)', function () {
            var devNoList = [];
            devNoList.push(this.value);
            var moveOutParam = {'devNo' : devNoList};
            $.ajax({
                url: baseUrl+"/agv/basDevp/visualized/container/moveOut",
                headers: {'token': localStorage.getItem('token')},
                data: JSON.stringify(moveOutParam),
                dataType:'json',
                contentType:'application/json;charset=UTF-8',
                method: 'POST',
                success: function (res) {
                    if (res.code === 200){
                        layer.msg(res.msg);
                        loadData(param);
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    } else {
                        layer.msg(res.msg)
                    }
                }
            })
        });
        //拣料入库
        form.on('submit(pickIn)', function () {
            var devNoList = [];
            devNoList.push(this.value);
            var pickInParam = {'devNo' : devNoList};
            $.ajax({
                url: baseUrl+"/agv/basDevp/visualized/container/pickIn",
                headers: {'token': localStorage.getItem('token')},
                data: JSON.stringify(pickInParam),
                dataType:'json',
                contentType:'application/json;charset=UTF-8',
                method: 'POST',
                success: function (res) {
                    if (res.code === 200){
                        layer.msg(res.msg);
                        loadData(param);
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    } else {
                        layer.msg(res.msg)
                    }
                }
            })
        });
        //启动入库
@@ -206,9 +261,9 @@
        //定时刷新数据
        //setInterval(loadData(param), 1000);
        setInterval(function() {
            loadData(param);
        }, 1000);
        // setInterval(function() {
        //     loadData(param);
        // }, 1000);
        function loadData(param){
            $.ajax({
src/main/webapp/views/mat/mat.html
@@ -459,7 +459,7 @@
                </div>
            </td>
        </tr>
        <tr style="height: 74px; font-size: 18px;font-weight: 400">
        <tr style="height: 50px; font-size: 18px;font-weight: 400">
            <td width="50px" align="center" colspan="1">规格</td>
            <td align="center" colspan="3" style="
                overflow:hidden;