自动化立体仓库 - WMS系统
优化agv工作档生成
组托时管控料箱码
拣料出库时生成工作党
AGV库存主档,工作主档的barcode也要记录料箱条码号
AGV工作党任务完成、取消优化
自动补货 管控不带料箱的托盘
盘点加上楼层选择
23个文件已修改
352 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvBasDevpController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvIoWorkController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvLocDetlController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/AgvBasDevpMapper.java 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvLocDetlService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvLocMastService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvWrkMastService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvBasDevpServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvLocDetlServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvLocMastServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoReplenishmentScheduler.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoReplenishmentHandler.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvLocDetl/locDetl.js 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/agvLocDetl/locDetl.html 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/agvPakStore/locDetlCheckQuery.html 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/pakStore/locDetlCheckQuery.html 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvBasDevpController.java
@@ -6,10 +6,7 @@
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.LocMastInitParam;
@@ -217,7 +214,7 @@
        try {
            devNos = (List<String>) map.get("devNo");
            agvWrkMastList = devNos.stream().map(devNo -> {
                AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo));
                AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo).eq("wrk_sts",205L));
                if(agvWrkMast.getIoType() != 101 && agvWrkMast.getIoType() != 110){
                    throw new CoolException("工作号为" + agvWrkMast.getWrkNo() + "类型不为101.出库,无法执行容器离场任务,请重新选择站点。");
                }
@@ -275,7 +272,7 @@
        try {
            devNos = (List<String>) map.get("devNo");
            agvWrkMastList = devNos.stream().map(devNo -> {
                AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo));
                AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo).eq("wrk_sts",205L));
                if(agvWrkMast.getIoType() == 101){
                    throw new CoolException("工作号为" + agvWrkMast.getWrkNo() + "类型为101.出库,无法执行拣料入库任务,请重新选择站点。");
                }
@@ -283,7 +280,7 @@
            }).collect(Collectors.toList());
        }catch (Exception e){
            String devNo = map.get("devNo").toString();
            AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo));
            AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo).eq("wrk_sts",205L));
            if(agvWrkMast.getIoType() == 101){
                throw new CoolException("工作号为" + agvWrkMast.getWrkNo() + "类型为101.出库,无法执行拣料入库任务,请重新选择站点。");
            }
src/main/java/com/zy/asrs/controller/AgvIoWorkController.java
@@ -66,6 +66,10 @@
                param.remove("row");
            }
        }
        if(!Cools.isEmpty(param.get("floor"))){
            wrapper.like("loc_no","@"+param.get("floor"));
            param.remove("floor");
        }
        excludeTrash(param);
        convert(param, wrapper);
        allLike(AgvLocDetl.class, param.keySet(), wrapper, condition);
src/main/java/com/zy/asrs/controller/AgvLocDetlController.java
@@ -20,6 +20,7 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@@ -145,6 +146,14 @@
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/locDetl/compare/auth")
    @ManagerAuth(memo = "库存明细比对")
    public R compareLocDetl(MultipartFile file) throws IOException {
        agvLocDetlService.compareToEss(file);
        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/mapper/AgvBasDevpMapper.java
src/main/java/com/zy/asrs/service/AgvLocDetlService.java
@@ -5,7 +5,9 @@
import com.zy.asrs.entity.AgvLocDetl;
import com.zy.common.model.LocDto;
import com.zy.common.model.TaskDto;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
public interface AgvLocDetlService extends IService<AgvLocDetl> {
@@ -39,4 +41,6 @@
    public AgvLocDetl selectLocdetl(String locNo,String matnr,String batch,String csocode,String isocode);
    public void compareToEss(MultipartFile file) throws IOException;
}
src/main/java/com/zy/asrs/service/AgvLocMastService.java
@@ -18,7 +18,7 @@
    void updateLocType2ByRBL(Integer locType2, AgvLocRule locRule);
    public void updateLocStsByLocNo(String locNo, String locSts);
    public void updateLocStsByLocNo(String locNo, String locSts, String barcode);
    public List<String> queryGroupEmptyStock(int floor);
src/main/java/com/zy/asrs/service/AgvWrkMastService.java
@@ -24,4 +24,6 @@
    public List<AgvWrkMast> selectReadyAgvWrkMast();
    public AgvWrkMast selectByContainerCode(String containerCode);
}
src/main/java/com/zy/asrs/service/impl/AgvBasDevpServiceImpl.java
@@ -102,7 +102,9 @@
            List<String> list = this.selectCacheShelvesStationCodeByFloor(3);
            if(list.contains(stationCode)){
                if(Cools.eq(stationCode,"CS-305") || Cools.eq(stationCode,"CS-306") || Cools.eq(stationCode,"CS-307")){
                wrapper.orderBy("dev_no",false);
                }
            }
            List<AgvBasDevp> agvBasDevpList = this.selectList(wrapper);
@@ -118,10 +120,21 @@
                    return agvBasDevpDto;
                }
                AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>()
                List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>()
                        .eq("loc_no", agvBasDevpDto.getDevNo())
                        .or().eq("source_loc_no",agvBasDevpDto.getDevNo()));
                AgvWrkMast agvWrkMast = null;
                for (AgvWrkMast wrkMast : agvWrkMasts){
                    if(Cools.isEmpty(agvWrkMast)){
                        agvWrkMast = wrkMast;
                    }else {
                        if(agvWrkMast.getWrkSts() < wrkMast.getWrkSts()){
                            agvWrkMast = wrkMast;
                        }
                    }
                }
                agvBasDevpDto.setAgvWrkMast(agvWrkMast);
                if("F".equals(agvBasDevpDto.getLocSts()) || "R".equals(agvBasDevpDto.getLocSts())){
src/main/java/com/zy/asrs/service/impl/AgvLocDetlServiceImpl.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.AgvLocDetl;
import com.zy.asrs.entity.AgvLocMast;
import com.zy.asrs.entity.AgvWrkDetl;
@@ -17,11 +18,21 @@
import com.zy.common.model.LocDto;
import com.zy.common.model.TaskDto;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@@ -191,5 +202,47 @@
        return this.baseMapper.selectLocdetl(locNo,matnr,batch,csocode,isocode);
    }
    @Override
    public void compareToEss(MultipartFile file) throws IOException {
        InputStream inStream = file.getInputStream();
        String fileMime = file.getContentType();
        int excelVersion = 2007;
        if ("application/vnd.ms-excel".equals(fileMime)) {
            excelVersion = 2003;
        }
        Workbook book = null;
        try {
            if (excelVersion == 2003) {
                book = new HSSFWorkbook(inStream);
            }
            else {  // 当 excel 是 2007 时
                book = new XSSFWorkbook(inStream);
            }
        } catch (Exception e) {
            log.error("fail", e);
            throw new CoolException("导入文件格式错误,请使用xls后缀的文件!");
        }
        Sheet sheet = book.getSheetAt(0);
        int totalRows = sheet.getLastRowNum() + 1;    // 总
        Date now = new Date();
        DataFormatter dataFormatter = new DataFormatter();
        for (int i = 0; i < totalRows; i++) {
            Row row = sheet.getRow(i);
            // 库位号
            String locNo = dataFormatter.formatCellValue(row.getCell(0));
            // 容器码
            String containerCode = dataFormatter.formatCellValue(row.getCell(1));
            List<AgvLocDetl> agvLocDetls = this.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", locNo).eq("supp_code", containerCode));
            if(Cools.isEmpty(agvLocDetls)){
                log.info("库位号:" + locNo + ",容器码:" + containerCode + ",不存在明细");
            }
            if(agvLocDetls.size()>1){
                log.info("库位号:" + locNo + ",容器码:" + containerCode + ",存在1条以上记录");
            }
        }
    }
}
src/main/java/com/zy/asrs/service/impl/AgvLocMastServiceImpl.java
@@ -137,9 +137,10 @@
        this.baseMapper.updateLocType2(locType2,locRule.getRowBeg(),locRule.getRowEnd(),locRule.getBayBeg(),locRule.getBayEnd(),locRule.getLevBeg(),locRule.getLevEnd(),locRule.getFloor());
    }
    public void updateLocStsByLocNo(String locNo, String locSts) {
    public void updateLocStsByLocNo(String locNo, String locSts, String barcode) {
        AgvLocMast agvLocMast = this.selectById(locNo);
        agvLocMast.setLocSts(locSts);
        agvLocMast.setBarcode(barcode);
        this.updateById(agvLocMast);
    }
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java
@@ -40,6 +40,8 @@
    private AgvBasDevpService agvBasDevpService;
    @Autowired
    private AgvLocDetlService agvLocDetlService;
    @Autowired
    private AgvWrkMastService agvWrkMastService;
    /*
@@ -54,12 +56,17 @@
        //检查是否已存在相同的托盘条码,存在则抛出异常
        if (agvWaitPakinService.selectCount(new EntityWrapper<AgvWaitPakin>().eq("supp_code", param.getBarcode())) > 0) {
            throw new CoolException(param.getBarcode() + "数据正在进行入库");
            throw new CoolException(param.getBarcode() + "料想码已存在AGV入库通知档中");
        }
        //检查库存是否有相同料箱,存在则抛出异常
        if(!Cools.isEmpty(agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("supp_code",param.getBarcode())))){
            throw new CoolException(param.getBarcode() + "料箱码已在库存中");
            throw new CoolException(param.getBarcode() + "料箱码已存在AGV库存明细中");
        }
        //查看工作档是否有相同料箱,存在则抛出异常
        if(!Cools.isEmpty(agvWrkMastService.selectByContainerCode(param.getBarcode()))){
            throw new CoolException(param.getBarcode() + "料箱码已存在AGV工作档中");
        }
        if (Cools.isEmpty(param.getOrderNo())) {
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -90,12 +90,10 @@
            //检索库位,选择合适的库位
            AgvLocMast agvLocMast = agvCommonService.getLocNo(agvWaitPakinList, agvBasDevp.getFloor());
            //生成工作档
            //AgvWrkMast wrkMast = createWrkMast(agvBasDevp, agvLocMast, now, userId);
            AgvWrkMast wrkMast = createWrkMast(1,201L,agvBasDevp.getDevNo(),agvLocMast.getLocNo(),agvBasDevp.getBarcode(),now,userId, isConveyor);
            //标记是否为输送线入库
            wrkMast.setMk(isConveyor ? "Y" : "N");
            //生成工作档明细
            //createWrkDetlReWrite(agvWaitPakinList,wrkMast,userId);
            agvWaitPakinList.forEach(wp -> {
                createWrkDetlReWrite(wp.getMatnr(),wrkMast.getWrkNo(),wp.getOrderNo(),wp.getBatch(),wp.getAnfme(),wp.getSuppCode(),now,userId,wp.getThreeCode(),wp.getDeadTime());
            });
@@ -170,6 +168,11 @@
    public void pickIn(List<AgvWrkMast> agvWrkMastList){
        Date now = new Date();
        agvWrkMastList.forEach(agvWrkMast -> {
            //保存拣料出库的工作档和明细
            agvWrkMastLogService.save(agvWrkMast);
            agvWrkDetlLogService.save(agvWrkMast.getWrkNo());
            //修改工作党
            agvWrkMast.setWrkSts(201L);
@@ -504,7 +507,6 @@
            throw new CoolException(workNo+"工作档不存在");
        }
        if(wrkMast.getWrkSts() > 202){
            //修改AGV工作档的工作状态为205.工作完成
            agvWrkMastService.updateWrkStsByWrkNo(wrkMast.getWrkNo(),205);
@@ -516,7 +518,6 @@
            //出库任务 110.空板出库
            if(wrkMast.getIoType() == 110){
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(wrkMast.getLocNo(),"F",wrkMast.getBarcode());
            }
        }
    }
@@ -532,15 +533,13 @@
            throw new CoolException("当前任务不可取消");
        }
        //AGV机器人未取货前取消
        if(wrkMast.getWrkSts() < 203){
            //入库取消
            if(wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10){
                //源站点
                String devNo = wrkMast.getSourceLocNo();
                //目标库位
                String locNo = wrkMast.getLocNo();
                agvLocMastService.updateLocStsByLocNo(locNo,"O");
            agvLocMastService.updateLocStsByLocNo(locNo,"O","");
                agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"F",wrkMast.getBarcode());
                //出库取消
@@ -549,13 +548,12 @@
                String locNo = wrkMast.getSourceLocNo();
                //目标站点
                String devNo = wrkMast.getLocNo();
                agvLocMastService.updateLocStsByLocNo(locNo,"F");
            agvLocMastService.updateLocStsByLocNo(locNo,"F",wrkMast.getBarcode());
                if(devNo.contains("@")){
                    agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"O","");
                }
            }
        }
        //订单回滚
        //List<AgvWrkDetl> agvWrkDetlList = agvWrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java
@@ -143,6 +143,11 @@
        //return this.baseMapper.selectReadyAgvWrkMast();
    }
    @Override
    public AgvWrkMast selectByContainerCode(String containerCode) {
        return this.selectOne(new EntityWrapper<AgvWrkMast>().eq("barcode",containerCode));
    }
    private void getContainerMoveParam(List<AgvWrkMast> agvWrkMastList,List<Map<String,String>> positionCodeMapList){
        //往容器入场参数中放入源站点位置
        for(AgvWrkMast agvWrkMast : agvWrkMastList){
src/main/java/com/zy/asrs/task/AgvWrkMastScheduler.java
@@ -122,7 +122,7 @@
    /*
    定时处理等待执行的任务 工作状态为21.生成出库任务 且目标库位中不含@字符
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    @Scheduled(cron = "0/10 * * * * ? ")
    public void dealWatiWrk(){
        List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectReadyAgvWrkMast();
        if(!Cools.isEmpty(agvWrkMastList)){
@@ -132,6 +132,5 @@
                log.error(e.getMessage());
            }
        }
    }
}
src/main/java/com/zy/asrs/task/AutoReplenishmentScheduler.java
@@ -5,6 +5,7 @@
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.Order;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.MatService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.task.handler.AutoReplenishmentHandler;
import lombok.extern.slf4j.Slf4j;
@@ -24,12 +25,22 @@
    private DocTypeService docTypeService;
    @Autowired
    private AutoReplenishmentHandler autoReplenishmentHandler;
    @Autowired
    private MatService matService;
    /*
    定时便利库存,生成自动补货单据
     */
    //@Scheduled(cron = "0/5 * * * * ? ")
    public void createOrder(){
    }
    /*
    定时处理自动补货单据
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    public void excute(){
    public void excuteOrder(){
        DocType docType = docTypeService.selectOne(new EntityWrapper<DocType>().eq("doc_name", "自动补货单"));
        List<Order> orderList = orderService.selectList(new EntityWrapper<Order>()
                .eq("doc_type", docType.getDocId())
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -8,6 +8,7 @@
import com.zy.asrs.service.*;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -57,10 +58,10 @@
        agvWrkMastService.updateById(agvWrkMast);
        if(agvWrkMast.getIoType() == 10){
            // 空板入库 设置库位状态为D.空桶/空栈板
            agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"D");
            agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"D",agvWrkMast.getBarcode());
        }else{
            //修改目标库位状态为F.在库
            agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"F");
            agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"F",agvWrkMast.getBarcode());
        }
        //生成AGV工作历史档
        agvWrkMastLogService.save(agvWrkMast);
@@ -82,7 +83,7 @@
            //更新库存明细
            agvLocDetlService.updateStock(agvWrkMast.getSourceLocNo(),agvWrkMast.getLocNo());
            //修改源库位状态为O
            agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O");
            agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O","");
        }
        //删除AGV工作档
@@ -113,7 +114,7 @@
        agvWrkMast.setWrkSts(207L);
        agvWrkMastService.updateById(agvWrkMast);
        //修改源库位状态为O
        agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O");
        agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O","");
        if(agvWrkMast.getIoType() == 101){
            //更新目标库位明细 101.出库 删除源库位库存明细
            agvLocDetlService.delete(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvWrkMast.getSourceLocNo()));
@@ -162,7 +163,6 @@
                        continue;
                    }
                }
                //202.RCS取货中
                agvWrkMast.setWrkSts(202L);
                agvWrkMastService.updateById(agvWrkMast);
@@ -171,10 +171,8 @@
                    agvWaitPakinService.updateIoStatus(agvWrkMast.getWrkNo(),"Y");
                }
            }
            return SUCCESS;
        }
        return FAIL;
    }
@@ -195,17 +193,11 @@
        return FAIL;
    }
    @Synchronized
    @Transactional
    public ReturnT<String> dealWatiWrk(List<AgvWrkMast> agvWrkMastList) throws IOException {
        agvWrkMastList.forEach(agvWrkMast -> {
//            //寻找空站点位置
//            AgvBasDevp agvBasDevp = agvBasDevpService.selectEmptyDevpByStation(agvWrkMast.getLocNo());
//            if(!Cools.isEmpty(agvBasDevp)){
//                agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvBasDevp.getDevNo(),"S",null);
//                agvWrkMast.setLocNo(agvBasDevp.getDevNo());
//                agvWrkMastService.updateById(agvWrkMast);
//            }
            //查询该站点所有暂存位在工作档中出现的次数
            List<Map<String, Object>> devNoMaps = agvBasDevpService.selectDevNoAndNumBystationCode(agvWrkMast.getLocNo());
            //取第一个暂存位,并查询其次数与配置的次数做比较
@@ -213,8 +205,8 @@
            if((int)devNoMap.get("num") < maxWrokNum){
                agvWrkMast.setLocNo(devNoMap.get("dev_no").toString());
                agvWrkMastService.updateById(agvWrkMast);
                log.info("after:" + devNoMap.toString()  +  ", wrkNo:" + agvWrkMast.getWrkNo() + ", locNo: " + agvWrkMast.getLocNo());
            }
        });
        return SUCCESS;
src/main/java/com/zy/asrs/task/handler/AutoReplenishmentHandler.java
@@ -1,11 +1,13 @@
package com.zy.asrs.task.handler;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.*;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import org.springframework.beans.BeanUtils;
@@ -13,10 +15,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
@Service
public class AutoReplenishmentHandler extends AbstractHandler<String> {
@@ -84,7 +83,10 @@
            //List<String> locNosSearch = locDetlService.selectLocNo(matnr);
            Set<String> locNosSearch = locDetlService.selectLocNo(matnr, batch, csocode, isocode);
            for(String locNo : locNosSearch){
            //重新排序 并且检测该库位是否含没有料箱码的物料,如有有则不允许出库
            Set<String> resort = resort(locNosSearch);
            for(String locNo : resort){
                List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo);
                locNos.add(locNo);
                for (LocDetl locDetl :locDetls){
@@ -100,37 +102,44 @@
            }
        }
//        orderDetlList.forEach(orderDetl -> {
//
//            if(orderDetl.getAnfme() - orderDetl.getQty() <= 0){
//                cont
//            }
//
//            String matnr = orderDetl.getMatnr();
//            Double orderAnfme = orderDetl.getAnfme();
//
//            List<String> locNosSearch = locDetlService.selectLocNo(matnr);
//
//            for(String locNo : locNosSearch){
//                List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo);
//                locNos.add(locNo);
//                for (LocDetl locDetl :locDetls){
//                    if(matnr.equals(locDetl.getMatnr())){
//                        orderAnfme -= locDetl.getAnfme();
//                    }
//                }
//                if(orderAnfme <= 0){
//                    orderDetl.setQty(orderDetl.getAnfme() - orderAnfme);
//                    orderDetlService.updateById(orderDetl);
//                    break;
//                }
//            }
//
//        });
        return locNos;
    }
    //根据深浅库位进行重新排序
    private Set<String> resort(Set<String> locNos){
        Set<String> locNosResort = new LinkedHashSet<>();
        for(String locNoSearch : locNos){
            LocMast locMast = locMastService.selectById(locNoSearch);
            if(!"F".equals(locMast.getLocSts())){
                continue;
            }
            List<String> groupOuterLoc = Utils.getGroupOuterLoc(locNoSearch);
            if(Cools.isEmpty(groupOuterLoc)){
                locNosResort.add(locNoSearch);
            }else {
                groupOuterLoc.add(locNoSearch);
                //如果是深库位,则先找外侧的库位
                for (String locNoOut : groupOuterLoc){
                    LocMast locMastOuter = locMastService.selectById(locNoOut);
                    //外侧如果是拣料,则内测不允许出
                    if("P".equals(locMastOuter.getLocSts()) || "Q".equals(locMastOuter.getLocSts()) || "S".equals(locMastOuter.getLocSts())){
                        break;
                    }
                    if(!"F".equals(locMastOuter.getLocSts())){
                        continue;
                    }
                    locNosResort.add(locNoOut);
                }
            }
        }
        return locNosResort;
    }
    private WrkMast createWrkMast(String locNo,String barCode,Date now){
        int ioType = 101;
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
src/main/resources/application.yml
@@ -73,21 +73,21 @@
    password: Wlzh44338
agv:
#  url: localhost:8080
#  taskCreatePath: /agv/task/create
#  containerMoveInPath: /agv/container/moveIn
#  containerMoveOutPath: /agv/container/moveOut
#  containerArrivedPath: /agv/containerArrived
  url: 10.10.10.182:9046
  taskCreatePath: /task/create
  containerMoveInPath: /expand/api/moveIn/container
  containerMoveOutPath: /expand/api/moveOut/container
  containerArrivedPath: /conveyor/containerArrived
  url: localhost:8080
  taskCreatePath: /agv/task/create
  containerMoveInPath: /agv/container/moveIn
  containerMoveOutPath: /agv/container/moveOut
  containerArrivedPath: /agv/containerArrived
#  url: 10.10.10.182:9046
#  taskCreatePath: /task/create
#  containerMoveInPath: /expand/api/moveIn/container
#  containerMoveOutPath: /expand/api/moveOut/container
#  containerArrivedPath: /conveyor/containerArrived
u8:
  url: http://192.168.1.55:8010
  orderReportPath: /api/RdAudit
agvBasDev:
  maxWorkNum: 2
  maxWorkNum: 1
src/main/webapp/static/js/agvLocDetl/locDetl.js
@@ -1,5 +1,6 @@
var pageCurr;
var tableData;
var admin;
function getCol() {
    var cols = [
        {field: 'locNo', align: 'center',title: '库位号'},
@@ -60,12 +61,15 @@
    return cols;
}
layui.use(['table','laydate', 'form'], function(){
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['table','laydate','admin','form'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    admin = layui.admin;
    // 数据渲染
    tableIns = table.render({
@@ -497,6 +501,11 @@
        });
    });
    // 导入销售单
    $("#compareToEss").click(function () {
        $("#importExcel").trigger("click");
    });
    // 时间选择器
    layDate.render({
        elem: '#modiTime\\$',
@@ -612,3 +621,45 @@
        $("#search").click();
    }
});
function upload(obj){
    if(!obj.files) {
        return;
    }
    var file = obj.files[0];
    admin.confirm('确认导入 [' + file.name +'] 文件吗?', function (index) {
        layer.load(1, {shade: [0.1,'#fff']});
        var url = baseUrl + "/agv/locDetl/compare/auth";
        var form = new FormData();
        form.append("file", file);
        let xhr = new XMLHttpRequest();
        xhr.open("post", url, true);
        xhr.setRequestHeader('token', localStorage.getItem('token'));
        xhr.onload = uploadComplete;
        xhr.onerror =  uploadFailed;
        xhr.onloadend = function () {
            layer.closeAll('loading');
        };
        // xhr.upload.onprogress = progressFunction;
        xhr.upload.onloadstart = function(){
            ot = new Date().getTime();
            oloaded = 0;
        };
        xhr.send(form);
    }, function(index){
    });
}
function uploadComplete(evt) {
    let res = JSON.parse(evt.target.responseText);
    if(res.code === 200) {
        layer.msg(res.msg, {icon: 1});
        insTb.reload({page: {curr: 1}});
    } else {
        alert(res.msg);
        // layer.msg(res.msg, {icon: 2});
    }
}
function uploadFailed(evt) {
    let res = JSON.parse(evt.target.responseText);
    alert(res.msg);
    // layer.msg(res.msg, {icon: 2});
}
src/main/webapp/static/js/common.js
@@ -226,8 +226,8 @@
var detlCols = [
    ,{field: 'zpallet', align: 'center',title: '托盘条码', hide: true}
    ,{field: 'zpallet', align: 'center',title: '托盘条码', hide: false}
    ,{field: 'suppCode', align: 'center',title: '料箱码', hide: false}
    ,{field: 'matnr', align: 'center',title: '存货编码',hide: true}
    ,{field: 'suppCode', align: 'center',title: '料箱码', hide: false}
    ,{field: 'matnr', align: 'center',title: '存货编码'}
    ,{field: 'anfme', align: 'center',title: '数量'}
    ,{field: 'batch', align: 'center',title: '序列码', width: 300, sort:true, hide: true}
src/main/webapp/views/agvLocDetl/locDetl.html
@@ -9,6 +9,7 @@
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
    <link rel="stylesheet" href="../../static/css/common.css" media="all">
    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
</head>
<body>
@@ -58,6 +59,10 @@
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="margin-top: 10px">导出</button>
    </div>
    <button style="display:none" id="compareToEss" >
        <i class="layui-icon layui-icon-upload"></i>&nbsp;库存比对
    </button>
    <input style="display:none" id="importExcel" type="file" onchange="upload(this)" >
</script>
<script type="text/html" id="operate">
src/main/webapp/views/agvPakStore/locDetlCheckQuery.html
@@ -61,6 +61,11 @@
                <input class="layui-input" type="text" name="maktx" placeholder="物料描述" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline">
            <div class="layui-input-inline">
                <input class="layui-input" type="number" name="floor" placeholder="楼层" autocomplete="off">
            </div>
        </div>
        <!-- 日期范围 -->
        <div class="layui-inline" style="width: 300px">
            <div class="layui-input-inline">
@@ -210,6 +215,14 @@
            tableReload();
        });
        // 搜索栏重置事件
        form.on('submit(reset)', function (data) {
            pageCurr = 1;
            clearFormVal($('#search-box'));
            $('#detlTable').css("display", 'none');
            tableReload(false);
        });
        layDate.render({
            elem: '.layui-laydate-range'
            ,type: 'datetime'
src/main/webapp/views/pakStore/locDetlCheckQuery.html
@@ -190,6 +190,13 @@
        form.on('submit(search)', function (data) {
            tableReload();
        });
        // 搜索栏重置事件
        form.on('submit(reset)', function (data) {
            pageCurr = 1;
            clearFormVal($('#search-box'));
            $('#detlTable').css("display", 'none');
            tableReload(false);
        });
        layDate.render({
            elem: '.layui-laydate-range'