自动化立体仓库 - WMS系统
#
zwl
2025-03-31 a936c187f9d7f389a711e001739384dcbd9278e2
#
19个文件已修改
5个文件已添加
899 ■■■■ 已修改文件
pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LocMastController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MatController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutController.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasCrnp.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/LocDetl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Mat.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/CarryParam.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/GetShuttleStatusParam.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/result/StorageResult.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/GetEquipmentStatus.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OutWorkScheduler.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OutWorkHandler.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 239 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/param/SearchLocParam.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/image/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -114,7 +114,7 @@
    </dependencies>
    <build>
        <finalName>htwms</finalName>
        <finalName>lfdsxkwms</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -64,6 +64,7 @@
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        }
        wrapper.orderBy("loc_attribute",false);
        return R.ok(locMastService.selectPage(new Page<>(curr, limit), wrapper));
    }
src/main/java/com/zy/asrs/controller/MatController.java
@@ -89,7 +89,7 @@
    public R pdaSearch(@RequestParam(required = false) String condition) {
        EntityWrapper<Mat> wrapper = new EntityWrapper<>();
        if (!Cools.isEmpty(condition)) {
            wrapper.like("matnr", condition).or().like("maktx", condition);
            wrapper.like("matnr", condition).or().like("maktx", condition).or().like("specs", condition);
        }
        wrapper.orderBy("create_time", false);
        List<Mat> mats = matService.selectList(wrapper);
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -8,6 +8,7 @@
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.service.OpenService;
import com.zy.asrs.service.WorkService;
import com.zy.asrs.service.WrkMastService;
import com.zy.common.model.DetlDto;
import com.zy.common.web.BaseController;
@@ -38,12 +39,14 @@
    private OpenService openService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private WorkService workService;
    @PostMapping("/order/matSync/default/v1")
    @AppAuth(memo = "商品信息同步接口")
    public synchronized R syncMatInfo(@RequestHeader(required = false) String appkey,
                                      @RequestBody(required = false) MatSyncParam param,
                                      HttpServletRequest request){
                                      HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
@@ -218,30 +221,30 @@
     * 任务开始
     */
    @RequestMapping("/start/task")
    public HashMap<String ,Object> startTask(@RequestBody HashMap<String,Object> map) {
        String taskNo = map.get("TaskNo")+"";
        HashMap<String ,Object> map1 = new HashMap<>();
        if(Cools.isEmpty(taskNo)){
    public HashMap<String, Object> startTask(@RequestBody HashMap<String, Object> map) {
        String taskNo = map.get("TaskNo") + "";
        HashMap<String, Object> map1 = new HashMap<>();
        if (Cools.isEmpty(taskNo)) {
            map1.put("ReturnStatus", "1");
            map1.put("ErrorMessage", "任务号为空");
        }else{
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",Integer.valueOf(taskNo)));
            if(wrkMast == null){
        } else {
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", Integer.valueOf(taskNo)));
            if (wrkMast == null) {
                map1.put("ReturnStatus", "1");
                map1.put("ErrorMessage", "没有找到该任务号:"+taskNo);
            }else{
                if(wrkMast.getIoType()==1){
                map1.put("ErrorMessage", "没有找到该任务号:" + taskNo);
            } else {
                if (wrkMast.getIoType() == 1) {
                    wrkMast.setWrkSts(3L);//入库开始
                }else if(wrkMast.getIoType()==11){
                } else if (wrkMast.getIoType() == 11) {
                    wrkMast.setWrkSts(13L);//出库开始
                }
                wrkMast.setModiTime(new Date());
                if(wrkMastService.updateById(wrkMast)){
                if (wrkMastService.updateById(wrkMast)) {
                    map1.put("ReturnStatus", "0");
                    map1.put("ErrorMessage", "");
                }else{
                } else {
                    map1.put("ReturnStatus", "1");
                    map1.put("ErrorMessage", "更新任务状态失败"+wrkMast);
                    map1.put("ErrorMessage", "更新任务状态失败" + wrkMast);
                }
            }
        }
@@ -252,62 +255,97 @@
     * 搬运到目的地
     */
    @RequestMapping("/destination/task")
    public HashMap<String ,Object> destinationTask(@RequestBody HashMap<String,Object> map) {
        String taskNo = map.get("TaskNo")+"";
        HashMap<String ,Object> map1 = new HashMap<>();
        if(Cools.isEmpty(taskNo)){
    public HashMap<String, Object> destinationTask(@RequestBody HashMap<String, Object> map) {
        String taskNo = map.get("TaskNo") + "";
        HashMap<String, Object> map1 = new HashMap<>();
        if (Cools.isEmpty(taskNo)) {
            map1.put("ReturnStatus", "1");
            map1.put("ErrorMessage", "任务号为空");
        }else{
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",Integer.valueOf(taskNo)));
            if(wrkMast == null){
                map1.put("ReturnStatus", "1");
                map1.put("ErrorMessage", "没有找到该任务号:"+taskNo);
            }else{
                if(wrkMast.getIoType()==1){
                    wrkMast.setWrkSts(4L);//任务结束
                }else if(wrkMast.getIoType()==11){
                    wrkMast.setWrkSts(13L);//出库到站点上
                }
                wrkMast.setModiTime(new Date());
                if(wrkMastService.updateById(wrkMast)){
                    map1.put("ReturnStatus", "0");
                    map1.put("ErrorMessage", "");
                }else{
        } else {
            //任务完成
            if (map.get("Result").equals(1)) {
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", Integer.valueOf(taskNo)));
                if (wrkMast == null) {
                    map1.put("ReturnStatus", "1");
                    map1.put("ErrorMessage", "更新任务状态失败"+wrkMast);
                    map1.put("ErrorMessage", "没有找到该任务号:" + taskNo);
                } else {
                    if (wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10) {
                        wrkMast.setWrkSts(4L);//任务结束
                    } else if (wrkMast.getIoType() == 101) {
                        wrkMast.setWrkSts(13L);//出库到站点上
                    } else if (wrkMast.getIoType() == 53 || wrkMast.getIoType() == 57) {
                        wrkMast.setWrkSts(4L);//4.任务结束
                    } else if (wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107 || wrkMast.getIoType() == 110) {
                        wrkMast.setWrkSts(14L);
                    }
                    wrkMast.setModiTime(new Date());
                    if (wrkMastService.updateById(wrkMast)) {
                        map1.put("ReturnStatus", "0");
                        map1.put("ErrorMessage", "");
                    } else {
                        map1.put("ReturnStatus", "1");
                        map1.put("ErrorMessage", "更新任务状态失败" + wrkMast);
                    }
                }
            } else {
                //任务取消
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", Integer.valueOf(taskNo)));
                if (wrkMast == null) {
                    map1.put("ReturnStatus", "1");
                    map1.put("ErrorMessage", "没有找到该任务号:" + taskNo);
                    return map1;
                }
                workService.cancelWrkMast(String.valueOf(wrkMast.getWrkNo()),9999L);
            }
        }
        return map1;
    }
    /**
     * 搬运到目的地
     * 出库---目的地搬离
     */
    @RequestMapping("/leave/task")
    public HashMap<String ,Object> leaveTask(@RequestBody HashMap<String,Object> map) {
        String taskNo = map.get("TaskNo")+"";
        HashMap<String ,Object> map1 = new HashMap<>();
        if(Cools.isEmpty(taskNo)){
    public HashMap<String, Object> leaveTask(@RequestBody HashMap<String, Object> map) {
        String taskNo = map.get("TaskNo") + "";
        HashMap<String, Object> map1 = new HashMap<>();
        if (Cools.isEmpty(taskNo)) {
            map1.put("ReturnStatus", "1");
            map1.put("ErrorMessage", "任务号为空");
        }else{
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",Integer.valueOf(taskNo)));
            if(wrkMast == null){
        } else {
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", Integer.valueOf(taskNo)));
            if (wrkMast == null) {
                map1.put("ReturnStatus", "1");
                map1.put("ErrorMessage", "没有找到该任务号:"+taskNo);
            }else{
                map1.put("ErrorMessage", "没有找到该任务号:" + taskNo);
                return map1;
            }
            if ((wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107 || wrkMast.getIoType() == 110) && wrkMast.getWrkSts() != 14) {
                wrkMast.setWrkSts(14L);//出库到站点上
                wrkMast.setModiTime(new Date());
                if(wrkMastService.updateById(wrkMast)){
                if (wrkMastService.updateById(wrkMast)) {
                    map1.put("ReturnStatus", "0");
                    map1.put("ErrorMessage", "");
                }else{
                } else {
                    map1.put("ReturnStatus", "1");
                    map1.put("ErrorMessage", "更新任务状态失败"+wrkMast);
                    map1.put("ErrorMessage", "更新任务状态失败" + wrkMast);
                }
            } else if (wrkMast.getIoType() != 101) {
                map1.put("ReturnStatus", "0");
                map1.put("ErrorMessage", "");
                return map1;
            } else {
                wrkMast.setWrkSts(14L);//出库到站点上
                wrkMast.setModiTime(new Date());
                if (wrkMastService.updateById(wrkMast)) {
                    map1.put("ReturnStatus", "0");
                    map1.put("ErrorMessage", "");
                } else {
                    map1.put("ReturnStatus", "1");
                    map1.put("ErrorMessage", "更新任务状态失败" + wrkMast);
                }
            }
        }
        return map1;
    }
src/main/java/com/zy/asrs/controller/OutController.java
@@ -1,16 +1,19 @@
package com.zy.asrs.controller;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.service.*;
import com.zy.common.model.LocDto;
import com.zy.common.model.TaskDto;
import com.zy.common.web.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -23,7 +26,7 @@
/**
 * Created by vincent on 2022/3/26
 */
@Slf4j
@RestController
public class OutController extends BaseController {
@@ -66,17 +69,37 @@
            if (issued <= 0.0D) { continue; }
            List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMatnr(), orderDetl.getBatch(), null, exist);
            for (LocDetl locDetl : locDetls) {
                if (issued > 0) {
                    LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
                            issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued);
                    List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
                    locDto.setStaNos(staNos);
                    locDtos.add(locDto);
                    exist.add(locDetl.getLocNo());
                    // 剩余待出数量递减
                    issued = issued - locDetl.getAnfme();
                } else {
                    break;
                LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo()));
                if(locMast==null){
                    R.error("没有找到该库位:"+locDetl.getLocNo());
                }
                List<LocMast> locMasts=locMastService.selectList(new EntityWrapper<LocMast>()
                        .eq("group1",locMast.getGroup1())
                        .eq("loc_sts","F")
                        .orderBy("loc_attribute",false));
                for (LocMast locMast1 : locMasts) {
                    LocDetl locDetl1 = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locMast1.getLocNo()));
                    if(locDetl1==null){
                        return R.error(locMast1.getLocNo()+"没有找到物料");
                    }
                    if (!locDetl1.getMatnr().equals(locDetl.getMatnr())) {
                        log.error(locMast1.getGroup1()+"巷道的第"+locMast1.getLocAttribute()+"深浅库位号和同巷道物料不同");
                        break;
                    }
                    if (issued > 0) {
                        LocDto locDto = new LocDto(locDetl1.getLocNo(), locDetl1.getMatnr(), locDetl1.getMaktx(), locDetl1.getBatch(), orderDetl.getOrderNo(),
                                issued >= locDetl1.getAnfme() ? locDetl1.getAnfme() : issued);
                        List<Integer> staNos = new ArrayList<>();
                        staNos.add(100);
                        staNos.add(200);
                        locDto.setStaNos(staNos);
                        locDtos.add(locDto);
                        exist.add(locDetl.getLocNo());
                        // 剩余待出数量递减
                        issued = issued - locDetl.getAnfme();
                    } else {
                        break;
                    }
                }
            }
            if (issued > 0) {
src/main/java/com/zy/asrs/entity/BasCrnp.java
@@ -50,8 +50,8 @@
    /**
     * 状态
     * 1.联机
     * 2.手动
     * 3.充电中
     * 0.手动
     * 2.充电中
     */
    @ApiModelProperty(value= "状态")
    @TableField("crn_sts")
src/main/java/com/zy/asrs/entity/LocDetl.java
@@ -67,7 +67,7 @@
    @ApiModelProperty(value= "单位")
    private String unit;
    @ApiModelProperty(value= "单价")
    @ApiModelProperty(value= "库存数量")
    private Double price;
    @ApiModelProperty(value= "sku")
src/main/java/com/zy/asrs/entity/Mat.java
@@ -86,10 +86,10 @@
    private String specs;
    /**
     * 型号
     * 图号
     */
    @ApiModelProperty(value= "型号")
    @ExcelProperty(value = "型号")
    @ExcelProperty(value = "图号")
    private String model;
    /**
src/main/java/com/zy/asrs/entity/param/CarryParam.java
New file
@@ -0,0 +1,46 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class CarryParam {
    //工作号
    private String TaskNo;
    //入出库类型
    private Integer StereoscopicTaskType;
    //优先级
    private Integer Priority;
    //容器编码
    private String BoxNo;
    //源货位排编号
    private Integer OriginalRowNo;
    //源货位层编号
    private Integer OriginalFloorNo;
    //源货位列编号
    private Integer OriginalColumnNo;
    //目标库位排编号
    private Integer GoalRowNo;
    //目标库位层编号
    private Integer GoalFloorNo;
    //目标库位列编号
    private Integer GoalColumnNo;
    //起点
    private String startPoint;
    //终端编号(输送线上某一点位)
    private String TerminalNo;
    //备注
    private String meno;
}
src/main/java/com/zy/asrs/entity/param/GetShuttleStatusParam.java
New file
@@ -0,0 +1,91 @@
package com.zy.asrs.entity.param;
import com.baomidou.mybatisplus.annotations.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class GetShuttleStatusParam {
    /**
     * 小车号
     */
    private Integer shuttleNo;
    /**
     * 状态 1: 正常  0: 手动 2.充电中
     */
    @ApiModelProperty(value= "状态 1: 正常  0: 手动 2.充电中  ")
    private Integer status;
    /**
     * 小车所在层
     */
    @ApiModelProperty(value= "小车所在层")
    @TableField("charge_line")
    private Integer chargeLine;
    /**
     * 小车异常码
     */
    @ApiModelProperty(value= "小车异常码")
    @TableField("errorCode")
    private Integer errorCode;
    /**
     * 小车状态
     * <p>
     * IDLE(1, "空闲"),
     * WORKING(2, "作业中"),
     * WAITING(3, "等待确认"),
     * CHARGING(4, "充电中"),
     * CHARGING_WAITING(5, "充电任务等待确认"),
     * FIXING(6, "故障修复中"),
     * OFFLINE(7, "离线"),
     */
    private Integer protocolStatus;
    /**
     * 当前二维码
     * 0为空
     */
    private String currentCode;
    /**
     * 是否为充电状态
     */
    private Boolean hasCharge;
    public String getProtocolStatus$() {
        String protocolStatus$ = "";
        switch (this.protocolStatus) {
            case 1:
                protocolStatus$ = "空闲";
                break;
            case 2:
                protocolStatus$ = "作业中";
                break;
            case 3:
                protocolStatus$ = "等待确认";
                break;
            case 4:
                protocolStatus$ = "充电中";
                break;
            case 5:
                protocolStatus$ = "充电任务等待确认";
                break;
            case 6:
                protocolStatus$ = "故障修复中";
                break;
            case 7:
                protocolStatus$ = "离线";
                break;
        }
        return protocolStatus$;
    }
}
src/main/java/com/zy/asrs/entity/result/StorageResult.java
@@ -8,12 +8,15 @@
    private Integer ReturnStatus = 0;
    private Results Results;
    @Data
    public static class Results{
        //库位号
        private String ShelfUnitId;
        //任务号
        private Integer TaskNo;
        private String barcode;
    }
}
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -232,7 +232,7 @@
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(ioType); // 入出库状态
            wrkMast.setIoPri(13D); // 优先级:13
            wrkMast.setIoPri(10.0+locMast.getLocAttribute()); // 优先级
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
            wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
@@ -300,6 +300,7 @@
        StaDesc staDesc = staDescService.queryCrnStnAuto(ioType, locMast.getCrnNo(), staNo.getDevNo());
        // 生成工作号
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
        int yz=staDesc.getStnNo()*10+Integer.valueOf(taskDto.getLocNo().substring(6));
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
@@ -308,7 +309,7 @@
        wrkMast.setIoType(ioType); // 入出库状态
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setCrnNo(locMast.getCrnNo());
        wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
        wrkMast.setSourceStaNo(yz); // 源站
        wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
        wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
@@ -331,6 +332,7 @@
            if (orderDetl == null) {
                orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null);
            }
            LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locDto.getLocNo()).eq("matnr", locDto.getMatnr()));
            Mat mat=matService.selectOne(new EntityWrapper<Mat>().eq("matnr",locDto.getMatnr()));
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(orderDetl);
@@ -340,6 +342,7 @@
            wrkDetl.setBatch(locDto.getBatch());
            wrkDetl.setOrderNo(locDto.getOrderNo());
            wrkDetl.setModel(mat.getModel());
            wrkDetl.setPrice(locDetl.getAnfme());//库存数量
            wrkDetl.setAnfme(locDto.getAnfme()); // 数量
            wrkDetl.setAppeTime(now);
            wrkDetl.setAppeUser(userId);
@@ -465,6 +468,7 @@
            wrkMast.setStaNo(param.getOutSite()); // 目标站
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceLocNo(locNo); // 源库位
            wrkMast.setIoPri(10.0+locMast.getLocAttribute());//优先级
            wrkMast.setFullPlt("N"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
src/main/java/com/zy/asrs/task/GetEquipmentStatus.java
New file
@@ -0,0 +1,74 @@
package com.zy.asrs.task;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.BasCrnp;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.param.GetShuttleStatusParam;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.BasCrnpService;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.impl.BasDevpServiceImpl;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.utils.HttpHandler;
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 GetEquipmentStatus {
    private static final Logger log = LoggerFactory.getLogger(WorkMastScheduler.class);
    @Value("${wcs.address.URL}")
    private String addrs;
    @Value("${wcs.address.deviceStatus}")
    private String deviceStatus;
    @Autowired
    private BasCrnpService basCrnpService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private BasDevpService basDevpService;
    @Scheduled(cron = "0/3 * * * * ? ")
    private void execute() {
        //获取设备信息
        String response ="";
        try {
            response = new HttpHandler.Builder()
                    // .setHeaders(headParam)
                    .setUri(addrs)
                    .setPath(deviceStatus)
                    .build()
                    .doGet();
            JSONObject jsonObject = JSON.parseObject(response);
            if (jsonObject.get("code").equals(200)) {
                JSONObject data = JSON.parseObject(jsonObject.get("data").toString());
                List<GetShuttleStatusParam> shuttles = JSON.parseArray(data.get("basShuttle").toString(), GetShuttleStatusParam.class);
                for (GetShuttleStatusParam shuttle : shuttles) {
                    BasCrnp shuttle1 = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", shuttle.getShuttleNo()));
                    shuttle1.setCrnSts(shuttle.getStatus());//小车模式
                    shuttle1.setCrnErr(Long.valueOf(shuttle.getErrorCode()));//小车报警
                    shuttle1.setLev1(shuttle.getChargeLine());//小车所在层
                    basCrnpService.updateById(shuttle1);
                }
                List<BasDevp> basDevps = JSON.parseArray(data.get("basDevp").toString(), BasDevp.class);
                for (BasDevp basDevp : basDevps) {
                    basDevpService.updateById(basDevp);
                }
            }
        } catch (Exception e) {
            log.error("wms读取wcs小车状态失败");
        }
    }
}
src/main/java/com/zy/asrs/task/OutWorkScheduler.java
New file
@@ -0,0 +1,41 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
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.OutWorkHandler;
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;
import java.util.List;
@Component
public class OutWorkScheduler {
    private static final Logger log = LoggerFactory.getLogger(WorkMastScheduler.class);
    @Autowired
    OutWorkHandler outWorkHandler;
    @Autowired
    WrkMastService wrkMastService;
    /**
     * 出库任务下发
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    private void execute() {
        List<WrkMast> wrkMasts=wrkMastService.selectList(new EntityWrapper<WrkMast>()
                .eq("wrk_sts",11)
                .in("io_type",11,101,103,107,110));
        for(WrkMast wrkMast:wrkMasts){
            ReturnT<String> result = outWorkHandler.start(wrkMast);
            if (!result.isSuccess()) {
                log.error("wms下发出库移库任务={}给wcs下发失败", wrkMast.getWrkNo());
            }
        }
    }
}
src/main/java/com/zy/asrs/task/handler/OutWorkHandler.java
New file
@@ -0,0 +1,95 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.param.CarryParam;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.service.impl.LocMastServiceImpl;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
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.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Slf4j
@Service
@Transactional
public class OutWorkHandler extends AbstractHandler<String> {
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private ApiLogService apiLogService;
    @Value("${wcs.address.URL}")
    private String addrs;
    @Value("${wcs.address.outboundTaskSend}")
    private String outboundTaskSend;
    @Autowired
    private WrkMastService wrkMastService;
    public synchronized ReturnT<String> start(WrkMast wrkMast) {
        //优先级
        LocMast locMast=locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", wrkMast.getSourceLocNo()));
        int Priority = locMast.getLocAttribute() == null ? 0 : locMast.getLocAttribute();
        HashMap<String, Object> map = new HashMap<>();
        CarryParam carryParam = new CarryParam();
        carryParam.setBoxNo(wrkMast.getBarcode());//托盘码
        carryParam.setTaskNo(wrkMast.getWrkNo()+"");//任务号
        carryParam.setStereoscopicTaskType(2);//2.出库
        carryParam.setPriority(10+Priority);//优先级
        carryParam.setOriginalRowNo(locMast.getRow1());//源库位排
        carryParam.setOriginalColumnNo(locMast.getBay1());//源库位列
        carryParam.setOriginalFloorNo(locMast.getLev1());//源库位层
        carryParam.setStartPoint(wrkMast.getStaNo()+""+locMast.getLev1());//源站
        carryParam.setTerminalNo(wrkMast.getStaNo()+"");//目标站
        List<CarryParam> carryParamList=new ArrayList<>();
        carryParamList.add(carryParam);
        map.put("TaskList",carryParamList);
        String response ="";
        Boolean bool =false;
        try {
            log.info("wms派发任务给wcs出库={}", map);
            response = new HttpHandler.Builder()
                    // .setHeaders(headParam)
                    .setUri(addrs)
                    .setPath(outboundTaskSend)
                    .setJson(JSON.toJSONString(map))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if(jsonObject.get("Code").equals("1")){
                wrkMast.setWrkSts(12L);
                wrkMastService.updateById(wrkMast);
                bool = true;
            }
        } catch (Exception e) {
            log.error("wcs派发任务给RCS出库失败{},返回值={}", wrkMast, response);
        } finally {
            apiLogService.save("wcs派发任务给RCS出库"
                    , addrs + outboundTaskSend
                    , null
                    , "127.0.0.1"
                    , JSON.toJSONString(map)
                    , response
                    , bool
            );
        }
        return  SUCCESS;
    }
}
src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
@@ -71,27 +71,27 @@
                        }
                    }
                    // 手动入库生成单据 【 上报三方平台 】
                    if (!Cools.isEmpty(wrkDetls)) {
                        if (!orderService.saveHandlerOrder(Boolean.TRUE, wrkMast, wrkDetls)) {
                            exceptionHandle("生成手动入库单据[workNo={0}]失败", wrkMast.getWrkNo());
                        }
                    }
//                    if (!Cools.isEmpty(wrkDetls)) {
//                        if (!orderService.saveHandlerOrder(Boolean.TRUE, wrkMast, wrkDetls)) {
//                            exceptionHandle("生成手动入库单据[workNo={0}]失败", wrkMast.getWrkNo());
//                        }
//                    }
                // 拣料再入库
                } else if (wrkMast.getIoType() == 53) {
                    if (!Cools.isEmpty(wrkDetls)) {
                        if (!orderService.saveHandlerOrder(Boolean.FALSE, wrkMast, wrkDetls)) {
                            exceptionHandle("生成手动出库单据[workNo={0}]失败", wrkMast.getWrkNo());
                        }
                    }
//                    if (!Cools.isEmpty(wrkDetls)) {
//                        if (!orderService.saveHandlerOrder(Boolean.FALSE, wrkMast, wrkDetls)) {
//                            exceptionHandle("生成手动出库单据[workNo={0}]失败", wrkMast.getWrkNo());
//                        }
//                    }
                }
            // 出库 --------------------------------------------------------------------------------
            } else if (wrkMast.getWrkSts() == 15) {
                if (!Cools.isEmpty(wrkDetls)) {
                    if (!orderService.saveHandlerOrder(Boolean.FALSE, wrkMast, wrkDetls)) {
                        exceptionHandle("生成手动出库单据[workNo={0}]失败", wrkMast.getWrkNo());
                    }
                }
//                if (!Cools.isEmpty(wrkDetls)) {
//                    if (!orderService.saveHandlerOrder(Boolean.FALSE, wrkMast, wrkDetls)) {
//                        exceptionHandle("生成手动出库单据[workNo={0}]失败", wrkMast.getWrkNo());
//                    }
//                }
            }
            // 保存工作主档历史档
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -35,6 +35,10 @@
    private WaitPakinService waitPakinService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private WrkMastLogService wrkMastLogService;
    @Autowired
    private WrkDetlLogService wrkDetlLogService;
    public ReturnT<String> start(WrkMast wrkMast) {
        // 4.入库完成
@@ -156,9 +160,16 @@
                    }
                    for (WrkDetl wrkDetl : wrkDetls53) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                        LocDetl locDetl = new LocDetl();
                        locDetl.sync(wrkDetl);
                        locDetl.setAnfme(wrkDetl.getPrice()-wrkDetl.getAnfme());//数量
                        locDetl.setLocNo(wrkMast.getLocNo()); // 库位号
                        locDetl.setZpallet(wrkDetl.getZpallet()); // 托盘条码
                        locDetl.setModiTime(now);
                        locDetl.setAppeTime(now);
                        locDetl.setPrice(0.0);
                        if (null != locDetl) {
                            if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) {
                            if (!locDetlService.insert(locDetl)) {
//                                exceptionHandle("拣料入库 ===>> 修改库存明细数量失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("拣料入库 ===>> 修改库存明细数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
@@ -184,7 +195,7 @@
                    }
                    // 修改库位状态 Q ====>> F
                    if (locMast.getLocSts().equals("Q")) {
                    if (locMast.getLocSts().equals("S")) {
                        locMast.setLocSts("F");
                        locMast.setBarcode(wrkMast.getBarcode());
                        locMast.setIoTime(now);
@@ -382,6 +393,8 @@
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("全板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                        }
                        // 修改工作主档状态
                        wrkMast.setWrkSts(15L);
                    }
                    break;
                // 空板出库
@@ -397,13 +410,40 @@
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("空板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                        }
                        // 修改工作主档状态
                        wrkMast.setWrkSts(15L);
                    }
                    break;
                    //拣料和盘点出库
                case 103:
                case 107:
                    if (locMast.getLocSts().equals("P")) {
                        locMast.setLocSts("O");
                        locMast.setBarcode("");
                        locMast.setModiTime(now);
                        locMast.setIoTime(now);
                        if (!locMastService.updateById(locMast)) {
//                            exceptionHandle("空板出库 ===>> 修改源库位状态失败;[workNo={0}],[sourceLocNo={1}]", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("拣料和盘点出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                        }
                        wrkMast.setWrkSts(16L);//等待入库
                        // 保存工作主档历史档
                        if (!wrkMastLogService.save(wrkMast.getWrkNo())) {
                            exceptionHandle("保存工作历史档[workNo={0}]失败", wrkMast.getWrkNo());
                        }
                        if(!wrkMast.getEmptyMk().equals("Y")) {
                            // 保存工作明细档历史档
                            if (!wrkDetlLogService.save(wrkMast.getWrkNo())) {
                                exceptionHandle("保存工作明细历史档[workNo={0}]失败", wrkMast.getWrkNo());
                            }
                        }
                    }
                    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
@@ -46,43 +46,100 @@
    private  LocDetlService locDetlService;
    @Autowired
    private  BasCrnpService basCrnpService;
    @PostMapping("/pakin/loc/returnWarehouse")
    @ResponseBody
    public synchronized StorageResult returnWarehouse(@RequestBody(required = false) SearchLocParam param) {
        StorageResult storageResult=new StorageResult();
        if (Cools.isEmpty(param.getTaskNo())) {
            storageResult.setReturnStatus(1);
            storageResult.setErrorMessage("传入工作号为空");
            return storageResult;
        }
        WrkMast wrkMast =wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                .eq("wrk_no",param.getTaskNo())
                .in("io_type",103,107));
        if (Cools.isEmpty(wrkMast)){
            storageResult.setReturnStatus(1);
            storageResult.setErrorMessage("没有找到盘点拣料任务---------"+param.getTaskNo());
            return storageResult;
        }
        SearchLocParam searchLocParam = new SearchLocParam();
        searchLocParam.setBoxNo(wrkMast.getBarcode());
        searchLocParam.setWcsIoType(1);//满板
        searchLocParam.setWcsSourceStaNo(wrkMast.getStaNo());
        searchLocParam.setWcsStatus(0);
        return getLocNo(searchLocParam);
    }
    @PostMapping("/pakin/loc/v1")
    @ResponseBody
    public synchronized R getLocNo(@RequestBody(required = false) SearchLocParam param) {
    public synchronized StorageResult getLocNo(@RequestBody(required = false) SearchLocParam param) {
        StorageResult storageResult=new StorageResult();
        log.info("收到WCS入库接口请求====>>入参:{}", param);
        if (Cools.isEmpty(param.getWcsIoType())) {
            return R.error("入出库类型不能为空");
            storageResult.setReturnStatus(1);
            storageResult.setErrorMessage("入出库类型不能为空");
            return storageResult;
        }
        if (Cools.isEmpty(param.getWcsSourceStaNo())) {
            return R.error("源站编号不能为空");
            storageResult.setReturnStatus(1);
            storageResult.setErrorMessage("源站编号不能为空");
            return storageResult;
        }
        int ioType = 0;
        List<WaitPakin> waitPakins = null;
        if (param.getWcsIoType() == 1) {
            if (Cools.isEmpty(param.getBoxNo())) {
                return R.error("条码不能为空");
            //拣料和盘点入库
            WrkMast wrkMast1037 =wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                    .eq("barcode", param.getBoxNo())
                    .in("io_type",103,107));
            WrkMast wrkMast537 =wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                    .eq("barcode", param.getBoxNo())
                    .in("io_type",53,57));
            if (wrkMast537 != null) {
                StorageResult.Results results=new StorageResult.Results();
                results.setTaskNo(wrkMast537.getWrkNo());
                results.setShelfUnitId(wrkMast537.getLocNo()+"");
                storageResult.setResults(results);
                return storageResult;
            }
            waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBoxNo()));
            if (Cools.isEmpty(waitPakins)) {
                WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBoxNo());
                if (wrkMast != null && wrkMast.getIoType() == 103) {
                    return R.parse(CodeRes.PICK_600);
            if(Cools.isEmpty(wrkMast1037)) {
                if (Cools.isEmpty(param.getBoxNo())) {
                    storageResult.setReturnStatus(1);
                    storageResult.setErrorMessage("条码不能为空");
                    return storageResult;
                }
                return R.parse(CodeRes.NO_COMB_700);
                waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBoxNo()));
                if (Cools.isEmpty(waitPakins)) {
                    WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBoxNo());
                    if (wrkMast != null && wrkMast.getIoType() == 103) {
                        storageResult.setReturnStatus(1);
                        storageResult.setErrorMessage(CodeRes.PICK_600);
                        return storageResult;
                    }
                    storageResult.setReturnStatus(1);
                    storageResult.setErrorMessage(CodeRes.NO_COMB_700);
                    return storageResult;
                }
                int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", param.getBoxNo()));
                int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet", param.getBoxNo()));
                if (countLoc > 0 || countWrk > 0) {
                    storageResult.setReturnStatus(1);
                    storageResult.setErrorMessage(CodeRes.EXIST_500);
                    return storageResult;
                }
            }else {
                ioType = wrkMast1037.getIoType();
            }
            int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBoxNo()));
            int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet",param.getBoxNo()));
            if (countLoc > 0 || countWrk > 0) {
                return R.error(CodeRes.EXIST_500);
            }
        }
        switch (param.getWcsIoType()) {
            case 1://满托盘入库
                assert waitPakins != null;
                storageResult = startupFullPutStore(param.getWcsSourceStaNo(), param.getBoxNo(), waitPakins);
                storageResult = startupFullPutStore(param.getWcsSourceStaNo(), param.getBoxNo(), waitPakins,ioType);
                break;
            case 2://空托盘入库
                storageResult = emptyPlateIn(param.getWcsSourceStaNo(), param.getBoxNo());
@@ -91,80 +148,111 @@
                break;
        }
        log.info("WCS入库接口返参:{},托盘码:{}", storageResult, param.getBoxNo());
        return R.ok().add(storageResult);
        return storageResult;
    }
    /**
     * 全板入库
     */
    @Transactional
    public StorageResult startupFullPutStore(Integer devpNo, String barcode, List<WaitPakin> waitPakins) {
    public StorageResult startupFullPutStore(Integer devpNo, String barcode, List<WaitPakin> waitPakins,Integer ioType) {
        StorageResult storageResult=new StorageResult();
        Integer[] arr=arr();
        int type=Cools.isEmpty(waitPakins.get(0).getBeBatch())?1:waitPakins.get(0).getBeBatch();
        // 检索库位
        LocMast locMast1 =commonService.getLocNo2(waitPakins.get(0),arr,0,type,1);
        int workNo = commonService.getWorkNo(0);
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(new Date());
        wrkMast.setWrkSts(2L); // 工作状态:生成入库ID
        wrkMast.setIoType(1); // 入出库状态:1.入库
        wrkMast.setIoPri(13D); // 优先级
        wrkMast.setSourceStaNo(devpNo);
        wrkMast.setLocNo(locMast1.getLocNo());
        wrkMast.setBarcode(barcode); // 托盘码
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("Y");
        wrkMast.setCtnType(1); // 容器类型
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        boolean res = wrkMastService.insert(wrkMast);
        if (!res) {
            throw new CoolException("保存工作档失败");
        }
        // 生成工作档明细
        waitPakins.forEach(waitPakin -> {
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(waitPakin);
            wrkDetl.setWrkNo(wrkMast.getWrkNo());
            wrkDetl.setIoTime(wrkMast.getIoTime());
            wrkDetl.setAppeTime(now);
            wrkDetl.setModiTime(now);
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作明细失败");
        LocMast locMast1=new LocMast();
        Integer workNo = 0;
        //判断是否是拣料或者是盘点
        if(ioType==103||ioType==107) {
            WrkDetl wrkDetl=wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("zpallet", barcode));
            int type=Cools.isEmpty(wrkDetl.getBeBatch())?1:wrkDetl.getBeBatch();
            // 检索库位
            WaitPakin waitPakin1=new WaitPakin();
            waitPakin1.sync(wrkDetl);
            locMast1 =commonService.getLocNo2(waitPakin1,arr,0,type,1);
            WrkMast wrkMast=wrkMastService.selectByBarcode(barcode);
            workNo = wrkMast.getWrkNo();
            int mbz=wrkMast.getStaNo()*10+Integer.valueOf(wrkMast.getSourceLocNo().substring(6));
            String ykw=wrkMast.getLocNo();
            wrkMast.setIoType(ioType-50);
            wrkMast.setWrkSts(1L);//入库
            wrkMast.setModiTime(new Date());
            wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站
            wrkMast.setStaNo(mbz); // 目标站
            wrkMast.setLocNo(locMast1.getLocNo()); // 目标库位 = 出库时的源库位
            wrkMast.setSourceLocNo(ykw); // 源库位
            wrkMastService.updateById(wrkMast);
        }else{
            int type=Cools.isEmpty(waitPakins.get(0).getBeBatch())?1:waitPakins.get(0).getBeBatch();
            // 检索库位
            locMast1 =commonService.getLocNo2(waitPakins.get(0),arr,0,type,1);
            //正常入库
            workNo = commonService.getWorkNo(0);
            Date now = new Date();
            // 生成工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(new Date());
            wrkMast.setWrkSts(2L); // 工作状态:生成入库ID
            wrkMast.setIoType(1); // 入出库状态:1.入库
            wrkMast.setIoPri(13D); // 优先级
            wrkMast.setSourceStaNo(devpNo);
            wrkMast.setLocNo(locMast1.getLocNo());
            wrkMast.setBarcode(barcode); // 托盘码
            wrkMast.setFullPlt("Y"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("N"); // 空板
            wrkMast.setLinkMis("Y");
            wrkMast.setCtnType(1); // 容器类型
            // 操作人员数据
            wrkMast.setAppeTime(now);
            wrkMast.setModiTime(now);
            boolean res = wrkMastService.insert(wrkMast);
            if (!res) {
                throw new CoolException("保存工作档失败");
            }
        });
        // 更新入库通知档 ioStatus ===>> Y
        Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>()
                .eq("zpallet", barcode);
        WaitPakin setParam = new WaitPakin();
        setParam.setLocNo(locMast1.getLocNo());
        setParam.setIoStatus("Y");
        setParam.setModiTime(now);
        if (!waitPakinService.update(setParam, wrapper)) {
            throw new CoolException("更新通知档失败");
            // 生成工作档明细
            waitPakins.forEach(waitPakin -> {
                WrkDetl wrkDetl = new WrkDetl();
                wrkDetl.sync(waitPakin);
                wrkDetl.setWrkNo(wrkMast.getWrkNo());
                wrkDetl.setIoTime(wrkMast.getIoTime());
                wrkDetl.setAppeTime(now);
                wrkDetl.setModiTime(now);
                if (!wrkDetlService.insert(wrkDetl)) {
                    throw new CoolException("保存工作明细失败");
                }
            });
            // 更新入库通知档 ioStatus ===>> Y
            Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>()
                    .eq("zpallet", barcode);
            WaitPakin setParam = new WaitPakin();
            setParam.setLocNo(locMast1.getLocNo());
            setParam.setIoStatus("Y");
            setParam.setModiTime(now);
            if (!waitPakinService.update(setParam, wrapper)) {
                throw new CoolException("更新通知档失败");
            }
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(locMast1.getLocNo());
        if (locMast.getLocSts().equals("O")){
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(now);
            locMast.setModiTime(new Date());
            if (!locMastService.updateById(locMast)){
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(locMast1.getLocNo()+"目标库位已被占用");
        }
        StorageResult.Results results=new StorageResult.Results();
        results.setTaskNo(workNo);
        results.setShelfUnitId(locMast1.getLocNo());
        results.setBarcode(barcode);
        storageResult.setResults(results);
        return storageResult;
    }
@@ -252,6 +340,7 @@
        }else{
            basCrnp.setTankQty(0);
            basCrnpService.update(basCrnp,new EntityWrapper<BasCrnp>().eq("crn_no",basCrnp.getCrnNo()));
            int xx=0;
            arr[i]=basCrnp.getLev1();
            i++;
            int o=basCrnp.getCrnNo();
@@ -260,18 +349,27 @@
                    o=1;
                }
                basCrnp=basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no",o));
                if(q==1){
                if(Cools.isEmpty(basCrnp)){
                    log.error(q+"号小车没有找到");
                    continue;
                }
                if(basCrnp.getCrnErr()>0||basCrnp.getCrnSts()!=1){
                    log.error(q+"号小车报警或者在充电跳过此车");
                    continue;
                }
                if(xx==0){
                    basCrnp.setTankQty(1);
                    basCrnpService.update(basCrnp,new EntityWrapper<BasCrnp>().eq("crn_no",o));
                }
                arr[i]=basCrnp.getLev1();
                i++;
                xx++;
            }
        }
        for (int w=1;w<=7;w++){
            boolean boo=true;
            for(int g=0;g<count;g++){
            for(int g=0;g<i;g++){
                if(arr[g]==w){
                    boo=false;
                    break;
@@ -281,6 +379,7 @@
                arr[i]=w;
                i++;
            }
            if(i==7) break;
        }
        return arr;
    }
src/main/java/com/zy/common/web/param/SearchLocParam.java
@@ -9,6 +9,9 @@
@Data
public class SearchLocParam {
    @JSONField(name = "taskNo")
    private Integer taskNo;
    //托盘码
    @JSONField(name = "BoxNo")
    private String boxNo;
@@ -23,7 +26,7 @@
    @JSONField(name = "WCSSourceStaNo")
    private Integer wcsSourceStaNo;
    //空板满板
    //空板满板 1.满板 2.空板
    @JSONField(name = "WCSIoType")
    private Integer wcsIoType;
src/main/resources/application.yml
@@ -10,7 +10,7 @@
    enabled: false
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=lfdasrs-sxc
    url: jdbc:sqlserver://192.168.0.17:1433;databasename=lfdasrs-sxc
    username: sa
    password: sa@123
  mvc:
@@ -50,6 +50,16 @@
  # 一个堆垛机负责的货架排数
  groupCount: 4
#wcs对接
wcs:
  #地址
  address:
    URL: http://127.0.0.1:9092/wcs
    #出库移库任务下发
    outboundTaskSend: open/outboundTaskSend
    deviceStatus : open/deviceStatus
#erp对接
erp:
  #地址
src/main/resources/mapper/LocDetlMapper.xml
@@ -120,6 +120,7 @@
        and b.loc_sts = 'F'
        <include refid="stockOutCondition"></include>
        ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})
    </select>
    <select id="getStockOutPageCount" parameterType="java.util.Map" resultType="java.lang.Integer">
@@ -205,6 +206,7 @@
        where 1=1
        and b.loc_sts = 'F'
        and a.matnr = #{matnr}
        and b.loc_attribute = 1
        <!--        <choose>-->
        <!--            <when test="batch != null and batch != ''">-->
        <!--                and a.batch = #{batch}-->
src/main/resources/mapper/WrkMastMapper.xml
@@ -63,12 +63,13 @@
    </resultMap>
    <select id="selectToBeCompleteData" resultMap="BaseResultMap">
        select * from asr_wrk_mast where ((wrk_sts = 4 Or wrk_sts = 14 ) and io_type != 103 and io_type != 104 and io_type != 107 ) or (wrk_sts = 2 and io_type=6) order by upd_mk,error_time,io_time,wrk_no
        select * from asr_wrk_mast where ((wrk_sts = 4 Or wrk_sts = 14 )  and io_type != 104  ) or (wrk_sts = 2 and io_type=6) order by upd_mk,error_time,io_time,wrk_no
    </select>
    <select id="selectToBeHistoryData" resultMap="BaseResultMap">
        select * from asr_wrk_mast
        where wrk_sts=5
        or wrk_sts=20
        or (wrk_sts=15 and ove_mk='Y' and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and dateadd(mi,15,crn_end_time) &lt;= getdate() and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and crn_end_time is null and wrk_no not in (select wrk_no from asr_bas_devp))
src/main/webapp/static/image/logo.png

src/main/webapp/static/js/common.js
@@ -1,4 +1,4 @@
var baseUrl = "/htwms";
var baseUrl = "/lfdsxkwms";
// 详情窗口-高度
var detailHeight = '80%';