自动化立体仓库 - WMS系统
zwl
19 小时以前 1b31d14e361c01fcd4e5c2dcfe0b6fb3a63c92fc
erp下发停止出库任务,wms取消wcs任务
5个文件已修改
225 ■■■■ 已修改文件
src/main/java/com/zy/api/controller/params/StopOutTaskParams.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OpenOrderPakoutPauseParam.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 183 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/controller/params/StopOutTaskParams.java
@@ -1,5 +1,6 @@
package com.zy.api.controller.params;
import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -20,6 +21,7 @@
    @ApiModelProperty("pause reason")
    private Integer reason;
    @JSONField(name = "taskList")
    @ApiModelProperty("task list")
    private List<TaskItem> tasks = new ArrayList<>();
src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
@@ -24,6 +24,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -181,17 +182,10 @@
                if (!wrkMastService.updateById(mast)) {
                    throw new CoolException("任务状态修改失败!!");
                }
                //wcs任务取消接口
            } 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.setModiTime(new Date());
                    if (!wrkMastService.updateById(mast)) {
                        throw new CoolException("task cancel update fail");
                    }
                }
            }else if (params.getMsgType().equals("task_arrive")) {
                workService.cancelWrkMast(String.valueOf(mast.getWrkNo()), 9955L);
            } else if (params.getMsgType().equals("task_arrive")) {
                //到达目的地
                //如果出库任务是跨区则需要生成新的入库任务入库
                if(!Cools.isEmpty(mast.getLocNo())){
@@ -219,13 +213,14 @@
    @Override
    public R pauseOutTasks(StopOutTaskParams params) {
        if (params == null || params.getTasks() == null || params.getTasks().isEmpty()) {
            return R.ok("no tasks to stop");
            return R.ok("无任务需要取消");
        }
        if (!Boolean.parseBoolean(String.valueOf(switchValue))) {
            return R.ok("wcs switch off");
            return R.ok("WCS开关关闭");
        }
        String response;
        try {
            log.info("调用WCS取消出库任务, request={}", JSON.toJSONString(params));
            response = new HttpHandler.Builder()
                    .setUri(wcs_address)
                    .setPath(stopOutTask)
@@ -235,15 +230,27 @@
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response == null ? "{}" : response);
            log.info("WCS取消出库任务返回, response={}", response);
            Integer code = jsonObject.getInteger("code");
            if (code == null || !Objects.equals(code, 200)) {
                String msg = jsonObject.getString("msg");
                throw new CoolException(Cools.isEmpty(msg) ? "WCS stop out task failed" : msg);
                throw new CoolException(Cools.isEmpty(msg) ? "WCS取消出库任务失败" : msg);
            }
            JSONObject data = jsonObject.getJSONObject("data");
            List<String> successList = data == null || data.getJSONArray("successList") == null
                    ? Collections.emptyList()
                    : data.getJSONArray("successList").toJavaList(String.class);
            List<String> failList = data == null || data.getJSONArray("failList") == null
                    ? Collections.emptyList()
                    : data.getJSONArray("failList").toJavaList(String.class);
            R result = R.ok(Cools.isEmpty(jsonObject.getString("msg")) ? "操作成功" : jsonObject.getString("msg"));
            result.put("data", data);
            result.put("successList", successList);
            result.put("failList", failList);
            return result;
        } catch (IOException e) {
            throw new CoolException("call WCS stop out task fail: " + e.getMessage());
            throw new CoolException("调用WCS取消出库任务失败: " + e.getMessage());
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/entity/param/OpenOrderPakoutPauseParam.java
@@ -7,5 +7,6 @@
    private String orderId;
    //执行任务,1 出库;2 暂停;暂停指剩余未操作托盘不再执行出库;
    private Integer reason;
}
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -375,47 +375,123 @@
    @Transactional
    public R pakoutOrderPause(OpenOrderPakoutPauseParam param) {
        if (param == null || Cools.isEmpty(param.getOrderId())) {
            throw new CoolException("orderNo is empty");
            throw new CoolException("orderNo不能为空");
        }
        if (param.getReason() == null) {
            throw new CoolException("reason不能为空");
        }
        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()) {
            result.put("confirmedCount", 0);
            return R.ok("no active out tasks").add(result);
        }
        Date now = new Date();
        int confirmedCount = 0;
        for (WrkMast wrkMast : activeTasks) {
            if (wrkMast == null || "Y".equalsIgnoreCase(wrkMast.getPdcType())) {
                continue;
        if (Objects.equals(param.getReason(), 1)) {
            // ERP确认立即执行,仅处理待下发的出库任务。
            List<WrkMast> pendingTasks = activeTasks.stream()
                    .filter(wrkMast -> wrkMast != null && Objects.equals(wrkMast.getWrkSts(), 11L))
                    .collect(Collectors.toList());
            Map<String, Object> result = new HashMap<>();
            result.put("orderNo", param.getOrderId());
            result.put("taskCount", pendingTasks.size());
            if (pendingTasks.isEmpty()) {
                result.put("confirmedCount", 0);
                return R.ok("无有效出库任务").add(result);
            }
            wrkMast.setPdcType("Y");
            Date now = new Date();
            int confirmedCount = 0;
            for (WrkMast wrkMast : pendingTasks) {
                if (wrkMast == null || "Y".equalsIgnoreCase(wrkMast.getPdcType())) {
                    continue;
                }
                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("confirm out task failed: " + wrkMast.getWrkNo());
                wrkMast.setModiTime(now);
                wrkMast.setModiUser(9527L);
                if (!wrkMastService.updateById(wrkMast)) {
                    throw new CoolException("确认执行出库任务失败: " + wrkMast.getWrkNo());
                }
                confirmedCount++;
            }
            confirmedCount++;
        }
        result.put("confirmedCount", confirmedCount);
        return R.ok(confirmedCount == 0 ? "tasks already confirmed" : "erp confirm out success").add(result);
            result.put("confirmedCount", confirmedCount);
            return R.ok(confirmedCount == 0 ? "任务已确认执行" : "ERP确认执行出库成功").add(result);
        }
        if (Objects.equals(param.getReason(), 2)) {
            // ERP请求取消任务:未下发任务直接本地取消,已下发任务交给WCS判定可取消清单。
            Map<String, Object> result = new HashMap<>();
            result.put("orderNo", param.getOrderId());
            result.put("reason", param.getReason());
            result.put("taskCount", activeTasks.size());
            if (activeTasks.isEmpty()) {
                result.put("successList", Collections.emptyList());
                result.put("failList", Collections.emptyList());
                result.put("cancelledCount", 0);
                return R.ok("无有效出库任务").add(result);
            }
            Map<String, WrkMast> taskIndex = activeTasks.stream()
                    .filter(wrkMast -> wrkMast != null && wrkMast.getWrkNo() != null)
                    .collect(Collectors.toMap(
                            wrkMast -> String.valueOf(wrkMast.getWrkNo()),
                            wrkMast -> wrkMast,
                            (left, right) -> left,
                            LinkedHashMap::new
                    ));
            List<WrkMast> directCancelTasks = activeTasks.stream()
                    .filter(wrkMast -> wrkMast != null && !needNotifyWcsStop(wrkMast))
                    .collect(Collectors.toList());
            List<WrkMast> wcsCancelTasks = activeTasks.stream()
                    .filter(this::needNotifyWcsStop)
                    .collect(Collectors.toList());
            LinkedHashSet<String> successTaskNos = new LinkedHashSet<>();
            LinkedHashSet<String> failTaskNos = new LinkedHashSet<>();
            cancelOutboundTasks(directCancelTasks.stream()
                    .map(WrkMast::getWrkNo)
                    .filter(Objects::nonNull)
                    .map(String::valueOf)
                    .collect(Collectors.toList()), taskIndex, successTaskNos);
            List<String> wcsSuccessList = Collections.emptyList();
            List<String> wcsFailList = Collections.emptyList();
            if (!wcsCancelTasks.isEmpty()) {
                R wcsResult = wcsApiService.pauseOutTasks(buildStopOutTaskParams(param, wcsCancelTasks));
                wcsSuccessList = extractTaskNoList(wcsResult, "successList");
                wcsFailList = extractTaskNoList(wcsResult, "failList");
                cancelOutboundTasks(wcsSuccessList, taskIndex, successTaskNos);
                LinkedHashSet<String> wcsFailTaskNos = new LinkedHashSet<>(wcsFailList);
                if (wcsFailTaskNos.isEmpty()) {
                    for (WrkMast wrkMast : wcsCancelTasks) {
                        String taskNo = String.valueOf(wrkMast.getWrkNo());
                        if (!successTaskNos.contains(taskNo)) {
                            wcsFailTaskNos.add(taskNo);
                        }
                    }
                }
                failTaskNos.addAll(wcsFailTaskNos);
                wcsFailList = new ArrayList<>(wcsFailTaskNos);
            }
            result.put("wcsTaskCount", wcsCancelTasks.size());
            result.put("wcsSuccessList", wcsSuccessList);
            result.put("wcsFailList", wcsFailList);
            result.put("successList", new ArrayList<>(successTaskNos));
            result.put("failList", new ArrayList<>(failTaskNos));
            result.put("cancelledCount", successTaskNos.size());
            result.put("failCount", failTaskNos.size());
            return R.ok(successTaskNos.isEmpty() ? "没有可取消任务" : "取消出库任务成功").add(result);
        }
        throw new CoolException("reason仅支持1或2");
    }
    @Override
    @Transactional
    public R pakoutOrderExecute(OpenOrderPakoutExecuteParam param) {
        if (param == null || Cools.isEmpty(param.getOrderId())) {
            throw new CoolException("orderId is empty");
            throw new CoolException("orderId不能为空");
        }
        if (param.getExecute() == null) {
            throw new CoolException("execute is empty");
            throw new CoolException("execute不能为空");
        }
        if (Objects.equals(param.getExecute(), 1)) {
            return createPakoutTasks(param.getOrderId());
@@ -423,10 +499,10 @@
        if (Objects.equals(param.getExecute(), 2)) {
            OpenOrderPakoutPauseParam pauseParam = new OpenOrderPakoutPauseParam();
            pauseParam.setOrderId(param.getOrderId());
//            pauseParam.setReason("OPEN_API_CONFIRM_OUT");
            pauseParam.setReason(2);
            return pakoutOrderPause(pauseParam);
        }
        throw new CoolException("execute only supports 1 or 2");
        throw new CoolException("execute仅支持1或2");
    }
    private List<WrkMast> findActiveOutboundTasks(String orderNo) {
@@ -444,7 +520,7 @@
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                .in("wrk_no", wrkNos)
                .in("io_type", Arrays.asList(101, 103, 104, 107, 108, 110))
                .eq("wrk_sts", 11L));
                .in("wrk_sts", Arrays.asList(11L, 12L, 13L)));
        if (wrkMasts == null || wrkMasts.isEmpty()) {
            return Collections.emptyList();
        }
@@ -564,20 +640,59 @@
    private StopOutTaskParams buildStopOutTaskParams(OpenOrderPakoutPauseParam param, List<WrkMast> wrkMasts) {
        StopOutTaskParams stopParams = new StopOutTaskParams();
        stopParams.setOrderNo(param.getOrderId());
        stopParams.setReason(param.getReason());
        // WCS取消接口仅接收 taskList.taskNo。
        for (WrkMast wrkMast : wrkMasts) {
            StopOutTaskParams.TaskItem item = new StopOutTaskParams.TaskItem();
            item.setTaskNo(String.valueOf(wrkMast.getWrkNo()));
            if (wrkMast.getStaNo() != null) {
                item.setStaNo(String.valueOf(wrkMast.getStaNo()));
            }
            item.setLocNo(wrkMast.getSourceLocNo());
            stopParams.getTasks().add(item);
        }
        return stopParams;
    }
    private List<String> extractTaskNoList(R result, String key) {
        if (result == null) {
            return Collections.emptyList();
        }
        List<String> taskNos = toTaskNoList(result.get(key));
        if (!taskNos.isEmpty()) {
            return taskNos;
        }
        Object data = result.get("data");
        if (data instanceof Map) {
            return toTaskNoList(((Map<?, ?>) data).get(key));
        }
        if (data instanceof JSONObject) {
            return toTaskNoList(((JSONObject) data).get(key));
        }
        return Collections.emptyList();
    }
    private List<String> toTaskNoList(Object value) {
        if (value == null) {
            return Collections.emptyList();
        }
        if (value instanceof Collection) {
            List<String> taskNos = new ArrayList<>();
            for (Object item : (Collection<?>) value) {
                if (item != null) {
                    taskNos.add(String.valueOf(item));
                }
            }
            return taskNos;
        }
        return JSON.parseArray(JSON.toJSONString(value), String.class);
    }
    private void cancelOutboundTasks(List<String> taskNos, Map<String, WrkMast> taskIndex, Set<String> successTaskNos) {
        for (String taskNo : taskNos) {
            if (Cools.isEmpty(taskNo) || successTaskNos.contains(taskNo) || !taskIndex.containsKey(taskNo)) {
                continue;
            }
            workService.cancelWrkMast(taskNo, 9527L);
            successTaskNos.add(taskNo);
        }
    }
    @Override
    public List<OpenOrderCompeteResult> pakoutOrderComplete(OpenOrderCompleteParam param) {
        List<OpenOrderCompeteResult> results = new ArrayList<>();
src/main/resources/application.yml
@@ -113,4 +113,4 @@
    #移库任务下发地址
    createLocMoveTask: /openapi/createLocMoveTask
    #pause out task
    stopOutTask: /openapi/stopOutTask
    stopOutTask: /openapi/createOutTaskBatch