自动化立体仓库 - WMS系统
1
zhang
5 小时以前 0a1dceaa6478ec0081c38721be88fa6d807c6094
1
11个文件已修改
1个文件已添加
253 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutController.java 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/ReturnOrderConfirmParam.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/UnQualifiedOrderConfirmParam.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderDetlService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WorkService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -508,7 +508,7 @@
    @PostMapping("/unQualifiedOrder/auth/v1")
    @AppAuth(memo = "不合格品退库单单据下发")
    public synchronized R unqualifiedOrder(@RequestHeader(required = false) String appkey,
                                      @RequestBody ReturnOrderConfirmParam param,
                                      @RequestBody UnQualifiedOrderConfirmParam param,
                                      HttpServletRequest request) {
        auth(appkey, param, request);
        openService.unQualifiedOrder(param);
src/main/java/com/zy/asrs/controller/OutController.java
@@ -83,12 +83,22 @@
            return R.parse("订单数据为空");
        }
        // 按包装组号分组处理
        Map<String, List<OrderDetl>> brandGroup = orderDetls.stream()
                .collect(Collectors.groupingBy(o -> {
                    String brand = o.getBrand();
                    return brand != null ? brand : "跨巷道";
                }));
        Map<String, List<OrderDetl>> brandGroup;
        if (order.getDocType() == 27) {
            // 按包装组号分组处理
            brandGroup = orderDetls.stream()
                    .collect(Collectors.groupingBy(o -> {
                        String brand = o.getModel();
                        return brand != null ? brand : "跨巷道";
                    }));
        } else {
            // 按包装组号分组处理
            brandGroup = orderDetls.stream()
                    .collect(Collectors.groupingBy(o -> {
                        String brand = o.getBrand();
                        return brand != null ? brand : "跨巷道";
                    }));
        }
        List<LocDto> locDtos = new ArrayList<>();
@@ -97,11 +107,18 @@
        for (Map.Entry<String, List<OrderDetl>> entry : brandGroup.entrySet()) {
            String brand = entry.getKey();
            List<OrderDetl> brandOrderDetls = entry.getValue();
            List<LocDetl> locDetls;
            if (order.getDocType() == 27) {
                locDetls = locDetlService.selectList(
                        new EntityWrapper<LocDetl>().eq("model", brand)
                );
            } else {
                // 查这个包装组对应的所有库存
                locDetls = locDetlService.selectList(
                        new EntityWrapper<LocDetl>().eq("brand", brand)
                );
            }
            // 查这个包装组对应的所有库存
            List<LocDetl> locDetls = locDetlService.selectList(
                    new EntityWrapper<LocDetl>().eq("brand", brand)
            );
            if (locDetls.isEmpty()) continue;
            // 获取出库口
@@ -133,7 +150,7 @@
                locDto.setUnit(locDetl.getUnit());
                locDto.setModel(locDetl.getModel());
                locDto.setThreeCode(locDetl.getThreeCode());
                locDto.setBrand(brand);
                locDto.setBrand(locDetl.getBrand());
                locDto.setOrderNo(firstDetl.getOrderNo());
                locDto.setStaNos(staNos);
                locDto.setOrderDetlId(firstDetl.getId());
@@ -269,9 +286,15 @@
                            ioWorkType = IoWorkType.ALL_OUT;
                        }
                    }
                    workService.stockOut(staNo, locDetlDtos,
                            ioWorkType,
                            getUserId(), optionValue);
                    if (order.getDocType() == 27) {
                        workService.stockOut2(staNo, locDetlDtos,
                                ioWorkType,
                                getUserId(), optionValue);
                    }else {
                        workService.stockOut(staNo, locDetlDtos,
                                ioWorkType,
                                getUserId(), optionValue);
                    }
                } else {
                    throw new CoolException("所选库位状态不为F/D,库位号:" +
                            locMast.getLocNo() + ",当前状态:" +
src/main/java/com/zy/asrs/entity/param/ReturnOrderConfirmParam.java
@@ -10,7 +10,7 @@
    private String packageGroupNo; // 多个包装组号
    private List<VolumeNumber> volumeNumbers; // 多个包装组号
    private String memo;//备注
    @Data
    public static class VolumeNumber {
        private String volumeNumber;
src/main/java/com/zy/asrs/entity/param/UnQualifiedOrderConfirmParam.java
New file
@@ -0,0 +1,17 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
@Data
public class UnQualifiedOrderConfirmParam {
    private String orderNumber; //组货单号
    private List<VolumeNumber> volumeNumbers; // 多个包装组号
    private String memo;//备注
    @Data
    public static class VolumeNumber {
        private String volumeNumber;
    }
}
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
@@ -42,6 +42,9 @@
    void updateOrderDetlByGroupNo(@Param("orderNo") String orderNo,@Param("brand") String brand, @Param("count") double count);
    void updateOrderDetlByModel(@Param("orderNo") String orderNo,@Param("model") String model, @Param("count") double count);
    void updateOrderDetlQtyByGroupNo(@Param("orderNo") String orderNo,@Param("brand") String brand);
    /**
@@ -66,5 +69,11 @@
    List<OrderDetl> selectByBrand(@Param("brand") String brand);
    List<OrderDetl> selectByModel(@Param("model") String model);
    OrderDetl selectByOrderNoAndPkgGroupNoAndVolumeNo(@Param("orderNo") String orderNo,@Param("brand") String brand,@Param("model") String model);
    OrderDetl selectByOrderNoAndVolumeNo(@Param("orderNo") String orderNo,@Param("model") String model);
}
src/main/java/com/zy/asrs/service/OpenService.java
@@ -161,5 +161,5 @@
    R returnOrder(ReturnOrderConfirmParam param);
    R unQualifiedOrder(ReturnOrderConfirmParam param);
    R unQualifiedOrder(UnQualifiedOrderConfirmParam param);
}
src/main/java/com/zy/asrs/service/OrderDetlService.java
@@ -39,4 +39,7 @@
    boolean increaseWorkQty(Long orderId, String matnr, String batch, Double workQty);
    List<OrderDetl> selectByBrand(String brand);
    List<OrderDetl> selectByModel(String model);
}
src/main/java/com/zy/asrs/service/WorkService.java
@@ -44,6 +44,9 @@
     */
    void stockOut(BasDevp staNo, List<LocDetlDto> locDetls, IoWorkType ioWorkType, Long userId,String groupOrderNumber);
    void stockOut2(BasDevp staNo, List<LocDetlDto> locDetls, IoWorkType ioWorkType, Long userId,String groupOrderNumber);
    void stockOut(BasDevp staNo, TaskDto taskDto, Long userId);
    /**
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -2365,6 +2365,7 @@
            order.setCreateTime(new Date());
            order.setSettle(1L);
            order.setDocType(26L);
            order.setMemo(param.getMemo());
            orderMapper.insert(order);
        } else {
            // 1.2 存在,更新单据状态
@@ -2394,6 +2395,7 @@
                detl.setAnfme(1.0);
                detl.setBrand(param.getPackageGroupNo());   // 包装组号
                detl.setModel(vn.getVolumeNumber());     // 卷号
                detl.setMemo(param.getMemo());
                orderDetlMapper.insert(detl);
            } else {
                throw new RuntimeException("该单据的卷号已存在," + vn.getVolumeNumber());
@@ -2405,7 +2407,7 @@
    @Override
    @Transactional
    public R unQualifiedOrder(ReturnOrderConfirmParam param) {
    public R unQualifiedOrder(UnQualifiedOrderConfirmParam param) {
        if (Cools.isEmpty(param.getOrderNumber())) {
            param.setOrderNumber("UQCK" + DateUtils.convert(new Date(), DateUtils.yyyyMMdd));
        }
@@ -2422,6 +2424,7 @@
            order.setCreateTime(new Date());
            order.setSettle(1L);
            order.setDocType(27L);
            order.setMemo(param.getMemo());
            orderMapper.insert(order);
        } else {
            // 1.2 存在,更新单据状态
@@ -2433,14 +2436,14 @@
        // 2. 一一对应遍历
        List<ReturnOrderConfirmParam.VolumeNumber> volList = param.getVolumeNumbers();
        List<UnQualifiedOrderConfirmParam.VolumeNumber> volList = param.getVolumeNumbers();
        for (int i = 0; i < volList.size(); i++) {
            ReturnOrderConfirmParam.VolumeNumber vn = volList.get(i);
            UnQualifiedOrderConfirmParam.VolumeNumber vn = volList.get(i);
            // 查询是否已存在该 detl
            OrderDetl detl = orderDetlMapper.selectByOrderNoAndPkgGroupNoAndVolumeNo(
                    param.getOrderNumber(), param.getPackageGroupNo(), vn.getVolumeNumber()
            OrderDetl detl = orderDetlMapper.selectByOrderNoAndVolumeNo(
                    param.getOrderNumber(), vn.getVolumeNumber()
            );
            if (detl == null) {
@@ -2449,8 +2452,8 @@
                detl.setOrderNo(param.getOrderNumber());
                detl.setCreateTime(new Date());
                detl.setAnfme(1.0);
                detl.setBrand(param.getPackageGroupNo());   // 包装组号
                detl.setModel(vn.getVolumeNumber());     // 卷号
                detl.setMemo(param.getMemo());
                orderDetlMapper.insert(detl);
            } else {
                throw new RuntimeException("该单据的卷号已存在," + vn.getVolumeNumber());
src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java
@@ -96,4 +96,9 @@
    public List<OrderDetl> selectByBrand(String brand) {
        return this.baseMapper.selectByBrand(brand);
    }
    @Override
    public List<OrderDetl> selectByModel(String model) {
        return this.baseMapper.selectByModel(model);
    }
}
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -582,6 +582,130 @@
    @Override
    @Transactional
    public void stockOut2(BasDevp staNo, List<LocDetlDto> locDetlDtos, IoWorkType ioWorkType, Long userId, String groupOrderNumber) {
        Date now = new Date();
        // 合并同类项
        Set<String> locNos = new HashSet<>();
        List<OutLocDto> dtos = new ArrayList<>();
        for (LocDetlDto locDetlDto : locDetlDtos) {
            String locNo = locDetlDto.getLocDetl().getLocNo();
            if (locNos.contains(locNo)) {
                for (OutLocDto dto : dtos) {
                    if (dto.getLocNo().equals(locNo)) {
                        dto.getLocDetlDtos().add(locDetlDto);
                        break;
                    }
                }
            } else {
                locNos.add(locNo);
                dtos.add(new OutLocDto(locNo, locDetlDto));
            }
        }
        Integer ioType = null;
        // 生成工作档
        for (OutLocDto dto : dtos) {
            // 判断入出库类型:101.全板出库 or 103.拣料出库
            if (ioWorkType == null) {
                ioType = dto.isAll() ? 101 : 103;
            } else if (ioWorkType.equals(IoWorkType.CHECK_OUT)) {
                ioType = 107;
            } else if (ioWorkType.equals(IoWorkType.ALL_OUT)) {
                ioType = 101;
            }
            assert ioType != null;
            // 获取库位
            LocMast locMast = locMastService.selectById(dto.getLocNo());
            Integer outSta = staNo.getDevNo();
//            //2号堆垛机全板出库站指定为204站,拣料站指定为202
//            if(locMast.getCrnNo()==2){
//                outSta = ioType == 101 ? 204 : 202;
//            }
            // 获取路径
            StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
            // 生成工作号
            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
            // 生成工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(ioType); // 入出库状态
            wrkMast.setIoPri(13D); // 优先级:13
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
            wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
            wrkMast.setSourceLocNo(dto.getLocNo()); // 源库位
            wrkMast.setFullPlt("Y"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("N"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setSheetNo("0");
            wrkMast.setMemo(groupOrderNumber);
            if (staDesc.getStnNo() < 118 || staDesc.getStnNo() > 121) {
                wrkMast.setSheetNo("3");
            }
            wrkMast.setBarcode(locMast.getBarcode());
            wrkMast.setAppeUser(userId); // 操作人员数据
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(userId);
            wrkMast.setModiTime(now);
            if (!wrkMastService.insert(wrkMast)) {
                throw new CoolException("保存工作档失败,出库库位号:" + dto.getLocNo());
            }
            // 生成工作档明细
            for (LocDetlDto detlDto : dto.getLocDetlDtos()) {
                if (detlDto.getCount() == null || detlDto.getCount() <= 0.0D) {
                    continue;
                }
                WrkDetl wrkDetl = new WrkDetl();
                List<OrderDetl> orderDetl = orderDetlService.selectByModel(detlDto.getLocDetl().getModel());
                wrkDetl.sync(detlDto.getLocDetl());
                for (OrderDetl orderDetlDto : orderDetl) {
                    if (orderDetlDto.getSupp() != null) {
                        wrkDetl.setSupp(orderDetlDto.getSupp());
                    }
                    if (orderDetlDto.getMemo() != null) {
                        wrkDetl.setMemo(orderDetlDto.getMemo());
                    }
                }
                wrkDetl.setOrderNo(detlDto.getOrderNo()); // 手动出库不需要带出库存中的单据编号
                wrkDetl.setWrkNo(workNo);
                wrkDetl.setIoTime(now);
                Double anfme = ioType == 101 ? detlDto.getLocDetl().getAnfme() : detlDto.getCount();
                wrkDetl.setAnfme(anfme); // 数量
                wrkDetl.setAppeTime(now);
                wrkDetl.setAppeUser(userId);
                wrkDetl.setModiTime(now);
                wrkDetl.setModiUser(userId);
                if (!wrkDetlService.insert(wrkDetl)) {
                    throw new CoolException("保存工作档明细失败");
                }
                // 修改订单明细
                orderDetlMapper.updateOrderDetlByModel(detlDto.getOrderNo(), detlDto.getLocDetl().getModel(), 1);
                // 修改订单状态
                orderMapper.updateSettleByOrderNo(detlDto.getOrderNo(), 2L, userId);
            }
            // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
            locMast = locMastService.selectById(dto.getLocNo());
            if (locMast.getLocSts().equals("F")) {
                locMast.setLocSts(ioType == 101 ? "R" : "P");
                locMast.setModiUser(userId);
                locMast.setModiTime(now);
                if (!locMastService.updateById(locMast)) {
                    throw new CoolException("预约库位状态失败,库位号:" + dto.getLocNo());
                }
            } else {
                throw new CoolException(dto.getLocNo() + "库位不是在库状态");
            }
        }
    }
    @Override
    @Transactional
    public void stockOut(BasDevp staNo, TaskDto taskDto, Long userId) {
        Date now = new Date();
        List<LocDto> locDtos = taskDto.getLocDtos();
src/main/resources/mapper/OrderDetlMapper.xml
@@ -247,6 +247,13 @@
        where 1=1
          and order_no= #{orderNo} and brand = #{brand}
    </update>
    <update id="updateOrderDetlByModel">
        update man_order_detl
        set work_qty = #{count}
        where 1=1
          and order_no= #{orderNo} and model = #{model}
    </update>
    <update id="updateOrderDetlQtyByGroupNo">
        update man_order_detl
        set qty = 1
@@ -273,6 +280,12 @@
        where brand = #{brand}
    </select>
    <select id="selectByModel" resultMap="BaseResultMap">
        select *
        from man_order_detl
        where model = #{model}
    </select>
    <select id="selectByOrderNoAndPkgGroupNoAndVolumeNo" resultMap="BaseResultMap">
        select *
        from man_order_detl
@@ -281,4 +294,11 @@
        and model = #{model}
    </select>
    <select id="selectByOrderNoAndVolumeNo" resultMap="BaseResultMap">
        select *
        from man_order_detl
        where order_no = #{orderNo}
          and model = #{model}
    </select>
</mapper>