自动化立体仓库 - WMS系统
Administrator
2025-06-27 f910377a07c3ab8e428f094b4bb4d2b03ea1d1a8
#接口防抖
5个文件已修改
143 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MobileController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/GhjtHandler.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/out.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -606,7 +606,7 @@
    }
    @PostMapping("/pdaGetMemo")
    @ManagerAuth(memo = "pda获取木箱资料")
//    @ManagerAuth(memo = "pda获取木箱资料")
    public synchronized  List<Map<String, Object>> pdaGetMemo() {
        return mobileService.pdaGetMemo();
    }
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -30,6 +30,7 @@
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;
@@ -1136,57 +1137,88 @@
        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(); // 防止误删他人锁
        // 获取模式为电脑模式,无任务的堆垛机列表:防止分配到堆垛机不可用
        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"));
        // 分布式锁,5秒过期
        Boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, lockVal, 5, TimeUnit.SECONDS);
        if (locked == null || !locked) {
            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");
        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"));
        return R.ok("空托回流请求成功");
            // 如果没有空闲堆垛机,尝试所有可用堆垛机
            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);
            }
        }
    }
    @Override
    public R tb(TbParam param) {
@@ -1491,8 +1523,14 @@
            wrkMastService.updateById(wrkMast);
        }
        // 出库上报推送mes记录
        ckjgsbPushMes(wrkMast,wrkDetls);
        if(!wrkDetls.get(0).getMatnr().equals("空箱")){
            // 出库上报推送mes记录
            ckjgsbPushMes(wrkMast,wrkDetls);
        }else{
            wrkMast.setWrkSts(14L);
            wrkMastService.updateById(wrkMast);
        }
        return "出库结果上报成功";
    }
src/main/java/com/zy/asrs/task/handler/GhjtHandler.java
@@ -24,6 +24,7 @@
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -101,6 +102,7 @@
                    .setPath(MesConstant.GWCS_DCKK_URL)
                    .setHeaders(headers)
                    .setJson(body)
                    .setTimeout(30, TimeUnit.SECONDS) // 设置连接 + 读取超时为30秒
                    .build()
                    .doPost();
            if (!Cools.isEmpty(response)) {
src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
@@ -95,7 +95,7 @@
                }
            // 出库 --------------------------------------------------------------------------------
            } else if (wrkMast.getWrkSts() == 15 && wrkMast.getIoType() != 110) {
            } else if (wrkMast.getWrkSts() == 15 && wrkMast.getIoType() != 110 &&wrkMast.getIoType() != 3) {
                List<WrkDetl> wrkDetls101 = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                if (wrkDetls101.isEmpty()) {
//                        exceptionHandle("全板出库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
src/main/webapp/static/js/order/out.js
@@ -42,6 +42,15 @@
            ,{field: 'memo', align: 'center',title: '备注', hide: false}
            ,{field: 'qty', align: 'center',title: '作业数量', style: 'font-weight: bold'}
            ,{field: 'enableQty', align: 'center',title: '待出数量', style: 'font-weight: bold'}
            ,{field: 'finishStatus', align: 'center', title: '是否完成', templet: function(d){
                    if (d.qty === 0 && d.enableQty === 0) {
                        return '<span style="color:green;font-weight:bold;">完成</span>';
                    } else {
                        return '<span style="color:red;">未完成</span>';
                    }
                }}
            // ,{field: 'name', align: 'center',title: '名称'}
            // ,{field: 'unit', align: 'center',title: '单位', hide: true}
            // ,{field: 'barcode', align: 'center',title: '商品条码', hide: true}