zjj
2024-04-20 52b397b5901c0ec428d0dc6589cbf4c9c2729c24
#演示
19个文件已修改
24个文件已添加
3825 ■■■■■ 已修改文件
pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/FillingMastController.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RgvController.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/VacuumMastController.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/WrkMastStaController.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/FillingMast.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/VacuumMast.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastSta.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/FillingMastMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/VacuumMastMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/FillingMastService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/VacuumMastService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkMastStaService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/FillingMastServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 1379 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/VacuumMastServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastStaServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/CodeBuilder.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/enums/RgvStatusType.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/DevpSlave.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/command/RgvCommand.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/RgvProtocol.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/FillingMastMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/VacuumMastMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastStaMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wcs/js/common.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wms/js/common.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wms/js/fillingMast/fillingMast.js 247 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wms/js/vacuumMast/vacuumMast.js 247 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wms/js/wrkMastSta/wrkMastSta.js 272 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/deviceOperate/rgvOperate.html 175 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/fillingMast/fillingMast.html 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/index.html 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/login.html 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/vacuumMast/vacuumMast.html 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/wrkMastSta/wrkMastSta.html 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -200,7 +200,7 @@
    </dependencies>
    <build>
        <finalName>wcs</finalName>
        <finalName>ssdwcs</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
src/main/java/com/zy/asrs/controller/FillingMastController.java
New file
@@ -0,0 +1,123 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.asrs.entity.FillingMast;
import com.zy.asrs.service.FillingMastService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
public class FillingMastController extends BaseController {
    @Autowired
    private FillingMastService fillingMastService;
    @RequestMapping(value = "/fillingMast/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(fillingMastService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/fillingMast/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<FillingMast> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(fillingMastService.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/fillingMast/add/auth")
    @ManagerAuth
    public R add(FillingMast fillingMast) {
        fillingMastService.insert(fillingMast);
        return R.ok();
    }
    @RequestMapping(value = "/fillingMast/update/auth")
    @ManagerAuth
    public R update(FillingMast fillingMast){
        if (Cools.isEmpty(fillingMast) || null==fillingMast.getId()){
            return R.error();
        }
        fillingMastService.updateById(fillingMast);
        return R.ok();
    }
    @RequestMapping(value = "/fillingMast/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Long[] ids){
         for (Long id : ids){
            fillingMastService.deleteById(id);
        }
        return R.ok();
    }
    @RequestMapping(value = "/fillingMast/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
        EntityWrapper<FillingMast> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("fillingMast"));
        convert(map, wrapper);
        List<FillingMast> list = fillingMastService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/fillingMastQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<FillingMast> wrapper = new EntityWrapper<>();
        wrapper.like("id", condition);
        Page<FillingMast> page = fillingMastService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (FillingMast fillingMast : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", fillingMast.getId());
            map.put("value", fillingMast.getId());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/fillingMast/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<FillingMast> wrapper = new EntityWrapper<FillingMast>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != fillingMastService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(FillingMast.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/controller/RgvController.java
@@ -2,9 +2,11 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.annotations.ManagerAuth;
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.domain.enums.RgvStatusType;
import com.zy.asrs.domain.param.CrnDemoParam;
import com.zy.asrs.domain.param.CrnOperatorParam;
import com.zy.asrs.domain.param.RgvOperatorParam;
import com.zy.asrs.domain.vo.RgvMsgTableVo;
@@ -33,15 +35,19 @@
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.properties.SystemProperties;
import com.zy.core.thread.SiemensRgvThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * RGV接口
@@ -64,7 +70,124 @@
    private MainServiceImpl mainService;
    @Autowired
    private LocMastService locMastService;
    int wrkNo = 9990;
    @ManagerAuth(memo = "演示命令下发")
    @GetMapping("/rgvDemoTask")
    public R rgvDemoTask(Integer rgvNo, Integer sta,Integer end){
        wrkNo++;
        RgvCommand command = new RgvCommand();
        command.setRgvNo(rgvNo); // RGV编号
        command.setAckFinish1(false);  // 任务完成确认位
        command.setTaskNo1(wrkNo); // 工作号
        command.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setSourceStaNo1(sta.shortValue()); // 源站
        command.setDestinationStaNo1(end.shortValue());  // 目标站
//        command.setAckFinish2((short) 0);  // 任务完成确认位
//        command.setTaskNo2((short) 0); // 工作号
//        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
//        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
//        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand((short) 0);
        return rgvControl(command)? R.ok(): R.error();
    }
    @ManagerAuth(memo = "解锁小车")
    @PostMapping("/lock")
    public R lock(RgvOperatorParam param ){
        SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, param.getRgvNo());
        rgvThread.setPakMk(true);
        return R.ok();
    }
    @GetMapping("/demo/status")
    public R demoStatus(Integer rgvNo){
        if (Cools.isEmpty(rgvNo)){
            return R.ok("X");
        }
        String demo = "X";
//        List<Map<String, Object>> res = new ArrayList<>();
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
            if (rgvSlave.getId() == rgvNo){
               demo = rgvSlave.getDemo()?"Y":"N";
            }
        }
        return R.ok(demo);
    }
    @GetMapping("/demo/status/true")
    public R demoStatusTrue(Integer rgvNo){
        if (Cools.isEmpty(rgvNo)){
            return R.error("请选择rgv");
        }
//        List<Map<String, Object>> res = new ArrayList<>();
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
            if (rgvSlave.getId() == rgvNo){
                rgvSlave.setDemo(true);
            }
        }
        return R.ok();
    }
    @GetMapping("/demo/status/false")
    public R demoStatusFalse(Integer rgvNo){
        if (Cools.isEmpty(rgvNo)){
            return R.error("请选择rgv");
        }
//        List<Map<String, Object>> res = new ArrayList<>();
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
            if (rgvSlave.getId() == rgvNo){
                rgvSlave.setDemo(false);
            }
        }
        return R.ok();
    }
    @PostMapping("/demo/switch")
    @ManagerAuth(memo = "RGV演示")
    public R crnDemo(CrnDemoParam param) throws InterruptedException {
        if (Cools.isEmpty(param.getCrnId())){
            return R.error();
        }
        if (Cools.isEmpty(param.getPassword())){
            return R.error("请输入口令");
        }
        if (!param.getPassword().equals(SystemProperties.WCS_PASSWORD)){
            return R.error("口令错误");
        }
        Thread.sleep(200L);
        for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
            if (rgvSlave.getId().equals(param.getCrnId())) {
                rgvSlave.setDemo(param.getOpt());
            }
        }
//        mainService.crnDemoOfLocMove(param.getCrnId());
        return R.ok();
    }
    @ManagerAuth(memo = "取放货")
    @PostMapping("/operator/put")
    public R rgvFetchPut(RgvOperatorParam param){
        wrkNo++;
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1(false);  // 任务完成确认位
        command.setTaskNo1(wrkNo); // 工作号
        command.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
        command.setSourceStaNo1(param.getSourceRow().shortValue()); // 源站
        command.setDestinationStaNo1(param.getSourceBay().shortValue());  // 目标站
//        command.setAckFinish2((short) 0);  // 任务完成确认位
//        command.setTaskNo2((short) 0); // 工作号
//        command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货
//        command.setSourceStaNo2(param.getSourceStaNo2()); // 源站
//        command.setDestinationStaNo2(param.getStaNo2());  // 目标站
        command.setCommand((short) 0);
        return rgvControl(command)? R.ok(): R.error();
    }
    @ManagerAuth(memo = "复位")
    @PostMapping("/operator/reset")
@@ -166,14 +289,14 @@
                continue;
            }
            vo.setStatusType(rgvProtocol.modeType.desc);   //  模式状态
            vo.setStatus(rgvProtocol.getStatusType().desc);     //  状态
            vo.setStatus(rgvProtocol.getStatusType1().desc);     //  状态
            vo.setWorkNo1(rgvProtocol.getTaskNo1());  //  工位1任务号
            vo.setRgvPos(rgvProtocol.getRgvPos());
            vo.setPakMk(rgvThread.isPakMk()?"无锁":"锁定");
            vo.setWalkPos(rgvProtocol.getAlarm() == 0?"正常":"报警");
            vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm()));
            vo.setStaNo(rgvProtocol.getSouSta().intValue());
            vo.setSourceStaNo(rgvProtocol.getEndSta().intValue());
//            vo.setStaNo(rgvProtocol.getSouSta().intValue());
//            vo.setSourceStaNo(rgvProtocol.getEndSta().intValue());
            if (rgvProtocol.getAlarm() > 0) {
                BasRgvErr rgvErr = basRgvErrMapper.selectById(rgvProtocol.getAlarm());
                vo.setAlarm(rgvErr==null?"未知异常":rgvErr.getErrName());
@@ -247,8 +370,8 @@
    public R rgvTaskComplete(RgvOperatorParam param){
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 1);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setAckFinish1(false);  // 任务完成确认位
        command.setTaskNo1( 0); // 工作号
        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo1((short) 0); // 源站
        command.setDestinationStaNo1((short) 0);  // 目标站
@@ -270,8 +393,8 @@
        }
        RgvCommand command = new RgvCommand();
        command.setRgvNo(param.getRgvNo()); // RGV编号
        command.setAckFinish1((short) 0);  // 任务完成确认位
        command.setTaskNo1((short) 0); // 工作号
        command.setAckFinish1(false);  // 任务完成确认位
        command.setTaskNo1(0); // 工作号
        command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式
        command.setSourceStaNo1((short) 0); // 源站
        command.setDestinationStaNo1((short) 0);  // 目标站
@@ -306,7 +429,7 @@
                RgvCommand Command = new RgvCommand();
                Command.setRgvNo(rgv.getId()); // RGV编号
                Command.setTaskMode1(RgvTaskModeType.NONE);
                Command.setAckFinish1((short) 0);  // 任务完成确认位
                Command.setAckFinish1(false);  // 任务完成确认位
                Command.setAckFinish2((short) 0);  // 任务完成确认位
                Command.setCommand((short) 0);  // 任务完成确认位
                // 延时发送
src/main/java/com/zy/asrs/controller/VacuumMastController.java
New file
@@ -0,0 +1,123 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.asrs.entity.VacuumMast;
import com.zy.asrs.service.VacuumMastService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
public class VacuumMastController extends BaseController {
    @Autowired
    private VacuumMastService vacuumMastService;
    @RequestMapping(value = "/vacuumMast/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(vacuumMastService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/vacuumMast/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<VacuumMast> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(vacuumMastService.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/vacuumMast/add/auth")
    @ManagerAuth
    public R add(VacuumMast vacuumMast) {
        vacuumMastService.insert(vacuumMast);
        return R.ok();
    }
    @RequestMapping(value = "/vacuumMast/update/auth")
    @ManagerAuth
    public R update(VacuumMast vacuumMast){
        if (Cools.isEmpty(vacuumMast) || null==vacuumMast.getId()){
            return R.error();
        }
        vacuumMastService.updateById(vacuumMast);
        return R.ok();
    }
    @RequestMapping(value = "/vacuumMast/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Long[] ids){
         for (Long id : ids){
            vacuumMastService.deleteById(id);
        }
        return R.ok();
    }
    @RequestMapping(value = "/vacuumMast/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
        EntityWrapper<VacuumMast> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("vacuumMast"));
        convert(map, wrapper);
        List<VacuumMast> list = vacuumMastService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/vacuumMastQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<VacuumMast> wrapper = new EntityWrapper<>();
        wrapper.like("id", condition);
        Page<VacuumMast> page = vacuumMastService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (VacuumMast vacuumMast : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", vacuumMast.getId());
            map.put("value", vacuumMast.getId());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/vacuumMast/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<VacuumMast> wrapper = new EntityWrapper<VacuumMast>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != vacuumMastService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(VacuumMast.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/controller/WrkMastStaController.java
New file
@@ -0,0 +1,123 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.asrs.entity.WrkMastSta;
import com.zy.asrs.service.WrkMastStaService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
public class WrkMastStaController extends BaseController {
    @Autowired
    private WrkMastStaService wrkMastStaService;
    @RequestMapping(value = "/wrkMastSta/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(wrkMastStaService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/wrkMastSta/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<WrkMastSta> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        return R.ok(wrkMastStaService.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/wrkMastSta/add/auth")
    @ManagerAuth
    public R add(WrkMastSta wrkMastSta) {
        wrkMastStaService.insert(wrkMastSta);
        return R.ok();
    }
    @RequestMapping(value = "/wrkMastSta/update/auth")
    @ManagerAuth
    public R update(WrkMastSta wrkMastSta){
        if (Cools.isEmpty(wrkMastSta) || null==wrkMastSta.getId()){
            return R.error();
        }
        wrkMastStaService.updateById(wrkMastSta);
        return R.ok();
    }
    @RequestMapping(value = "/wrkMastSta/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Long[] ids){
         for (Long id : ids){
            wrkMastStaService.deleteById(id);
        }
        return R.ok();
    }
    @RequestMapping(value = "/wrkMastSta/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
        EntityWrapper<WrkMastSta> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("wrkMastSta"));
        convert(map, wrapper);
        List<WrkMastSta> list = wrkMastStaService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/wrkMastStaQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<WrkMastSta> wrapper = new EntityWrapper<>();
        wrapper.like("id", condition);
        Page<WrkMastSta> page = wrkMastStaService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (WrkMastSta wrkMastSta : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", wrkMastSta.getId());
            map.put("value", wrkMastSta.getId());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/wrkMastSta/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<WrkMastSta> wrapper = new EntityWrapper<WrkMastSta>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != wrkMastStaService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(WrkMastSta.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java
@@ -15,4 +15,6 @@
    private boolean restoreTask;
    private boolean compTask;
    private boolean reset;
    private Integer sourceRow;
    private Integer sourceBay;
}
src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java
@@ -13,7 +13,7 @@
    private Integer rgvNo;
    // 工作号
    private Short workNo = 0;
    private Integer workNo = 0;
    // 状态
    private String status = "-";
src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
@@ -18,7 +18,7 @@
    private String status = "-";
    // 任务号
    private Short workNo1 = 0;
    private Integer workNo1 = 0;
    // 状态
    private String status1 = "-";
src/main/java/com/zy/asrs/entity/FillingMast.java
New file
@@ -0,0 +1,42 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("man_filling_mast")
public class FillingMast implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value= "")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value= "")
    @TableField("sta_no")
    private Integer staNo;
    @ApiModelProperty(value= "")
    private String status;
    public FillingMast() {}
    public FillingMast(Integer staNo,String status) {
        this.staNo = staNo;
        this.status = status;
    }
//    FillingMast fillingMast = new FillingMast(
//            null,    //
//            null    //
//    );
}
src/main/java/com/zy/asrs/entity/VacuumMast.java
New file
@@ -0,0 +1,42 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("man_vacuum_mast")
public class VacuumMast implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value= "")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value= "")
    @TableField("sta_no")
    private Integer staNo;
    @ApiModelProperty(value= "")
    private String status;
    public VacuumMast() {}
    public VacuumMast(Integer staNo,String status) {
        this.staNo = staNo;
        this.status = status;
    }
//    VacuumMast vacuumMast = new VacuumMast(
//            null,    //
//            null    //
//    );
}
src/main/java/com/zy/asrs/entity/WrkMastSta.java
New file
@@ -0,0 +1,178 @@
package com.zy.asrs.entity;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.annotations.TableField;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Date;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
@Data
@TableName("asr_wrk_mast_sta")
public class WrkMastSta implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 工作号
     */
    @ApiModelProperty(value= "工作号")
    @TableField("wrk_no")
    private Long wrkNo;
    /**
     * 工作档开始位置
     */
    @ApiModelProperty(value= "工作档开始位置")
    @TableField("wrk_start")
    private Integer wrkStart;
    /**
     * 工作档结束位置
     */
    @ApiModelProperty(value= "工作档结束位置")
    @TableField("wrk_end")
    private Integer wrkEnd;
    /**
     * 小车接货位置
     */
    @ApiModelProperty(value= "小车接货位置")
    @TableField("sta_start")
    private Integer staStart;
    /**
     * 小车放货位置
     */
    @ApiModelProperty(value= "小车放货位置")
    @TableField("sta_end")
    private Integer staEnd;
    /**
     * 添加时间
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("create_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * 类型 0:满版  1:空板
     */
    @ApiModelProperty(value= "类型 0:满版  1:空板")
    private Integer type;
    /**
     * 工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成
     */
    @ApiModelProperty(value= "工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成")
    @TableField("wrk_sts")
    private Integer wrkSts;
    /**
     * 行号
     */
    @ApiModelProperty(value= "行号")
    @TableField("line_number")
    private Integer lineNumber;
    /**
     * 工作类型  类型  1:取(叠盘)  2:放 3:取放 4:拆盘
     */
    @ApiModelProperty(value= "工作类型  类型  1:取(叠盘)  2:放 3:取放 4:拆盘")
    @TableField("wrk_type")
    private Integer wrkType;
    /**
     * 标记时间
     */
    @ApiModelProperty(value= "标记时间")
    @TableField("bign_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date bignTime;
    @ApiModelProperty(value= "")
    @TableField("wrk_crn")
    private Integer wrkCrn;
    public WrkMastSta() {}
    public WrkMastSta(Long wrkNo,Integer wrkStart,Integer wrkEnd,Integer staStart,Integer staEnd,Date createTime,Date updateTime,Integer type,Integer wrkSts,Integer lineNumber,Integer wrkType,Date bignTime,Integer wrkCrn) {
        this.wrkNo = wrkNo;
        this.wrkStart = wrkStart;
        this.wrkEnd = wrkEnd;
        this.staStart = staStart;
        this.staEnd = staEnd;
        this.createTime = createTime;
        this.updateTime = updateTime;
        this.type = type;
        this.wrkSts = wrkSts;
        this.lineNumber = lineNumber;
        this.wrkType = wrkType;
        this.bignTime = bignTime;
        this.wrkCrn = wrkCrn;
    }
//    WrkMastSta wrkMastSta = new WrkMastSta(
//            null,    // 工作号[非空]
//            null,    // 工作档开始位置[非空]
//            null,    // 工作档结束位置[非空]
//            null,    // 小车接货位置[非空]
//            null,    // 小车放货位置[非空]
//            null,    // 添加时间
//            null,    // 修改时间
//            null,    // 类型 0:满版  1:空板[非空]
//            null,    // 工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成[非空]
//            null,    // 行号[非空]
//            null,    // 工作类型  类型  1:取(叠盘)  2:放 3:取放 4:拆盘[非空]
//            null,    // 标记时间
//            null    //
//    );
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
    public String getBignTime$(){
        if (Cools.isEmpty(this.bignTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.bignTime);
    }
}
src/main/java/com/zy/asrs/mapper/FillingMastMapper.java
New file
@@ -0,0 +1,16 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.FillingMast;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.VacuumMast;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface FillingMastMapper extends BaseMapper<FillingMast> {
    FillingMast selectByStatusIsn();
}
src/main/java/com/zy/asrs/mapper/VacuumMastMapper.java
New file
@@ -0,0 +1,13 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.VacuumMast;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface VacuumMastMapper extends BaseMapper<VacuumMast> {
    VacuumMast selectByStatusIsN();
}
src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java
New file
@@ -0,0 +1,15 @@
package com.zy.asrs.mapper;
import com.zy.asrs.entity.WrkMastSta;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface WrkMastStaMapper extends BaseMapper<WrkMastSta> {
    WrkMastSta selectWrkSts0();
    WrkMastSta selectWrkSts1();
}
src/main/java/com/zy/asrs/service/FillingMastService.java
New file
@@ -0,0 +1,9 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.FillingMast;
import com.baomidou.mybatisplus.service.IService;
public interface FillingMastService extends IService<FillingMast> {
    FillingMast selectByStatusIsn();
}
src/main/java/com/zy/asrs/service/VacuumMastService.java
New file
@@ -0,0 +1,9 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.VacuumMast;
import com.baomidou.mybatisplus.service.IService;
public interface VacuumMastService extends IService<VacuumMast> {
    VacuumMast selectByStatusIsN();
}
src/main/java/com/zy/asrs/service/WrkMastStaService.java
New file
@@ -0,0 +1,8 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.WrkMastSta;
import com.baomidou.mybatisplus.service.IService;
public interface WrkMastStaService extends IService<WrkMastSta> {
}
src/main/java/com/zy/asrs/service/impl/FillingMastServiceImpl.java
New file
@@ -0,0 +1,18 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.entity.VacuumMast;
import com.zy.asrs.mapper.FillingMastMapper;
import com.zy.asrs.entity.FillingMast;
import com.zy.asrs.service.FillingMastService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("fillingMastService")
public class FillingMastServiceImpl extends ServiceImpl<FillingMastMapper, FillingMast> implements FillingMastService {
    @Override
    public FillingMast selectByStatusIsn() {
        return this.baseMapper.selectByStatusIsn();
    }
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -3,50 +3,49 @@
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;
import com.core.common.R;
import com.core.common.SpringUtils;
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zy.asrs.domain.enums.TaskStatusType;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.TaskOverToWms;
import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam;
import com.zy.asrs.entity.param.taskCreateParam;
import com.zy.asrs.mapper.*;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.CommandUtils;
import com.zy.asrs.utils.PostMesDataUtils;
import com.zy.asrs.utils.Utils;
import com.zy.asrs.utils.VersionUtils;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.MatDto;
import com.zy.common.model.SearchLocParam;
import com.zy.common.model.StartupDto;
import com.zy.common.service.CommonService;
import com.zy.common.utils.CollectionUtils;
import com.zy.common.utils.HttpHandler;
import com.zy.core.CrnThread;
import com.zy.core.DevpThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.*;
import com.zy.core.model.CrnSlave;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
import com.zy.core.model.command.CommandPackage;
import com.zy.core.model.*;
import com.zy.core.model.command.CrnCommand;
import com.zy.core.model.command.LedCommand;
import com.zy.core.model.command.RgvCommand;
import com.zy.core.model.protocol.CrnProtocol;
import com.zy.core.model.protocol.RgvProtocol;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.BarcodeThread;
import com.zy.core.thread.LedThread;
import com.zy.core.thread.SiemensDevpThread;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import com.zy.core.thread.SiemensRgvThread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
 * 立体仓库WCS系统主流程业务
@@ -60,309 +59,63 @@
    public static final long COMMAND_TIMEOUT = 5 * 1000;
    @Autowired
    private CommonService commonService;
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkMastMapper wrkMastMapper;
    private WrkMastStaMapper wrkMastStaMapper;
    @Autowired
    private LocMastService locMastService;
    private FillingMastService fillingMastService;
    @Autowired
    private BasCrnpService basCrnpService;
    @Autowired
    private BasDevpService basDevpService;
    @Autowired
    private BasErrLogService basErrLogService;
    @Autowired
    private BasCrnErrorMapper basCrnErrorMapper;
    @Autowired
    private TaskWrkMapper taskWrkMapper;
    @Autowired
    private TaskWrkService taskWrkService;
    @Autowired
    private ConfigService configService;
    @Autowired
    private StaDescMapper staDescMapper;
    @Autowired
    private CommandInfoService commandInfoService;
    @Autowired
    private OpenServiceImpl openServiceImpl;
    @Autowired
    private StaDescService staDescService;
    @Autowired
    private ApiLogService apiLogService;
    private VacuumMastService vacuumMastService;
    @Value("${wms.url}")
    private String wmsUrl;
    @Value("${wms.movePath}")
    private String movePath;
    public Integer wrkNo1 = 10000;
    public Integer wrkNo2 = 20000;
    public void generateStoreWrkFile() throws IOException, InterruptedException {
        // 根据输送线plc遍历
    /**
     * 堆垛机演示  ===>> 库位移转
     */
    public void getRgvTask() {
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历入库口
            for (DevpSlave.Sta inSta : devp.getInSta()) {
                // 获取入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                Short workNo = staProtocol.getWorkNo();
                Short stano = staProtocol.getStaNo();
                    // 尺寸检测异常
                    boolean back = false;
                    String errMsg = "";
                    if (staProtocol.isFrontErr()) {
                        errMsg = "前超限";
                        back = true;
                    }
                    if (!back && staProtocol.isBackErr()) {
                        errMsg = "后超限";
                        back = true;
                    }
                    if (!back && staProtocol.isHighErr()) {
                        errMsg = "高超限";
                        back = true;
                    }
                    if (!back && staProtocol.isLeftErr()) {
                        errMsg = "左超限";
                        back = true;
                    }
                    if (!back && staProtocol.isRightErr()) {
                        errMsg = "右超限";
                        back = true;
                    }
                    if (!back && staProtocol.isWeightErr()) {
                        errMsg = "超重";
                        back = true;
                    }
                    if (!back && staProtocol.isBarcodeErr()) {
                        errMsg = "扫码失败";
                        back = true;
                    }
                    // 退回
                    if (back) {
                        if (stano == inSta.getBackSta().shortValue()){
                            continue;
                        }
                        if (workNo == 0 && stano == 0){
                            continue;
                        }
                        if (!staProtocol.isPakMk()){
                            continue;
                        }
//                        News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg);
                        staProtocol.setWorkNo(workNo);
                        staProtocol.setStaNo(inSta.getBackSta().shortValue());
                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol));
                        TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo));
                        if (taskWrk != null) {
                            taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示
                            taskWrkMapper.updateById(taskWrk);
                        }
                for (RgvSlave rgv : slaveProperties.getRgv()) {
                    if (!rgv.getDemo()){
                        continue;
                    }
                // 判断是否满足入库条件
                if (staProtocol.isAutoing() && staProtocol.isLoading()
                        && staProtocol.isInEnable()
                        && !staProtocol.isEmptyMk() && (workNo >= 0)
                        && staProtocol.isPakMk()) {
                    // 获取条码扫描仪信息
                    BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                    if (barcodeThread == null) {
                        continue;
                    }
                    String barcode = barcodeThread.getBarcode();
                    staProtocol.setBarcode(barcode);
                    if(!Cools.isEmpty(barcode)) {
                        StaDescService staDescService = SpringUtils.getBean(StaDescService.class);
                        ToWmsDTO toWmsDTO = new ToWmsDTO();
                        Map<String, Object> map = new HashMap<>();
                        map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2");
                        TaskWrk taskWrk = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", barcode));
                        if (Cools.isEmpty(taskWrk)){
                            continue;
                        }
                        //StaDesc staDesc1 = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("stn_no",inSta.getBackSta()));
                        boolean sign = true;
                        if (inSta.getBarcode() == 7 || inSta.getBarcode() == 8){
                        }else {
                            if (taskWrk.getCrnNo() != inSta.getBarcode()){
                                sign = false;
                            }
                        }
                        if (taskWrk.getTargetPoint() != null && taskWrk.getStartPoint() != null && sign){
                            if ( taskWrk.getWrkNo() != null && taskWrk.getWrkNo().shortValue() == workNo ){
                                continue;
                            }
                            if (taskWrk.getStatus() != 2){
                                continue;
                            }
                            //获取堆垛机站点
                            StaDesc staDesc = new StaDesc();
                            if (devp.getId() <= 1){
                                staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                        .eq("crn_no", taskWrk.getCrnNo()).eq("type_no",1).lt("stn_no", 200));
                            }else {
                                staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                        .eq("crn_no", taskWrk.getCrnNo()).eq("type_no",1).lt("stn_no", 400).ge("stn_no", 250));
                            }
                            staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
                            staProtocol.setStaNo(staDesc.getCrnStn().shortValue());
                            MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol));
                            Thread.sleep(500);
                        }else {
                            //TaskWrk taskWrk = taskWrkService.selectByTaskNo(param.getTaskNo());
                            toWmsDTO.setWarehouseId("1688469798893297665");
                            toWmsDTO.setContainerCode(barcode);
                            toWmsDTO.setApplyType("TUNNEL_LOCATION");
                            List<Integer> list = new ArrayList<>();
                            if (inSta.getBarcode() == 7 || inSta.getBarcode() == 8){
                                toWmsDTO.setTaskTunnel(taskWrk.getCrnNo());
                                list.add(taskWrk.getCrnNo());
                            }else {
                                toWmsDTO.setTaskTunnel(inSta.getBarcode());
                                list.add(inSta.getBarcode());
                            }
                            toWmsDTO.setCanInboundTunnels(list);
                            String response = null;
                            try {
                                response = new HttpHandler.Builder()
                                        .setHeaders(map)
                                        .setUri(wmsUrl)
                                        .setPath("wcsManager/wcsInterface/inboundTaskApply")
                                        .setJson(JSON.toJSONString(toWmsDTO))
                                        .build()
                                        .doPost();
                            }catch (Exception e){
                                log.error("wms通讯失败,"+e.getMessage());
                                continue;
                            }
                            apiLogService.save("wms请求入库货位接口"
                                    ,wmsUrl+"wcsManager/wcsInterface/inboundTaskApply"
                                    ,null
                                    ,"127.0.0.1"
                                    ,JSON.toJSONString(toWmsDTO)
                                    ,response
                                    ,true
                            );
                            JSONObject jsonObject = JSON.parseObject(response);
                            if (jsonObject.getInteger("code").equals(200)) {
                                GetWmsDto getWmsDto = JSON.parseObject(jsonObject.get("data").toString(), GetWmsDto.class);
                                taskWrk.setOriginTargetPoint(getWmsDto.getTargetLocationCode());
                                taskWrk.setTargetPoint(Utils.getWcsLocNo(getWmsDto.getTargetLocationCode()));
                                taskWrk.setStartPoint(String.valueOf(inSta.getBackSta()));
                                if (inSta.getBarcode() == 7 || inSta.getBarcode() == 8){
                                }else {
                                    taskWrk.setCrnNo(inSta.getBarcode());
                                }
                                if (!taskWrkService.updateById(taskWrk)){
                                    log.error("保存wms库位号失败");
                                }
                            }else {
                                log.error("wms通讯失败,"+jsonObject.get("msg"));
                            }
                        }
                    }
                }
            }
        }
    }
    /**
     * 堆垛机站出库到出库站
     */
    @Async
    public void crnStnToOutStn() {
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
            // 遍历堆垛机出库站
            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
                List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnSlave.getId()).eq("crn_stn", crnStn.getStaNo()));
                for (StaDesc staDesc : staDescs){
                    // 获取堆垛机出库站信息
                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                    StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) {
                        // 查询工作档
                        TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnSlave.getId(), staDesc.getStnNo().toString());
                        if (taskWrk == null) {
                            continue;
                        }
                        // 判断工作档条件
                        if (taskWrk.getWrkSts() == 12 && taskWrk.getIoType() == 2) {
                            // 判断吊车是否实际已完成,且电脑状态在move中,以备电脑进行更新工作档
                            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, taskWrk.getCrnNo());
                            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                            if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) {
                                // 移动中
                                continue;
                            }
                            //  判断堆垛机状态等待确认
                            if (crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(taskWrk.getWrkNo().shortValue())
                                    && crnProtocol.getTaskFinish() == 0
                                    && crnProtocol.forkPosType == CrnForkPosType.HOME) {
                                // 命令下发区 --------------------------------------------------------------------------
                                //取出输送线命令
                                List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo());
                                if (commandInfos.isEmpty()) {
                                    continue;//命令空
                                }
//                                CommandPackage commandPackage = JSON.parseObject(commandInfo.getCommand(), CommandPackage.class);//取出命令报文
//                                CrnCommand crnCommand = JSON.parseObject(commandPackage.getCommand().toString(), CrnCommand.class);
                                Integer commandStep = taskWrk.getCommandStep();
                                CommandInfo commandInfo = commandInfos.get(commandStep);
                                CommandPackage commandPackage = JSON.parseObject(commandInfo.getCommand(), CommandPackage.class);//取出命令报文
                                //StaProtocol staProtocol1 = JSON.parseObject(commandInfo.getCommand(), StaProtocol.class);
                                StaProtocol staProtocol1 = JSON.parseObject(commandPackage.getCommand().toString(), StaProtocol.class);
                                if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol1))) {
                                    log.error("输送线命令下方失败!!! [工作号:{}]", taskWrk.getWrkNo());
                                    continue;//命令下发失败
                                }
                                // 复位堆垛机
                                crnThread.setResetFlag(true);
                                if (taskWrk.getIoType() == 1 || taskWrk.getIoType() == 3){
                                    taskWrk.setWrkSts(4);
                                } else if (taskWrk.getIoType() == 2) {
                                    taskWrk.setWrkSts(14);
                                }
                                if (!taskWrkService.updateById(taskWrk)){
                                    log.error(taskWrk.getTaskNo()+ " 堆垛机任务完成,改变任务状态失败");
                                }
                            }
                    if (staProtocol.isPakMk()){
                        VacuumMast vacuumMast = vacuumMastService.selectByStatusIsN();
                        FillingMast fillingMast = fillingMastService.selectByStatusIsn();
                        Date now = new Date();
                        WrkMastSta wrkMastSta = new WrkMastSta();
                        int workNo = commonService.getWorkNo(0);
                        wrkMastSta.setWrkNo((long)workNo);
                        wrkMastSta.setWrkStart(2);
                        wrkMastSta.setWrkEnd(vacuumMast.getStaNo());
//                    wrkMastSta.setStaStart();
                        wrkMastSta.setStaEnd(fillingMast.getStaNo());
                        wrkMastSta.setCreateTime(now);
                        wrkMastSta.setUpdateTime(now);
                        wrkMastSta.setBignTime(now);
                        wrkMastSta.setType(0);      //类型 0:非空  1:空板
                        wrkMastSta.setWrkType(3);                      //工作类型  1:取(叠盘)  2:放 3:取放 4:拆盘
                        Integer insert = wrkMastStaMapper.insert(wrkMastSta);
                        if (insert>0){
                            devpThread.setPakMk(devp.getId(),false);
                        }
                    }
                }
@@ -370,800 +123,244 @@
            }
        }
    }
    /**
     * 入出库  ===>>  堆垛机入出库作业下发
     */
    public synchronized void crnIoExecute() throws IOException {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
            if (basCrnp == null) {
                log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId());
                continue;
            }
            // 只有当堆垛机空闲 并且 无任务时才继续执行
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                    && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
                // 如果最近一次是入库模式
                if (crnProtocol.getLastIo().equals("I")) {
                    if (basCrnp.getInEnable().equals("Y")) {
                        this.crnStnToLoc(crn, crnProtocol); //  入库
                        crnProtocol.setLastIo("O");
                    } else if (basCrnp.getOutEnable().equals("Y")) {
                        this.locToCrnStn(crn, crnProtocol); //  出库
                        crnProtocol.setLastIo("I");
                    }
                }
                // 如果最近一次是出库模式
                else if (crnProtocol.getLastIo().equals("O")) {
                    if (basCrnp.getOutEnable().equals("Y")) {
                        this.locToCrnStn(crn, crnProtocol); //  出库
                        crnProtocol.setLastIo("I");
                    } else if (basCrnp.getInEnable().equals("Y")) {
                        this.crnStnToLoc(crn, crnProtocol); //  入库
                        crnProtocol.setLastIo("O");
                    }
                }
            }
            // 库位移转
            this.locToLoc(crn, crnProtocol);
        }
    }
    /**
     * 入库  ===>>  堆垛机站到库位
     */
    public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol) throws IOException {
        for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo()));
            for (StaDesc staDesc : staDescs) {
                boolean flag = false;
                // 获取堆垛机入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 查询站点详细信息
                BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                if (staDetl == null) {
                    log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                    continue;
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
                        && staDetl.getCanining()!=null && staDetl.getCanining().equals("Y")) {
                    flag = true;
                }
                if (!flag) {
                    continue;
                }
                // 获取工作状态为2(设备上走)的入库工作档
                TaskWrk taskWrk = taskWrkMapper.selectPakIn(slave.getId(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString());
                if(null == taskWrk) {
                    continue;
                }
                // 堆垛机控制过滤
                if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
                    continue;
                }
                // 已经存在吊车执行任务时,则过滤
                if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
                    continue;
                }
                // 修改工作档状态 2.设备上走 => 3.吊车入库中
                log.error("进入修改工作档流程");
                Date now = new Date();
                taskWrk.setWrkSts(3);
                taskWrk.setModiTime(now);
                if (taskWrkMapper.updateById(taskWrk) == 0) {
                    log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo());
                }
                TaskWrk taskWrk2 = taskWrkService.selectByWrkNo(taskWrk.getWrkNo());
                if (taskWrk2.getWrkSts() != 3){
                    continue;
                }
                log.error("进入修改工作档流程完成,taskWrk=", taskWrk.getWrkNo());
                //取出命令
                List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo());
                Integer commandStep = taskWrk.getCommandStep();
                if (commandInfos.isEmpty()) {
                    continue;//命令空
                }
                CommandInfo commandInfo = commandInfos.get(commandStep);
                CommandPackage commandPackage = JSON.parseObject(commandInfo.getCommand(), CommandPackage.class);//取出命令报文
                CrnCommand crnCommand = JSON.parseObject(commandPackage.getCommand().toString(), CrnCommand.class);
                if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) {
                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
                } else {
                    //开始运行
                    String response = CrnStartRunning(taskWrk);
                    JSONObject jsonObject = JSON.parseObject(response);
                    if (jsonObject.getInteger("code").equals(200)) {
                    }else {
                        log.error("入库开始运行通讯失败,"+jsonObject.get("msg"));
                    }
                }
//                // 命令下发区 --------------------------------------------------------------------------
//                CrnCommand crnCommand = new CrnCommand();
//                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
//                crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号
//                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
//                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
//                crnCommand.setSourcePosX(crnStn.getBay().shortValue());     // 源库位列
//                crnCommand.setSourcePosY(crnStn.getLev().shortValue());     // 源库位层
//                crnCommand.setSourcePosZ(crnStn.getRow().shortValue());     // 源库位排
//                crnCommand.setDestinationPosX(Utils.getBayShort(taskWrk.getTargetPoint()));     // 目标库位列
//                crnCommand.setDestinationPosY(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位层
//                crnCommand.setDestinationPosZ(Utils.getRowShort(taskWrk.getTargetPoint()));     // 目标库位排
//                crnCommand.setCommand((short)1);
//                if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) {
//                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
//                } else {
//                    // 修改工作档状态 2.设备上走 => 3.吊车入库中
//                    Date now = new Date();
//                    taskWrk.setWrkSts(3);
//                    taskWrk.setModiTime(now);
//                    if (taskWrkMapper.updateById(taskWrk) == 0) {
//                        log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo());
//                    }
//                }
            }
           // return;
        }
    }
    /**
     * 出库  ===>>  库位到堆垛机站
     * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库
     */
    public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){
        List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(slave.getId(), null);
        if (taskWrksInitial.size()==0){
            return;
        }
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo()));
            for (StaDesc staDesc : staDescs){
                // 获取工作状态为11(生成出库ID)的出库工作档
                List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(slave.getId(),staDesc.getStnNo().toString());
                for (TaskWrk taskWrk : taskWrks){
                    if (taskWrk == null) {
                        continue;
                    }
                    // 工作档状态判断
                    if (taskWrk.getIoType() != 2 || taskWrk.getTargetPoint() == null || taskWrk.getStartPoint() == null) {
                        log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", taskWrk.getWrkNo(), taskWrk.getStartPoint(), taskWrk.getIoType());
                        continue;
                    }
                    // 获取堆垛机出库站信息
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                    StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                    if (staProtocol == null) {
                        break;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    // 查询站点详细信息
                    BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                    if (staDetl == null) {
                        log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                        break;
                    }
                    // 判断堆垛机出库站状态
                    if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() !=null && staDetl.getCanouting().equals("Y")
                            && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
                        // 命令下发区 --------------------------------------------------------------------------
                        // 堆垛机控制过滤
                        if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
                            break;
                        }
                        // 已经存在吊车执行任务时,则过滤
                        if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
                            break;
                        }
                        // 双深库位且浅库位有货,则需先对浅库位进行库位移转
                        if (Utils.isDeepLoc(slaveProperties, taskWrk.getStartPoint())) {
                            taskWrkMapper.selectPakOutIoType(taskWrk.getCrnNo());
                            List<TaskWrk> taskWrks1 = taskWrkMapper.selectPakOutIoType(taskWrk.getCrnNo());
                            if (Cools.isEmpty(taskWrks1) && taskWrks1.size()!=0){
                                continue;
                            }
                            String shallowLocNo = Utils.getShallowLoc(slaveProperties, taskWrk.getStartPoint());
                            TaskWrk hallowLocNoTask = taskWrkMapper.selectByStartPoint(shallowLocNo);
                            if (!Cools.isEmpty(hallowLocNoTask)){
//                                if (!Cools.isEmpty(hallowLocNoTask.getTargetPoint())){
//                                    continue;
//                                }
////                            new PostMesDataUtils().postMesData("移库任务分配库位",wmsUrl,movePath,hallowLocNoTask);
//                                try {
//                                    String response = new HttpHandler.Builder()
//                                            .setUri(wmsUrl)
//                                            .setPath(movePath)
//                                            .setJson(JSON.toJSONString(hallowLocNoTask))
//                                            .build()
//                                            .doPost();
//                                    System.out.println("response:"+response);
//                                    JSONObject jsonObject = JSON.parseObject(response);
//                                    if (jsonObject.getInteger("code").equals(200)) {
//                                        //解析
//                                    }
//                                }catch (Exception e){
//                                    log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl+"/"+movePath, JSON.toJSONString(hallowLocNoTask), "请求移库任务分配库位");
//                                }
                                continue;
                            }
                        }
                        //取出命令
                        List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo());
                        Integer commandStep = taskWrk.getCommandStep();
                        if (commandInfos.isEmpty()) {
                            continue;//命令空
                        }
                        //判断末端命令是否执行
                        CommandInfo commandInfo2 = commandInfos.get(commandInfos.size() - 1);
                        if (commandInfo2.getCommandStatus() != CommandStatusType.CREATE.id) {
                            continue;//指令已执行
                        }
                        CommandInfo commandInfo = commandInfos.get(commandStep);
                        CommandPackage commandPackage = JSON.parseObject(commandInfo.getCommand(), CommandPackage.class);//取出命令报文
                        CrnCommand crnCommand = JSON.parseObject(commandPackage.getCommand().toString(), CrnCommand.class);
                        if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) {
                            log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
                        } else {
                            // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                            Date now = new Date();
                            taskWrk.setWrkSts(12);
                            taskWrk.setModiTime(now);
                            if (taskWrkMapper.updateById(taskWrk) == 0) {
                                log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo());
                            }
                            //开始运行
                            String response = CrnStartRunning(taskWrk);
                            JSONObject jsonObject = JSON.parseObject(response);
                            if (jsonObject.getInteger("code").equals(200)) {
                            }else {
                                log.error("出库开始运行通讯失败,"+jsonObject.get("msg"));
                            }
                        }
                    }
                }
            }
        }
    }
    /**
     * 库位移转
     */
    public void locToLoc(CrnSlave slave, CrnProtocol crnProtocol){
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            // 获取工作状态为11(生成出库ID)的移库工作档
            List<TaskWrk> taskWrks = taskWrkMapper.selectList(new EntityWrapper<TaskWrk>()
                    .eq("crn_no",slave.getId())
                    .eq("wrk_sts",11)
                    .eq("io_type",3));
            for (TaskWrk taskWrk : taskWrks){
                // 双深库位且浅库位有货,则需先对浅库位进行库位移转
                if (Utils.isDeepLoc(slaveProperties, taskWrk.getStartPoint())) {
                    String shallowLocNo = Utils.getShallowLoc(slaveProperties, taskWrk.getStartPoint());
                    TaskWrk hallowLocNoTask = taskWrkMapper.selectByStartPoint(shallowLocNo);
                    if (!Cools.isEmpty(hallowLocNoTask)){
                        continue;
                    }
                }
                // 堆垛机控制过滤
                if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
                    continue;
                }
                // 已经存在吊车执行任务时,则过滤
                if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
                    continue;
                }
                if (Cools.isEmpty(taskWrk.getTargetPoint())){
                    List<Integer> list = openServiceImpl.getInEnableRoadway();
                    Map<String, Object> map = new HashMap<>();
                    map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2");
                    ToWmsDTO toWmsDTO = new ToWmsDTO();
                    toWmsDTO.setWarehouseId("1688469798893297665");
                    toWmsDTO.setContainerCode(taskWrk.getBarcode());
                    toWmsDTO.setApplyType("TUNNEL_LOCATION");
                    toWmsDTO.setTaskTunnel(taskWrk.getCrnNo());
                    toWmsDTO.setCanInboundTunnels(list);
                    String response = null;
                    try {
                        response = new HttpHandler.Builder()
                                .setHeaders(map)
                                .setUri(wmsUrl)
                                .setPath("wcsManager/wcsInterface/inboundTaskApply")
                                .setJson(JSON.toJSONString(toWmsDTO))
                                .build()
                                .doPost();
                    }catch (Exception e){
                        log.error("wms通讯失败,"+e.getMessage());
                        continue;
                    }
                    JSONObject jsonObject = JSON.parseObject(response);
                    if (jsonObject.getInteger("code").equals(200)) {
                        GetWmsDto getWmsDto = JSON.parseObject(jsonObject.get("data").toString(), GetWmsDto.class);
                        taskWrk.setOriginTargetPoint(getWmsDto.getTargetLocationCode());
                        taskWrk.setTargetPoint(Utils.getWcsLocNo(getWmsDto.getTargetLocationCode()));
                        if (!taskWrkService.updateById(taskWrk)){
                            log.error("保存wms库位号失败");
                        }
                        continue;
                    }else {
                        log.error("wms通讯失败,"+jsonObject.get("msg"));
                        continue;
                    }
                }
                if (taskWrk == null || Cools.isEmpty(taskWrk.getTargetPoint()) || taskWrk.getTargetPoint().equals("") || taskWrk.getWrkNo() == null) {
                    continue;
                }
                // 工作档状态判断
                if (taskWrk.getIoType() != 3 || taskWrk.getTargetPoint() == null) {
                    log.error("查询工作档数据不符合条件--入出类型/目标库位号, 工作号={},源库位={},入出类型={}", taskWrk.getWrkNo(), taskWrk.getTargetPoint(), taskWrk.getIoType());
                    continue;
                }
                // 命令下发区 --------------------------------------------------------------------------
                // 1.堆垛机开始移动
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号
                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                crnCommand.setSourcePosZ(Utils.getRowShort(taskWrk.getStartPoint()));     // 源库位排
                crnCommand.setSourcePosX(Utils.getBayShort(taskWrk.getStartPoint()));     // 源库位列
                crnCommand.setSourcePosY(Utils.getLevShort(taskWrk.getStartPoint()));     // 源库位层
                crnCommand.setDestinationPosZ(Utils.getRowShort(taskWrk.getTargetPoint()));     // 目标库位排
                crnCommand.setDestinationPosX(Utils.getBayShort(taskWrk.getTargetPoint()));     // 目标库位列
                crnCommand.setDestinationPosY(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位层
                crnCommand.setCommand((short) 1);
                if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand),false)) {
                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
                } else {
                    // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                    Date now = new Date();
                    taskWrk.setWrkSts(12);
                    taskWrk.setModiTime(now);
                    if (taskWrkMapper.updateById(taskWrk) == 0) {
                        log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo());
                    }
                    //开始运行
                    String response = CrnStartRunning(taskWrk);
                    JSONObject jsonObject = JSON.parseObject(response);
                    if (jsonObject.getInteger("code").equals(200)) {
                    }else {
                        log.error("移库任务开始运行通讯失败,"+jsonObject.get("msg"));
                        continue;
                    }
                    break;
                }
                return;
            }
        }
    }
    /**
     * 执行对工作档的完成操作
     */
    @Async
    public void storeFinished() {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) { continue; }
            //  状态:等待确认 并且  任务完成位 = 1
            if (crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) {
                //获取入库待确认工作档
                TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crn.getId(),crnProtocol.getTaskNo().intValue());
                if (Cools.isEmpty(taskWrk)) {
//                    log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
                    continue;
                }
                //获取指令ID
                Integer commandId = crnProtocol.getCommandId();
                CommandInfo commandInfo = new CommandInfo();
                if (Cools.isEmpty(commandId)){
                    commandInfo = commandInfoService.selectOne(new EntityWrapper<CommandInfo>()
                            .eq("wrk_no",crnProtocol.getTaskNo())
                            .eq("device","Crn"));
                }else {
                    commandInfo = commandInfoService.selectById(commandId);
                }
                if (commandInfo == null) {
                    //指令不存在
                    continue;
                }
                if (commandInfo.getCommandStatus() == 3){
                    continue;
                }
                commandInfo.setCommandStatus(CommandStatusType.COMPLETE.id);//指令完成
                commandInfo.setCompleteTime(new Date());//指令完成时间
                if (commandInfoService.updateById(commandInfo)) {//修改成功后复位堆垛机
                    // 堆垛机复位
                    crnThread.setResetFlag(true);
                    if (taskWrk.getIoType() == 1 || taskWrk.getIoType() == 3){
                        taskWrk.setWrkSts(4);
                    } else if (taskWrk.getIoType() == 2) {
                        taskWrk.setWrkSts(14);
                    }
                    if (!taskWrkService.updateById(taskWrk)){
                        log.error(taskWrk.getTaskNo()+ " 堆垛机任务完成,改变任务状态失败");
                    }
                }
            }
        }
    }
//    /**
//     * 执行对工作档的完成操作
//     */
//    @Async
//    public void storeFinished() {
//        for (CrnSlave crn : slaveProperties.getCrn()) {
//            // 获取堆垛机信息
//            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
//            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
//            if (crnProtocol == null) { continue; }
//            //  状态:等待确认 并且  任务完成位 = 1
//            if (crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) {
//                // 获取入库待确认工作档
//                TaskWrk taskWrk = taskWrkMapper.selectCrnNoWorking(crn.getId(),crnProtocol.getTaskNo().intValue());
//                if (Cools.isEmpty(taskWrk)) {
//                    log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo());
//                    continue;
//                }
//                // 入库 + 库位转移  ==> 4.入库完成
//                if ((taskWrk.getWrkSts() == 3 && taskWrk.getIoType() == 1) || (taskWrk.getWrkSts() == 12 && taskWrk.getIoType() == 3)) {
//                    taskWrk.setWrkSts(4);
//                } else {
//                    continue;
//                }
//                Date now = new Date();
//                taskWrk.setModiTime(now);
//                Integer integerTaskWrk = taskWrkMapper.updateById(taskWrk);
//                // 修改成功后复位堆垛机
//                if (integerTaskWrk > 0) {
//                    // 堆垛机复位
//                    crnThread.setResetFlag(true);
//
//                    //更新库位状态
//                    LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
//                    locMast.setLocSts("F");//F.在库
//                    locMast.setBarcode(taskWrk.getBarcode());//托盘码
//                    locMast.setModiTime(now);
//                    locMast.setModiUser(9999L);
//                    locMastService.updateById(locMast);
//                }
//            }
//        }
//    }
    /**
     * 堆垛机异常信息记录
     */
    @Async
    public void recCrnErr(){
        Date now = new Date();
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) {
                continue;
            }
            if (false) {
//            if (crnProtocol.getModeType() != CrnModeType.STOP) {
                // 有任务
                if (crnProtocol.getTaskNo() != 0) {
                    BasErrLog latest = basErrLogService.findLatestByTaskNo(crn.getId(), crnProtocol.getTaskNo().intValue());
                    // 有异常
                    if (latest == null) {
                        if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) {
                            WrkMast wrkMast = wrkMastMapper.selectById(crnProtocol.getTaskNo());
                            if (wrkMast == null) {
                                continue;
                            }
                            BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm());
                            String errName = crnError==null? String.valueOf(crnProtocol.getAlarm()):crnError.getErrName();
                            BasErrLog basErrLog = new BasErrLog(
                                    null,    // 编号
                                    wrkMast.getWrkNo(),    // 工作号
                                    now,    // 发生时间
                                    null,    // 结束时间
                                    wrkMast.getWrkSts(),    // 工作状态
                                    wrkMast.getIoType(),    // 入出库类型
                                    crn.getId(),    // 堆垛机
                                    null,    // plc
                                    wrkMast.getLocNo(),    // 目标库位
                                    wrkMast.getStaNo(),    // 目标站
                                    wrkMast.getSourceStaNo(),    // 源站
                                    wrkMast.getSourceLocNo(),    // 源库位
                                    wrkMast.getBarcode(),    // 条码
                                    (int) crnProtocol.getAlarm1(),    // 异常码
                                    errName,    // 异常
                                    1,    // 异常情况
                                    now,    // 添加时间
                                    null,    // 添加人员
                                    now,    // 修改时间
                                    null,    // 修改人员
                                    "任务中异常"    // 备注
                            );
                            if (!basErrLogService.insert(basErrLog)) {
                                log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName);
                            }
                        }
                    } else {
                        // 异常修复
                        if (crnProtocol.getAlarm1() == null || crnProtocol.getAlarm1() == 0) {
                            latest.setEndTime(now);
                            latest.setUpdateTime(now);
                            latest.setStatus(2);
                            if (!basErrLogService.updateById(latest)) {
                                log.error("堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId());
                            }
                        }
                    }
                // 无任务
                } else {
                    BasErrLog latest = basErrLogService.findLatest(crn.getId());
                    // 有异常
                    if (crnProtocol.getAlarm1() != null && crnProtocol.getAlarm() > 0) {
                        // 记录新异常
                        if (latest == null || (latest.getErrCode() != crnProtocol.getAlarm().intValue())) {
                            BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm());
                            String errName = crnError==null? String.valueOf(crnProtocol.getAlarm()):crnError.getErrName();
                            BasErrLog basErrLog = new BasErrLog(
                                    null,    // 编号
                                    null,    // 工作号
                                    now,    // 发生时间
                                    null,    // 结束时间
                                    null,    // 工作状态
                                    null,    // 入出库类型
                                    crn.getId(),    // 堆垛机
                                    null,    // plc
                                    null,    // 目标库位
                                    null,    // 目标站
                                    null,    // 源站
                                    null,    // 源库位
                                    null,    // 条码
                                    (int)crnProtocol.getAlarm1(),    // 异常码
                                    errName,    // 异常
                                    1,    // 异常情况
                                    now,    // 添加时间
                                    null,    // 添加人员
                                    now,    // 修改时间
                                    null,    // 修改人员
                                    "无任务异常"    // 备注
                            );
                            if (!basErrLogService.insert(basErrLog)) {
                                log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName);
                            }
                        }
                    // 无异常
                    } else {
                        // 异常修复
                        if (latest != null && latest.getStatus() == 1) {
                            latest.setEndTime(now);
                            latest.setUpdateTime(now);
                            latest.setStatus(2);
                            if (!basErrLogService.updateById(latest)) {
                                log.error("堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId());
                            }
                        }
                    }
                }
            }
        }
    }
    //自动派发任务
    public void autoDistribute() {
        Config config = configService.selectByCode("autoDistribute");
        if (config == null) {
            return;
        }
        if (config.getValue().equals("false")) {//判断是否开启自动派发任务
            return;
        }
        for (TaskWrk taskWrk : taskWrkService.selectReceive()) {
            try {
                taskWrkService.distribute(taskWrk.getTaskNo(), 9527L);
            } catch (CoolException e) {
//                log.info(e.getMessage());
            }
        }
    }
    //自动完成任务
    public synchronized void autoCompleteTask() {
        List<TaskWrk> taskWrks = taskWrkMapper.selectWorkingTask();
        for (TaskWrk taskWrk : taskWrks) {
            //获取命令集合
            List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo());
            if (taskWrk.getCommandStep() < commandInfos.size()) {
                continue;//当前步序没有到达最后一条命令
            }
            //判断末端命令是否执行完成
            if (!commandInfos.isEmpty()){
                CommandInfo commandInfo = commandInfos.get(commandInfos.size() - 1);
                if (commandInfo.getCommandStatus() != CommandStatusType.COMPLETE.id) {
                    continue;//指令未完成
                }
            }
            Date now = new Date();
            //指令已完成,更新任务
            if (taskWrk.getIoType() == 1) {
                //入库任务
//                taskWrk.setWrkSts(4);//3.吊车入库中 => 4.入库完成
                taskWrk.setStatus(TaskStatusType.OVER.id);
                taskWrk.setModiTime(now);
                taskWrkService.updateById(taskWrk);
                //更新库位状态
                LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
                locMast.setLocSts("Z");//F.在库
                locMast.setBarcode(taskWrk.getBarcode());//托盘码
                locMast.setModiTime(now);
                locMast.setModiUser(9999L);
                locMastService.updateById(locMast);
            } else if (taskWrk.getIoType() == 2) {
                //出库任务
//                taskWrk.setWrkSts(14);//12.吊车出库中 => 14.出库完成
                taskWrk.setStatus(TaskStatusType.OVER.id);
                taskWrk.setModiTime(now);
                taskWrkService.updateById(taskWrk);
                //更新库位状态
                LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
                locMast.setLocSts("K");//O.空库位
                locMast.setBarcode("");//托盘码
                locMast.setModiTime(now);
                locMast.setModiUser(9999L);
                locMastService.updateById(locMast);
            } else if (taskWrk.getIoType() == 3) {
                //更新起始库位状态
                LocMast locMastStart = locMastService.selectByLocNo(taskWrk.getStartPoint());
                locMastStart.setLocSts("K");//O.空库位
                locMastStart.setBarcode("");//托盘码
                locMastStart.setModiTime(now);
                locMastStart.setModiUser(9999L);
                locMastService.updateById(locMastStart);
                //更新目标库位状态
                LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
                locMast.setLocSts("Z");//F.在库
                locMast.setBarcode(taskWrk.getBarcode());//托盘码
                locMast.setModiTime(now);
                locMast.setModiUser(9999L);
                locMastService.updateById(locMast);
                taskWrk.setStatus(TaskStatusType.OVER.id);
                taskWrk.setModiTime(now);
                taskWrkService.updateById(taskWrk);
            }
        }
    }
    public synchronized String CrnStartRunning(TaskWrk taskWrk){
        String tasktype = null;
        switch (taskWrk.getIoType()){
            case 1:
                tasktype= "RK";
                break;
            case 2:
                tasktype= "CK";
                break;
            case 3:
                tasktype= "YK";
                break;
            default:
                tasktype= "未知";
        }
        Map<String, Object> map = new HashMap<>();
        map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2");
        TaskOverToWms taskOverToWms = new TaskOverToWms();
        taskOverToWms.setFeedbackFrom("WCS"); //来源
        taskOverToWms.setWarehouseId("1688469798893297665"); //仓库标识
        taskOverToWms.setTaskNo(taskWrk.getTaskNo()); //任务号
        taskOverToWms.setTaskType(tasktype); // 任务类型
        taskOverToWms.setContainerCode(taskWrk.getBarcode()); // 容器编码
        if (taskWrk.getIoType() ==1 || taskWrk.getIoType() == 3){
            taskOverToWms.setEquipmentCode(String.valueOf(taskWrk.getCrnNo())); //设备编码
            taskOverToWms.setTargetLocationCode(taskWrk.getOriginTargetPoint()); //目标库位
        }else if (taskWrk.getIoType() ==2){
            Map<Integer,String> map1 = new HashMap<>();
            map1.put(102,"J-1101");
            map1.put(106,"J-1103");
            map1.put(110,"J-1105");
            map1.put(114,"J-1107");
            map1.put(118,"J-1109");
            map1.put(122,"J-1111");
            map1.put(305,"H-1101");
            map1.put(405,"G-1101");
            taskOverToWms.setEquipmentCode(map1.get(taskWrk.getTargetPoint())); //设备编码
            taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint()); //源库位
        }
        taskOverToWms.setTaskStatus("executing"); //任务状态
        String response = null;
    public synchronized void RGVDemoShow0() {
        try {
            response = new HttpHandler.Builder()
                    .setHeaders(map)
                    .setUri(wmsUrl)
                    .setPath("wcsManager/wcsInterface/taskStatusFeedback")
                    .setJson(JSON.toJSONString(taskOverToWms))
                    .build()
                    .doPost();
        }catch (Exception e){
            log.error("堆垛机任务完成,请求wms任务完成接口失败");
            for (DevpSlave devp : slaveProperties.getDevp()) {
                for (DevpSlave.Sta inSta : devp.getInSta()) {
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
//                    if (){ //输送线状态
//
//                    }
                    for (RgvSlave rgv : slaveProperties.getRgv()) {
                        SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
                        RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                        if (rgvProtocol == null) {
                            continue;
                        }else {
                            rgvProtocol = rgvProtocol.clone();
                        }
                        if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                                && rgvProtocol.getModeType() == RgvModeType.AUTO
                                && rgvProtocol.getLoaded1()==0
                                && rgvProtocol.getTaskNo1() == 0
                                && rgvThread.isPakMk()
                        ){
                            WrkMastSta wrkMastSta = wrkMastStaMapper.selectWrkSts0();
                            if (!Cools.isEmpty(wrkMastSta)){
                                //  命令下发区 --------------------------------------------------------------------------
                                RgvCommand rgvCommand = new RgvCommand();
                                rgvCommand.setRgvNo(rgv.getId()); // RGV编号
                                rgvCommand.setAckFinish1(false);  // 工位1任务完成确认位
                                rgvCommand.setTaskNo1(wrkNo1); // 工位1工作号
                                rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式:  取放货
                                rgvCommand.setSourceStaNo1(wrkMastSta.getWrkStart().shortValue());   //工位1起点
                                rgvCommand.setDestinationStaNo1(wrkMastSta.getWrkEnd().shortValue());   //工位1目标站点
                                rgvCommand.setCommand((short) 1);   //工位1任务确认
                                if (!MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, rgvCommand))) {
                                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgv.getId(), JSON.toJSON(rgvCommand));
                                } else {
                                    vacuumMastStatusSetY(wrkMastSta.getWrkEnd());
                                    rgvThread.setPakMk(false);
                                    wrkMastSta.setWrkSts(1);
                                    Integer update = wrkMastStaMapper.updateById(wrkMastSta);
                                    if (update>0){
                                    }else {
                                        log.error("RGV命令下发后,更新工作任务状态失败");
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("Rgv演示  ===>> 失败", e);
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        apiLogService.save("堆垛机开始运行"
                ,wmsUrl+"wcsManager/wcsInterface/taskStatusFeedback"
                ,null
                ,"127.0.0.1"
                ,JSON.toJSONString(taskOverToWms)
                ,response
                ,true
        );
        return response;
    }
    public synchronized void RGVDemoShow1() {
        try {
            for (DevpSlave devp : slaveProperties.getDevp()) {
                for (DevpSlave.Sta inSta : devp.getInSta()) {
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
//                    if (){ //输送线状态
//
//                    }
                    for (RgvSlave rgv : slaveProperties.getRgv()) {
                        if (!rgv.getDemo()) {
                            continue;
                        }
                        SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
                        RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                        if (rgvProtocol == null) {
                            continue;
                        }else {
                            rgvProtocol = rgvProtocol.clone();
                        }
                        if (rgvProtocol.getStatusType() == RgvStatusType.IDLE
                                && rgvProtocol.getModeType() == RgvModeType.AUTO
                                && rgvProtocol.getLoaded1()==0
                                && rgvProtocol.getTaskNo1() == 0
                                && rgvThread.isPakMk()
                        ){
                            WrkMastSta wrkMastSta = wrkMastStaMapper.selectWrkSts1();
                            if (!Cools.isEmpty(wrkMastSta)){
                                //  命令下发区 --------------------------------------------------------------------------
                                RgvCommand rgvCommand = new RgvCommand();
                                rgvCommand.setRgvNo(rgv.getId()); // RGV编号
                                rgvCommand.setAckFinish1(false);  // 工位1任务完成确认位
                                rgvCommand.setTaskNo1(wrkNo1); // 工位1工作号
                                rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式:  取放货
                                rgvCommand.setSourceStaNo1(wrkMastSta.getWrkEnd().shortValue());   //工位1起点
                                rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue());   //工位1目标站点
                                rgvCommand.setCommand((short) 1);   //工位1任务确认
                                if (!MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, rgvCommand))) {
                                    //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                                    log.error("RGV命令下发失败,RGV号={},任务数据={}", rgv.getId(), JSON.toJSON(rgvCommand));
                                } else {
                                    rgvThread.setPakMk(false);
                                    vacuumMastStatusSetN(wrkMastSta.getWrkEnd());
                                    fillingMastStatusSetY(wrkMastSta.getStaEnd());
                                    wrkMastSta.setWrkSts(2);
                                    Integer update = wrkMastStaMapper.updateById(wrkMastSta);
                                    if (update>0){
                                    }else {
                                        log.error("RGV命令下发后,更新工作任务状态失败");
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("Rgv演示  ===>> 失败", e);
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    public synchronized void RGVDemoShow2() throws InterruptedException {
        for (RgvSlave rgv : slaveProperties.getRgv()) {
//            if (!rgv.getDemo()) {
//                continue;
//            }
            SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId());
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol == null) {
                continue;
            }else {
                rgvProtocol = rgvProtocol.clone();
            }
            if ((rgvProtocol.getStatusType1() == RgvStatusType.WAITING || rgvProtocol.getStatusType1()==RgvStatusType.FETCHWAITING)
                    && rgvProtocol.getModeType() == RgvModeType.AUTO
                    && rgvProtocol.getTaskNo1() >0
//                    && (rgvProtocol.getStatusType() == RgvStatusType.WORKING1)
            ){
                boolean rgvComplete = rgvComplete(rgv.getId());
                if (rgvComplete){
                    rgvThread.setPakMk(true);
                }
            }
        }
    }
    public boolean vacuumMastStatusSetN(Integer staNo){
        EntityWrapper<VacuumMast> vacuumMastEntityWrapper = new EntityWrapper<>();
        vacuumMastEntityWrapper.eq("sta_no",staNo);
        VacuumMast vacuumMast = vacuumMastService.selectOne(vacuumMastEntityWrapper);
        vacuumMast.setStatus("N");
        boolean update = vacuumMastService.update(vacuumMast, vacuumMastEntityWrapper);
        return update;
    }
    public boolean vacuumMastStatusSetY(Integer staNo){
        EntityWrapper<VacuumMast> vacuumMastEntityWrapper = new EntityWrapper<>();
        vacuumMastEntityWrapper.eq("sta_no",staNo);
        VacuumMast vacuumMast = vacuumMastService.selectOne(vacuumMastEntityWrapper);
        vacuumMast.setStatus("Y");
        boolean update = vacuumMastService.update(vacuumMast, vacuumMastEntityWrapper);
        return update;
    }
    public boolean fillingMastStatusSetN(Integer staNo){
        EntityWrapper<FillingMast> fillingMastEntityWrapper = new EntityWrapper<>();
        fillingMastEntityWrapper.eq("sta_no",staNo);
        FillingMast fillingMast = fillingMastService.selectOne(fillingMastEntityWrapper);
        fillingMast.setStatus("N");
        boolean update = fillingMastService.update(fillingMast, fillingMastEntityWrapper);
        return update;
    }
    public boolean fillingMastStatusSetY(Integer staNo){
        EntityWrapper<FillingMast> fillingMastEntityWrapper = new EntityWrapper<>();
        fillingMastEntityWrapper.eq("sta_no",staNo);
        FillingMast fillingMast = fillingMastService.selectOne(fillingMastEntityWrapper);
        fillingMast.setStatus("Y");
        boolean update = fillingMastService.update(fillingMast, fillingMastEntityWrapper);
        return update;
    }
    /*
     * 小车复位
     * */
    public synchronized boolean rgvComplete(Integer rgvId){
        try{
            //  命令下发区 --------------------------------------------------------------------------
            if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(3, new RgvCommand()))) {
                //step=2,工位1、2写任务;   step=4,工位1写任务;     step=5,工位2写任务
                log.error("RGV命令下发失败,RGV号={}",rgvId);
                return false;
            } else {
                log.info("RGV命令下发成功,RGV号={}",rgvId);
                return true;
            }
        }catch (Exception e){
            log.error("RGV命令下发失败,RGV号={}。异常:"+e,rgvId);
            return false;
        }
    }
}
src/main/java/com/zy/asrs/service/impl/VacuumMastServiceImpl.java
New file
@@ -0,0 +1,15 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.VacuumMastMapper;
import com.zy.asrs.entity.VacuumMast;
import com.zy.asrs.service.VacuumMastService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("vacuumMastService")
public class VacuumMastServiceImpl extends ServiceImpl<VacuumMastMapper, VacuumMast> implements VacuumMastService {
    @Override
    public VacuumMast selectByStatusIsN() {
        return this.baseMapper.selectByStatusIsN();
    }
}
src/main/java/com/zy/asrs/service/impl/WrkMastStaServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.zy.asrs.mapper.WrkMastStaMapper;
import com.zy.asrs.entity.WrkMastSta;
import com.zy.asrs.service.WrkMastStaService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("wrkMastStaService")
public class WrkMastStaServiceImpl extends ServiceImpl<WrkMastStaMapper, WrkMastSta> implements WrkMastStaService {
}
src/main/java/com/zy/common/CodeBuilder.java
@@ -20,7 +20,7 @@
        generator.url="127.0.0.1:1433;databasename=ghtzasrs";
        generator.username="sa";
        generator.password="sa@123";
        generator.table="asr_bas_rgv_err";
        generator.table="man_vacuum_mast";
        generator.packagePath="com.zy.asrs";
        generator.js = false;
        generator.html = false;
src/main/java/com/zy/core/MainProcess.java
@@ -42,36 +42,12 @@
                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
                        continue;
                    }
                    // 演示
//                    mainService.crnDemoOfLocMove1();
                    // 入库  ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档
                    mainService.generateStoreWrkFile(); // 组托
                    // 出库  ===>>  堆垛机出库站到出库站
                    mainService.crnStnToOutStn();
                    // 入出库  ===>>  堆垛机入出库作业下发
                    mainService.crnIoExecute();
                    // 入库  ===>> 执行对工作档的完成操作
                    mainService.storeFinished();
//                    mainService.getRgvTask();
//                    mainService.RGVDemoShow0();
//                    mainService.RGVDemoShow1();
                    mainService.RGVDemoShow2();
                    // 堆垛机异常信息记录
                    mainService.recCrnErr();
                    // 入库  ===>> 空栈板初始化入库,叉车入库站放货
//                    mainService.storeEmptyPlt();
//                    mainService.outOfDevp();
                    // 其他  ===>> // 入出库模式切换函数
                    i++;
                    if (i > 1) {
//                        mainService.ioConvert();
                        i = 0;
                    }
                    //自动派发任务
                    mainService.autoDistribute();
                    //自动完成任务
                    mainService.autoCompleteTask();
                } catch (Exception e) {
                    e.printStackTrace();
src/main/java/com/zy/core/ServerBootstrap.java
@@ -80,26 +80,26 @@
    private void initThread(){
        // 初始化堆垛机线程
        log.info("初始化堆垛机线程...................................................");
        for (CrnSlave crn : slaveProperties.getCrn()) {
            CrnThread crnThread = new SiemensCrnThread(crn);
            new Thread((Runnable) crnThread).start();
            SlaveConnection.put(SlaveType.Crn, crn.getId(), crnThread);
        }
        // 初始化输送线线程
        log.info("初始化输送线线程...................................................");
        for (DevpSlave devp : slaveProperties.getDevp()) {
            DevpThread devpThread = new SiemensDevpThread(devp);
            new Thread((Runnable) devpThread).start();
            SlaveConnection.put(SlaveType.Devp, devp.getId(), devpThread);
        }
        // 初始化条码扫描仪线程
        log.info("初始化条码扫描仪线程...................................................");
        for (Slave barcode : slaveProperties.getBarcode()) {
            BarcodeThread barcodeThread = new BarcodeThread(barcode);
//            new Thread(barcodeThread).start();
            SlaveConnection.put(SlaveType.Barcode, barcode.getId(), barcodeThread);
        }
//        log.info("初始化堆垛机线程...................................................");
//        for (CrnSlave crn : slaveProperties.getCrn()) {
//            CrnThread crnThread = new SiemensCrnThread(crn);
//            new Thread((Runnable) crnThread).start();
//            SlaveConnection.put(SlaveType.Crn, crn.getId(), crnThread);
//        }
//        // 初始化输送线线程
//        log.info("初始化输送线线程...................................................");
//        for (DevpSlave devp : slaveProperties.getDevp()) {
//            DevpThread devpThread = new SiemensDevpThread(devp);
//            new Thread((Runnable) devpThread).start();
//            SlaveConnection.put(SlaveType.Devp, devp.getId(), devpThread);
//        }
//        // 初始化条码扫描仪线程
//        log.info("初始化条码扫描仪线程...................................................");
//        for (Slave barcode : slaveProperties.getBarcode()) {
//            BarcodeThread barcodeThread = new BarcodeThread(barcode);
////            new Thread(barcodeThread).start();
//            SlaveConnection.put(SlaveType.Barcode, barcode.getId(), barcodeThread);
//        }
        // 初始化穿梭车线程
        log.info("初始化RGV线程...................................................");
        for (RgvSlave rgv : slaveProperties.getRgv()) {
src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -3,18 +3,21 @@
public enum RgvStatusType {
    NONE(-1, "离线"),
    IDLE(0, "无任务"),
    IDLE(0, "空闲"),
    WORKING(1, "取货行走"),
    SOS(2, "进站运行中"),
    WORKING1(3, "进站完成"),
    FETCHING(4, "有物待出站"),
    A5(5,"出站行走"),
    A6(6,"出站请求"),
    A7(7,"出站运行中"),
    A8(8,"出站完成"),
    SOS(2, "等待取货允许"),
    WORKING1(3, "取货中"),
    WORKING5(5, "放货行走"),
//    FETCHING(11, "取货中"),
    PUTTING(6, "放货中"),
    WORKING7(7, "放货完成"),
    WAITING(90, "任务完成等待WCS确认"),
    FETCHWAITING(91, "取货任务完成等待WCS确认"),
    error(99,"报警")
    ;
    public Integer id;
    public String desc;
    RgvStatusType(Integer id, String desc) {
src/main/java/com/zy/core/model/DevpSlave.java
@@ -18,6 +18,7 @@
    private Integer rack;
    private Integer slot;
    private boolean demo;
    private List<Sta> inSta = new ArrayList<>();
src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -18,10 +18,10 @@
    private Integer rgvNo = 0;
    // 工位1任务完成确认位
    private Short ackFinish1 = 0;
    private boolean ackFinish1 = false;
    // 工位1任务号
    private Short taskNo1 = 0;
    private Integer taskNo1 = 0;
    /**
     * 任务模式:
src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -46,7 +46,7 @@
    /**
     * 工位1任务号
     */
    public Short taskNo1 = 0;
    public Integer taskNo1 = 0;
    /**
     * RGV工位1当前状态
src/main/resources/application-prod.yml
@@ -5,31 +5,11 @@
  # RGV穿梭车1
  rgv[0]:
    id: 1
    ip: 172.17.91.54
    ip: 10.10.10.200
    port: 502
    rack: 0
    slot: 0
  # RGV穿梭车1
  rgv[1]:
    id: 2
    ip: 172.17.91.57
    port: 502
    rack: 0
    slot: 0
  # RGV穿梭车1
  rgv[2]:
    id: 3
    ip: 172.17.91.60
    port: 502
    rack: 0
    slot: 0
  # RGV穿梭车1
  rgv[3]:
    id: 4
    ip: 172.17.91.63
    port: 502
    rack: 0
    slot: 0
    demo: false
  crn[0]: #堆垛机1
    id: 1
    ip: 172.17.91.2
src/main/resources/mapper/FillingMastMapper.xml
New file
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.FillingMastMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.FillingMast">
        <id column="id" property="id" />
        <result column="sta_no" property="staNo" />
        <result column="status" property="status" />
    </resultMap>
    <select id="selectByStatusIsn" resultMap="BaseResultMap">
        select TOP 1 * from man_filling_mast
        where status = 'N'
    </select>
</mapper>
src/main/resources/mapper/VacuumMastMapper.xml
New file
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.VacuumMastMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.VacuumMast">
        <id column="id" property="id" />
        <result column="sta_no" property="staNo" />
        <result column="status" property="status" />
    </resultMap>
    <select id="selectByStatusIsN" resultMap="BaseResultMap">
        select TOP 1 * from man_vacuum_mast
        where status = 'N'
    </select>
</mapper>
src/main/resources/mapper/WrkMastStaMapper.xml
New file
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.WrkMastStaMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.WrkMastSta">
        <id column="id" property="id" />
        <result column="wrk_no" property="wrkNo" />
        <result column="wrk_start" property="wrkStart" />
        <result column="wrk_end" property="wrkEnd" />
        <result column="sta_start" property="staStart" />
        <result column="sta_end" property="staEnd" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="type" property="type" />
        <result column="wrk_sts" property="wrkSts" />
        <result column="line_number" property="lineNumber" />
        <result column="wrk_type" property="wrkType" />
        <result column="bign_time" property="bignTime" />
        <result column="wrk_crn" property="wrkCrn" />
    </resultMap>
    <select id="selectWrkSts0" resultMap="BaseResultMap">
        select TOP 1  * from asr_wrk_mast_sta
        where 1=1
          and wrk_sts=0
        order by create_time,id
    </select>
    <select id="selectWrkSts1" resultMap="BaseResultMap">
        select TOP 1  * from asr_wrk_mast_sta
        where 1=1
          and wrk_sts=1
        order by create_time,id
    </select>
</mapper>
src/main/webapp/static/wcs/js/common.js
@@ -1,4 +1,4 @@
var baseUrl = "/wcs";
var baseUrl = "/ssdwcs";
// 赋值
function setVal(el, val) {
src/main/webapp/static/wms/js/common.js
@@ -1,4 +1,4 @@
var baseUrl = "/wcs";
var baseUrl = "/ssdwcs";
// 详情窗口-高度
var detailHeight = '80%';
src/main/webapp/static/wms/js/fillingMast/fillingMast.js
New file
@@ -0,0 +1,247 @@
var pageCurr;
layui.config({
    base: baseUrl + "/static/wms/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    // 数据渲染
    tableIns = table.render({
        elem: '#fillingMast',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/fillingMast/list/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
        toolbar: '#toolbar',
        cellMinWidth: 50,
        height: 'full-120',
        cols: [[
            {type: 'checkbox'}
            ,{field: 'id', align: 'center',title: 'ID',width: 50}
            ,{field: 'staNo', align: 'center',title: '站点'}
            ,{field: 'status', align: 'center',title: '状态'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            limit();
        }
    });
    // 监听排序事件
    table.on('sort(fillingMast)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {curr: 1}
        });
    });
    // 监听头工具栏事件
    table.on('toolbar(fillingMast)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id).data;
        switch(obj.event) {
            case 'addData':
                showEditModel();
                break;
            case 'deleteData':
               if (checkStatus.length === 0) {
                   layer.msg('请选择要删除的数据', {icon: 2});
                   return;
               }
               del(checkStatus.map(function (d) {
                   return d.id;
               }));
               break;
            case 'exportData':
                admin.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
                            fields.push(col.field);
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                        exportData[this.name] = this.value;
                    });
                    var param = {
                        'fillingMast': exportData,
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/fillingMast/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    });
                });
                break;
        }
    });
    // 监听行工具事件
    table.on('tool(fillingMast)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'edit':
                showEditModel(data);
                break;
            case "del":
                del([data.id]);
                break;
        }
    });
    /* 弹窗 - 新增、修改 */
    function showEditModel(mData) {
        admin.open({
            type: 1,
            area: '600px',
            title: (mData ? '修改' : '添加') + '订单状态',
            content: $('#editDialog').html(),
            success: function (layero, dIndex) {
                layDateRender(mData);
                form.val('detail', mData);
                form.on('submit(editSubmit)', function (data) {
                    var loadIndex = layer.load(2);
                    $.ajax({
                        url: baseUrl+"/fillingMast/"+(mData?'update':'add')+"/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: data.field,
                        method: 'POST',
                        success: function (res) {
                            layer.close(loadIndex);
                            if (res.code === 200){
                                layer.close(dIndex);
                                layer.msg(res.msg, {icon: 1});
                                tableReload();
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    })
                    return false;
                });
                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                layui.form.render('select');
            }
        });
    }
    /* 删除 */
    function del(ids) {
        layer.confirm('确定要删除选中数据吗?', {
            skin: 'layui-layer-admin',
            shade: .1
        }, function (i) {
            layer.close(i);
            var loadIndex = layer.load(2);
            $.ajax({
                url: baseUrl+"/fillingMast/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {ids: ids},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
                    if (res.code === 200){
                        layer.msg(res.msg, {icon: 1});
                        tableReload();
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    } else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    // 搜索
    form.on('submit(search)', function (data) {
        pageCurr = 1;
        tableReload(false);
    });
    // 重置
    form.on('submit(reset)', function (data) {
        pageCurr = 1;
        clearFormVal($('#search-box'));
        tableReload(false);
    });
    // 时间选择器
    function layDateRender(data) {
        setTimeout(function () {
            layDate.render({
                elem: '.layui-laydate-range'
                ,type: 'datetime'
                ,range: true
            });
        }, 300);
    }
    layDateRender();
});
// 关闭动作
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    tableIns.reload({
        where: searchData,
        page: {curr: pageCurr}
     });
}
src/main/webapp/static/wms/js/vacuumMast/vacuumMast.js
New file
@@ -0,0 +1,247 @@
var pageCurr;
layui.config({
    base: baseUrl + "/static/wms/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    // 数据渲染
    tableIns = table.render({
        elem: '#vacuumMast',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/vacuumMast/list/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
        toolbar: '#toolbar',
        cellMinWidth: 50,
        height: 'full-120',
        cols: [[
            {type: 'checkbox'}
            ,{field: 'id', align: 'center',title: 'ID',width: 50}
            ,{field: 'staNo', align: 'center',title: '站点'}
            ,{field: 'status', align: 'center',title: '状态'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            limit();
        }
    });
    // 监听排序事件
    table.on('sort(vacuumMast)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {curr: 1}
        });
    });
    // 监听头工具栏事件
    table.on('toolbar(vacuumMast)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id).data;
        switch(obj.event) {
            case 'addData':
                showEditModel();
                break;
            case 'deleteData':
               if (checkStatus.length === 0) {
                   layer.msg('请选择要删除的数据', {icon: 2});
                   return;
               }
               del(checkStatus.map(function (d) {
                   return d.id;
               }));
               break;
            case 'exportData':
                admin.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
                            fields.push(col.field);
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                        exportData[this.name] = this.value;
                    });
                    var param = {
                        'vacuumMast': exportData,
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/vacuumMast/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    });
                });
                break;
        }
    });
    // 监听行工具事件
    table.on('tool(vacuumMast)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'edit':
                showEditModel(data);
                break;
            case "del":
                del([data.id]);
                break;
        }
    });
    /* 弹窗 - 新增、修改 */
    function showEditModel(mData) {
        admin.open({
            type: 1,
            area: '600px',
            title: (mData ? '修改' : '添加') + '订单状态',
            content: $('#editDialog').html(),
            success: function (layero, dIndex) {
                layDateRender(mData);
                form.val('detail', mData);
                form.on('submit(editSubmit)', function (data) {
                    var loadIndex = layer.load(2);
                    $.ajax({
                        url: baseUrl+"/vacuumMast/"+(mData?'update':'add')+"/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: data.field,
                        method: 'POST',
                        success: function (res) {
                            layer.close(loadIndex);
                            if (res.code === 200){
                                layer.close(dIndex);
                                layer.msg(res.msg, {icon: 1});
                                tableReload();
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    })
                    return false;
                });
                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                layui.form.render('select');
            }
        });
    }
    /* 删除 */
    function del(ids) {
        layer.confirm('确定要删除选中数据吗?', {
            skin: 'layui-layer-admin',
            shade: .1
        }, function (i) {
            layer.close(i);
            var loadIndex = layer.load(2);
            $.ajax({
                url: baseUrl+"/vacuumMast/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {ids: ids},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
                    if (res.code === 200){
                        layer.msg(res.msg, {icon: 1});
                        tableReload();
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    } else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    // 搜索
    form.on('submit(search)', function (data) {
        pageCurr = 1;
        tableReload(false);
    });
    // 重置
    form.on('submit(reset)', function (data) {
        pageCurr = 1;
        clearFormVal($('#search-box'));
        tableReload(false);
    });
    // 时间选择器
    function layDateRender(data) {
        setTimeout(function () {
            layDate.render({
                elem: '.layui-laydate-range'
                ,type: 'datetime'
                ,range: true
            });
        }, 300);
    }
    layDateRender();
});
// 关闭动作
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    tableIns.reload({
        where: searchData,
        page: {curr: pageCurr}
     });
}
src/main/webapp/static/wms/js/wrkMastSta/wrkMastSta.js
New file
@@ -0,0 +1,272 @@
var pageCurr;
layui.config({
    base: baseUrl + "/static/wms/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    // 数据渲染
    tableIns = table.render({
        elem: '#wrkMastSta',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/wrkMastSta/list/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
        toolbar: '#toolbar',
        height: 'full-120',
        cols: [[
            {type: 'checkbox'}
            // ,{field: 'id', align: 'center',title: 'ID'}
            ,{field: 'wrkNo', align: 'center',title: '工作号'}
            ,{field: 'wrkStart', align: 'center',title: '工作档开始位置'}
            ,{field: 'wrkEnd', align: 'center',title: '工作档结束位置'}
            ,{field: 'staStart', align: 'center',title: '小车接货位置'}
            ,{field: 'staEnd', align: 'center',title: '小车放货位置'}
            // ,{field: 'type', align: 'center',title: '类型 0:满版  1:空板'}
            ,{field: 'wrkSts$', align: 'center',title: '工作状态'}
            // ,{field: 'lineNumber', align: 'center',title: '行号'}
            // ,{field: 'wrkType', align: 'center',title: '工作类型  类型  1:取(叠盘)  2:放 3:取放 4:拆盘'}
            ,{field: 'bignTime$', align: 'center',title: '标记时间'}
            // ,{field: 'wrkCrn', align: 'center',title: ''}
            ,{field: 'createTime$', align: 'center',title: '添加时间'}
            ,{field: 'updateTime$', align: 'center',title: '修改时间'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            limit();
        }
    });
    // 监听排序事件
    table.on('sort(wrkMastSta)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {curr: 1}
        });
    });
    // 监听头工具栏事件
    table.on('toolbar(wrkMastSta)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id).data;
        switch(obj.event) {
            case 'addData':
                showEditModel();
                break;
            case 'deleteData':
               if (checkStatus.length === 0) {
                   layer.msg('请选择要删除的数据', {icon: 2});
                   return;
               }
               del(checkStatus.map(function (d) {
                   return d.id;
               }));
               break;
            case 'exportData':
                admin.confirm('确定导出Excel吗', {shadeClose: true}, function(){
                    var titles=[];
                    var fields=[];
                    obj.config.cols[0].map(function (col) {
                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
                            titles.push(col.title);
                            fields.push(col.field);
                        }
                    });
                    var exportData = {};
                    $.each($('#search-box [name]').serializeArray(), function() {
                        exportData[this.name] = this.value;
                    });
                    var param = {
                        'wrkMastSta': exportData,
                        'fields': fields
                    };
                    $.ajax({
                        url: baseUrl+"/wrkMastSta/export/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify(param),
                        dataType:'json',
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll();
                            if (res.code === 200) {
                                table.exportFile(titles,res.data,'xls');
                            } else if (res.code === 403) {
                                top.location.href = baseUrl+"/";
                            } else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    });
                });
                break;
        }
    });
    // 监听行工具事件
    table.on('tool(wrkMastSta)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case 'edit':
                showEditModel(data);
                break;
            case "del":
                del([data.id]);
                break;
        }
    });
    /* 弹窗 - 新增、修改 */
    function showEditModel(mData) {
        admin.open({
            type: 1,
            area: '600px',
            title: (mData ? '修改' : '添加') + '订单状态',
            content: $('#editDialog').html(),
            success: function (layero, dIndex) {
                layDateRender(mData);
                form.val('detail', mData);
                form.on('submit(editSubmit)', function (data) {
                    var loadIndex = layer.load(2);
                    $.ajax({
                        url: baseUrl+"/wrkMastSta/"+(mData?'update':'add')+"/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: data.field,
                        method: 'POST',
                        success: function (res) {
                            layer.close(loadIndex);
                            if (res.code === 200){
                                layer.close(dIndex);
                                layer.msg(res.msg, {icon: 1});
                                tableReload();
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    })
                    return false;
                });
                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                layui.form.render('select');
            }
        });
    }
    /* 删除 */
    function del(ids) {
        layer.confirm('确定要删除选中数据吗?', {
            skin: 'layui-layer-admin',
            shade: .1
        }, function (i) {
            layer.close(i);
            var loadIndex = layer.load(2);
            $.ajax({
                url: baseUrl+"/wrkMastSta/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {ids: ids},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
                    if (res.code === 200){
                        layer.msg(res.msg, {icon: 1});
                        tableReload();
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    } else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    // 搜索
    form.on('submit(search)', function (data) {
        pageCurr = 1;
        tableReload(false);
    });
    // 重置
    form.on('submit(reset)', function (data) {
        pageCurr = 1;
        clearFormVal($('#search-box'));
        tableReload(false);
    });
    // 时间选择器
    function layDateRender(data) {
        setTimeout(function () {
            layDate.render({
                elem: '.layui-laydate-range'
                ,type: 'datetime'
                ,range: true
            });
            layDate.render({
                elem: '#createTime\\$',
                type: 'datetime',
                value: data!==undefined?data['createTime\\$']:null
            });
            layDate.render({
                elem: '#updateTime\\$',
                type: 'datetime',
                value: data!==undefined?data['updateTime\\$']:null
            });
            layDate.render({
                elem: '#bignTime\\$',
                type: 'datetime',
                value: data!==undefined?data['bignTime\\$']:null
            });
        }, 300);
    }
    layDateRender();
});
// 关闭动作
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    tableIns.reload({
        where: searchData,
        page: {curr: pageCurr}
     });
}
src/main/webapp/views/deviceOperate/rgvOperate.html
@@ -26,6 +26,8 @@
                </el-table-column>
                <el-table-column property="walkPos" label="设备状态">
                </el-table-column>
                <el-table-column property="pakMk" label="锁定状态">
                </el-table-column>
            </el-table>
        </div>
@@ -40,26 +42,37 @@
<!--                            <el-form-item label="源站/源库位">-->
<!--                                <el-input v-model="formParam.sourceStaNo" placeholder="源站/源库位"></el-input>-->
<!--                            </el-form-item>-->
                            <el-form-item label="源排">
                                <el-input v-model="formParam.sourceRow" placeholder="排"></el-input>
                            <el-form-item label="起始站">
                                <el-input v-model="formParam.sourceRow" placeholder="起始站"></el-input>
                            </el-form-item>
                            <el-form-item label="源列">
                                <el-input v-model="formParam.sourceBay" placeholder="列"></el-input>
                            <el-form-item label="目标站">
                                <el-input v-model="formParam.sourceBay" placeholder="目标站"></el-input>
                            </el-form-item>
                            <el-form-item label="源层">
                                <el-input v-model="formParam.sourceLev" placeholder="层"></el-input>
                            <el-form-item label="启动">
                                <el-button @click="initiate" type="warning">执行任务</el-button>
                            </el-form-item>
                        </el-form>
                        <div>
                            <el-button @click="requestOperate('auto')" type="warning">联机</el-button>
                            <el-button @click="requestOperate('restoreTask')" type="warning">恢复联机任务</el-button>
                            <el-button @click="requestOperate('compTask')" type="warning">强制完成任务</el-button>
                            <br/>
                            <br/>
                            <el-button @click="requestOperate('stop')" type="warning">远程急停</el-button>
<!--                            <el-button @click="requestOperate('noStop')" type="warning">取消急停</el-button>-->
                            <el-button @click="requestOperate('reset')" type="warning">系统复位</el-button>
                            <el-button v-if="demo === 'N' " @click="demos('true')" type="warning">演示</el-button>
                            <el-button v-if="demo === 'Y' " @click="demos('false')" type="warning">取消演示</el-button>
                        </div>
                        <div style="margin-top: 5px" v-if="demo === 'Y'">
                            <el-button  @click="staTova(2,1)" type="warning">输送-置换1</el-button>
                            <el-button  @click="staTova(2,3)" type="warning">输送-置换2</el-button>
                            <el-button  @click="staTova(2,5)" type="warning">输送-置换3</el-button>
                            <el-button  @click="staTova(2,7)" type="warning">输送-置换4</el-button>
                        </div>
                        <div style="margin-top: 5px" v-if="demo === 'Y'">
                            <el-button  @click="staTova(2,4)" type="warning">输送-灌装1</el-button>
                            <el-button  @click="staTova(2,6)" type="warning">输送-灌装2</el-button>
                            <el-button  @click="staTova(2,8)" type="warning">输送-灌装3</el-button>
                        </div>
                        <div style="margin-top: 5px" v-if="demo === 'Y'">
                            <el-button  @click="staTova(1,10)" type="warning">置换1-放货</el-button>
                            <el-button  @click="staTova(2,10)" type="warning">置换2-放货</el-button>
                            <el-button  @click="staTova(3,10)" type="warning">置换3-放货</el-button>
                            <el-button  @click="staTova(4,10)" type="warning">置换4-放货</el-button>
                        </div>
                    </div>
                </el-card>
@@ -84,12 +97,9 @@
                                    <el-tag>{{ tableData[currentIndex].statusType }}</el-tag>
                                </el-descriptions-item>
                                <el-descriptions-item label="任务状态">
                                    <div v-if="tableData[currentIndex].wrkStatus == 0">
                                        <el-tag>{{ tableData[currentIndex].status}}</el-tag>
                                    </div>
                                    <div v-else>
                                        <el-tag type="success">{{ tableData[currentIndex].wrkStatus$ }}</el-tag>
                                    </div>
                                </el-descriptions-item>
                                <el-descriptions-item label="设备状态">
                                    <el-tag>{{ tableData[currentIndex].walkPos }}</el-tag>
@@ -98,11 +108,12 @@
                                </el-descriptions-item>
                                <el-descriptions-item label="故障描述">{{ tableData[currentIndex].alarm }}
                                </el-descriptions-item>
                                <el-descriptions-item label="源站">{{ tableData[currentIndex].staNo }}
                                </el-descriptions-item>
                                <el-descriptions-item label="目标站">{{ tableData[currentIndex].sourceStaNo }}
                                </el-descriptions-item>
<!--                                <el-descriptions-item label="源站">{{ tableData[currentIndex].staNo }}-->
<!--                                </el-descriptions-item>-->
<!--                                <el-descriptions-item label="目标站">{{ tableData[currentIndex].sourceStaNo }}-->
<!--                                </el-descriptions-item>-->
                            </el-descriptions>
                        </div>
                    </div>
                </el-card>
@@ -142,7 +153,8 @@
                        value:'0',
                        label:'否'
                    }
                ]
                ],
                demo: 'X'
            },
            created() {
                this.init()
@@ -151,11 +163,46 @@
            },
            methods: {
                staTova(sta,end){
                    let that = this
                    that.$confirm('此操作存在风险,是否继续','提示',{
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }).then(()=>{
                        $.ajax({
                            url: baseUrl + "/rgv/rgvDemoTask",
                            headers: {
                                'token': localStorage.getItem('token')
                            },
                            data:{
                                rgvNo : this.formParam.rgvNo,
                                sta : sta,
                                end : end
                            },
                            method: 'Get',
                            success: function (res) {
                                if (res.code == 200) {
                                    that.$message({
                                        message: res.msg,
                                        type: 'success'
                                    });
                                } else {
                                    that.$message({
                                        message: res.msg,
                                        type: 'error'
                                    });
                                }
                            }
                        });
                    })
                },
                init() {
                    this.getTableData()
                    setInterval(() => {
                        this.getTableData()
                        this.demoStatus()
                    }, 1000)
                },
                handleRowClick(row, col, event) {
@@ -183,6 +230,86 @@
                        }
                    });
                },
                demoStatus() {
                    let that = this;
                    $.ajax({
                        url: baseUrl + "/rgv/demo/status",
                        data:{
                            rgvNo : this.formParam.rgvNo
                        },
                        headers: {
                            'token': localStorage.getItem('token')
                        },
                        contentType: 'application/json;charset=UTF-8',
                        method: 'get',
                        success: function (res) {
                            that.demo = res.msg
                        }
                    });
                },
                initiate(){
                    let that = this
                    that.$confirm('此操作存在风险,是否继续','提示',{
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }).then(()=>{
                        $.ajax({
                            url: baseUrl + "/rgv/operator/put",
                            headers: {
                                'token': localStorage.getItem('token')
                            },
                            data: this.formParam,
                            method: 'POST',
                            success: function (res) {
                                if (res.code == 200) {
                                    that.$message({
                                        message: res.msg,
                                        type: 'success'
                                    });
                                } else {
                                    that.$message({
                                        message: res.msg,
                                        type: 'error'
                                    });
                                }
                            }
                        });
                    })
                },
                demos(method){
                    let that = this
                    that.$confirm('此操作存在风险,是否继续','提示',{
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }).then(()=>{
                        $.ajax({
                            url: baseUrl + "/rgv/demo/status/" + method,
                            headers: {
                                'token': localStorage.getItem('token')
                            },
                            data:{
                                rgvNo : this.formParam.rgvNo
                            },
                            method: 'Get',
                            success: function (res) {
                                if (res.code == 200) {
                                    that.$message({
                                        message: res.msg,
                                        type: 'success'
                                    });
                                } else {
                                    that.$message({
                                        message: res.msg,
                                        type: 'error'
                                    });
                                }
                            }
                        });
                    })
                },
                requestOperate(method) {
                    let that = this
                    that.$confirm('此操作存在风险,是否继续','提示',{
src/main/webapp/views/fillingMast/fillingMast.html
New file
@@ -0,0 +1,98 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/wms/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/wms/css/admin.css?v=318" media="all">
    <link rel="stylesheet" href="../../static/wms/css/cool.css" media="all">
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <div class="layui-form toolbar" id="search-box">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off">
                        </div>
                    </div>
                     <div class="layui-inline" style="width: 300px">
                        <div class="layui-input-inline">
                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px">
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
                            <i class="layui-icon">&#xe666;</i>重置
                        </button>
                    </div>
                </div>
            </div>
            <table class="layui-hide" id="fillingMast" lay-filter="fillingMast"></table>
        </div>
    </div>
</div>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button>
    </div>
</script>
<script type="text/html" id="operate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<script type="text/javascript" src="../../static/wms/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/wms/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/wms/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/wms/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/wms/js/fillingMast/fillingMast.js" charset="utf-8"></script>
</body>
<!-- 表单弹窗 -->
<script type="text/html" id="editDialog">
    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
        <input name="id" type="hidden">
        <div class="layui-row">
            <div class="layui-col-md12">
                <div class="layui-form-item">
                    <label class="layui-form-label">站点: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="staNo" placeholder="请输入">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">状态: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="status" placeholder="请输入">
                    </div>
                </div>
             </div>
        </div>
        <hr class="layui-bg-gray">
        <div class="layui-form-item text-right">
            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
        </div>
    </form>
</script>
</html>
src/main/webapp/views/index.html
@@ -149,16 +149,16 @@
      }
    });
    $.ajax({
      url: baseUrl+"/loginInformation",
      data: {},
      method: 'GET',
      success: function (res) {
        var data = res.data
        $(".copyright-text").text(data.loginCopyrightText);
        $(".loginLogo").attr("src", data.loginLogo);
      }
    });
    // $.ajax({
    //   url: baseUrl+"/loginInformation",
    //   data: {},
    //   method: 'GET',
    //   success: function (res) {
    //     var data = res.data
    //     // $(".copyright-text").text(data.loginCopyrightText);
    //     // $(".loginLogo").attr("src", data.loginLogo);
    //   }
    // });
    $.ajax({
      url: baseUrl + "/license/getLicenseDays",
@@ -179,7 +179,7 @@
    // 默认加载主页
    index.loadHome({
      menuPath: baseUrl+'/views/home/console.html',
      menuPath: baseUrl+'/views/deviceOperate/rgvOperate.html',
      menuName: '<i class="layui-icon layui-icon-home"></i>'
    });
src/main/webapp/views/login.html
@@ -2,7 +2,7 @@
<html>
    <head>
        <meta charset="utf-8">
        <title>冠鸿 │ login of zoneyung wcs</title>
        <title>中扬 │ login of zoneyung wcs</title>
        <style>
            * {
                padding: 0;
@@ -237,21 +237,21 @@
        <script>
            // remember pwd
            $(function () {
                $.ajax({
                    url: baseUrl+"/loginInformation",
                    data: {},
                    method: 'GET',
                    success: function (res) {
                        var data = res.data
                        $(".copyright-text").text(data.loginCopyrightText);
                        $(".copyright-img-url").attr("src", data.loginCopyrightImg1);
                        $(".loginLogoUrl").attr("src", data.loginLogo);
                        if (data.loginCopyrightImg1 == "") {
                            $(".copyright-img-url").hide()
                        }
                    }
                });
                // $.ajax({
                //     url: baseUrl+"/loginInformation",
                //     data: {},
                //     method: 'GET',
                //     success: function (res) {
                //         var data = res.data
                //         $(".copyright-text").text(data.loginCopyrightText);
                //         // $(".copyright-img-url").attr("src", data.loginCopyrightImg1);
                //         // $(".loginLogoUrl").attr("src", data.loginLogo);
                //
                //         if (data.loginCopyrightImg1 == "") {
                //             $(".copyright-img-url").hide()
                //         }
                //     }
                // });
                var oldUserName = localStorage.getItem('oldUserName');
                var oldPass = localStorage.getItem('oldPass');
src/main/webapp/views/vacuumMast/vacuumMast.html
New file
@@ -0,0 +1,98 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/wms/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/wms/css/admin.css?v=318" media="all">
    <link rel="stylesheet" href="../../static/wms/css/cool.css" media="all">
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <div class="layui-form toolbar" id="search-box">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off">
                        </div>
                    </div>
                     <div class="layui-inline" style="width: 300px">
                        <div class="layui-input-inline">
                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px">
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
                            <i class="layui-icon">&#xe666;</i>重置
                        </button>
                    </div>
                </div>
            </div>
            <table class="layui-hide" id="vacuumMast" lay-filter="vacuumMast"></table>
        </div>
    </div>
</div>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button>
    </div>
</script>
<script type="text/html" id="operate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<script type="text/javascript" src="../../static/wms/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/wms/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/wms/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/wms/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/wms/js/vacuumMast/vacuumMast.js" charset="utf-8"></script>
</body>
<!-- 表单弹窗 -->
<script type="text/html" id="editDialog">
    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
        <input name="id" type="hidden">
        <div class="layui-row">
            <div class="layui-col-md12">
                <div class="layui-form-item">
                    <label class="layui-form-label">站点: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="staNo" placeholder="请输入">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">状态: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="status" placeholder="请输入">
                    </div>
                </div>
             </div>
        </div>
        <hr class="layui-bg-gray">
        <div class="layui-form-item text-right">
            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
        </div>
    </form>
</script>
</html>
src/main/webapp/views/wrkMastSta/wrkMastSta.html
New file
@@ -0,0 +1,164 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/wms/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/wms/css/admin.css?v=318" media="all">
    <link rel="stylesheet" href="../../static/wms/css/cool.css" media="all">
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <div class="layui-form toolbar" id="search-box">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off">
                        </div>
                    </div>
                     <div class="layui-inline" style="width: 300px">
                        <div class="layui-input-inline">
                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px">
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
                            <i class="layui-icon">&#xe666;</i>重置
                        </button>
                    </div>
                </div>
            </div>
            <table class="layui-hide" id="wrkMastSta" lay-filter="wrkMastSta"></table>
        </div>
    </div>
</div>
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button>
    </div>
</script>
<script type="text/html" id="operate">
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a>
</script>
<script type="text/javascript" src="../../static/wms/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/wms/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/wms/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/wms/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/wms/js/wrkMastSta/wrkMastSta.js" charset="utf-8"></script>
</body>
<!-- 表单弹窗 -->
<script type="text/html" id="editDialog">
    <form id="detail" lay-filter="detail" class="layui-form admin-form model-form">
        <input name="id" type="hidden">
        <div class="layui-row">
            <div class="layui-col-md12">
                <div class="layui-form-item">
                    <label class="layui-form-label layui-form-required">工作号: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="wrkNo" placeholder="请输入工作号" lay-vertype="tips" lay-verify="required">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label layui-form-required">工作档开始位置: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="wrkStart" placeholder="请输入工作档开始位置" lay-vertype="tips" lay-verify="required">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label layui-form-required">工作档结束位置: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="wrkEnd" placeholder="请输入工作档结束位置" lay-vertype="tips" lay-verify="required">
                    </div>
                </div>
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">小车接货位置: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="staStart" placeholder="请输入小车接货位置" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">小车放货位置: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="staEnd" placeholder="请输入小车放货位置" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">添加时间: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="createTime" id="createTime$" placeholder="请输入添加时间">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">修改时间: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="updateTime" id="updateTime$" placeholder="请输入修改时间">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">类型 0:满版  1:空板: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="type" placeholder="请输入类型 0:满版  1:空板" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
                <div class="layui-form-item">
                    <label class="layui-form-label layui-form-required">工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="wrkSts" placeholder="请输入工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成" lay-vertype="tips" lay-verify="required">
                    </div>
                </div>
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">行号: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="lineNumber" placeholder="请输入行号" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label layui-form-required">工作类型  类型  1:取(叠盘)  2:放 3:取放 4:拆盘: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="wrkType" placeholder="请输入工作类型  类型  1:取(叠盘)  2:放 3:取放 4:拆盘" lay-vertype="tips" lay-verify="required">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">标记时间: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="bignTime" id="bignTime$" placeholder="请输入标记时间">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="wrkCrn" placeholder="请输入">-->
<!--                    </div>-->
<!--                </div>-->
             </div>
        </div>
        <hr class="layui-bg-gray">
        <div class="layui-form-item text-right">
            <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
        </div>
    </form>
</script>
</html>