自动化立体仓库 - WMS系统
skyouc
2 天以前 dd2096e88fc4b44c7d40ffab90719a695dd56b4e
设备执行状态 回写
8个文件已修改
340 ■■■■■ 已修改文件
src/main/java/com/zy/api/controller/WcsApiController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/controller/params/ReceviceTaskParams.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/controller/params/WorkTaskParams.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/service/WcsApiService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/LocDetl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WorkMastScheduler.java 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 193 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/controller/WcsApiController.java
@@ -79,4 +79,17 @@
        }
        return wcsApiService.pubWrkToWcs(params);
    }
    @ManagerAuth
    @ApiOperation("设备执行状态回写")
    @PostMapping("/openapi/report")
    public R receviceTaskFromWcs(@RequestBody ReceviceTaskParams params) {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
        }
        return wcsApiService.receviceTaskFromWcs(params);
    }
}
src/main/java/com/zy/api/controller/params/ReceviceTaskParams.java
@@ -1,7 +1,9 @@
package com.zy.api.controller.params;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -15,4 +17,28 @@
    @ApiModelProperty("机台号")
    private String deviceNo;
    @ApiModelProperty("流水号")
    private Integer id;
    @ApiModelProperty("通知类型:task")
    private String notifyType;
    @ApiModelProperty("堆垛机号")
    private Integer device;
    @ApiModelProperty("WCS任务号")
    private String taskNo;
    @ApiModelProperty("WMS任务号")
    private String superTaskNo;
    @ApiModelProperty("消息类型:task_complete、task_cancel")
    private String msgType;
    @ApiModelProperty("消息描述")
    private String msgDesc;
    @ApiModelProperty("消息数据")
    private String data;
}
src/main/java/com/zy/api/controller/params/WorkTaskParams.java
@@ -28,7 +28,7 @@
    private String barcode;
    @ApiModelProperty("优先级")
    private String taskPri;
    private Integer taskPri;
    @ApiModelProperty("出库站点")
    private String staNo;
src/main/java/com/zy/api/service/WcsApiService.java
@@ -44,4 +44,13 @@
     * @param type
     */
    void reportLockLocs(Set<String> locs, String type);
    /**
     * 堆垛机任务完成状态上报
     * @author Ryan
     * @date 2026/1/10 16:29
     * @param params
     * @return com.core.common.R
     */
    R receviceTaskFromWcs(ReceviceTaskParams params);
}
src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
@@ -175,4 +175,47 @@
        }
    }
    /**
     * 堆垛机执行状态上报
     * @author Ryan
     * @date 2026/1/10 16:30
     * @param params
     * @return com.core.common.R
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R receviceTaskFromWcs(ReceviceTaskParams params) {
        if (Objects.isNull(params.getDevice())) {
            throw new CoolException("设备号不能为空!!");
        }
        if (Objects.isNull(params.getSuperTaskNo())) {
            throw new CoolException("WMS任务号不能为空!!");
        }
        if (Objects.isNull(params.getMsgType())) {
            throw new CoolException("动作类型不能为空!!");
        }
        WrkMast mast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_code", params.getSuperTaskNo()));
        if (Objects.isNull(mast)) {
            throw new CoolException("任务档不存在!!");
        }
        if (!Objects.isNull(params.getMsgType()) && params.getMsgType().equals("task")) {
           throw new CoolException("消息不能为空!!");
        }
        if (params.getMsgType().equals("task_complete")) {
            mast.setWrkSts(4L);
            if (!wrkMastService.updateById(mast)) {
                throw new CoolException("任务状态修改失败!!");
            }
        } else if (params.getMsgType().equals("task_cancel")){
        }
//       if (!wrkMastService.updateById(mast)) {
//           throw new CoolException("任务状态修改失败!!");
//       }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/entity/LocDetl.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.SpringUtils;
@@ -25,13 +26,12 @@
@Data
@TableName("asr_loc_detl")
@Accessors(chain = true)
@ExcelIgnoreUnannotated
public class LocDetl implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @TableField("loc_id")
src/main/java/com/zy/asrs/task/WorkMastScheduler.java
@@ -1,5 +1,8 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.api.controller.params.WorkTaskParams;
import com.zy.api.service.WcsApiService;
import com.zy.asrs.entity.Task;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.TaskService;
@@ -12,6 +15,8 @@
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;
@@ -29,9 +34,11 @@
    private WorkMastHandler workMastHandler;
    @Autowired
    private TaskService taskService;
    @Autowired
    private WcsApiService wcsApiService;
    @Scheduled(cron = "0/3 * * * * ? ")
    private void execute(){
    private void execute() {
        List<WrkMast> wrkMasts = wrkMastService.selectToBeCompleteData();
        if (wrkMasts.isEmpty()) {
            return;
@@ -49,23 +56,36 @@
        }
    }
    @Scheduled(cron = "0/3 * * * * ? ")
    private void executeTask(){
        List<Task> wrkMasts = taskService.selectToBeCompleteData();
    /**
     * 任务自动下发
     *
     * @author Ryan
     * @date 2026/1/10 14:42
     */
//    @Scheduled(cron = "0/15 * * * * ? ")
    private void autoPubTasks() {
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_sts", Arrays.asList(1L, 11L)));
        if (wrkMasts.isEmpty()) {
            return;
        }
        for (Task wrkMast : wrkMasts) {
            ReturnT<String> returnT = workMastHandler.AgvStart(wrkMast);
            if (!returnT.isSuccess()) {
                wrkMast.setUpdMk("X");
                wrkMast.setErrorMemo(returnT.getMsg());
                wrkMast.setErrorTime(new Date());
                if (!taskService.updateById(wrkMast)) {
                    log.error("工作档[workNo={}]标记待处理失败", wrkMast.getWrkNo());
                }
        Collections.shuffle(wrkMasts);
        wrkMasts.forEach(wrkMast -> {
            WorkTaskParams params = new WorkTaskParams();
            if (wrkMast.getIoType().equals(1)) {
                params.setType("in");
                params.setTaskNo(wrkMast.getWrkCode())
                        .setLocNo(wrkMast.getLocNo())
                        .setBarcode(wrkMast.getBarcode())
                        .setTaskPri(Integer.parseInt(wrkMast.getIoPri() + ""));
            } else {
                params.setType("out")
                        .setTaskNo(wrkMast.getWrkCode())
                        .setLocNo(wrkMast.getLocNo())
                        .setStaNo(wrkMast.getStaNo())
                        .setTaskPri(Integer.parseInt(wrkMast.getIoPri() + ""));
            }
        }
            wcsApiService.pubWrkToWcs(params);
        });
    }
}
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -138,30 +138,35 @@
                            }
                        }
                        // 更新订单完成数量
                        OrderDetlPakin orderDetlPakin = orderDetlPakinService.selectItem
                                (wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        if (orderDetlPakin == null) {
                            orderDetlPakin = orderDetlPakinService.selectItem
                                    (wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(),
                                            wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                        //判断匹配编码不为空,且任务编码包含-2,确认为有上组任务
                        if (!Objects.isNull(wrkMast.getWrkCode()) && wrkMast.getWrkCode().contains("-2")) {
                            //不需要更新单据信息(子任务无单据
                        } else {
                            //正常单据才存存入库单,作入库单据信息更新
                            // 更新订单完成数量
                            OrderDetlPakin orderDetlPakin = orderDetlPakinService.selectItem
                                    (wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                            wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        }
                        try {
                            if (!Cools.isEmpty(orderDetlPakin)) {
                                if (!orderDetlPakinService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                        orderDetlPakin.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) {
                            if (orderDetlPakin == null) {
                                orderDetlPakin = orderDetlPakinService.selectItem
                                        (wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(),
                                                wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                                wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                            }
                            try {
                                if (!Cools.isEmpty(orderDetlPakin)) {
                                    if (!orderDetlPakinService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                            orderDetlPakin.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                            wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) {
//                                    exceptionHandle("全板入库 ===>> 更新订单完成数量失败;[workNo={0}],[locNo={1}]",
//                                            wrkMast.getWrkNo(), wrkMast.getLocNo());
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("全板入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                        return FAIL.setMsg("全板入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                    }
                                }
                            } catch (Exception ignore) {
                            }
                        } catch (Exception ignore) {
                        }
                    }
                    // 修改库位状态 S ====>> F
                    if (locMast.getLocSts().equals("S")) {
@@ -567,158 +572,6 @@
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return FAIL.setMsg(e.getMessage());
        }
        return SUCCESS;
    }
    /**
     * @author Ryan
     * @date 2025/9/23
     * @description: AGV任务完成加入历史档
     * @version 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public ReturnT<String> AgvStart(Task task) {
        // 4.入库完成
        if (task.getWrkSts() == 4) {
            return agvDoIn(task);
            // 14.出库完成
        } else if (task.getWrkSts() == 14) {
            return agvDoOut(task);
        }
        return SUCCESS;
    }
    /**
     * @author Ryan
     * @date 2025/9/25
     * @description: AGV出库任务
     * @version 1.0
     */
    public ReturnT<String> agvDoOut(Task task) {
        if (task.getIoType().equals(101)) {
            Date now = new Date();
            LocCache locMast = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no" ,task.getSourceLocNo()));
            if (Objects.isNull(locMast)) {
                throw new RuntimeException("数据错误:库位信息不能为空!!");
            }
            List<TaskDetl> wrkDetls101 = taskDetlService.selectList(new EntityWrapper<TaskDetl>().eq("wrk_no", task.getWrkNo()));
            if (wrkDetls101.isEmpty()) {
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg("全板出库 ===>> 工作明细档为空; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
            }
            for (TaskDetl wrkDetl : wrkDetls101) {
                // 更新订单完成数量
                OrderDetlPakout orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                        wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                if (orderDetlPakout == null) {
                    orderDetlPakout = orderDetlPakoutService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                            wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                }
                try {
                    if (!Cools.isEmpty(orderDetlPakout)) {
                        if (!orderDetlPakoutService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                orderDetlPakout.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(),
                                wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3(), wrkDetl.getAnfme())) {
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("全板出库 ===>> 更新订单完成数量失败; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
                        }
                    }
                } catch (Exception ignore) {
                }
            }
            // 删除工作档源库位的库存明细
            if (!locDetlService.delete(new EntityWrapper<LocDetl>().eq("loc_no", task.getSourceLocNo()))) {
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg("全板出库 ===>> 删除库存明细失败; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
            }
            // 修改源库位状态 R ===>> O
            if (locMast.getLocSts().equals(LocStsType.LOC_STS_TYPE_R.type)) {
                locMast.setLocSts(LocStsType.LOC_STS_TYPE_O.type);
                locMast.setBarcode("");
                locMast.setModiTime(now);
                locMast.setIoTime(now);
                if (!locCacheService.updateById(locMast)) {
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                    return FAIL.setMsg("全板出库 ===>> 修改源库位状态失败; [workNo=" + task.getWrkNo() + "],[locNo=" + task.getSourceLocNo() + "]");
                }
            } else {
                throw new CoolException("当前库位状态" + locMast.getLocSts() + ", 无法执行出库操作!!");
            }
            BasStation devNo = basStationService.selectOne(new EntityWrapper<BasStation>().eq("dev_no", task.getStaNo()));
            if (Objects.isNull(devNo)) {
                throw new CoolException("站点:" + task.getSourceStaNo() + ", 不存在!!");
            }
            devNo.setLocSts(LocStsType.LOC_STS_TYPE_F.type);
            devNo.setModiTime(new Date());
            if (!basStationService.updateById(devNo)) {
                throw new CoolException("站点信息修改失败!!");
            }
            task.setWrkSts(15L);
            if (!taskService.updateById(task)) {
                throw new CoolException("任务状态修改失败!!");
            }
        } else {
        }
        return SUCCESS;
    }
    @Transactional(rollbackFor = Exception.class)
    public ReturnT<String> agvDoIn(Task wrkMast) {
        LocCache locCache = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", wrkMast.getLocNo()));
        if (Objects.isNull(locCache)) {
            throw new CoolException("数据错误,库位不存在!!");
        }
        if (!locCache.getLocSts().equals(LocStsType.LOC_STS_TYPE_S.type)) {
            throw new CoolException("当前库位状态为:" + LocStsType.LOC_STS_TYPE_S.type + "." + LocStsType.LOC_STS_TYPE_S.desc + ",不是出库预约状态");
        }
        List<WaitPakin> apallet = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", wrkMast.getBarcode()));
        if (Objects.isNull(apallet)) {
            throw new CoolException("数据错误:组托数据不存在!!");
        }
        apallet.forEach(pakin -> {
            LocDetl detl = new LocDetl();
            BeanUtils.copyProperties(pakin, detl);
            detl.setBarcode(pakin.getBarcode())
                    .setAnfme(pakin.getAnfme())
                    .setBrand(pakin.getBrand())
                    .setAppeTime(new Date())
                    .setSpecs(pakin.getSpecs())
                    .setColor(pakin.getColor())
                    .setLocId(locCache.getId())
                    .setLocNo(locCache.getLocNo())
                    .setAreaId(locCache.getAreaId())
                    .setAreaName(locCache.getAreaName())
                    .setUnit(pakin.getUnit())
                    .setBatch(pakin.getBatch());
            if (!locDetlService.insert(detl)) {
                throw new CoolException("库位明细保存失败!!");
            }
        });
        locCache.setLocSts(LocStsType.LOC_STS_TYPE_F.type);
        locCache.setModiTime(new Date());
        locCache.setBarcode(wrkMast.getBarcode());
        locCache.setModiTime(new Date());
        locCache.setIoTime(new Date());
        if (!locCacheService.updateById(locCache)) {
            throw new CoolException("库位状态修改失败!");
        }
        wrkMast.setWrkSts(5L);
        wrkMast.setModiTime(new Date());
        if (!taskService.updateById(wrkMast)) {
            throw new CoolException("任务状态修改失败!!");
        }
        Set<Long> list = apallet.stream().map(WaitPakin::getOrderId).collect(Collectors.toSet());
        List<OrderPakin> pakins = orderPakinService.selectList(new EntityWrapper<OrderPakin>().in("id", list));
        if (Objects.isNull(pakins) || pakins.isEmpty()) {
            throw new CoolException("单据不存在!!");
        }
        return SUCCESS;
    }
}