自动化立体仓库 - WMS系统
pang.jiabao
2024-07-20 1dee71cb131b52cd6e9ed8995de4d07c3a879d68
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -26,6 +26,7 @@
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 移动端服务核心类
@@ -1249,7 +1250,223 @@
        return R.error("盘点确认异常");
    }
        /**
    @Override
    @Transactional
    public R pdaWarehousingNow(PdaWarehousingNowParam param, Long userId) {
        String barcode = param.getBarcode();
        Integer sourceStaNo = param.getSourceStaNo();
        int zpalletCount = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", barcode));
        if (zpalletCount > 0) {
            throw new CoolException("库存托盘码已存在:" + barcode);
        }
        int barcodeCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("barcode", barcode));
        if (barcodeCount > 0) {
            throw new CoolException("工作档已存在该托盘码:" + barcode);
        }
        Map<String, List<PdaWarehousingNowParam.Roll>> boxGroup = param.getBoxGroup();
        List<PdaWarehousingNowParam.Roll> leftPosList = boxGroup.get("左");
        List<PdaWarehousingNowParam.Roll> centrePosList = boxGroup.get("中");
        List<PdaWarehousingNowParam.Roll> rightPosList = boxGroup.get("右");
        // 根据箱号获取包装组号
        List<String> boxNoList = leftPosList.stream().map(PdaWarehousingNowParam.Roll::getBoxNo).distinct().collect(Collectors.toList());
        boxNoList.addAll(centrePosList.stream().map(PdaWarehousingNowParam.Roll::getBoxNo).distinct().collect(Collectors.toList()));
        boxNoList.addAll(rightPosList.stream().map(PdaWarehousingNowParam.Roll::getBoxNo).distinct().collect(Collectors.toList()));
        Map<String, String> map = new HashMap<>();
//        if (boxNoList.size() > 0) {
//             map = getPackageGroupNoByGwms(boxNoList);
//        }
        LocTypeDto locTypeDto = new LocTypeDto();
        locTypeDto.setLocType1((short)1);
        // 根据源站点寻找库位
        StartupDto dto = commonService.getLocNo(1, sourceStaNo, locTypeDto);
        int workNo = dto.getWorkNo();
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(new Date());
        wrkMast.setWrkSts(1L); // 工作状态:1.生成入库id
        wrkMast.setIoType(1); // 入出库状态:1.入库
        wrkMast.setIoPri(13D); // 优先级
        wrkMast.setCrnNo(dto.getCrnNo());
        wrkMast.setSourceStaNo(dto.getSourceStaNo());
        wrkMast.setStaNo(dto.getStaNo());
        wrkMast.setLocNo(dto.getLocNo());
        wrkMast.setBarcode(barcode); // 托盘码
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("Y");
        wrkMast.setCtnType(1); // 容器类型
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setAppeUser(userId);
        wrkMast.setModiUser(userId);
        boolean res = wrkMastService.insert(wrkMast);
        if (!res) {
            throw new CoolException("保存工作档失败");
        }
        for (PdaWarehousingNowParam.Roll roll: leftPosList) {
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setMatnr(roll.getSpecs()); // 规格
            wrkDetl.setMaktx(roll.getSpecs()); //规格
            wrkDetl.setBatch(roll.getBoxNo()); // 箱号
            wrkDetl.setModel(roll.getRollNo()); // 卷号
            wrkDetl.setBrand(map.get(roll.getBoxNo()) == null ? "" : map.get(roll.getBoxNo())); // 包装组号
            wrkDetl.setZpallet(barcode); // 托盘吗
            wrkDetl.setOrigin("左"); // 木箱在托盘位置
            wrkDetl.setWeight(roll.getNetWeight()); // 净重
            wrkDetl.setVolume(roll.getGrossWeight()); // 毛重
            wrkDetl.setPrice(roll.getLength());
            wrkDetl.setSpecs(String.valueOf(roll.getSplices()));
            wrkDetl.setAnfme(1.0);
            wrkDetl.setIoTime(now);
            wrkDetl.setAppeTime(now);
            wrkDetl.setModiTime(now);
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiUser(userId);
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作明细失败");
            }
        }
        for (PdaWarehousingNowParam.Roll roll: centrePosList) {
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setMatnr(roll.getSpecs()); // 规格
            wrkDetl.setMaktx(roll.getSpecs()); //规格
            wrkDetl.setBatch(roll.getBoxNo()); // 箱号
            wrkDetl.setModel(roll.getRollNo()); // 卷号
            wrkDetl.setBrand(map.get(roll.getBoxNo()) == null ? "" : map.get(roll.getBoxNo())); // 包装组号
            wrkDetl.setZpallet(barcode); // 托盘吗
            wrkDetl.setOrigin("中"); // 木箱在托盘位置
            wrkDetl.setWeight(roll.getNetWeight()); // 净重
            wrkDetl.setVolume(roll.getGrossWeight()); // 毛重
            wrkDetl.setPrice(roll.getLength());
            wrkDetl.setSpecs(String.valueOf(roll.getSplices()));
            wrkDetl.setAnfme(1.0);
            wrkDetl.setIoTime(now);
            wrkDetl.setAppeTime(now);
            wrkDetl.setModiTime(now);
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiUser(userId);
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作明细失败");
            }
        }
        for (PdaWarehousingNowParam.Roll roll: rightPosList) {
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setMatnr(roll.getSpecs()); // 规格
            wrkDetl.setMaktx(roll.getSpecs()); //规格
            wrkDetl.setBatch(roll.getBoxNo()); // 箱号
            wrkDetl.setModel(roll.getRollNo()); // 卷号
            wrkDetl.setBrand(map.get(roll.getBoxNo()) == null ? "" : map.get(roll.getBoxNo())); // 包装组号
            wrkDetl.setZpallet(barcode); // 托盘吗
            wrkDetl.setOrigin("右"); // 木箱在托盘位置
            wrkDetl.setWeight(roll.getNetWeight()); // 净重
            wrkDetl.setVolume(roll.getGrossWeight()); // 毛重
            wrkDetl.setPrice(roll.getLength());
            wrkDetl.setSpecs(String.valueOf(roll.getSplices()));
            wrkDetl.setAnfme(1.0);
            wrkDetl.setIoTime(now);
            wrkDetl.setAppeTime(now);
            wrkDetl.setModiTime(now);
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiUser(userId);
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作明细失败");
            }
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(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()+"目标库位已被占用");
        }
        // 推送GWCS目标消息
        openServiceImpl.pushStaNoToGwcs(sourceStaNo,dto.getStaNo(),dto.getWorkNo());
        return R.ok("入库启动成功");
    }
    private Map<String, String> getPackageGroupNoByGwms(List<String> boxNoList) {
        Map<String, String> map = null;
        Map<String, Object> headers = new HashMap<>();
        headers.put("Content-Type", "application/json;charset=UTF-8");
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("boxNoList", JSONObject.toJSONString(boxNoList));
        String body = jsonObject.toJSONString();
        boolean success = false;
        String response = "";
        try {
            response = new HttpHandler.Builder()
                    .setUri(MesConstant.GWMS_IP_PORT)
                    .setPath(MesConstant.GWMS_GET_GROUP_NO_URL)
                    .setHeaders(headers)
                    .setJson(body)
                    .build()
                    .doPost();
            if (!Cools.isEmpty(response)) {
                JSONObject jsonObject1 = JSONObject.parseObject(response);
                int code = (int) jsonObject1.get("code");
                String msg = (String) jsonObject1.get("msg");
                 if (code != 200) {
                     throw new CoolException(msg);
                 }
                map = (Map<String, String>) jsonObject1.get("data");
                success = true;
            } else {
                log.error("pda组托入库请求gwms接口失败!!!url:{};request:{};response:{}", MesConstant.URL + MesConstant.PAKIN_URL, body, response);
            }
        } catch (Exception e) {
            log.error("pda组托入库请求gwms接口异常,工作号:{},{}", boxNoList.toString(), e.getMessage());
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "pda组托入库请求gwms接口",
                        MesConstant.URL + MesConstant.PAKIN_URL,
                        null,
                        "127.0.0.1",
                        body,
                        response,
                        success
                );
            } catch (Exception e) {
                log.error("接口日志保存异常", e);
            }
        }
        if (map == null) {
            throw new CoolException("请求gwcs查询包装组号异常");
        }
        return map;
    }
    /**
         * 比较两个集合的类的属性,相同则抵消,最后判断两个集合是否完全抵消
         */
        public  boolean compareAndCheckCancellation(List<WrkDetl> list1, List<PdckqrParam.Material> list2) {