自动化立体仓库 - WMS系统
野心家
2025-06-21 288e45a990a5abf4ab50f820ed4e870e8314468e
完善
8个文件已修改
1个文件已添加
250 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MobileController.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WaitPakin.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMast.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/NewWay/AutomaticallyAssignInTasksToRCSScheduler.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/NewWay/AutomaticallyAssignOutTasksToRCSScheduler.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -464,51 +464,41 @@
     */
    @RequestMapping("/AGVMove")
    public R AGVMove(@RequestParam(required = false) String sourceStaNo
            ,@RequestParam(required = false) String staNo){
        RCSParam rcsParam = new RCSParam();
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        String formattedDate = now.format(formatter); // 格式化日期时间
        //网络流水号
        rcsParam.setReqId(now.toString());
        //应用标识
        rcsParam.setClientId("WMS");
        //通知时间
        rcsParam.setReqTime(formattedDate);
        RCSParam.DataBody dataBody=new RCSParam.DataBody();
        //任务号
        dataBody.setId(formattedDate);
            ,@RequestParam(required = false) String staNo
            ,Integer priority){
        String noww="aa" + new Date().getTime();
        List<RCSParam.TaskBody> taskBodyList=new ArrayList<>();
        RCSParam.TaskBody taskBody=new RCSParam.TaskBody();
        //取货类型
        taskBody.setType("load");
        taskBody.setStation(sourceStaNo);
        taskBodyList.add(taskBody);
        LinkedHashMap<String,Object> rcsParam=new LinkedHashMap<>();
        rcsParam.put("task_id",noww);
        rcsParam.put("start_location",sourceStaNo);
        rcsParam.put("start_command",1);
        rcsParam.put("target_location",staNo);
        rcsParam.put("target_command",2);
        rcsParam.put("priority",1);//优先级越小先执行
        rcsParam.put("robot_type",1);//车 辆 类 型 0:XC 1:XCD 2:XP_T 3:XP_L
        rcsParam.put("MoverID","XCD");
        RCSParam.TaskBody taskBody1=new RCSParam.TaskBody();
        //放货类型
        taskBody1.setType("unload");
        taskBody1.setStation(staNo);
        taskBodyList.add(taskBody1);
        dataBody.setTasks(taskBodyList);
        rcsParam.setData(dataBody);
        LinkedHashMap<String,Object> map=new LinkedHashMap<>();
        map.put("data",rcsParam);
        String response ="";
        Boolean bool =false;
        String msg = "";
        try {
            log.info("wms派发搬运任务给AGV搬运={}", rcsParam);
            response = new HttpHandler.Builder()
                    // .setHeaders(headParam)
                    .setUri(url)
                    .setPath(attrcs)
                    .setJson(JSON.toJSONString(rcsParam))
                    .setJson(JSON.toJSONString(map))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if(jsonObject.getBoolean("IsSuccess")){
            JSONObject data = jsonObject.getJSONObject("data");
            JSONObject errInfo = jsonObject.getJSONObject("err_info");
            if(data.getInteger("result")==0){
                bool = true;
            }else{
                msg=errInfo.getString("err_msg");
            }
        } catch (Exception e) {
            log.error("wms派发搬运任务给AGV搬运失败返回值={}", response);
@@ -517,13 +507,14 @@
                    , url + attrcs
                    , null
                    , "127.0.0.1"
                    , JSON.toJSONString(rcsParam)
                    , JSON.toJSONString(map)
                    , response
                    , bool
            );
        }
        if(bool){
            return R.ok();
            return R.ok(noww);
        }else {
            return R.error("下发任务失败");
        }
src/main/java/com/zy/asrs/entity/WaitPakin.java
@@ -17,6 +17,10 @@
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value= "RCS任务")
    @TableField("item_num")
    private String itemNum;
    @ApiModelProperty(value= "托盘条码")
    private String zpallet;
@@ -76,10 +80,6 @@
    @ApiModelProperty(value= "生产日期")
    @TableField("manu_date")
    private String manuDate;
    @ApiModelProperty(value= "品项数")
    @TableField("item_num")
    private String itemNum;
    @ApiModelProperty(value= "安全库存量")
    @TableField("safe_qty")
src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -159,7 +159,7 @@
    @TableField("ctn_type")
    private Integer ctnType;
    @ApiModelProperty(value= "")
    @ApiModelProperty(value= "RCS工作号")
    private String packed;
    @ApiModelProperty(value= "")
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -217,13 +217,6 @@
            }
            Integer outSta = staNo.getDevNo();
            //2号堆垛机全板出库站指定为103
            if(locMast.getCrnNo()==2){
                outSta = 103;
                //出库站点为205,
            }else if(staNo.getDevNo()==205){
            }
            // 获取路径
            StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
@@ -238,7 +231,7 @@
            wrkMast.setIoPri(13D); // 优先级:13
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
            wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
            wrkMast.setStaNo(104); // 目标站
            wrkMast.setSourceLocNo(dto.getLocNo()); // 源库位
            wrkMast.setFullPlt("Y"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
@@ -250,6 +243,7 @@
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(userId);
            wrkMast.setModiTime(now);
            wrkMast.setMemo(outSta+"");
            if (!wrkMastService.insert(wrkMast)) {
                throw new CoolException("保存工作档失败,出库库位号:"+dto.getLocNo());
            }
@@ -809,6 +803,7 @@
                if (!Cools.isEmpty(waitPakin)) {
                    waitPakin.setIoStatus("N");
                    waitPakin.setLocNo("");
                    waitPakin.setZpallet("");
                    boolean  result = waitPakinService.update(waitPakin, new EntityWrapper<WaitPakin>()
                            .eq("zpallet", wrkMast.getBarcode()));
                }
src/main/java/com/zy/asrs/task/NewWay/AutomaticallyAssignInTasksToRCSScheduler.java
@@ -39,7 +39,7 @@
     * 自动派发入库任务给RCS
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    private void execute(){
    private synchronized void execute(){
        //查看是否有agv在做的任务
        WaitPakin waitPakin1=waitPakinService.selectOne(new EntityWrapper<WaitPakin>().eq("be_batch",1));
        if(waitPakin1!=null){
@@ -49,13 +49,15 @@
        //该数据进行0转1
        WaitPakin waitPakin=waitPakinService.selectOne(new EntityWrapper<WaitPakin>().eq("be_batch",0));
        if(waitPakin!=null){
            R r=mobileController.AGVMove(waitPakin.getMemo(),100+"");
            R r=mobileController.AGVMove(waitPakin.getMemo(),6001+"",1);
            if (r.get("code").equals(200)){
                waitPakin.setBeBatch(1);//0转1
                waitPakinService.update(waitPakin,new EntityWrapper<WaitPakin>().eq("manu",waitPakin.getManu()));
                R r1=mobileController.AGVMove(6001+"",waitPakin.getMemo(),2);
                if (r1.get("code").equals(200)){
                    waitPakin.setItemNum(r.get("msg")+"");
                    waitPakin.setBeBatch(1);//0转1
                    waitPakinService.update(waitPakin,new EntityWrapper<WaitPakin>().eq("manu",waitPakin.getManu()));
                }
            }
        }
    }
}
src/main/java/com/zy/asrs/task/NewWay/AutomaticallyAssignOutTasksToRCSScheduler.java
New file
@@ -0,0 +1,56 @@
package com.zy.asrs.task.NewWay;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.controller.MobileController;
import com.zy.asrs.entity.WaitPakin;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.service.impl.WaitPakinServiceImpl;
import com.zy.asrs.task.handler.WorkMastHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
 * Created by vincent on 2020/7/7
 */
@Component
public class AutomaticallyAssignOutTasksToRCSScheduler {
    private static final Logger log = LoggerFactory.getLogger(AutomaticallyAssignOutTasksToRCSScheduler.class);
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private MobileController mobileController;
    /**
     * 自动派发入库任务给RCS
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    private synchronized void execute(){
        //查看是否有agv在做的任务
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_sts", 15));
        if(!Cools.isEmpty(wrkMast)){
            return;
        }
        //找到出库任务
        //将任务档状态从30转15
        WrkMast wrkMast1 =wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_sts", 30));
        if(wrkMast1!=null){
            R r=mobileController.AGVMove(wrkMast1.getMemo()+"","6002",3);
            if (r.get("code").equals(200)){
                R r1=mobileController.AGVMove("6002",wrkMast1.getMemo()+"",4);
                if (r1.get("code").equals(200)){
                    wrkMast1.setWrkSts(15L);
                    wrkMast1.setPacked(r.get("msg")+"");//RCS 工作号
                    wrkMastService.updateById(wrkMast1);
                }
            }
        }
    }
}
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -14,6 +14,8 @@
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.PostMesDataUtils;
import com.zy.common.utils.HttpHandler;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -58,6 +60,8 @@
    private PackQualifiedService packQualifiedService;
    @Autowired
    private ReportQueryMapper reportQueryMapper;
    @Autowired
    private ConfigService   configService;
    public ReturnT<String> start(WrkMast wrkMast) {
        // 4.入库完成
@@ -504,37 +508,14 @@
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("全板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                        }else{
                            //出库标记
                            packQualifiedService.insertPackQualified(false,new Date(),wrkDetls101.get(0).getMatnr());
                            //2.出库完成上报
                           CombParam combParam = new CombParam();
                            combParam.setPackNo(wrkDetls101.get(0).getMatnr());
                            combParam.setLocNo(wrkMast.getLocNo());
                            combParam.setBarcode(wrkMast.getBarcode());
                            //目标站206出库
                            if(wrkMast.getStaNo()==206){
                                combParam.setPackSts(1);//OK
                                combParam.setStepSts(7);//测试库出库完成
                            }else if(wrkMast.getStaNo()==204){//NG 出库
                                //NG出库修改测试档的状态为5.已移库
                                TestMast testMast=testMastService.selectOne(new EntityWrapper<TestMast>()
                                        .eq("user_id",wrkMast.getBarcode())
                                        .eq("barcode",wrkDetls101.get(0).getMatnr()));
                                combParam.setPackSts(2);//NG
                                combParam.setStepSts(8);//NG出库完成
                                testMast.setStatus(5);
                                if(!testMastService.update(testMast,new EntityWrapper<TestMast>()
                                        .eq("user_id",wrkMast.getBarcode())
                                        .eq("barcode",wrkDetls101.get(0).getMatnr()))){
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("全板出库 ===>> 修改测试表状态为5失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                                }
                            }else if(wrkMast.getStaNo()==103){//目标站103出库
                                combParam.setPackSts(1);//OK
                                combParam.setStepSts(6);//静置库出库完成
                            Config config=configService.selectOne(new EntityWrapper<Config>().eq("code","OutTask"));
                            if(config.getValue().equals("Y")){
                                // 修改工作主档状态
                                wrkMast.setWrkSts(30L);//等待上报
                            }else{
                                wrkMast.setWrkSts(15L);
                            }
                            combParam.setRequestTime(DateUtils.convert(now));
//                            new PostMesDataUtils().postMesData("MES系统",mesUrl,inpath,combParam);
                        }
                    }
                    break;
@@ -551,14 +532,16 @@
//                            exceptionHandle("空板出库 ===>> 修改源库位状态失败;[workNo={0}],[sourceLocNo={1}]", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("空板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                        }else{
                            // 修改工作主档状态
                            wrkMast.setWrkSts(15L);
                        }
                    }
                    break;
                default:
                    break;
            }
            // 修改工作主档状态
            wrkMast.setWrkSts(15L);
            wrkMast.setModiTime(now);
            if (!wrkMastService.updateById(wrkMast)) {
//                exceptionHandle("更新出库完成状态失败;[workNo={0}]", wrkMast.getWrkNo());
src/main/java/com/zy/common/web/WcsController.java
@@ -76,22 +76,33 @@
                return R.error("条码不能为空");
            }
            waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
            if (Cools.isEmpty(waitPakins) || waitPakins.size() !=1) {
            List<WaitPakin> beBatch = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("be_batch", 1));
            if(beBatch.size() > 1){
                return  R.error("组托档中有多条搬运任务");
            }else if(Cools.isEmpty(beBatch)){
                return  R.error("组托档中没有搬运任务");
            }
            if (Cools.isEmpty(waitPakins)) {
                WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
                if (wrkMast != null || waitPakins.size() !=1) {
                if (wrkMast != null) {
                    return R.parse("600-重复组托");
                }
                return R.parse(CodeRes.NO_COMB_700);
            }
            int countWait = waitPakinService.selectCount(new EntityWrapper<WaitPakin>().eq("zpallet",param.getBarcode())
            .eq("io_status", "Y"));
            int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode()));
            int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet",param.getBarcode()));
            if (countLoc > 0 || countWrk > 0 || countWait > 0) {
                if (!Cools.isEmpty(waitPakins.get(0).getDeadWarn()) && waitPakins.get(0).getDeadWarn()!=0){
                    return R.error(CodeRes.EXIST_500);
                for (WaitPakin waitPakin : beBatch) {
                    waitPakin.setZpallet(param.getBarcode());
                    waitPakinService.update(waitPakin,new EntityWrapper<WaitPakin>().eq("be_batch",1));
                }
            }else {
                int countWait = waitPakinService.selectCount(new EntityWrapper<WaitPakin>().eq("zpallet",param.getBarcode())
                        .eq("io_status", "Y"));
                int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode()));
                int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet",param.getBarcode()));
                if (countLoc > 0 || countWrk > 0 || countWait > 0) {
                    if (!Cools.isEmpty(waitPakins.get(0).getDeadWarn()) && waitPakins.get(0).getDeadWarn()!=0){
                        return R.error(CodeRes.EXIST_500);
                    }
                }
            }
        }
        if (Cools.isEmpty(param.getLocType1())){
            param.setLocType1((short)1);
@@ -228,18 +239,6 @@
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)){
                throw new CoolException("改变库位状态失败");
            }else{
                if (locMast.getRow1()<2){
                    //1.扫码上报
                    CombParam combParam = new CombParam();
                    combParam.setPackNo(waitPakins.get(0).getMatnr());
                    combParam.setBarcode(wrkMast.getBarcode());
                    combParam.setLocNo(wrkMast.getLocNo());
                    combParam.setPackSts(0);
                    combParam.setStepSts(1);
                    combParam.setRequestTime(DateUtils.convert(now));
//                    new PostMesDataUtils().postMesData("MES系统",mesUrl,inpath,combParam);
                }
            }
        } else {
            throw new CoolException(dto.getLocNo()+"目标库位已被占用");
src/main/resources/application.yml
@@ -1,5 +1,5 @@
server:
  port: 8081
  port: 8083
  servlet:
    context-path: /@pom.build.finalName@
#  tomcat:
@@ -12,7 +12,7 @@
    enabled: false
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://127.0.0.1:50948;databasename=dlzasrs
    url: jdbc:sqlserver://178.18.1.200:1433;databasename=jxtlfasrs
#    url: jdbc:sqlserver://10.12.55.200:1433;databasename=zjfnasrs
    username: sa
    password: sa@123
@@ -60,6 +60,8 @@
  doubleLocs: 3
  # 一个堆垛机负责的货架排数
  groupCount: 3
  workIssued : 1
  url: 1
# MES系统
mes:
@@ -105,6 +107,6 @@
#RCS
rcs:
  address:
    url: http://192.168.3.102:16001
    url: http://178.18.1.220:50001
    #任务下发地址
    attrcs: 3CLOUD/Kingdee.BOS.WebApi.ServicesStub.
    attrcs: rbrainrobot/create_task