自动化立体仓库 - WMS系统
17个文件已修改
445 ■■■■■ 已修改文件
src/main/java/com/zy/api/controller/params/StopOutTaskParams.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMast.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/MesToCombParam.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OpenOrderPakoutPauseParam.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutomaticallyIssueWCSTasksScheduler.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WorkMastScheduler.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutomaticallyIssueWCSTasksHandler.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 172 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastLogMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/controller/params/StopOutTaskParams.java
@@ -18,7 +18,7 @@
    private String orderNo;
    @ApiModelProperty("pause reason")
    private String reason;
    private Integer reason;
    @ApiModelProperty("task list")
    private List<TaskItem> tasks = new ArrayList<>();
src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
@@ -96,8 +96,13 @@
        String response;
        R r = R.ok();
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", params.getTaskNo()));
        if (!Objects.isNull(wrkMast) && "out".equalsIgnoreCase(params.getType()) && "Y".equalsIgnoreCase(wrkMast.getPauseMk())) {
            return R.error("task paused");
        if (!Objects.isNull(wrkMast) && "out".equalsIgnoreCase(params.getType())) {
            if ("Y".equalsIgnoreCase(wrkMast.getPauseMk())) {
                return R.error("task paused");
            }
            if (requiresOutboundErpConfirm(wrkMast) && !"Y".equalsIgnoreCase(wrkMast.getPdcType())) {
                return R.error("task not confirmed by erp");
            }
        }
        try {
            log.info("下发搬运任务给wcs="+JSON.toJSONString(params));
@@ -179,8 +184,8 @@
            } else if (params.getMsgType().equals("task_cancel")) {
                if (mast.getIoType() != null && mast.getIoType() > 100 && mast.getWrkSts() < 14) {
                    mast.setPauseMk("Y");
                    mast.setUpdMk("WCS_CANCELLED");
                    mast.setManuType("WCS_CANCELLED");
//                    mast.setUpdMk("WCS_CANCELLED");
//                    mast.setManuType("WCS_CANCELLED");
                    mast.setModiTime(new Date());
                    if (!wrkMastService.updateById(mast)) {
                        throw new CoolException("task cancel update fail");
@@ -206,6 +211,11 @@
        }
        return R.ok();
    }
    private boolean requiresOutboundErpConfirm(WrkMast wrkMast) {
        Integer ioType = wrkMast == null ? null : wrkMast.getIoType();
        return ioType != null && (ioType == 101 || ioType == 103 || ioType == 104 || ioType == 107 || ioType == 110);
    }
    @Override
    public R pauseOutTasks(StopOutTaskParams params) {
        if (params == null || params.getTasks() == null || params.getTasks().isEmpty()) {
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -116,20 +116,7 @@
    /**
     * pause out order
     */
    @PostMapping("/order/pakout/pause/default/v1")
    @AppAuth(memo = "pause out order")
    public synchronized R pakoutOrderPause(@RequestHeader(required = false) String appkey,
                                           @RequestBody OpenOrderPakoutPauseParam param,
                                           HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param) || Cools.isEmpty(param.getOrderNo())) {
            return R.error("orderNo is empty");
        }
        return openService.pakoutOrderPause(param);
    }
    /**
     * 出库单回写
@@ -437,15 +424,9 @@
    @PostMapping("/comb/auth")
    public synchronized R comb(@RequestBody ArrayList<MesToCombParam> param){
        for (MesToCombParam mesToCombParam : param) {
            // 判断是否有相同条码的数据
            if (waitPakinService.selectCount(new EntityWrapper<WaitPakin>().
                    eq("zpallet", mesToCombParam.getPalletId()).eq("io_status", "N")) > 0) {
                waitPakinService.delete(new EntityWrapper<WaitPakin>().eq("zpallet", mesToCombParam.getPalletId()));
            }
            if (mesToCombParam.getPalletId().length() != 8) {
                return R.error(mesToCombParam.getPalletId()+"-该托盘码不为8位");
            }
//            if (mesToCombParam.getPalletId().length() != 8) {
//                return R.error(mesToCombParam.getPalletId()+"-该托盘码不为8位");
//            }
//        if (param.getCombMats().size()>1){
//            throw new CoolException("不允许混料===>>" + param.getBarcode());
//        }
@@ -455,6 +436,11 @@
//        int countwait = waitPakinService.selectCount(new EntityWrapper<WaitPakin>().eq("zpallet",param.getPalletId()));
            if (countLoc > 0 || countWrk > 0) {
                return R.error(mesToCombParam.getPalletId()+"-工作档/库存条码数据已存在");
            }
            // 判断是否有相同条码的数据
            if (waitPakinService.selectCount(new EntityWrapper<WaitPakin>().
                    eq("zpallet", mesToCombParam.getPalletId()).eq("io_status", "N")) > 0) {
                waitPakinService.delete(new EntityWrapper<WaitPakin>().eq("zpallet", mesToCombParam.getPalletId()));
            }
        }
        for (MesToCombParam mesToCombParam : param) {
@@ -477,28 +463,14 @@
    }
    /**
     * 添加出库单
     * pause out order
     */
    @PostMapping("/order/pakout/default/v1")
//    @AppAuth(memo = "添加订单出库")
    public synchronized R pakoutOrderCreate(@RequestHeader(required = false) String appkey,
                                            @RequestBody OpenOrderPakoutParam param,
                                            HttpServletRequest request) {
//        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
    @PostMapping("/order/pakout/pause/default/v1")
    public synchronized R pakoutOrderPause(@RequestBody OpenOrderPakoutPauseParam param){
        if (Cools.isEmpty(param) || Cools.isEmpty(param.getOrderId())) {
            return R.error("orderNo is empty");
        }
        if (Cools.isEmpty(param.getOrderNo())) {
            return R.error("单据编号[orderNo]不能为空");
        }
        if (Cools.isEmpty(param.getOrderType())) {
            return R.error("单据类型[orderType]不能为空");
        }
        if (Cools.isEmpty(param.getOrderDetails())) {
            return R.error("单据明细[orderDetails]不能为空");
        }
        openService.pakoutOrderCreate(param);
        return R.ok();
        return openService.pakoutOrderPause(param);
    }
}
src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -292,7 +292,7 @@
    @ApiModelProperty(value= "条码")
    private String barcode;
    // Y:销售订单出库任务
    // ERP出库确认标记:Y 允许下发WCS,N/空 不允许
    @ApiModelProperty(value= "")
    @TableField("Pdc_type")
    private String PdcType;
src/main/java/com/zy/asrs/entity/param/MesToCombParam.java
@@ -28,7 +28,7 @@
    //操作类型,1 组托;2 组托解绑;
    private Integer operateType;
    //唯一码
    private String BizNo;
    private String bizNo;
    //是否散货,0 非散货;1 散货;为了管控出货速率,散货可以出慢点。
    private Integer package1;
}
src/main/java/com/zy/asrs/entity/param/OpenOrderPakoutPauseParam.java
@@ -5,7 +5,7 @@
@Data
public class OpenOrderPakoutPauseParam {
    private String orderNo;
    private String orderId;
    private String reason;
    private Integer reason;
}
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -248,6 +248,7 @@
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(11L); // 工作状态:101.生成出库
        wrkMast.setIoType(104); // 入出库状态
        wrkMast.setPdcType("N");
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
        wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
@@ -1316,6 +1317,7 @@
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("N");
        wrkMast.setPdcType("N");
        wrkMast.setAppeUser(userId); // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -374,56 +374,38 @@
    @Override
    @Transactional
    public R pakoutOrderPause(OpenOrderPakoutPauseParam param) {
        if (param == null || Cools.isEmpty(param.getOrderNo())) {
        if (param == null || Cools.isEmpty(param.getOrderId())) {
            throw new CoolException("orderNo is empty");
        }
        Order order = orderService.selectByNo(param.getOrderNo());
        if (order == null) {
            order = OrderInAndOutUtil.selectByNo(Boolean.FALSE, param.getOrderNo());
        }
        if (order == null) {
            throw new CoolException("order not found: " + param.getOrderNo());
        }
        List<WrkMast> activeTasks = findActiveOutboundTasks(param.getOrderNo());
        List<WrkMast> activeTasks = findActiveOutboundTasks(param.getOrderId());
        Map<String, Object> result = new HashMap<>();
        result.put("orderNo", param.getOrderId());
        result.put("taskCount", activeTasks.size());
        if (activeTasks.isEmpty()) {
            return R.ok("no active out tasks");
            result.put("confirmedCount", 0);
            return R.ok("no active out tasks").add(result);
        }
        Date now = new Date();
        int pausedCount = 0;
        List<WrkMast> issuedTasks = new ArrayList<>();
        int confirmedCount = 0;
        for (WrkMast wrkMast : activeTasks) {
            if (wrkMast == null || "Y".equalsIgnoreCase(wrkMast.getPauseMk())) {
            if (wrkMast == null || "Y".equalsIgnoreCase(wrkMast.getPdcType())) {
                continue;
            }
            wrkMast.setPauseMk("Y");
            wrkMast.setUpdMk(needNotifyWcsStop(wrkMast) ? "WCS_STOP_REQUESTED" : "WMS_PAUSED");
            wrkMast.setManuType("ERP_PAUSE");
            wrkMast.setPdcType("Y");
//            wrkMast.setUpdMk("ERP_CONFIRMED");
//            wrkMast.setManuType("ERP_CONFIRM_OUT");
            wrkMast.setModiTime(now);
            wrkMast.setModiUser(9527L);
            if (!wrkMastService.updateById(wrkMast)) {
                throw new CoolException("pause out task failed: " + wrkMast.getWrkNo());
                throw new CoolException("confirm out task failed: " + wrkMast.getWrkNo());
            }
            pausedCount++;
            if (needNotifyWcsStop(wrkMast)) {
                issuedTasks.add(wrkMast);
            }
            confirmedCount++;
        }
        if (pausedCount == 0) {
            return R.ok("tasks already paused");
        }
        if (!issuedTasks.isEmpty()) {
            wcsApiService.pauseOutTasks(buildStopOutTaskParams(param, issuedTasks));
        }
        Map<String, Object> result = new HashMap<>();
        result.put("orderNo", param.getOrderNo());
        result.put("pausedCount", pausedCount);
        result.put("wcsStopCount", issuedTasks.size());
        return R.ok("pause out success").add(result);
        result.put("confirmedCount", confirmedCount);
        return R.ok(confirmedCount == 0 ? "tasks already confirmed" : "erp confirm out success").add(result);
    }
    @Override
@@ -440,8 +422,8 @@
        }
        if (Objects.equals(param.getExecute(), 2)) {
            OpenOrderPakoutPauseParam pauseParam = new OpenOrderPakoutPauseParam();
            pauseParam.setOrderNo(param.getOrderId());
            pauseParam.setReason("OPEN_API_PAUSE");
            pauseParam.setOrderId(param.getOrderId());
//            pauseParam.setReason("OPEN_API_CONFIRM_OUT");
            return pakoutOrderPause(pauseParam);
        }
        throw new CoolException("execute only supports 1 or 2");
@@ -461,8 +443,8 @@
        }
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                .in("wrk_no", wrkNos)
                .in("io_type", Arrays.asList(101, 103, 107, 108, 110))
                .lt("wrk_sts", 14L));
                .in("io_type", Arrays.asList(101, 103, 104, 107, 108, 110))
                .eq("wrk_sts", 11L));
        if (wrkMasts == null || wrkMasts.isEmpty()) {
            return Collections.emptyList();
        }
@@ -582,7 +564,7 @@
    private StopOutTaskParams buildStopOutTaskParams(OpenOrderPakoutPauseParam param, List<WrkMast> wrkMasts) {
        StopOutTaskParams stopParams = new StopOutTaskParams();
        stopParams.setOrderNo(param.getOrderNo());
        stopParams.setOrderNo(param.getOrderId());
        stopParams.setReason(param.getReason());
        for (WrkMast wrkMast : wrkMasts) {
            StopOutTaskParams.TaskItem item = new StopOutTaskParams.TaskItem();
@@ -1276,7 +1258,7 @@
            if (param.getFull() == 1) {
                //满托盘
                mat = matService.selectByMatnr(param.getMatnr());
                mat = matService.selectByMatnr("emptyPallet");
            } else if (param.getFull() == 0) {
                //空托盘
                mat = matService.selectByMatnr("emptyPallet");
@@ -1285,6 +1267,7 @@
        WaitPakin waitPakin = new WaitPakin();
        waitPakin.sync(mat);
//        waitPakin.setMatnr(param.getMatnr());
        waitPakin.setBatch(String.valueOf(param.getBatchId()));
        waitPakin.setZpallet(param.getPalletId());   // 托盘码
@@ -1335,6 +1318,7 @@
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("N");
        wrkMast.setPdcType("N");
        wrkMast.setUserNo(param.getOrderId());//订单号
        wrkMast.setPltType(param.getSeq());//出库顺序,从1开始
        wrkMast.setTakeNone("0");  //0非自动
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -367,6 +367,7 @@
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("N"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setPdcType("N");
            wrkMast.setBarcode(locMast.getBarcode());
            wrkMast.setTakeNone("0");  //0非自动
@@ -749,6 +750,7 @@
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("N");
        wrkMast.setPdcType("N");
        wrkMast.setBarcode(locMast.getBarcode());
        wrkMast.setAppeUser(userId); // 操作人员数据
        wrkMast.setAppeTime(now);
@@ -984,6 +986,7 @@
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("Y"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setPdcType("N");
            wrkMast.setAppeUser(userId);
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(userId);
@@ -1046,6 +1049,7 @@
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("Y"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setPdcType("N");
            wrkMast.setAppeUser(1L);
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(1L);
src/main/java/com/zy/asrs/task/AutomaticallyIssueWCSTasksScheduler.java
@@ -22,12 +22,12 @@
    @Autowired
    private AutomaticallyIssueWCSTasksHandler automaticallyIssueWCSTasksHandler;
    @Scheduled(cron = "0/3 * * * * ? ")
//    @Scheduled(cron = "0/3 * * * * ? ")
    private void execute(){
        List<WrkMast> wrkMasts = wrkMastService.selectList(
                new com.baomidou.mybatisplus.mapper.EntityWrapper<WrkMast>()
                        .eq("wrk_sts", 11)
                        .last(" and (pause_mk is null or pause_mk <> 'Y')")
                        .last(" and (pause_mk is null or pause_mk <> 'Y') and (io_type not in (101,103,104,107,110) or Pdc_type = 'Y')")
        );
        if (wrkMasts.isEmpty()) {
            return;
src/main/java/com/zy/asrs/task/WorkMastScheduler.java
@@ -1,15 +1,24 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.api.controller.params.WorkTaskParams;
import com.zy.api.service.WcsApiService;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.WorkMastHandler;
import com.zy.asrs.utils.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
@@ -21,6 +30,8 @@
    private static final Logger log = LoggerFactory.getLogger(WorkMastScheduler.class);
    @Autowired
    private WcsApiService wcsApiService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
@@ -45,4 +56,60 @@
        }
    }
    /**
     * 任务自动下发
     *
     * @author Ryan
     * @date 2026/1/10 14:42
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    private void autoPubTasks() {
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts", Arrays.asList(1L, 11L)));
        if (wrkMasts.isEmpty()) {
            return;
        }
        Collections.shuffle(wrkMasts);
        for (WrkMast wrkMast : wrkMasts) {
            if (wrkMast.getIoType()>100&& !wrkMast.getPdcType().equals("Y")) {
                continue;
            }
            Integer crnNo = wrkMast.getCrnNo();
            //该堆垛机已经下发任务给wcs后不再下发新的搬运任务
            List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("crn_no", crnNo).in("wrk_sts", Arrays.asList(2L, 12L)));
            if (!wrkMasts1.isEmpty()) {
                continue;
            }
            String wcsSourceLocNo = Cools.isEmpty(wrkMast.getSourceLocNo()) ? "" : Utils.WMSLocToWCSLoc(wrkMast.getSourceLocNo());
            String wcsLocNo = Cools.isEmpty(wrkMast.getLocNo()) ? "" : Utils.WMSLocToWCSLoc(wrkMast.getLocNo());
            WorkTaskParams params = new WorkTaskParams();
            //出库和移库
            if(wrkMast.getIoType()==101&&!Cools.isEmpty(wrkMast.getStaNo())&& !wrkMast.getStaNo().equals("0")) {
                params.setType("out")
                        .setTaskNo(wrkMast.getWrkNo()+"")
                        .setLocNo(wcsSourceLocNo)
                        .setStaNo(String.valueOf(wrkMast.getStaNo()))
                        .setTaskPri(wrkMast.getIoPri().intValue())
                        .setBarcode(wrkMast.getBarcode());
            }else if(wrkMast.getIoType()==2&& !Cools.isEmpty(wrkMast.getSourceStaNo())){
                params.setType("in")
                        .setTaskNo(wrkMast.getWrkNo()+"")
                        .setSourceStaNo(String.valueOf(wrkMast.getSourceStaNo()))
                        .setLocNo(wcsLocNo)
                        .setTaskPri(wrkMast.getIoPri().intValue())
                        .setBarcode(wrkMast.getBarcode());
            } else {
                params.setType("move")
                        .setTaskNo(wrkMast.getWrkNo()+"")
                        .setSourceLocNo(wcsSourceLocNo)
                        .setLocNo(wcsLocNo)
                        .setBarcode(wrkMast.getBarcode());
            }
            R r = wcsApiService.pubWrkToWcs(params);
            if (r.get("code").equals(200)){
                break;
            }
        };
    }
}
src/main/java/com/zy/asrs/task/handler/AutomaticallyIssueWCSTasksHandler.java
@@ -51,6 +51,9 @@
                    if ("Y".equalsIgnoreCase(m.getPauseMk())) {
                        continue;
                    }
                    if (requiresOutboundErpConfirm(m) && !"Y".equalsIgnoreCase(m.getPdcType())) {
                        continue;
                    }
                    if (m.getUpdMk() != null && "WCS_SENT".equalsIgnoreCase(m.getUpdMk())) {
                        continue;
                    }
@@ -139,4 +142,9 @@
        }
        return SUCCESS;
    }
    private boolean requiresOutboundErpConfirm(WrkMast wrkMast) {
        Integer ioType = wrkMast == null ? null : wrkMast.getIoType();
        return ioType != null && (ioType == 101 || ioType == 103 || ioType == 104 || ioType == 107 || ioType == 110);
    }
}
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -88,11 +88,30 @@
        if (!Cools.isEmpty(erpReport) && !"true".equalsIgnoreCase(erpReport)) {
            return false;
        }
        if (wrkMast == null || Cools.isEmpty(wrkMast.getBarcode())) {
        if (wrkMast == null) {
            return false;
        }
        Integer ioType = wrkMast.getIoType();
        return ioType != null && (ioType == 101 || ioType == 108 || ioType == 110);
        if (ioType == null || (ioType != 101 && ioType != 108 && ioType != 110)) {
            return false;
        }
        return !Cools.isEmpty(resolveOutboundPalletId(wrkMast));
    }
    private String resolveOutboundPalletId(WrkMast wrkMast) {
        if (!Cools.isEmpty(wrkMast.getBarcode())) {
            return wrkMast.getBarcode();
        }
        List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
        if (Cools.isEmpty(wrkDetls)) {
            return null;
        }
        for (WrkDetl wrkDetl : wrkDetls) {
            if (!Cools.isEmpty(wrkDetl.getZpallet())) {
                return wrkDetl.getZpallet();
            }
        }
        return null;
    }
    public ReturnT<String> doIn(WrkMast wrkMast) {
@@ -595,3 +614,4 @@
        return SUCCESS;
    }
}
src/main/java/com/zy/common/web/WcsController.java
@@ -47,7 +47,7 @@
    @Autowired
    private WaitPakinService waitPakinService;
    @Autowired
    private  LocDetlService locDetlService;
    private LocDetlService locDetlService;
    @Autowired
    private RowLastnoService rowLastnoService;
    @Autowired
@@ -62,59 +62,60 @@
        }
        List<WaitPakin> waitPakins = null;
            if (Cools.isEmpty(param.getBarcode())) {
                return R.error("条码不能为空");
            }
        if (Cools.isEmpty(param.getBarcode())) {
            return R.error("条码不能为空");
        }
        WrkMast wrkMast1 = wrkMastService.selectByBarcode(param.getBarcode());
        if (!Cools.isEmpty(wrkMast1)&&wrkMast1.getWrkSts()==2) {
            StartupDto dto1 =new StartupDto();
        if (!Cools.isEmpty(wrkMast1) && wrkMast1.getWrkSts() == 2) {
            StartupDto dto1 = new StartupDto();
            dto1.setBarcode(param.getBarcode());
            dto1.setStaNo(Integer.valueOf(wrkMast1.getStaNo()));
            String wcsLoc = Utils.WMSLocToWCSLoc(wrkMast1.getLocNo());
            dto1.setLocNo(wcsLoc);
            dto1.setCrnNo(wrkMast1.getCrnNo());
            dto1.setWorkNo(wrkMast1.getWrkNo());
            dto1.setTaskNo(wrkMast1.getWrkNo()+"");
            dto1.setTaskNo(wrkMast1.getWrkNo() + "");
//            dto1.setTaskPri((int) Math.round(wrkMast1.getIoPri()));
            return R.ok(dto1);
        }
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type", 1));
        if (!Cools.isEmpty(wrkMasts)&&wrkMasts.size()>100) {
        if (!Cools.isEmpty(wrkMasts) && wrkMasts.size() > 1) {
            return R.error("限行");
        }
            waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
            if (Cools.isEmpty(waitPakins)) {
                WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
                if (wrkMast != null && wrkMast.getIoType() == 103) {
                    return R.parse(CodeRes.PICK_600);
                }
                Date now = new Date();
                WaitPakin waitPakin = new WaitPakin();
                waitPakin.setMatnr("emptyPallet");
                waitPakin.setBatch("");
                waitPakin.setAnfme(1D);
                waitPakin.setZpallet(param.getBarcode());
                waitPakin.setIoStatus("N");
                waitPakin.setStatus("Y");
                waitPakin.setAppeUser(9999L);
                waitPakin.setAppeTime(now);
                waitPakin.setModiUser(9999L);
                waitPakin.setModiTime(now);
                if (!waitPakinService.insert(waitPakin)) {
                    return R.error("自动生成入库通知档失败");
                }
                waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
                if (Cools.isEmpty(waitPakins)) {
                    return R.error("自动生成入库通知档后未查询到数据");
                }
                log.info("WCS入库接口自动生成入库通知档, zpallet:{}, matnr:{}, anfme:{}", param.getBarcode(), "32149", 1D);
            }
             int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode()));
            int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet",param.getBarcode()));
            if (countLoc > 0 || countWrk > 0) {
                return R.error(CodeRes.EXIST_500);
            }
        if (Cools.isEmpty(param.getLocType1())){
        waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
        if (Cools.isEmpty(waitPakins)) {
            return R.error("请先添加入库通知档");
//            WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
//            if (wrkMast != null && wrkMast.getIoType() == 103) {
//                return R.parse(CodeRes.PICK_600);
//            }
//            Date now = new Date();
//            WaitPakin waitPakin = new WaitPakin();
//            waitPakin.setMatnr("emptyPallet");
//            waitPakin.setBatch("");
//            waitPakin.setAnfme(1D);
//            waitPakin.setZpallet(param.getBarcode());
//            waitPakin.setIoStatus("N");
//            waitPakin.setStatus("Y");
//            waitPakin.setAppeUser(9999L);
//            waitPakin.setAppeTime(now);
//            waitPakin.setModiUser(9999L);
//            waitPakin.setModiTime(now);
//            if (!waitPakinService.insert(waitPakin)) {
//                return R.error("自动生成入库通知档失败");
//            }
//            waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
//            if (Cools.isEmpty(waitPakins)) {
//                return R.error("自动生成入库通知档后未查询到数据");
//            }
//            log.info("WCS入库接口自动生成入库通知档, zpallet:{}, matnr:{}, anfme:{}", param.getBarcode(), "32149", 1D);
        }
        int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", param.getBarcode()));
        int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet", param.getBarcode()));
        if (countLoc > 0 || countWrk > 0) {
            return R.error(CodeRes.EXIST_500);
        }
        if (Cools.isEmpty(param.getLocType1())) {
            return R.error("高低检测信号不能为空");
        }
@@ -143,12 +144,12 @@
                return R.error("条码不能为空");
            }
        }
        if (Cools.isEmpty(param.getLocType1())){
        if (Cools.isEmpty(param.getLocType1())) {
            return R.error("高低检测信号不能为空");
        }
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.selectById(param.getSourceStaNo());
        if(sourceStaNo.getWrkNo() == 0 && sourceStaNo.getDevNo() != 2033){
        if (sourceStaNo.getWrkNo() == 0 && sourceStaNo.getDevNo() != 2033) {
            return R.error("站点工作号不存在");
        }
        sourceStaNo.setLocType1(param.getLocType1());
@@ -158,7 +159,7 @@
        switch (param.getIoType()) {
            case 1://满托盘入库
            case 10://空托盘入库
                dto = startupFullPutStoreAgv(param.getSourceStaNo(), param.getBarcode(), locTypeDto,param.getOutArea());
                dto = startupFullPutStoreAgv(param.getSourceStaNo(), param.getBarcode(), locTypeDto, param.getOutArea());
                break;
//                dto = emptyPlateIn(param.getSourceStaNo(), locTypeDto, param.getBarcode());
//                break;
@@ -171,15 +172,15 @@
    @PostMapping("/auto/emptyIn/v1")
    @ResponseBody
    public R autoEmptyIn(@RequestBody LocTypeDto locTypeDto){
    public R autoEmptyIn(@RequestBody LocTypeDto locTypeDto) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(1038, true);
        // 检索库位
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo( 10, 1038, findLocNoAttributeVo, locTypeDto);
        if (dto == null){
        StartupDto dto = commonService.getLocNo(10, 1038, findLocNoAttributeVo, locTypeDto);
        if (dto == null) {
            throw new CoolException("查询库位失败");
        }
        Date now = new Date();
@@ -208,27 +209,27 @@
        sourceStaNo.setWrkNo(dto.getWorkNo());
        sourceStaNo.setModiUser(9999L);
        sourceStaNo.setModiTime(now);
        if (!basDevpService.updateById(sourceStaNo)){
        if (!basDevpService.updateById(sourceStaNo)) {
            throw new CoolException("更新源站失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")){
        if (locMast.getLocSts().equals("O")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiUser(9999L);
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)){
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo()+"目标库位已被占用");
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        return wrkMastService.insert(wrkMast) ? R.ok("自动空托入库成功,工作号:"+wrkMast.getWrkNo()).add(wrkMast.getWrkNo()) : R.error("生成自动空托入库失败");
        return wrkMastService.insert(wrkMast) ? R.ok("自动空托入库成功,工作号:" + wrkMast.getWrkNo()).add(wrkMast.getWrkNo()) : R.error("生成自动空托入库失败");
    }
    @PostMapping("auto/emptyOut/v1")
    @ResponseBody
    public R autoEmptyOut(@RequestBody LocTypeDto locTypeDto){
    public R autoEmptyOut(@RequestBody LocTypeDto locTypeDto) {
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                .eq("loc_sts", "D"));
        if (Cools.isEmpty(locMast)) {
@@ -236,9 +237,11 @@
        }
        EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
        emptyPlateOutParam.setOutSite(locTypeDto.getSiteId());
        emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locMast.getLocNo()+"");}});
        emptyPlateOutParam.setLocNos(new ArrayList<String>() {{
            add(locMast.getLocNo() + "");
        }});
        WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam);
        return R.ok(!Cools.isEmpty(wrkMast)? R.ok("自动空托出库成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动空托出库失败"));
        return R.ok(!Cools.isEmpty(wrkMast) ? R.ok("自动空托出库成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动空托出库失败"));
    }
@@ -281,20 +284,21 @@
        }
        return workNo;
    }
    @PostMapping("/auto/TransplantingOut/v1")
    @ResponseBody
    public R autoTransplantingOut(@RequestBody TransplantWork transplantWork){
    public R autoTransplantingOut(@RequestBody TransplantWork transplantWork) {
        // 源站点状态检测
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(transplantWork.getStaNo(), true);
        WrkMast wrkMast1 = wrkMastService.selectWrkMast(transplantWork.getWorkNo(),transplantWork.getBarcode());
        WrkMast wrkMast1 = wrkMastService.selectWrkMast(transplantWork.getWorkNo(), transplantWork.getBarcode());
//        if(sourceStaNo ==null )hnagbao1{
//            return R.error("该站点盘点移栽许可,请查看源站点状态检测");
//        }
        if(wrkMast1== null){
            return  R.error("无该盘点移栽任务");
        if (wrkMast1 == null) {
            return R.error("无该盘点移栽任务");
        }
        WrkMast wrkMast2 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",9997));
        if(wrkMast2 != null){
        WrkMast wrkMast2 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", 9997));
        if (wrkMast2 != null) {
            throw new CoolException("存在9997盘点移栽任务");
        }
        List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(transplantWork.getWorkNo());
@@ -331,23 +335,23 @@
                throw new CoolException("保存工作明细失败");
            }
        }
        return wrkMastService.insert(wrkMast) ? R.ok("自动3号堆垛机移栽成功,工作号:"+wrkMast.getWrkNo()) : R.error("生成自动3号堆垛机移栽失败");
        return wrkMastService.insert(wrkMast) ? R.ok("自动3号堆垛机移栽成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动3号堆垛机移栽失败");
    }
    @PostMapping("/auto/TransplantingIn/v1")
    @ResponseBody
    public R autoTransplantingIn(@RequestBody TransplantWork transplantWork){
    public R autoTransplantingIn(@RequestBody TransplantWork transplantWork) {
        // 源站点状态检测
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(transplantWork.getStaNo(), true);
        WrkMast wrkMast1 = wrkMastService.selectWrkMast(transplantWork.getWorkNo(),transplantWork.getBarcode());
        WrkMast wrkMast1 = wrkMastService.selectWrkMast(transplantWork.getWorkNo(), transplantWork.getBarcode());
//        if(sourceStaNo == null){
//
//        }
        if(wrkMast1== null){
            return  R.error("无该盘点移栽任务");
        if (wrkMast1 == null) {
            return R.error("无该盘点移栽任务");
        }
        WrkMast wrkMast2 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",9996));
        if(wrkMast2 != null){
        WrkMast wrkMast2 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", 9996));
        if (wrkMast2 != null) {
            throw new CoolException("存在9996盘点移栽任务");
        }
        List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(transplantWork.getWorkNo());
@@ -384,7 +388,7 @@
                throw new CoolException("保存工作明细失败");
            }
        }
        return wrkMastService.insert(wrkMast) ? R.ok("自动3号堆垛机移栽成功,工作号:"+wrkMast.getWrkNo()) : R.error("生成自动3号堆垛机移栽失败");
        return wrkMastService.insert(wrkMast) ? R.ok("自动3号堆垛机移栽成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动3号堆垛机移栽失败");
    }
@@ -392,29 +396,29 @@
     * 全板入库AGV
     */
    @Transactional
    public StartupDto startupFullPutStoreAgv(Integer devpNo, String barcode, LocTypeDto locTypeDto,Integer outArea) {
    public StartupDto startupFullPutStoreAgv(Integer devpNo, String barcode, LocTypeDto locTypeDto, Integer outArea) {
        // 源站点状态检测
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        findLocNoAttributeVo.setOutArea(outArea);
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
        StartupDto dto = commonService.getLocNo( 1, devpNo,findLocNoAttributeVo, locTypeDto);
        StartupDto dto = commonService.getLocNo(1, devpNo, findLocNoAttributeVo, locTypeDto);
        // 更新目标库位状态
        Date now = new Date();
        if(dto == null){
        if (dto == null) {
            throw new CoolException("未找到库位");
        }
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")){
        if (locMast.getLocSts().equals("O")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setBarcode(barcode);
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)){
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo()+"目标库位已被占用");
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        return dto;
    }
@@ -490,18 +494,18 @@
//        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")){
        if (locMast.getLocSts().equals("O")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)){
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo()+"目标库位已被占用");
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        String wcsLoc = Utils.WMSLocToWCSLoc(dto.getLocNo());
        dto.setLocNo(wcsLoc);
        dto.setTaskNo(workNo+"");
        dto.setTaskNo(workNo + "");
        return dto;
    }
@@ -512,7 +516,7 @@
        // 检索库位
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo( 10, devpNo, findLocNoAttributeVo, locTypeDto);
        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto);
        int workNo = dto.getWorkNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -542,19 +546,19 @@
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiTime(new Date());
        if (!basDevpService.updateById(sourceStaNo)){
        if (!basDevpService.updateById(sourceStaNo)) {
            throw new CoolException("更新源站失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")){
        if (locMast.getLocSts().equals("O")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(new Date());
            if (!locMastService.updateById(locMast)){
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo()+"目标库位已被占用");
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        return dto;
    }
src/main/resources/application.yml
@@ -1,5 +1,5 @@
server:
  port: 8081
  port: 18080
  servlet:
    context-path: /@pom.build.finalName@
@@ -93,10 +93,10 @@
    ErpReportOld: true
  #  地址
  address:
    URL: https://shyucheng.test.kdgalaxy.com
    URL: http://192.168.160.8:8088
    #入库上报
    Inaddress: /kapi/oauth2/getToken
    #商品档案地址
    Inaddress: /api/Service/InPalletCompleted
    #出库上报
    Outaddress: /kapi/v2/eap7/basedata/bd_material/batchQuery
#wcs任务下发
@@ -105,7 +105,7 @@
  switch: true
  #  地址
  address:
    URL: https://127.0.0.1:9090
    URL: https://127.0.0.1:9090/wcs
    #入库任务下发地址
    createInTask : /openapi/createInTask
    #出库任务下发地址
src/main/resources/mapper/WrkMastLogMapper.xml
@@ -57,6 +57,7 @@
        <result column="log_err_time" property="logErrTime" />
        <result column="log_err_memo" property="logErrMemo" />
        <result column="barcode" property="barcode" />
        <result column="Pdc_type" property="PdcType" />
        <result column="ctn_no" property="ctnNo" />
        <result column="full_plt" property="fullPlt" />
        <result column="pre_have" property="preHave" />
src/main/resources/mapper/WrkMastMapper.xml
@@ -56,6 +56,7 @@
        <result column="log_err_time" property="logErrTime" />
        <result column="log_err_memo" property="logErrMemo" />
        <result column="barcode" property="barcode" />
        <result column="Pdc_type" property="PdcType" />
        <result column="ctn_no" property="ctnNo" />
        <result column="full_plt" property="fullPlt" />
        <result column="pre_have" property="preHave" />
@@ -70,6 +71,7 @@
        select * from asr_wrk_mast
        where wrk_sts=5
        or (wrk_sts=15 and take_none = '1' and ove_mk='Y' and wrk_no not in (select wrk_no from asr_bas_devp) and wrk_no not in (select wrk_no from asr_wrk_mast_sta))
        or (wrk_sts=15 and log_mk='F' and exp_time &gt;= 3 and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and dateadd(mi,3,crn_end_time) &lt;= getdate() and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and crn_end_time is null and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_no in (9997,9996) and wrk_sts = 15)
@@ -156,3 +158,4 @@
    </select>
</mapper>