自动化立体仓库 - WMS系统
lty
7 天以前 db91e03deeaac1bb3344d0b5cb9e1240f1f8caac
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -30,11 +30,11 @@
import com.zy.system.mapper.ConfigMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -110,6 +110,9 @@
    @Resource
    private OrderMapper orderMapper;
    @Resource
    private OrderDetlMapper orderDetlMapper;
    @Resource
    private BasCrnpMapper basCrnpMapper;
@@ -1137,88 +1140,64 @@
        return "入库成功";
    }
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Override
    @Transactional
    public R kthl(KthlParam param) {
        String barcode = param.getBarcode();
        String lockKey = "kthl:lock:" + barcode;
        String lockVal = UUID.randomUUID().toString(); // 防止误删他人锁
        // 分布式锁,5秒过期
        Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, lockVal, 5, TimeUnit.SECONDS);
        if (locked == null || !locked) {
            return R.error("重复提交:该托盘已在处理,请勿重复操作");
        // 获取模式为电脑模式,无任务的堆垛机列表:防止分配到堆垛机不可用
        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts",3)
                .eq("wrk_no",0).eq("in_enable","Y").eq("out_enable","Y"));
        if (basCrnps.isEmpty()) {
            // 都有任务则获取电脑模式的堆垛机列表
            basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts",3).eq("in_enable","Y")
                    .eq("out_enable","Y"));
        }
        try {
            // 获取空闲堆垛机(电脑模式、无任务)
            List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>()
                    .eq("crn_sts", 3).eq("wrk_no", 0)
                    .eq("in_enable", "Y").eq("out_enable", "Y"));
            // 如果没有空闲堆垛机,尝试所有可用堆垛机
            if (basCrnps.isEmpty()) {
                basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>()
                        .eq("crn_sts", 3)
                        .eq("in_enable", "Y").eq("out_enable", "Y"));
            }
            if (basCrnps.isEmpty()) {
                throw new CoolException("没有可用堆垛机,堆垛机停止或异常或禁用");
            }
            // 获取第一个可用堆垛机
            List<Integer> crnNoList = basCrnps.stream()
                    .map(BasCrnp::getCrnNo)
                    .collect(Collectors.toList());
            Integer crnNo = crnNoList.get(0);
            int workNo = commonService.getWorkNo(5);
            Date now = new Date();
            // 生成工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(1L);
            wrkMast.setIoType(3); // 站到站
            wrkMast.setIoPri(14D);
            wrkMast.setCrnNo(crnNo);
            wrkMast.setSourceStaNo(secondFloorIn[crnNo]);
            wrkMast.setStaNo(secondFloorOut[crnNo]);
            wrkMast.setLocNo("");
            wrkMast.setBarcode(barcode);
            wrkMast.setFullPlt("N");
            wrkMast.setPicking("N");
            wrkMast.setExitMk("N");
            wrkMast.setEmptyMk("Y");
            wrkMast.setLinkMis("Y");
            wrkMast.setCtnType(1);
            wrkMast.setAppeTime(now);
            wrkMast.setModiTime(now);
            boolean res = wrkMastService.insert(wrkMast);
            if (!res) {
                throw new CoolException("保存工作档失败");
            }
            // 推送站点到GWCS
            pushStaNoToGwcs(param.getPalletizingNo(), wrkMast.getSourceStaNo(), workNo, barcode, "二楼空托回流推送gwcs");
            return R.ok("空托回流请求成功");
        } finally {
            // 解锁,确保只释放自己加的锁
            String val = redisTemplate.opsForValue().get(lockKey);
            if (lockVal.equals(val)) {
                redisTemplate.delete(lockKey);
            }
        WrkMast exist = wrkMastService.selectOne(
                new EntityWrapper<WrkMast>()
                        .eq("barcode", param.getBarcode())
                        .eq("io_type", 3));
        if (exist != null) {
            return R.error("任务已存在,不可重复提交");
        }
        if (basCrnps.isEmpty()) {
            throw new CoolException("没有可用堆垛机,堆垛机停止或异常或禁用");
        }
        // 可用堆垛机列表
        List<Integer> crnNoList = basCrnps.stream().map(BasCrnp::getCrnNo).collect(Collectors.toList());
        Integer crnNo = crnNoList.get(0);
        int workNo = commonService.getWorkNo(5);
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(new Date());
        wrkMast.setWrkSts(1L); //
        wrkMast.setIoType(3); // 站到站
        wrkMast.setIoPri(14D); // 优先级
        wrkMast.setCrnNo(crnNo);
        wrkMast.setSourceStaNo(secondFloorIn[crnNo]);
        wrkMast.setStaNo(secondFloorOut[crnNo]);
        wrkMast.setLocNo("");
        wrkMast.setBarcode(param.getBarcode()); // 托盘码
        wrkMast.setFullPlt("N"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("Y"); // 空板
        wrkMast.setLinkMis("Y");
        wrkMast.setCtnType(1); // 容器类型
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        boolean res = wrkMastService.insert(wrkMast);
        if (!res) {
            throw new CoolException("保存工作档失败");
        }
        // 返回GWCS目标信息
        pushStaNoToGwcs(param.getPalletizingNo(),wrkMast.getSourceStaNo(),workNo,param.getBarcode(),"二楼空托回流推送gwcs");
        return R.ok("空托回流请求成功");
    }
    @Override
    public R tb(TbParam param) {
@@ -1385,7 +1364,7 @@
        if (wrkMast == null) {
            throw new CoolException("不存在该工作号:" + param.getWorkNo());
        }
        if (wrkMast.getWrkSts() == 3) {
        if (wrkMast.getWrkSts() == 3||wrkMast.getWrkSts() == 4) {
            throw new CoolException("工作档状态不对:" + param.getWorkNo());
        }
        wrkMast.setWrkSts(2L);
@@ -1539,8 +1518,10 @@
    private void ckjgsbPushMes(WrkMast wrkMast, List<WrkDetl> wrkDetls) {
        GwmsGenerateInventoryDto gwmsGenerateInventoryDto = new GwmsGenerateInventoryDto();
        gwmsGenerateInventoryDto.setWarehouseType(4);
        gwmsGenerateInventoryDto.setBarcode(wrkMast.getBarcode());
        gwmsGenerateInventoryDto.setPalletizingNo(wrkMast.getStaNo());
        gwmsGenerateInventoryDto.setGroupOrderNumber(wrkMast.getMemo());
        List<GwmsGenerateInventoryDto.MatList> matLists = new ArrayList<>();
        for (WrkDetl wrkDetl : wrkDetls) {
            boolean flag = true;
@@ -2290,5 +2271,60 @@
        return crnStn;
    }
    @Override
    @Transactional
    public R groupOrderConfirm(GroupOrderConfirmParam param) {
        // 1. 查询单据是否存在
        Order order = orderMapper.selectOrderByOrderNo(param.getGroupOrderNumber());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (order == null) {
            // 1.1 不存在,新建单据
            order = new Order();
            order.setOrderNo(param.getGroupOrderNumber());
            order.setStatus(Integer.valueOf(param.getGroupStatus()));
            order.setOrderTime(sdf.format(new Date()));
            order.setCreateTime(new Date());
            order.setSettle(1L);
            order.setDocType(25L);
            orderMapper.insert(order);
        } else {
            // 1.2 存在,更新单据状态
            order.setStatus(Integer.valueOf(param.getGroupStatus()));
            orderMapper.updateById(order);
        }
        // 2. 一一对应遍历
        List<GroupOrderConfirmParam.PackageGroupNo> pkgList = param.getPackageGroupNos();
        List<GroupOrderConfirmParam.VolumeNumber> volList = param.getVolumeNumbers();
        int size = Math.min(pkgList.size(), volList.size()); // 防止越界
        for (int i = 0; i < size; i++) {
            GroupOrderConfirmParam.PackageGroupNo pg = pkgList.get(i);
            GroupOrderConfirmParam.VolumeNumber vn = volList.get(i);
            // 查询是否已存在该 detl
            OrderDetl detl = orderDetlMapper.selectByOrderNoAndPkgGroupNoAndVolumeNo(
                    param.getGroupOrderNumber(), pg.getPackageGroupNo(), vn.getVolumeNumber()
            );
            if (detl == null) {
                detl = new OrderDetl();
                detl.setOrderId(order.getId());
                detl.setOrderNo(param.getGroupOrderNumber());
                detl.setCreateTime(new Date());
                detl.setAnfme(1.0);
                detl.setBrand(pg.getPackageGroupNo());   // 包装组号
                detl.setModel(vn.getVolumeNumber());     // 卷号
                orderDetlMapper.insert(detl);
            }
        }
        return R.ok("组货确认成功");
    }
    /*...........................上饶江铜..............以上.............徐工汉云...........................*/
}