自动化立体仓库 - WMS系统
#
Junjie
2025-12-18 757e410a3580adaaa305741903062371f98d778d
#
12个文件已修改
1个文件已添加
562 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OutController.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/WorkController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMast.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WorkService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OutWorkScheduler.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OutWorkHandler.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/properties/SlaveProperties.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/param/GetLocNoReassignParam.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutController.java
@@ -5,6 +5,7 @@
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.LocMast;
@@ -12,11 +13,13 @@
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.LocDto;
import com.zy.common.model.OutLocDto;
import com.zy.common.model.TaskDto;
import com.zy.common.properties.SlaveProperties;
import com.zy.common.web.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
@@ -105,7 +108,8 @@
                            LocDto locDto = new LocDto(locDetl1.getLocNo(), locDetl1.getMatnr(), locDetl1.getMaktx(), locDetl1.getBatch(), orderDetl.getOrderNo(),
                                    issued >= locDetl1.getAnfme() ? locDetl1.getAnfme() : issued);
                            int ioType = (issued >= locDetl1.getAnfme() && locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("loc_no", locDto.getLocNo())) == 1) ? 101 : 103;
                            List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl1.getLocNo(), ioType);
//                            List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl1.getLocNo(), ioType);
                            List<Integer> staNos = Utils.getOutStaNoList();
                            locDto.setStaNos(staNos);
                            locDtos.add(locDto);
                            exist.add(locDetl1.getLocNo());
@@ -158,11 +162,7 @@
                taskDtos.add(taskDto);
            }
        }
        // -----------------------------------------------------------------------------------------------
        for (TaskDto taskDto : taskDtos) {
            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
            workService.stockOut(staNo, taskDto, getUserId());
        }
        workService.stockOut(taskDtos, getUserId());
        return R.ok();
    }
src/main/java/com/zy/asrs/controller/WorkController.java
@@ -9,6 +9,7 @@
import com.zy.asrs.entity.param.StockOutParam;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.WorkService;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.StartupDto;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
@@ -50,18 +51,25 @@
    @ManagerAuth()
    public R availableTakeSite(){
        List<Map<String, Object>> result = new ArrayList<>();
        List<Integer> outSite = basDevpService.getAvailableOutSite(101);
        for (Integer siteId : outSite) {
//        List<Integer> outSite = basDevpService.getAvailableOutSite(101);
//        for (Integer siteId : outSite) {
//            Map<String, Object> map = new HashMap<>();
//            map.put("siteId", siteId);
//            map.put("desc", siteId + "(全板出库口)");
//            result.add(map);
//        }
//        List<Integer> pickOutSite = basDevpService.getAvailableOutSite(103);
//        for (Integer siteId : pickOutSite) {
//            Map<String, Object> map = new HashMap<>();
//            map.put("siteId", siteId);
//            map.put("desc", siteId + "(拣料出库口)");
//            result.add(map);
//        }
        List<Integer> outStaNoList = Utils.getOutStaNoList();
        for (Integer siteId : outStaNoList){
            Map<String, Object> map = new HashMap<>();
            map.put("siteId", siteId);
            map.put("desc", siteId + "(全板出库口)");
            result.add(map);
        }
        List<Integer> pickOutSite = basDevpService.getAvailableOutSite(103);
        for (Integer siteId : pickOutSite) {
            Map<String, Object> map = new HashMap<>();
            map.put("siteId", siteId);
            map.put("desc", siteId + "(拣料出库口)");
            result.add(map);
        }
        return R.ok().add(result);
src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.zy.asrs.service.*;
import com.zy.common.utils.Synchro;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
import com.core.common.Cools;
@@ -495,6 +496,8 @@
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.logErrTime);
    }
    public void sync(Object source) {
        Synchro.Copy(source, this);
    }
}
src/main/java/com/zy/asrs/service/WorkService.java
@@ -34,7 +34,7 @@
     */
    void stockOut(BasDevp staNo, List<LocDetlDto> locDetls, IoWorkType ioWorkType, Long userId);
    void stockOut(BasDevp staNo, TaskDto taskDto, Long userId);
    void stockOut(List<TaskDto> taskDto, Long userId);
    /**
     * 空板入库
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -221,10 +221,6 @@
                throw new CoolException(dto.getLocNo()+"托盘非在库状态");
            }
            Integer outSta = staNo.getDevNo();
            // 获取路径
            StaDesc staDesc = staDescService.queryCrnStn(ioType, outSta);
            // 生成工作号
            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
            // 生成工作档
@@ -235,9 +231,8 @@
            wrkMast.setIoType(ioType); // 入出库状态
            wrkMast.setIoPri(10D); // 优先级
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
            wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
            wrkMast.setSourceLocNo(dto.getLocNo()); // 源库位
            wrkMast.setStaNo(staNo.getDevNo());// 目标站
            wrkMast.setFullPlt("Y"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
@@ -284,93 +279,131 @@
                throw new CoolException(dto.getLocNo() + "库位不是在库状态");
            }
        }
        //检测是否存在浅库位
        for (OutLocDto dto : dtos) {
            //判断是否是深库位 触发移库任务
            if (Utils.isDeepLoc(dto.getLocNo())) {
                String deepLoc = dto.getLocNo();
                String shallowLocNo = Utils.getShallowLocNo(deepLoc);
                LocMast shallowLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", shallowLocNo));
                if (shallowLocMast.getLocSts().equals("F") || shallowLocMast.getLocSts().equals("D")) {
                    //触发移库任务
                    String locTransferLocNo = commonService.getLocTransferLocNo(shallowLocNo);
                    if (locTransferLocNo == null) {
                        throw new CoolException(shallowLocNo + "浅库位搜索移库空库位失败");
                    }
                    this.locMove(shallowLocNo, locTransferLocNo, userId);
                }
            }
        }
    }
    @Override
    @Transactional
    public void stockOut(BasDevp staNo, TaskDto taskDto, Long userId) {
        Date now = new Date();
        List<LocDto> locDtos = taskDto.getLocDtos();
        for (LocDto locDto : locDtos) {
            if (!taskDto.getLocNo().equals(locDto.getLocNo()) && !taskDto.getStaNo().equals(locDto.getStaNo())) {
                throw new CoolException("订单出库异常,请联系管理员");
    public void stockOut(List<TaskDto> taskDtoList, Long userId) {
        for (TaskDto taskDto : taskDtoList) {
            Date now = new Date();
            List<LocDto> locDtos = taskDto.getLocDtos();
            for (LocDto locDto : locDtos) {
                if (!taskDto.getLocNo().equals(locDto.getLocNo()) && !taskDto.getStaNo().equals(locDto.getStaNo())) {
                    throw new CoolException("订单出库异常,请联系管理员");
                }
            }
            // 获取库位
            LocMast locMast = locMastService.selectById(taskDto.getLocNo());
            // 获取路径
            int ioType = taskDto.isAll() ? 101 : 103;
            // 生成工作号
            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
            // 生成工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(ioType); // 入出库状态
            wrkMast.setIoPri(13D); // 优先级:13
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位
            wrkMast.setStaNo(taskDto.getStaNo());// 目标站
            wrkMast.setFullPlt("Y"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("N"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setBarcode(locMast.getBarcode());
            wrkMast.setAppeUser(userId); // 操作人员数据
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(userId);
            wrkMast.setModiTime(now);
            if (!wrkMastService.insert(wrkMast)) {
                throw new CoolException("保存工作档失败,出库库位号:"+taskDto.getLocNo());
            }
            // 生成工作档明细
            for (LocDto locDto : taskDto.getLocDtos()) {
                if (locDto.getAnfme()==null || locDto.getAnfme() <= 0.0D) { continue; }
                OrderDetl orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch());
                if (orderDetl == null) {
                    orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null);
                }
                LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locDto.getLocNo()).eq("matnr", locDto.getMatnr()));
                Mat mat = matService.selectOne(new EntityWrapper<Mat>().eq("matnr", locDto.getMatnr()));
                WrkDetl wrkDetl = new WrkDetl();
                wrkDetl.sync(orderDetl);
                wrkDetl.setZpallet(wrkMast.getBarcode());
                wrkDetl.setIoTime(now);
                wrkDetl.setWrkNo(workNo);
                wrkDetl.setBatch(locDto.getBatch());
                wrkDetl.setOrderNo(locDto.getOrderNo());
                wrkDetl.setModel(mat.getModel());
                wrkDetl.setPrice(locDetl.getAnfme());//库存数量
                wrkDetl.setAnfme(locDto.getAnfme()); // 数量
                wrkDetl.setWeight(locDetl.getAnfme());//总数
                wrkDetl.setAppeTime(now);
                wrkDetl.setAppeUser(userId);
                wrkDetl.setModiTime(now);
                wrkDetl.setModiUser(userId);
                if (!wrkDetlService.insert(wrkDetl)) {
                    throw new CoolException("保存工作档明细失败");
                }
                // 修改订单明细
                if (!orderDetlService.increaseWorkQty(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), locDto.getAnfme())) {
                    throw new CoolException("修改订单明细数量失败");
                }
                orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
            }
            // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
            locMast = locMastService.selectById(taskDto.getLocNo());
            if (locMast.getLocSts().equals("F")) {
                locMast.setLocSts(ioType==101?"R":"P");
                locMast.setModiUser(userId);
                locMast.setModiTime(now);
                if (!locMastService.updateById(locMast)) {
                    throw new CoolException("预约库位状态失败,库位号:"+taskDto.getLocNo());
                }
            } else {
                throw new CoolException(taskDto.getLocNo() + "库位不是在库状态");
            }
        }
        // 获取库位
        LocMast locMast = locMastService.selectById(taskDto.getLocNo());
        // 获取路径
        int ioType = taskDto.isAll() ? 101 : 103;
        StaDesc staDesc = staDescService.queryCrnStn(ioType, staNo.getDevNo());
        // 生成工作号
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
        wrkMast.setIoType(ioType); // 入出库状态
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setCrnNo(locMast.getCrnNo());
        wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
        wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
        wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("N");
        wrkMast.setBarcode(locMast.getBarcode());
        wrkMast.setAppeUser(userId); // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        if (!wrkMastService.insert(wrkMast)) {
            throw new CoolException("保存工作档失败,出库库位号:"+taskDto.getLocNo());
        }
        // 生成工作档明细
        for (LocDto locDto : taskDto.getLocDtos()) {
            if (locDto.getAnfme()==null || locDto.getAnfme() <= 0.0D) { continue; }
            OrderDetl orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch());
            if (orderDetl == null) {
                orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null);
        //检测是否存在浅库位
        for (TaskDto taskDto : taskDtoList) {
            //判断是否是深库位 触发移库任务
            if (Utils.isDeepLoc(taskDto.getLocNo())) {
                String deepLoc = taskDto.getLocNo();
                String shallowLocNo = Utils.getShallowLocNo(deepLoc);
                LocMast shallowLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", shallowLocNo));
                if (shallowLocMast.getLocSts().equals("F") || shallowLocMast.getLocSts().equals("D")) {
                    //触发移库任务
                    String locTransferLocNo = commonService.getLocTransferLocNo(shallowLocNo);
                    if (locTransferLocNo == null) {
                        throw new CoolException(shallowLocNo + "浅库位搜索移库空库位失败");
                    }
                    this.locMove(shallowLocNo, locTransferLocNo, userId);
                }
            }
            LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locDto.getLocNo()).eq("matnr", locDto.getMatnr()));
            Mat mat = matService.selectOne(new EntityWrapper<Mat>().eq("matnr", locDto.getMatnr()));
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(orderDetl);
            wrkDetl.setZpallet(wrkMast.getBarcode());
            wrkDetl.setIoTime(now);
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setBatch(locDto.getBatch());
            wrkDetl.setOrderNo(locDto.getOrderNo());
            wrkDetl.setModel(mat.getModel());
            wrkDetl.setPrice(locDetl.getAnfme());//库存数量
            wrkDetl.setAnfme(locDto.getAnfme()); // 数量
            wrkDetl.setWeight(locDetl.getAnfme());//总数
            wrkDetl.setAppeTime(now);
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiTime(now);
            wrkDetl.setModiUser(userId);
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作档明细失败");
            }
            // 修改订单明细
            if (!orderDetlService.increaseWorkQty(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), locDto.getAnfme())) {
                throw new CoolException("修改订单明细数量失败");
            }
            orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
        }
        // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
        locMast = locMastService.selectById(taskDto.getLocNo());
        if (locMast.getLocSts().equals("F")) {
            locMast.setLocSts(ioType==101?"R":"P");
            locMast.setModiUser(userId);
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("预约库位状态失败,库位号:"+taskDto.getLocNo());
            }
        } else {
            throw new CoolException(taskDto.getLocNo() + "库位不是在库状态");
        }
    }
src/main/java/com/zy/asrs/task/OutWorkScheduler.java
@@ -26,11 +26,11 @@
    /**
     * 出库任务下发
     */
//    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/3 * * * * ? ")
    private void execute() {
        List<WrkMast> wrkMasts=wrkMastService.selectList(new EntityWrapper<WrkMast>()
                .eq("wrk_sts",11)
                .in("io_type",11,101,103,107,110));
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                .eq("wrk_sts", 11)
                .in("io_type", 11, 101, 103, 107, 110));
        for(WrkMast wrkMast:wrkMasts){
            ReturnT<String> result = outWorkHandler.start(wrkMast);
            if (!result.isSuccess()) {
src/main/java/com/zy/asrs/task/handler/OutWorkHandler.java
@@ -7,6 +7,8 @@
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.StartupDto;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -21,64 +23,88 @@
@Transactional
public class OutWorkHandler extends AbstractHandler<String> {
    @Autowired
    private ApiLogService apiLogService;
    @Value("${wcs.address.URL}")
    private String addrs;
    @Value("${wcs.address.outboundTaskSend}")
    private String outboundTaskSend;
    @Value("${wcs.address.createOutTask}")
    private String outTask;
    @Value("${wcs.address.createLocMoveTask}")
    private String locMoveTask;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private WrkMastService wrkMastService;
    public synchronized ReturnT<String> start(WrkMast wrkMast) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("taskNo", wrkMast.getWrkNo());
        map.put("taskPriority", 10);
        map.put("barcode", wrkMast.getBarcode());
        StartupDto startupDto = new StartupDto();
        startupDto.setTaskNo(wrkMast.getWrkNo());
        startupDto.setStaNo(wrkMast.getStaNo());
        startupDto.setLocNo(Utils.locToLocNo(wrkMast.getSourceLocNo()));
        startupDto.setTaskPri(wrkMast.getIoPri());
        if (wrkMast.getIoType() == 11) {
            map.put("taskType", 3);
            map.put("startPoint", wrkMast.getSourceLocNo());
            map.put("targetPoint", wrkMast.getLocNo());
        }else {
            map.put("taskType", 2);
            map.put("startPoint", wrkMast.getSourceLocNo());
            map.put("targetPoint", wrkMast.getSourceStaNo() + "-" + wrkMast.getStaNo());
        }
        String response ="";
        boolean bool =false;
        try {
            log.info("wms派发任务给wcs出库={}", JSON.toJSONString(map));
            response = new HttpHandler.Builder()
                    // .setHeaders(headParam)
                    .setUri(addrs)
                    .setPath(outboundTaskSend)
                    .setJson(JSON.toJSONString(map))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if(jsonObject.getInteger("code") == 200){
                wrkMast.setWrkSts(12L);
                wrkMastService.updateById(wrkMast);
                bool = true;
            }else {
                log.error("wms派发任务给wcs出库失败{},返回值={}", JSON.toJSONString(wrkMast), response);
            String response = "";
            boolean bool = false;
            try {
                log.info("wms派发任务给wcs移库={}", JSON.toJSONString(startupDto));
                response = new HttpHandler.Builder()
                        .setUri(addrs)
                        .setPath(locMoveTask)
                        .setJson(JSON.toJSONString(startupDto))
                        .build()
                        .doPost();
                JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.getInteger("code") == 200) {
                    wrkMast.setWrkSts(12L);
                    wrkMastService.updateById(wrkMast);
                    bool = true;
                } else {
                    log.error("wms派发任务给wcs移库失败{},返回值={}", JSON.toJSONString(wrkMast), response);
                }
            } catch (Exception e) {
                log.error("wms派发任务给wcs移库失败{},返回值={}", JSON.toJSONString(wrkMast), response);
            } finally {
                apiLogService.save("wms派发任务给wcs移库"
                        , addrs + locMoveTask
                        , null
                        , "127.0.0.1"
                        , JSON.toJSONString(startupDto)
                        , response
                        , bool
                );
            }
        } catch (Exception e) {
            log.error("wms派发任务给wcs出库失败{},返回值={}", JSON.toJSONString(wrkMast), response);
        } finally {
            apiLogService.save("wms派发任务给wcs出库"
                    , addrs + outboundTaskSend
                    , null
                    , "127.0.0.1"
                    , JSON.toJSONString(map)
                    , response
                    , bool
            );
        } else {
            String response ="";
            boolean bool =false;
            try {
                log.info("wms派发任务给wcs出库={}", JSON.toJSONString(startupDto));
                response = new HttpHandler.Builder()
                        .setUri(addrs)
                        .setPath(outTask)
                        .setJson(JSON.toJSONString(startupDto))
                        .build()
                        .doPost();
                JSONObject jsonObject = JSON.parseObject(response);
                if(jsonObject.getInteger("code") == 200){
                    wrkMast.setWrkSts(12L);
                    wrkMastService.updateById(wrkMast);
                    bool = true;
                }else {
                    log.error("wms派发任务给wcs出库失败{},返回值={}", JSON.toJSONString(wrkMast), response);
                }
            } catch (Exception e) {
                log.error("wms派发任务给wcs出库失败{},返回值={}", JSON.toJSONString(wrkMast), response);
            } finally {
                apiLogService.save("wms派发任务给wcs出库"
                        , addrs + outTask
                        , null
                        , "127.0.0.1"
                        , JSON.toJSONString(startupDto)
                        , response
                        , bool
                );
            }
        }
        return SUCCESS;
    }
}
src/main/java/com/zy/asrs/utils/Utils.java
@@ -1,7 +1,11 @@
package com.zy.asrs.utils;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Arith;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.service.LocMastService;
import com.zy.common.model.LocGroupOrder;
import com.zy.common.properties.SlaveProperties;
@@ -136,6 +140,11 @@
        return checkOrder;
    }
    public static List<Integer> getOutStaNoList() {
        SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class);
        return slaveProperties.getOutStaNoList();
    }
    //判断是否是深库位
    public static boolean isDeepLoc(String locNo){
        int i = getRow(locNo);
src/main/java/com/zy/common/properties/SlaveProperties.java
@@ -17,4 +17,6 @@
    private List<LocGroupOrder> locGroupAscOrder;
    private List<Integer> outStaNoList;
}
src/main/java/com/zy/common/service/CommonService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.result.FindLocNoAttributeVo;
@@ -212,20 +213,6 @@
        StartupDto startupDto = new StartupDto();
        // 获取目标站
//        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>().eq("type_no", staDescId).eq("stn_no", sourceStaNo).eq("crn_no", locMast.getCrnNo());
//        StaDesc staDesc = staDescService.selectOne(wrapper);
//        if (Cools.isEmpty(staDesc)) {
//            log.error("type_no={},stn_no={},crn_no={}", staDescId, sourceStaNo, crnNo);
//            throw new CoolException("入库路径不存在");
//        } else {
//            BasDevp staNo = basDevpService.selectById(staDesc.getCrnStn());
//            if (!staNo.getAutoing().equals("Y")) {
//                log.error("目标站" + staDesc.getCrnStn() + "不可用");
//                throw new CoolException("目标站"+staDesc.getCrnStn()+"不可用");
//            }
//            startupDto.setStaNo(staNo.getDevNo());
//        }
        String locNo = locMast.getLocNo();
        // 生成工作号
        int workNo = getWorkNo(0);
@@ -513,4 +500,23 @@
        }
    }
    //移库任务获取空库位
    public String getLocTransferLocNo(String locNo){
        List<Integer> locGroupDesc = Utils.getLocGroupDesc(slaveProperties, locNo);
        //先找深库位
        List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "O").in("row1", locGroupDesc));
        if (locMastList.isEmpty()) {
            //搜索浅库位
            List<Integer> locGroupAsc = Utils.getLocGroupAsc(slaveProperties, locNo);
            locMastList = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "O").in("row1", locGroupAsc));
        }
        if (locMastList.isEmpty()) {
            return null;
        }
        LocMast locMast = locMastList.get(0);
        return locMast.getLocNo();
    }
}
src/main/java/com/zy/common/web/WcsController.java
@@ -7,28 +7,26 @@
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.result.FindLocNoAttributeVo;
import com.zy.asrs.entity.result.StorageResult;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.common.CodeRes;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.StartupDto;
import com.zy.common.service.CommonService;
import com.zy.common.web.param.GetLocNoReassignParam;
import com.zy.common.web.param.NotifyDto;
import com.zy.common.web.param.SearchLocParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ReactiveTypeDescriptor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * Created by vincent on 2020/10/30
@@ -78,6 +76,15 @@
        return R.ok(map);
    }
    @PostMapping("/reassign/loc/v1")
    @ResponseBody
    @Transactional
    public synchronized R getLocNoReassign(@RequestBody(required = false) GetLocNoReassignParam param) {
        log.info("收到WCS重新分配入库接口请求====>>入参:{}", param);
        StartupDto dto = startupFullReassign(param.getTaskNo(), param.getRow());
        log.info("WCS入库接口返参:{}", dto);
        return R.ok().add(dto);
    }
    @PostMapping("/pakin/loc/v1")
    @ResponseBody
@@ -371,6 +378,78 @@
        return dto;
    }
    /**
     * 全板入库-重新分配
     */
    @Transactional
    public StartupDto startupFullReassign(String workNo, int[] row) {
        WrkMast sourceWrkMast = wrkMastService.selectByTaskNo(workNo);
        if(sourceWrkMast == null) {
            throw new CoolException(workNo + "工作数据不存在");
        }
        List<WrkDetl> sourceWrkDetlList = wrkDetlService.selectByWrkNo(sourceWrkMast.getWrkNo());
        if (sourceWrkDetlList.isEmpty()) {
            throw new CoolException(workNo + "工作明细数据不存在");
        }
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        findLocNoAttributeVo.setMatnr(sourceWrkDetlList.get(0).getMatnr());
        LocMast sourceLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", sourceWrkMast.getLocNo()));
        if (sourceLocMast == null) {
            throw new CoolException(sourceWrkMast.getLocNo() + "库位数据不存在");
        }
        LocTypeDto locTypeDto = new LocTypeDto();
        locTypeDto.setLocType1(sourceLocMast.getLocType1());
        StartupDto dto = commonService.getLocNoToWmsDev(1, sourceWrkMast.getSourceStaNo(), findLocNoAttributeVo, locTypeDto, sourceWrkMast.getBarcode(), row);
        if (dto == null) {
            throw new CoolException("找不到空库位");
        }
        Date now = new Date();
        // 生成工作档
        sourceWrkMast.setIoTime(new Date());
        sourceWrkMast.setWrkSts(2L); // 工作状态:生成入库ID
        sourceWrkMast.setIoType(1); // 入出库状态:1.入库
        sourceWrkMast.setIoPri(13D); // 优先级
        sourceWrkMast.setCrnNo(dto.getCrnNo());
        sourceWrkMast.setSourceStaNo(dto.getSourceStaNo());
        sourceWrkMast.setStaNo(dto.getStaNo());
        sourceWrkMast.setLocNo(loc(dto.getLocNo()));
        sourceWrkMast.setModiTime(now);
        boolean res = wrkMastService.updateById(sourceWrkMast);
        if (!res) {
            throw new CoolException("保存工作档失败");
        }
        // 更新源库位状态
        if (sourceLocMast.getLocSts().equals("S")) {
            sourceLocMast.setLocSts("O");
            sourceLocMast.setModiTime(now);
            if (!locMastService.updateById(sourceLocMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo() + "目标库位状态不属于入库预约中");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(loc(dto.getLocNo()));
        if (locMast.getLocSts().equals("O")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        return dto;
    }
    public String loc(String locNo){
        String[] split = locNo.split("-");
        return Utils.getLocNo(Integer.parseInt(split[0]),Integer.parseInt(split[1]),Integer.parseInt(split[2]));
src/main/java/com/zy/common/web/param/GetLocNoReassignParam.java
New file
@@ -0,0 +1,13 @@
package com.zy.common.web.param;
import lombok.Data;
@Data
public class GetLocNoReassignParam {
    private String taskNo;
    //库位排
    private int[] row;
}
src/main/resources/application.yml
@@ -12,7 +12,7 @@
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=qlasrs-sxk
    username: sa
    password: sa@123
    password: Ab!123456
  mvc:
    static-path-pattern: /**
  redis:
@@ -53,21 +53,28 @@
wcs-slave:
  # 由浅入深
  locGroupAscOrder: [
    {rowList: [1],minBay: 2,maxBay: 60},
    {rowList: [3,4,5,6],minBay: 2,maxBay: 60},
    {rowList: [10,9,8,7],minBay: 2,maxBay: 60},
    {rowList: [10,9,8,7,6,5,4,3],minBay: 2,maxBay: 60},
    {rowList: [12,13],minBay: 2,maxBay: 60},
    {rowList: [15,14],minBay: 2,maxBay: 60},
    {rowList: [17,18,19,20,21,22,23,24],minBay: 2,maxBay: 60},
    {rowList: [2],minBay: 2,maxBay: 60},
    {rowList: [11],minBay: 2,maxBay: 60},
    {rowList: [16],minBay: 2,maxBay: 60},
    {rowList: [25,26,27,28],minBay: 2,maxBay: 60},
    {rowList: [29,30,31,32],minBay: 2,maxBay: 60},
    {rowList: [33,34,35,36],minBay: 2,maxBay: 60},
    {rowList: [37,38,39,40],minBay: 2,maxBay: 60},
    {rowList: [2,1],minBay: 2,maxBay: 60},
    {rowList: [3,4],minBay: 2,maxBay: 60},
    {rowList: [6,5],minBay: 2,maxBay: 60},
    {rowList: [7,8],minBay: 2,maxBay: 60},
    {rowList: [10,9],minBay: 2,maxBay: 60},
    {rowList: [11,12],minBay: 2,maxBay: 60},
    {rowList: [14,13],minBay: 2,maxBay: 60},
    {rowList: [15,16],minBay: 2,maxBay: 60},
    {rowList: [18,17],minBay: 2,maxBay: 60},
    {rowList: [19,20],minBay: 2,maxBay: 60},
    {rowList: [22,21],minBay: 2,maxBay: 60},
    {rowList: [23,24],minBay: 2,maxBay: 60},
    {rowList: [26,25],minBay: 2,maxBay: 60},
    {rowList: [27,28],minBay: 2,maxBay: 60},
    {rowList: [30,29],minBay: 2,maxBay: 60},
    {rowList: [31,32],minBay: 2,maxBay: 60},
    {rowList: [34,33],minBay: 2,maxBay: 60},
    {rowList: [35,36],minBay: 2,maxBay: 60},
    {rowList: [38,37],minBay: 2,maxBay: 60},
    {rowList: [39,40],minBay: 2,maxBay: 60},
  ]
  outStaNoList: [1152,1169,1177]
#wcs对接
wcs: