自动化立体仓库 - WMS系统
b93c304a85b704d8818d40e145b04d7d20dc53a0..9ab8ba0814f879c7d1175c82718bba41e665281e
2025-12-20 pang.jiabao
agv入库反馈end给wcs下命令
9ab8ba 对比 | 目录
2025-12-20 pang.jiabao
pda空托出库
f0bf8f 对比 | 目录
2025-12-20 pang.jiabao
登录接口bug修复
bad8a1 对比 | 目录
8个文件已修改
203 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MobileController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/MobileService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/AuthController.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/login.html 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -529,10 +529,14 @@
    @PostMapping("/callEmptyBinOutBound")
    @ManagerAuth(memo = "pda呼叫空料框出库")
    public synchronized R callEmptyBinOutBound(@RequestBody JSONObject param) {
        if(!param.containsKey("staNo") || !param.containsKey("locType")){ // 1.窄,2.宽
        if(!param.containsKey("staNo") || !param.containsKey("locType") || !param.containsKey("count")){ // 1.窄,2.宽
            return R.parse(BaseRes.PARAM);
        }
        return mobileService.callEmptyBinOutBound(null,param.getString("staNo"),param.getString("locType"),getUserId());
        int count = param.getInteger("count");
        if (count <= 0 || count > 10) {
            return R.parse("数量有误,count:" + count);
        }
        return mobileService.callEmptyBinOutBound(null,param.getString("staNo"),param.getString("locType"),count,getUserId());
    }
    @PostMapping("/callEmptyBinInBound")
src/main/java/com/zy/asrs/service/MobileService.java
@@ -107,7 +107,7 @@
     * @param locType 托盘类型 1.窄,2.宽
     * @param userId 用户id
     */
    R callEmptyBinOutBound(MesOutApply mesOutApply,String staNo, String locType, Long userId);
    R callEmptyBinOutBound(MesOutApply mesOutApply,String staNo, String locType, int count, Long userId);
    /**
     * pda呼叫料框回库
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
@@ -372,7 +372,7 @@
        // 空托出库
        if (StringUtils.isEmpty(mesOutApply.getOrderNo()) && "01".equals(mesOutApply.getTransType())) {
            // 生成空托出库任务
            mobileService.callEmptyBinOutBound(mesOutApply,WMS_TRANS_START_STATION_1,"1",defaultUserId);
            mobileService.callEmptyBinOutBound(mesOutApply,WMS_TRANS_START_STATION_1,"1",1,defaultUserId);
//            try {
//                if (!StringUtils.isEmpty(mesOutApply.getTaskno()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
@@ -586,8 +586,8 @@
                    transTask.setOrderNo(mesInApply.getOrderNo());
                    transTask.setTransType(mesInApply.getTransType());
                    transTask.setCurProcess(mesInApply.getProductLineId());
                    transTask.setCurStationId("A3");
                    transTask.setNextStationId("A4");
                    transTask.setCurStationId(mesInApply.getStationID());
                    transTask.setNextStationId(WMS_TRANS_START_STATION_2);
                    transTask.setItemno(WMS_ZPALLET_ID);  // 固定为空托的编码
                    transTask.setQty(1);    // 空托只回1个
                    transTask.setProductLineId(mesInApply.getProductLineId());
@@ -595,7 +595,7 @@
                    transTask.setAgvFactory(1);
                    JSONObject sendAgvTask = submitTask(transTask);
                    if (!"1".equals(sendAgvTask.getString("Success"))) {
                        log.error("出库下发agv运输任务失败,{}", JSONObject.toJSONString(transTask));
                        log.error("入库下发agv运输任务失败,{}", JSONObject.toJSONString(transTask));
                        return 2;
                    }
                } else {
@@ -678,7 +678,6 @@
            OrderInAndOutUtil.updateOrder(Boolean.TRUE, orderPakin.getId(), 2L, defaultUserId);
            // 呼叫AGV从产线运回立库
            try {
                if (!StringUtils.isEmpty(mesInApply.getTaskno())) {
                    TransTask transTask = new TransTask();
                    transTask.setTaskno(mesInApply.getTaskno());
@@ -697,12 +696,12 @@
                    transTask.setAgvFactory(1);
                    JSONObject sendAgvTask = submitTask(transTask);
                    if (!"1".equals(sendAgvTask.getString("Success"))) {
                        log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
                        log.error("入库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
                        throw new CoolException("入库下发agv运输任务失败");
                    }
                } else {
                    throw new CoolException("MES入库下发agv运输任务失败");
                }
            } catch (Exception e) {
                log.error("下发AGV运输任务失败", e);
            }
        }
        return 1;
@@ -1124,9 +1123,9 @@
        // 转发给海康或华晓RCS
        RcsReturn rcsReturn = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
        if (rcsReturn.getCode().equals("SUCCESS")) {
            JSONObject data = rcsReturn.getData();
            String robotTaskCode = data.getString("robotTaskCode");
            if (Cools.isEmpty(transTask.getTaskno())) {
                JSONObject data = rcsReturn.getData();
                String robotTaskCode = data.getString("robotTaskCode");
                transTask.setTaskno(robotTaskCode);
                result.put("taskno", transTask.getTaskno());
            }
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -1287,60 +1287,64 @@
    @Override
    @Transactional
    public R callEmptyBinOutBound(MesOutApply mesOutApply, String staNo, String locType, Long userId) {
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", 'D').eq("loc_type2", locType));
        if(locMast == null) {
            return R.parse("该类型:" + locType +"空托盘不存在");
    public R callEmptyBinOutBound(MesOutApply mesOutApply, String staNo, String locType,int count, Long userId) {
        List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<LocMast>().setSqlSelect("TOP " + count + " *")
                .eq("loc_sts", "D").eq("frozen", 0).eq("loc_type2", locType).orderBy("lev1").orderBy("bay1").orderBy("row1"));
        if (locMastList.size() < count) {
            return R.parse("空托数量不足(或冻结),剩余数量:" + locMastList.size());
        }
        // 获取路径
        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                .eq("type_no", 110)
                .eq("stn_no", 204)
                .eq("crn_no", locMast.getCrnNo());
                .eq("crn_no", 1);
        StaDesc staDesc = staDescService.selectOne(wrapper);
        if (staDesc == null) {
            return R.parse("出库路径不存在,站点:" + staNo);
        }
        Date now = new Date();
        // 生成工作档
        int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
        wrkMast.setIoType(110); // 入出库状态: 110.空板出库
        wrkMast.setIoPri(10D);
        wrkMast.setSourceStaNo(staDesc.getCrnStn$()); // 源站
        wrkMast.setStaNo(staDesc.getStnNo$()); // 目标站
        wrkMast.setCrnNo(staDesc.getCrnNo());
        wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位
        wrkMast.setFullPlt("N"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("Y"); // 空板
        wrkMast.setLinkMis("N");
        wrkMast.setAppeUser(userId);
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        if (mesOutApply != null) {
            wrkMast.setTaskNo(mesOutApply.getTaskno());
            wrkMast.setAgvSta(mesOutApply.getStationId());
            wrkMast.setMemo(JSONObject.toJSONString(mesOutApply));
        } else {
            wrkMast.setAgvSta(staNo);
        }
        for (LocMast locMast: locMastList) {
            Date now = new Date();
            // 生成工作档
            int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(110); // 入出库状态: 110.空板出库
            wrkMast.setIoPri(10D);
            wrkMast.setSourceStaNo(staDesc.getCrnStn$()); // 源站
            wrkMast.setStaNo(staDesc.getStnNo$()); // 目标站
            wrkMast.setCrnNo(staDesc.getCrnNo());
            wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位
            wrkMast.setFullPlt("N"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("Y"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setAppeUser(userId);
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(userId);
            wrkMast.setModiTime(now);
            if (mesOutApply != null) {
                wrkMast.setTaskNo(mesOutApply.getTaskno());
                wrkMast.setAgvSta(mesOutApply.getStationId());
                wrkMast.setMemo(JSONObject.toJSONString(mesOutApply));
            } else {
                wrkMast.setAgvSta(staNo);
            }
        wrkMastService.insert(wrkMast);
            wrkMastService.insert(wrkMast);
        // 更新库位状态
        if (locMast.getLocSts().equals("D")) {
            locMast.setLocSts("R");
            locMast.setModiUser(userId);
            locMast.setModiTime(now);
            locMastService.updateById(locMast);
            // 更新库位状态
            if (locMast.getLocSts().equals("D")) {
                locMast.setLocSts("R");
                locMast.setModiUser(userId);
                locMast.setModiTime(now);
                locMastService.updateById(locMast);
            }
            log.info("生成空托出库任务成功,任务号:{}",wrkMast.getWrkNo());
        }
        log.info("生成空托出库任务成功,任务号:{}",wrkMast.getWrkNo());
        return R.ok("出库成功");
    }
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java
@@ -13,6 +13,7 @@
import com.zy.asrs.mapper.BlockStationMapper;
import com.zy.asrs.mapper.BlockTaskMapper;
import com.zy.asrs.service.*;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -43,6 +44,10 @@
    private String HX_URL;
    @Value("${mes.defaultUserId}")
    public long defaultUserId;
    // wcs地址
    @Value("${wcs.url}")
    private String WCS_URL;
    @Resource
@@ -222,17 +227,16 @@
        String url = rcsFactory == 2 ? HX_URL : HIK_URL + "api/robot/controller/task/submit";
        String response = "";
        try {
            // 模拟返回
//            rcsReturn.setCode("SUCCESS");
//            log.info("呼叫agv搬运成功!url:{};request:{};response:{}", url, JSON.toJSONString(rcsTaskSubmit), response);
//            success = true;
            response = sendPost(url, JSONObject.toJSONString(rcsTaskSubmit));
            if (!StringUtils.isEmpty(response) && response.contains("code")) {
                rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
                if ("SUCCESS".equals(rcsReturn.getCode())) {
            // 模拟返回
//            rcsReturn.setCode("SUCCESS");
//            JSONObject jsonObject = new JSONObject();
//            jsonObject.put("robotTaskCode",4);
//            rcsReturn.setData(jsonObject);
                    success = true;
                    log.info("呼叫agv搬运成功!url:{};request:{};response:{}", url, JSON.toJSONString(rcsTaskSubmit), response);
                } else {
                    log.error("呼叫agv搬运失败!url:{};request:{};response:{}", url, JSON.toJSONString(rcsTaskSubmit), response);
@@ -391,6 +395,33 @@
                        // 任务完成
                        mesService.reporterTask(rcsReporterTask);
                        // 入立库时,区分是空托还是满托,给输送线下发命令9990 空,9995满
                        String transType = memo.getString("TransType");
                        if("02".equals(transType) || "04".equals(transType)) {
                            int wrkNo = 9995;
                            if("02".equals(transType)) {
                                TaskDetl taskDetl = taskDetlService.selectOne(new EntityWrapper<TaskDetl>().eq("wrk_no", task.getWrkNo()));
                                if (taskDetl != null) {
                                    if("tuopan".equals(taskDetl.getMatnr())){
                                        wrkNo = 9990;
                                    }
                                }
                            }
                            int staNo = Integer.parseInt(task.getStaNo());
                            Map<String,Object> params = new HashMap<>();
                            params.put("siteId",staNo);
                            params.put("workNo",wrkNo);
                            params.put("staNo", staNo == 205 ? 205 : (staNo-1) );
                            params.put("String","Y");
                            String response = new HttpHandler.Builder()
                                    .setUri(WCS_URL)
                                    .setPath("/site/detl/update")
                                    .setParams(params)
                                    .build()
                                    .doPost();
                            log.info("agv反馈end给wcs发命令:{},返回:{}",JSONObject.toJSONString(params),response);
                        }
//                    EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>();
//                    wapper2.eq("wrk_no", task.getWrkNo())
//                            .eq("matnr", memo.getString("ItemNo"))
src/main/java/com/zy/common/web/AuthController.java
@@ -53,39 +53,37 @@
    @Autowired
    private LoadingConfigTimer loadingConfigTimer;
    @PostMapping("/login.action")
    @RequestMapping("/login.action")
    @ManagerAuth(value = ManagerAuth.Auth.NONE, memo = "登录")
    public R loginAction(@RequestBody Map<String, String> param) {
    public R loginAction(String username, String password){
        //验证许可证是否有效
        if (!licenseTimer.getSystemSupport()) {
        if (!licenseTimer.getSystemSupport()){
            return R.parse(CodeRes.SYSTEM_20001);
        }
        if (username.equals("super") && password.equals(Cools.md5(superPwd))) {
            Map<String, Object> res = new HashMap<>();
            res.put("username", username);
            res.put("token", Cools.enToken(System.currentTimeMillis() + username, superPwd));
            return R.ok(res);
        }
        EntityWrapper<User> userWrapper = new EntityWrapper<>();
        userWrapper.eq("username", param.get("username"));
        userWrapper.eq("username", username);
        User user = userService.selectOne(userWrapper);
        if (Cools.isEmpty(user)) {
            if (param.get("username").equals("super") && param.get("password").equals(Cools.md5(superPwd))) {
                Map<String, Object> res = new HashMap<>();
                res.put("username", param.get("username"));
                res.put("token", Cools.enToken(System.currentTimeMillis() + param.get("username"), superPwd));
                return R.ok(res);
            }
        if (Cools.isEmpty(user)){
            return R.parse(CodeRes.USER_10001);
        }
        if (user.getStatus() != 1) {
        if (user.getStatus()!=1){
            return R.parse(CodeRes.USER_10002);
        }
        if (!user.getPassword().equals(param.get("password"))) {
        if (!user.getPassword().equals(password)){
            return R.parse(CodeRes.USER_10003);
        }
        String token = Cools.enToken(System.currentTimeMillis() + param.get("username"), user.getPassword());
        if (loadingConfigTimer.getTokenNumber() == 1) {
            userLoginService.delete(new EntityWrapper<UserLogin>().eq("user_id", user.getId()).eq("system", "WMS"));
        }        UserLogin userLogin = new UserLogin();
        String token = Cools.enToken(System.currentTimeMillis() + username, user.getPassword());
        userLoginService.delete(new EntityWrapper<UserLogin>().eq("user_id", user.getId()));
        UserLogin userLogin = new UserLogin();
        userLogin.setUserId(user.getId());
        userLogin.setToken(token);
        userLogin.setCreateTime(new Date());
        userLogin.setSystem("WMS");
        userLoginService.insert(userLogin);
        Map<String, Object> res = new HashMap<>();
        res.put("username", user.getUsername());
src/main/resources/application-dev.yml
@@ -144,3 +144,7 @@
hx:
  url: http://127.0.0.1:8089/hx/
#wcs地址
wcs:
  url: http://127.0.0.1:9090/jgwcs
src/main/webapp/views/login.html
@@ -135,8 +135,7 @@
        let params = {username: username, password: hex_md5(password)}
        $.ajax({
            url: baseUrl + "/login.action",
            headers: {'Content-Type': 'application/json'},
            data: JSON.stringify(params),
            data:params,
            method: 'POST',
            success: function (res) {
                if (res.code === 200) {