自动化立体仓库 - WMS系统
zwl
7 天以前 5b00928c8570a3ba21a1170b4642ef88635d90da
src/main/java/com/zy/common/web/WcsController.java
@@ -15,12 +15,15 @@
import com.zy.common.model.StartupDto;
import com.zy.common.service.CommonService;
import com.zy.common.web.param.SearchLocParam;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -58,8 +61,12 @@
    @PostMapping("/pakin/loc/v1")
    @ResponseBody
    public synchronized R getLocNo(@RequestBody SearchLocParam param) {
    public synchronized R getLocNo(@RequestBody SearchLocParam param, HttpServletRequest request) {
        long startTime = System.currentTimeMillis();
        if (param != null && request != null) {
            log.info("[getLocNo] cache: {}", JSON.toJSONString(param));
            request.setAttribute("cache", param);
        }
        String barcode = param == null ? null : param.getBarcode();
        Integer sourceStaNo = param == null ? null : param.getSourceStaNo();
        try {
@@ -93,7 +100,7 @@
//        }
            waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
            if (Cools.isEmpty(waitPakins)) {
                return R.error("请先添加入库通知档");
                return R.error("请先收货后再入库");
//            WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
//            if (wrkMast != null && wrkMast.getIoType() == 103) {
//                return R.parse(CodeRes.PICK_600);
@@ -130,10 +137,16 @@
            // 源站点状态检测
            BasDevp sourceStaNoEntity = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
            sourceStaNoEntity.setLocType1(param.getLocType1());
            sourceStaNoEntity.setLocType1((short) (param.getLocType1()!=1?2:1));
            LocTypeDto locTypeDto = new LocTypeDto(sourceStaNoEntity);
            if (waitPakins.get(0).getMatnr().equals("emptyPallet")) {
                // 空托盘由组托档 matnr=emptyPallet 标识;后续 CommonService 会按窄库位优先、locType1=3 兜底规则找库位。
                locTypeDto.setLocType2((short) 1);
            }
            // 入参重量最多两位小数
            if (param.getWeight() != null) {
                param.setWeight(param.getWeight().setScale(2, RoundingMode.HALF_UP));
            }
            StartupDto dto = startupFullPutStore(param.getSourceStaNo(), param.getBarcode(), locTypeDto, waitPakins,param.getWeight());
@@ -169,6 +182,7 @@
        }
        sourceStaNo.setLocType1(param.getLocType1());
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        // AGV 空托盘直入库固定走 staDescId=10,最终由 CommonService.getLocNo 统一执行找位规则。
        param.setIoType(10);
        StartupDto dto = null;
        switch (param.getIoType()) {
@@ -416,7 +430,7 @@
    public StartupDto startupFullPutStoreAgv(Integer devpNo, String barcode, LocTypeDto locTypeDto, Integer outArea, Integer staDescId) {
        // 源站点状态检测
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        // 检索库位;staDescId=10 时按空托盘入口识别,进入 CommonService 的优先池 + locType1=3 兜底找位规则。
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        findLocNoAttributeVo.setOutArea(outArea);
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
@@ -450,11 +464,8 @@
        try {
            // 源站点状态检测
            BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
            // 检索库位
            List<String> matnrs = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
            List<String> batchs = waitPakins.stream().map(WaitPakin::getBatch).distinct().collect(Collectors.toList());
            FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(matnrs.get(0), batchs.get(0));
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
            // 检索库位;如果组托档是 emptyPallet,即使 staDescId=1,也会在 CommonService 内切换为空托盘找位规则。
            FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
            // IoT 指定了目标库位时优先尝试该库位;不可用时再退回现有自动找位规则。
            StartupDto dto = buildPreferredStartupDto(devpNo, extractPreferredInboundLoc(waitPakins));
            if (dto == null) {
@@ -482,7 +493,9 @@
            wrkMast.setScWeight(weight);
            // 把 referenceId/orderNo 透传到工作主档,便于作业完成后继续回传给 IoT。
            wrkMast.setUserNo(waitPakins.get(0).getOrderNo());
            wrkMast.setCubeNumber(waitPakins.get(0).getCubeNumber());
            wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
            wrkMast.setMemo(InboundCameraCaptureService.CAPTURE_PENDING);
            // 操作人员数据
            wrkMast.setAppeTime(now);
            wrkMast.setModiTime(now);
@@ -588,7 +601,7 @@
public StartupDto emptyPlateIn(Integer devpNo, LocTypeDto locTypeDto, String barcode) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        // 检索库位;旧空托盘入库入口固定传 staDescId=10,仍复用 CommonService 的统一空托盘找位规则。
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto);