自动化立体仓库 - WMS系统
#
野心家
2024-10-23 ea09ba33fceccbb70ad1ad0621e739679a37dbb2
#
11个文件已修改
5个文件已添加
707 ■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/Re.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMast.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/StatusParam.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/result/WorkIssuedResult.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WCSReportScheduler.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WCSReportHandler.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/CodeRes.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocTypeDto.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 216 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/param/SearchLocParam.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/license.lic 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Re.java
New file
@@ -0,0 +1,63 @@
package com.zy.asrs.entity;
import com.core.common.Cools;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
public class Re extends HashMap<String, Object> {
    private static final long serialVersionUID = 1L;
    private static final String CODE = "code";
    private static final String MSG = "msg";
    private static final String DATA = "data";
    public Re(Integer code, String msg) {
        super.put("returnStatus", code);
        super.put("returnInfo", msg);
        Date date=new Date();
        DateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr=df.format(date);
        super.put ("msgTime", dateStr);
    }
    public static Re ok() {
        return parse("0-操作成功");
    }
    public static Re ok(String msg) {
        Re r = ok();
        r.put("msg", msg);
        return r;
    }
    public static Re ok(Object obj) {
        return parse("0-操作成功").add(obj);
    }
    public static Re error() {
        return parse("1-服务器错误");
    }
    public static Re error(String msg) {
        Re r = error();
        r.put("msg", msg);
        return r;
    }
    public Re add(Object obj) {
        this.put("data", obj);
        return this;
    }
    public static Re parse(String message) {
        if (Cools.isEmpty(message)) {
            return parse("1-服务器错误");
        } else {
            String[] msg = message.split("-");
            return msg.length == 2 ? new Re(Integer.parseInt(msg[0]), msg[1]) : parse("1-".concat(message));
        }
    }
}
src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -37,7 +37,7 @@
    @ApiModelProperty(value= "")
    private Date ymd;
    @ApiModelProperty(value= "")
    @ApiModelProperty(value= "是否上报wcs")
    private String mk;
    @ApiModelProperty(value= "")
src/main/java/com/zy/asrs/entity/param/StatusParam.java
New file
@@ -0,0 +1,33 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class StatusParam {
    /**
     * 任务编号
     */
    private String taskId;
    /**
     * 上报时间
     */
    private String reportTime;
    /**
     * 任务状态
     * 执行过程中
     * 的状态。 0- 已 接
     * 收 , 1- 任 务 开
     * 始,2-取货完成,3-
     * 任务中断,4-放货
     * 完成,8-任务结束
     */
    private int taskStatus;
    /**
     * 货位编码
     * 目的位置编码
     */
    private String gridId;
}
src/main/java/com/zy/asrs/entity/result/WorkIssuedResult.java
New file
@@ -0,0 +1,75 @@
package com.zy.asrs.entity.result;
import lombok.Data;
import java.util.List;
@Data
public class WorkIssuedResult {
    /**
     * 组号
     */
    private String groupId;
    /**
     * 下发时间
     */
    private String msgTime;
    /**
     * 优先级
     * 此组任务优先
     * 级,不填则按照
     * “ msgTime ”执
     * 行,并且优先级
     * 自动最低
     */
    private int priorityCode;
    /**
     * 仓库编码
     */
    private String warehouse;
    private List<Tasks> tasks;
    @Data
    public static class Tasks {
        /**
         * 任务 ID
         */
        private String taskId;
        /**
         * 任务类型
         * 0:入库
         * 1:出库
         * 2:移库
         */
        private int taskType;
        /**
         * 任务起点
         */
        private String startNode;
        /**
         * 任务终点
         */
        private String endNode;
        /**
         *托盘码
         */
        private String barCode;
        /**
         * 排序
         * 同组任务的执行
         * 顺序, 同组不可
         * 重复 数值小在
         * 前,大的在后
         */
        private int order;
    }
}
src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java
@@ -45,26 +45,6 @@
    @Override
    public BasDevp checkSiteStatus(Integer devpNo, boolean pakin) {
        BasDevp station = selectById(devpNo);
        if (station == null){
            throw new CoolException(devpNo+"站点不存在");
        }
        if (pakin) {
            if(station.getAutoing()==null || !station.getAutoing().equals("Y")) {
                throw new CoolException(devpNo+"站点不是自动状态");
            }
            if(station.getLoading()==null || !station.getLoading().equals("Y")) {
                throw new CoolException(devpNo+"站点无物");
            }
            if(station.getWrkNo()!=null && station.getWrkNo()>0 && station.getWrkNo() < 9990) {
                throw new CoolException(devpNo+"站点已有工作号");
            }
//            if(!station.getInEnable().equals("Y")) {
//                throw new CoolException(devpNo+"站点不是可入状态");
//            }
            if(wrkMastService.getWorkingMast(devpNo)>0){
                throw new CoolException(devpNo+"站点不能同时生成两笔入库工作档");
            }
        }
        return station;
    }
}
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -94,9 +94,9 @@
            throw new CoolException(param.getBarcode() + "数据正在进行入库");
        }
        if(param.getBarcode().length()!=8){
            throw new CoolException("条码长度不是8位===>>" + param.getBarcode());
        }
//        if(param.getBarcode().length()!=8){
//            throw new CoolException("条码长度不是8位===>>" + param.getBarcode());
//        }
        if (param.getCombMats().size()>1){
            throw new CoolException("不允许混料===>>" + param.getBarcode());
        }
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -243,7 +243,7 @@
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setWrkSts(0L); // 工作状态:0.待接收
            wrkMast.setIoType(ioType); // 入出库状态
            wrkMast.setIoPri(13D); // 优先级:13
            wrkMast.setCrnNo(locMast.getCrnNo());
@@ -454,9 +454,13 @@
            if (!locMast.getLocSts().equals("D")){
                throw new CoolException("所选库位存在状态不为D的库位,库位号:"+locMast.getLocNo()+" 、当前状态:"+locMast.getLocSts()+"-"+locMast.getLocSts$());
            }
            boolean res1 = false;
            if(param.getOutSite()==100){
                res1 = true;
            }
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                    .eq("lev1", locMast.getLev1())
                    .orderBy("bay1",false));
                    .orderBy("bay1",res1));
            for (LocMast locMast1 : locMasts) {
                if (locMast1.getLocNo().equals(locMast.getLocNo())) {
                    break;
@@ -480,7 +484,7 @@
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setWrkSts(0L); // 工作状态:0.待发送
            wrkMast.setIoType(110); // 入出库状态: 110.空板出库
            wrkMast.setIoPri(10D);
            wrkMast.setSourceStaNo(sourceStaNo); // 源站
@@ -696,12 +700,13 @@
        if (wrkMast.getWrkSts() == 4 || wrkMast.getWrkSts() == 14) {
            throw new CoolException("当前工作档已完成");
        }
        // 入库 + 库位转移
        if (wrkMast.getWrkSts() < 4 || (wrkMast.getWrkSts() > 10 && wrkMast.getIoType()==11)) {
            wrkMast.setWrkSts(4L);
        // 出库
        } else if (wrkMast.getWrkSts() > 10) {
        if (wrkMast.getIoType() > 100) {
            wrkMast.setWrkSts(14L);
            // 入库 + 库位转移
        } else if (wrkMast.getIoType()==1 || wrkMast.getIoType()==10 || wrkMast.getIoType()==11) {
            wrkMast.setWrkSts(4L);
        }
        Date now = new Date();
        wrkMast.setCrnStrTime(DateUtils.calculate(now, 1L, TimeUnit.SECONDS, true));
@@ -847,7 +852,7 @@
        String locNo = ""; // 待修改目标库位
        String locSts = ""; // 待修改目标库位状态
        // 入库取消(修改目标库位)
        if (wrkMast.getWrkSts() < 4) {
        if (wrkMast.getIoType() < 100) {
            locNo = wrkMast.getLocNo();
            locSts = "O";
@@ -864,10 +869,10 @@
                locMastService.updateById(locMast);
            }
        // 出库取消(修改源库位)
        } else if (wrkMast.getWrkSts() > 10 && wrkMast.getWrkSts() != 14) {
        } else if (wrkMast.getIoType() > 100 && wrkMast.getWrkSts() != 14) {
            locNo = wrkMast.getSourceLocNo();
            // 出库 ===>> F.在库
            if (wrkMast.getIoType() > 100 && wrkMast.getIoType() != 110) {
            if (wrkMast.getIoType() == 101) {
                locSts = "F";
            // 空板出库 ===>> D.空桶/空栈板
            } else if (wrkMast.getIoType() == 110) {
@@ -899,8 +904,7 @@
                    waitPakinService.update(waitPakin, new EntityWrapper<WaitPakin>()
//                            .eq("order_no", waitPakin.getOrderNo())
                            .eq("zpallet",waitPakin.getZpallet())
                            .eq("matnr", waitPakin.getMatnr())
                            .eq("batch", waitPakin.getBatch()));
                            .eq("matnr", waitPakin.getMatnr()));
                }
            }
        }
src/main/java/com/zy/asrs/task/WCSReportScheduler.java
New file
@@ -0,0 +1,46 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.WCSReportHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class WCSReportScheduler {
    private static final Logger log = LoggerFactory.getLogger(WorkMastScheduler.class);
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private WCSReportHandler wcsReportHandler;
    @Value("${wcs-slave.workIssued-fig}")
    private Boolean workIssuedFig;
    /**
     * 下发任务给WCS
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    public  void execute (){
        if (!workIssuedFig){
            return;
        }
        List<WrkMast> wrkMastList=wrkMastService.selectList(new EntityWrapper<WrkMast>());
        int i=1;
        for(WrkMast wrkMast:wrkMastList){
            if (wrkMast.getWrkSts()==0){
                wcsReportHandler.start(wrkMast,i);
                i++;
            }
        }
    }
}
src/main/java/com/zy/asrs/task/handler/WCSReportHandler.java
New file
@@ -0,0 +1,116 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.core.exception.CoolException;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.result.WorkIssuedResult;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.constant.MesConstant;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Slf4j
@Service
@Transactional
public class WCSReportHandler extends AbstractHandler<String> {
    @Value("${wcs-slave.url}")
    private String url;
    @Value("${wcs-slave.workIssued}")
    private String workIssued;
    @Value("${wcs-slave.inDevp}")
    private String inDevp;
    @Value("${wcs-slave.outDevp}")
    private String outDevp;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private WrkMastService wrkMastService;
    public ReturnT<String> start(WrkMast wrkMast,int i) {
        WorkIssuedResult workIssuedResult = new WorkIssuedResult();
        Date date = new Date();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String groupId = dateFormat.format(date)+"-"+i;
        workIssuedResult.setGroupId(groupId);//组号
        workIssuedResult.setMsgTime(dateFormat.format(date));
        workIssuedResult.setWarehouse("wzzy");
        List<WorkIssuedResult.Tasks> tasks = new ArrayList<>();
        WorkIssuedResult.Tasks task = new WorkIssuedResult.Tasks();
        task.setTaskId(wrkMast.getWrkNo().toString());
        task.setBarCode(wrkMast.getBarcode());
        task.setOrder(i);
        if(wrkMast.getIoType() == 1 ){//入库
            task.setTaskType(0);//入库
            task.setStartNode(inDevp);
            task.setEndNode(wrkMast.getLocNo());//目标库位
        }else if(wrkMast.getIoType() == 10 ){//空板入库
            task.setTaskType(0);//入库
            task.setStartNode("200");
            task.setEndNode(wrkMast.getLocNo());//目标库位
        }else if(wrkMast.getIoType() == 101 ){//出库
            task.setTaskType(1);//出库
            task.setStartNode(wrkMast.getSourceLocNo());//源库位
            task.setEndNode(outDevp);
        }else{//空板出库
            task.setTaskType(1);//出库
            task.setStartNode(wrkMast.getSourceLocNo());//源库位
            task.setEndNode("100");
        }
        tasks.add(task);
        workIssuedResult.setTasks(tasks);
        String response = "";
        boolean success = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri(url)
                    .setPath(workIssued)
                    .setJson(JSON.toJSONString(workIssuedResult))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if (jsonObject.getInteger("returnStatus").equals(0)) {
                success = true;
                wrkMast.setWrkSts(1L);
                wrkMastService.updateById(wrkMast);
            } else {
                log.error("wms下发任务给wcs失败!!!url:{};request:{};response:{}", url+"/"+workIssued, JSON.toJSONString(workIssuedResult), response);
                throw new CoolException("wms下发任务给wcs失败");
            }
        } catch (Exception e) {
            log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return FAIL.setMsg(e.getMessage());
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "wms下发任务给wcs",
                        url+"/"+workIssued,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(workIssuedResult),
                        response,
                        success
                );
            } catch (Exception e) { log.error("", e); }
        }
        return null;
    }
}
src/main/java/com/zy/common/CodeRes.java
@@ -5,14 +5,14 @@
public interface CodeRes extends BaseRes {
    // user
    String USER_10001 = "10001-账号不存在";
    String USER_10002 = "10002-账号已被禁用";
    String USER_10003 = "10003-密码错误";
    String USER_10001 = "1-账号不存在";
    String USER_10002 = "1-账号已被禁用";
    String USER_10003 = "1-密码错误";
    String SYSTEM_20001 = "20001-许可证已失效";
    String SYSTEM_20001 = "1-许可证已失效";
    String EXIST_500 = "500-工作档/库存条码数据已存在";
    String PICK_600 = "600-拣料任务";
    String NO_COMB_700 = "700-请先组托";
    String EXIST_500 = "1-工作档/库存条码数据已存在";
    String PICK_600 = "1-拣料任务";
    String NO_COMB_700 = "1-请先组托";
}
src/main/java/com/zy/common/model/LocTypeDto.java
@@ -26,14 +26,7 @@
    }
    public LocTypeDto(BasDevp basDevp) {
        if (basDevp.getLocType1() == null || basDevp.getLocType1() == 0) {
            throw new CoolException("plc高低检测异常");
        }
        if (basDevp.getLocType1() == 1) {
            this.locType1 = 1; // 低库位
        } else {
            this.locType1 = 2; // 高库位
        }
        this.locType1 = 1; // 低库位
        log.info(JSON.toJSONString(this));
    }
src/main/java/com/zy/common/service/CommonService.java
@@ -493,13 +493,24 @@
                        }
                    }
                }
                if(Cools.isEmpty(locMast)){
                    List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                            .eq("lev1", 1)
                            .orderBy("bay1",false));
                    for (LocMast locMast2 : locMasts) {
                        if (locMast2.getLocSts().equals("O") ) {
                            if (locMast == null){
                                locMast = locMast2;
                            }else if (locMast2.getLocSts().equals("F")){
                                locMast = null;
                            }
                        }
                    }
                }
            }else {
                for (int i = 1; i<=4;i++){
                for (int i = 1; i<=2;i++){
                    if (locMast != null){
                        break;
                    }
                    if (i == 2){
                        continue;
                    }
                    List<LocMast> locMastsF = locMastService.selectList(new EntityWrapper<LocMast>()
                            .eq("lev1", i)
@@ -536,13 +547,11 @@
                        }
                    }
                }
            }
        }else {
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                    .eq("lev1", 2)
                    .orderBy("bay1",false));
                    .eq("lev1", 3)
                    .orderBy("bay1",true));
            if (Cools.isEmpty(locMasts)){
                throw new CoolException("数据异常,请联系管理员===》库位未知");
            }
src/main/java/com/zy/common/web/WcsController.java
@@ -1,5 +1,7 @@
package com.zy.common.web;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.Cools;
@@ -7,19 +9,23 @@
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.EmptyPlateOutParam;
import com.zy.asrs.entity.param.StatusParam;
import com.zy.asrs.service.*;
import com.zy.common.CodeRes;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.StartupDto;
import com.zy.common.service.CommonService;
import com.zy.common.utils.HttpHandler;
import com.zy.common.web.param.SearchLocParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
@@ -44,74 +50,98 @@
    @Autowired
    private WaitPakinService waitPakinService;
    @Autowired
    private  LocDetlService locDetlService;
    private LocDetlService locDetlService;
    @Autowired
    private RowLastnoService rowLastnoService;
    @Autowired
    private WorkService workService;
    @Autowired
    private ApiLogService apiLogService;
    @Value("${wcs-slave.url}")
    private String url;
    @Value("${wcs-slave.loc}")
    private String loc;
    @PostMapping("/pakin/loc/v1")
    @PostMapping("/fromwcs/inware-task")
    @ResponseBody
    public synchronized R getLocNo(@RequestBody SearchLocParam param) {
    public synchronized Re getLocNo(@RequestBody SearchLocParam param) {
        log.info("收到WCS入库接口请求====>>入参:{}", param);
        if (Cools.isEmpty(param.getIoType())) {
            return R.error("入出库类型不能为空");
        if (Cools.isEmpty(param.getCargoHeight())) {
            return Re.error("入出库类型不能为空");
        }
        if (Cools.isEmpty(param.getSourceStaNo())) {
            return R.error("源站编号不能为空");
        if (Cools.isEmpty(param.getFromPort())) {
            return Re.error("源站编号不能为空");
        }
        List<WaitPakin> waitPakins = null;
        if (param.getIoType() == 1) {
            if (Cools.isEmpty(param.getBarcode())) {
                return R.error("条码不能为空");
        if (param.getFromPort().equals("100")) {
            //有空板出库时禁止入库
            int wrkCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type",110).eq("sta_no",100));
            if(wrkCount > 0){
                return Re.error("有空板出库到100站时时禁止入库");
            }
            waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
            if (Cools.isEmpty(param.getBarCode())) {
                return Re.error("条码不能为空");
            }
            waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarCode()));
            if (Cools.isEmpty(waitPakins)) {
                WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
                WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarCode());
                if (wrkMast != null && wrkMast.getIoType() == 103) {
                    return R.parse(CodeRes.PICK_600);
                    return Re.parse(CodeRes.PICK_600);
                }
                return R.parse(CodeRes.NO_COMB_700);
                return Re.parse(CodeRes.NO_COMB_700);
            }
            int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode()));
            int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet",param.getBarcode()));
            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) {
                return R.error(CodeRes.EXIST_500);
                return Re.error(CodeRes.EXIST_500);
            }
        }else {
            //有满板出库时禁止空板入库
            int wrkCount = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type",101).or().eq("io_type",110));
            if(wrkCount > 0){
                return Re.error("有满板出库时禁止空板入库");
            }
            int countLoc = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 10));
            if (countLoc > 0 ) {
                return Re.error("已有空板入库任务禁止在入空板");
            }
        }
        if (Cools.isEmpty(param.getLocType1())){
            return R.error("高低检测信号不能为空");
        if (Cools.isEmpty(param.getCargoHeight())) {
            return Re.error("高低检测信号不能为空");
        }
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
        sourceStaNo.setLocType1(param.getLocType1());
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(Integer.valueOf(param.getFromPort()), true);
        sourceStaNo.setLocType1(param.getCargoHeight().shortValue());
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        StartupDto dto = null;
        switch (param.getIoType()) {
            case 1://满托盘入库
        switch (param.getFromPort()) {
            case "100"://满托盘入库
                assert waitPakins != null;
                dto = startupFullPutStore(param.getSourceStaNo(), param.getBarcode(), locTypeDto, waitPakins);
                dto = startupFullPutStore(Integer.valueOf(param.getFromPort()), param.getBarCode(), locTypeDto, waitPakins);
                break;
            case 10://空托盘入库
                dto = emptyPlateIn(param.getSourceStaNo(), locTypeDto, param.getBarcode());
            case "200"://空托盘入库
                dto = emptyPlateIn(Integer.valueOf(param.getFromPort()), locTypeDto, param.getBarCode());
                break;
            default:
                break;
        }
        log.info("WCS入库接口返参:{},托盘码:{}", dto, param.getBarcode());
        return R.ok().add(dto);
        log.info("WCS入库接口返参:{},托盘码:{}", dto, param.getBarCode());
        return Re.ok();
    }
    @PostMapping("/auto/emptyIn/v1")
    @ResponseBody
    public R autoEmptyIn(@RequestBody LocTypeDto locTypeDto){
    public R autoEmptyIn(@RequestBody LocTypeDto locTypeDto) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(12, true);
        // 检索库位
        StartupDto dto = commonService.getLocNo( 10, 12, null,null,null, locTypeDto);
        StartupDto dto = commonService.getLocNo(10, 12, null, null, null, locTypeDto);
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -134,12 +164,12 @@
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setMemo("自动空托入库");
        return wrkMastService.insert(wrkMast) ? R.ok("自动空托入库成功,工作号:"+wrkMast.getWrkNo()) : R.error("生成自动空托入库失败");
        return wrkMastService.insert(wrkMast) ? R.ok("自动空托入库成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动空托入库失败");
    }
    @PostMapping("auto/emptyOut/v1")
    @ResponseBody
    public R autoEmptyOut(){
    public R autoEmptyOut() {
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                .eq("loc_sts", "D"));
        if (Cools.isEmpty(locMast)) {
@@ -147,9 +177,11 @@
        }
        EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
        emptyPlateOutParam.setOutSite(12);
        emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locMast.getLocNo()+"");}});
        emptyPlateOutParam.setLocNos(new ArrayList<String>() {{
            add(locMast.getLocNo() + "");
        }});
        WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam);
        return R.ok(!Cools.isEmpty(wrkMast)? R.ok("自动空托出库成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动空托出库失败"));
        return R.ok(!Cools.isEmpty(wrkMast) ? R.ok("自动空托出库成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动空托出库失败"));
    }
    /**
@@ -162,14 +194,14 @@
        // 检索库位
        List<String> matnrs = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
        List<String> batchs = waitPakins.stream().map(WaitPakin::getBatch).distinct().collect(Collectors.toList());
        StartupDto dto = commonService.getLocNo( 1, devpNo, matnrs.get(0),batchs.get(0),null, locTypeDto);
        StartupDto dto = commonService.getLocNo(1, devpNo, matnrs.get(0), batchs.get(0), null, locTypeDto);
        int workNo = dto.getWorkNo();
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(new Date());
        wrkMast.setWrkSts(2L); // 工作状态:生成入库ID
        wrkMast.setWrkSts(0L); // 工作状态:0.待接收
        wrkMast.setIoType(1); // 入出库状态:1.入库
        wrkMast.setIoPri(13D); // 优先级
        wrkMast.setCrnNo(dto.getCrnNo());
@@ -183,6 +215,7 @@
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("Y");
        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
        wrkMast.setMk("N");//是否完成上报wcs
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
@@ -215,19 +248,19 @@
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiTime(now);
        if (!basDevpService.updateById(sourceStaNo)){
        if (!basDevpService.updateById(sourceStaNo)) {
            throw new CoolException("更新源站失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")){
        if (locMast.getLocSts().equals("O")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)){
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo()+"目标库位已被占用");
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        return dto;
    }
@@ -237,13 +270,13 @@
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        StartupDto dto = commonService.getLocNo( 10, devpNo, null,null,null, locTypeDto);
        StartupDto dto = commonService.getLocNo(10, devpNo, null, null, null, locTypeDto);
        int workNo = dto.getWorkNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(new Date());
        wrkMast.setWrkSts(2L); // 工作状态:生成入库ID
        wrkMast.setWrkSts(0L); // 工作状态:0.待接收
        wrkMast.setIoType(10); // 入出库状态:10.空板入库
        wrkMast.setIoPri(13D); // 优先级
        wrkMast.setCrnNo(dto.getCrnNo());
@@ -267,21 +300,112 @@
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiTime(new Date());
        if (!basDevpService.updateById(sourceStaNo)){
        if (!basDevpService.updateById(sourceStaNo)) {
            throw new CoolException("更新源站失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")){
        if (locMast.getLocSts().equals("O")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(new Date());
            if (!locMastService.updateById(locMast)){
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo()+"目标库位已被占用");
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        return dto;
    }
    @PostMapping("/fromwcs/task")
    @ResponseBody
    public Re status(@RequestBody StatusParam statusParam) {
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", statusParam.getTaskId()));
        if(Cools.isEmpty(wrkMast)){
            return Re.error("没有找到:"+statusParam.getTaskId()+"这条任务");
        }
        /**
         * 任务状态
         * 执行过程中
         * 的状态。 0- 已 接
         * 收 , 1- 任 务 开
         * 始,2-取货完成,3-
         * 任务中断,4-放货
         * 完成,8-任务结束
         */
        if (statusParam.getTaskStatus()==0){
            wrkMast.setWrkSts(1L);//1.已接收
        }else if (statusParam.getTaskStatus()==1){
            wrkMast.setWrkSts(2L);//2.任务开始
        }else if (statusParam.getTaskStatus()==2){
            wrkMast.setWrkSts(3L);//3.取货完成
        }else if (statusParam.getTaskStatus()==3){
            wrkMast.setWrkSts(6L);//6.任务中断
        } else if (statusParam.getTaskStatus()==4){
            wrkMast.setWrkSts(7L);//6.放货完成
        }if (statusParam.getTaskStatus()==8){
            if(wrkMast.getIoType()==1 || wrkMast.getIoType() == 10){
                wrkMast.setWrkSts(4L);//4.入库完成
            }else if (wrkMast.getIoType()==101 || wrkMast.getIoType() == 110){
                wrkMast.setWrkSts(14L);//14.已出库未确认
            }
        }
        wrkMastService.updateById(wrkMast);
        return Re.ok();
    }
    @GetMapping("loc")
    public void loc(){
        List<LocMast> locMasts=locMastService.selectList(new EntityWrapper<LocMast>());
        List<HashMap<String,Object>> mapList=new ArrayList<>();
        for (LocMast locMast : locMasts) {
            if (locMast.getLev1()!=4){
                HashMap<String,Object> map=new HashMap<>();
                map.put("warehouse","wzzy");
                map.put("posiX",locMast.getRow1());
                map.put("posiY",locMast.getBay1());
                map.put("posiZ",locMast.getLev1());
                map.put("cargoNo",locMast.getLocNo());
                map.put("type","0");
                mapList.add(map);
            }
        }
        if(mapList.size()>0){
            String response = "";
            boolean success = false;
            try {
                response = new HttpHandler.Builder()
                        .setUri(url)
                        .setPath(loc)
                        .setJson(JSON.toJSONString(mapList))
                        .build()
                        .doPost();
                JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.getInteger("returnStatus").equals(0)) {
                    success = true;
                } else {
                    log.error("wms同步wcs库位失败!!!url:{};request:{};response:{}", url+"/"+loc, JSON.toJSONString(mapList), response);
                    throw new CoolException("wms下发任务给wcs失败");
                }
            } catch (Exception e) {
                log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                throw new CoolException("wms下发任务给wcs失败");
            } finally {
                try {
                    // 保存接口日志
                    apiLogService.save(
                            "wms同步wcs库位失败",
                            url+"/"+loc,
                            null,
                            "127.0.0.1",
                            JSON.toJSONString(mapList),
                            response,
                            success
                    );
                } catch (Exception e) { log.error("", e); }
            }
        }
    }
}
src/main/java/com/zy/common/web/param/SearchLocParam.java
@@ -1,5 +1,7 @@
package com.zy.common.web.param;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
@@ -8,13 +10,43 @@
@Data
public class SearchLocParam {
    private Integer ioType;
    /**
     * 申请时间
     */
    @JsonProperty(value = "applyTime")
    private String applyTime;
    private Integer sourceStaNo;
    /**
     * 入库口编号
     */
    @JsonProperty(value = "fromPort")
    private String fromPort;
    private String barcode;
    /**
     * 托盘码
     */
    @JsonProperty(value = "barCode")
    private String barCode;
    // 库位规格( 0:未知, 1:低库位, 2:高库位)
    private Short locType1;
    /**
     * 货物高度
     * 1(低),2(中),
     * 3(高) 三个等
     * 级,默认 0
     */
    private Integer cargoHeight;
    /**
     * 货物重量
     * 精确度根据设备
     * 定,最高 0.1KG,
     * 默认 0.0
     */
    private double cargoWeight;
//    // 库位规格( 0:未知, 1:低库位, 2:高库位)
//    private Short locType1;
}
src/main/resources/application.yml
@@ -57,6 +57,18 @@
  doubleLocsLeft: 1,5,9,13
  # 右深库位排号
  doubleLocsRight: 4,8,12,16
  #是否开启wms下发任务给wcs
  workIssued-fig : true
  #地址
  url : 192.168.110.100:8082
  #wms下发任务给wcs
  workIssued : fromWms/taskReceive
  #库位同步
  loc: fromWms/cargoNoSyn
  #入库站
  inDevp : 100
  #出库站
  outDevp : 200
# wms参数配置
wms-parameter:
  # 自动补空板功能开关
src/main/resources/license.lic
Binary files differ