From a2c563572181cf54946020db619b6867f11f088a Mon Sep 17 00:00:00 2001 From: Junjie <fallin.jie@qq.com> Date: 星期五, 24 三月 2023 08:56:19 +0800 Subject: [PATCH] 四向穿梭车 --- src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java | 294 +++++ src/main/java/com/zy/core/enums/ShuttlePlcInputStatusType.java | 41 src/main/java/com/zy/core/model/command/ShuttleCommand.java | 98 + src/main/java/com/zy/asrs/domain/vo/ShuttleMsgTableVo.java | 44 src/main/java/com/zy/asrs/mapper/BasShuttleMapper.java | 12 src/main/resources/mapper/BasShuttleMapper.xml | 29 src/main/java/com/zy/asrs/domain/vo/ShuttleDataVo.java | 22 src/main/webapp/static/css/shuttle.css | 334 ++++++ src/main/java/com/zy/core/enums/ShuttleStatusType.java | 45 src/main/java/com/zy/asrs/service/BasShuttleService.java | 8 src/main/java/com/zy/core/enums/ShuttleErrorCodeType.java | 50 src/main/webapp/views/index.html | 3 src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java | 90 + src/main/java/com/zy/core/enums/SlaveType.java | 1 src/main/java/com/zy/core/cache/OutputQueue.java | 2 src/main/java/com/zy/core/MainProcess.java | 2 src/main/webapp/views/shuttle.html | 786 +++++++++++++++ src/main/java/com/zy/asrs/service/impl/BasShuttleServiceImpl.java | 12 src/main/java/com/zy/core/model/ShuttleSlave.java | 46 src/main/java/com/zy/asrs/entity/BasShuttle.java | 258 +++++ src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java | 27 src/main/java/com/zy/core/thread/ShuttleThread.java | 275 +++++ src/main/java/com/zy/asrs/domain/vo/ShuttleStateTableVo.java | 63 + src/main/java/com/zy/core/cache/MessageQueue.java | 14 src/main/java/com/zy/core/enums/ShuttlePlcOutputStatusType.java | 45 src/main/java/com/zy/core/ServerBootstrap.java | 16 src/main/java/com/zy/core/properties/SlaveProperties.java | 7 src/main/java/com/zy/asrs/controller/ShuttleController.java | 294 +++++ src/main/java/com/zy/core/enums/ShuttleTaskModeType.java | 40 src/main/webapp/static/js/map.json | 30 src/main/java/com/zy/asrs/domain/param/ShuttleOperatorParam.java | 26 31 files changed, 2,986 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/zy/asrs/controller/ShuttleController.java b/src/main/java/com/zy/asrs/controller/ShuttleController.java new file mode 100644 index 0000000..d1d94ea --- /dev/null +++ b/src/main/java/com/zy/asrs/controller/ShuttleController.java @@ -0,0 +1,294 @@ +package com.zy.asrs.controller; + +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.core.annotations.ManagerAuth; +import com.core.common.BaseRes; +import com.core.common.Cools; +import com.core.common.R; +import com.core.exception.CoolException; +import com.zy.asrs.domain.enums.CrnStatusType; +import com.zy.asrs.domain.param.ShuttleOperatorParam; +import com.zy.asrs.domain.param.SteModeParam; +import com.zy.asrs.domain.param.SteOperatorParam; +import com.zy.asrs.domain.vo.*; +import com.zy.asrs.entity.BasShuttle; +import com.zy.asrs.entity.BasSte; +import com.zy.asrs.entity.WrkMast; +import com.zy.asrs.service.BasShuttleService; +import com.zy.asrs.service.WrkMastService; +import com.zy.core.cache.MessageQueue; +import com.zy.core.cache.OutputQueue; +import com.zy.core.cache.SlaveConnection; +import com.zy.core.enums.*; +import com.zy.core.model.ShuttleSlave; +import com.zy.core.model.SteSlave; +import com.zy.core.model.Task; +import com.zy.core.model.command.ShuttleCommand; +import com.zy.core.model.command.SteCommand; +import com.zy.core.model.protocol.ShuttleProtocol; +import com.zy.core.model.protocol.SteProtocol; +import com.zy.core.properties.SlaveProperties; +import com.zy.core.properties.SystemProperties; +import com.zy.core.thread.ShuttleThread; +import com.zy.core.thread.SteThread; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 鍥涘悜绌挎杞︽帴鍙� + */ +@Slf4j +@RestController +@RequestMapping("/shuttle") +public class ShuttleController { + + @Autowired + private SlaveProperties slaveProperties; + @Autowired + private BasShuttleService basShuttleService; + @Autowired + private WrkMastService wrkMastService; + + @PostMapping("/table/shuttle/state") + @ManagerAuth(memo = "鍥涘悜绌挎杞︿俊鎭〃") + public R steStateTable(){ + List<ShuttleStateTableVo> list = new ArrayList<>(); + List<BasShuttle> shuttles = basShuttleService.selectList(new EntityWrapper<BasShuttle>().orderBy("shuttle_no")); + for (BasShuttle basShuttle : shuttles) { + // 琛ㄦ牸琛� + ShuttleStateTableVo vo = new ShuttleStateTableVo(); + vo.setShuttleNo(basShuttle.getShuttleNo()); //鍥涘悜绌挎杞﹀彿 + list.add(vo); + // 鑾峰彇鍥涘悜绌挎杞︿俊鎭� + ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, basShuttle.getShuttleNo()); + if (shuttleThread == null) { + continue; + } + ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); + if (shuttleProtocol == null) { + continue; + } + vo.setTaskNo(shuttleProtocol.getTaskNo().intValue()); // 浠诲姟鍙� + if (!Cools.isEmpty(shuttleProtocol.getBusyStatus())) { + vo.setStatus(shuttleProtocol.getBusyStatusType().desc); // 鐘舵�� + } + vo.setRow(shuttleProtocol.getRow()); + vo.setBay(shuttleProtocol.getBay()); + vo.setLev(shuttleProtocol.getLev()); + vo.setBatteryPower(shuttleProtocol.getBatteryPower() + "%"); + vo.setSpeed(shuttleProtocol.getCurrentMoveServoSpeed()); + if (!Cools.isEmpty(shuttleProtocol.getErrorCode())) { + vo.setAlarm1(String.valueOf(shuttleProtocol.getErrorCode())); + } + if (!Cools.isEmpty(shuttleProtocol.getStatusErrorCode())) { + vo.setAlarm2(String.valueOf(shuttleProtocol.getStatusErrorCode())); + } + } + return R.ok().add(list); + } + + @PostMapping("/table/shuttle/msg") + @ManagerAuth(memo = "鍥涘悜绌挎杞︽暟鎹〃") + public R steMsgTable(){ + List<ShuttleMsgTableVo> list = new ArrayList<>(); + List<BasShuttle> shuttles = basShuttleService.selectList(new EntityWrapper<BasShuttle>().orderBy("shuttle_no")); + for (BasShuttle basShuttle : shuttles) { + // 琛ㄦ牸琛� + ShuttleMsgTableVo vo = new ShuttleMsgTableVo(); + vo.setShuttleNo(basShuttle.getShuttleNo()); // 鍥涘悜绌挎杞﹀彿 + list.add(vo); + // 鑾峰彇绌挎杞︿俊鎭� + ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, basShuttle.getShuttleNo()); + if (shuttleThread == null) { + continue; + } + ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); + if (shuttleProtocol == null) { + continue; + } + + vo.setWorkNo(shuttleProtocol.getTaskNo().intValue()); // 浠诲姟鍙� + if (shuttleProtocol.getTaskNo() > 0) { + WrkMast wrkMast = wrkMastService.selectById(shuttleProtocol.getTaskNo()); + if (wrkMast != null) { + //vo.setStatus(CrnStatusType.process(wrkMast.getIoType()).getDesc()); // 妯″紡鐘舵�� + vo.setSourceStaNo(wrkMast.getSourceStaNo$()); // 婧愮珯 + vo.setStaNo(wrkMast.getStaNo$()); // 鐩爣绔� + vo.setSourceLocNo(wrkMast.getSourceLocNo()); // 婧愬簱浣� + vo.setLocNo(wrkMast.getLocNo()); // 鐩爣搴撲綅 + } + } + vo.setSpeed(shuttleProtocol.getCurrentMoveServoSpeed()); // 閫熷害 + vo.setPakMk(shuttleProtocol.getPakMk()); // 浣滀笟鏍囪 + } + return R.ok().add(list); + } + + @PostMapping("/output/shuttle") + @ManagerAuth + public R steOutput(){ + StringBuilder str = new StringBuilder(); + String s; + int i = 0; + while((s = OutputQueue.SHUTTLE.poll()) != null && i <=10) { + str.append("\n").append(s); + i++; + } + return R.ok().add(str.toString()); + } + + @GetMapping("/detl/{shuttleNo}") + public R steDetl(@PathVariable("shuttleNo") Integer shuttleNo){ + ShuttleDataVo vo = new ShuttleDataVo(); + for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) { + if (shuttleNo.equals(shuttleSlave.getId())) { + vo.setShuttleNo(shuttleSlave.getId()); + BasShuttle basShuttle = basShuttleService.selectById(shuttleSlave.getId()); + if (!Cools.isEmpty(basShuttle)) { + vo.setRow(basShuttle.getRow()); + vo.setBay(basShuttle.getBay()); + vo.setLev(basShuttle.getLev()); + vo.setWorkNo(basShuttle.getWrkNo()); + vo.setPakMk(basShuttle.getPakMk()); + } + break; + } + } + return R.ok().add(vo); + } + + @GetMapping("/sensor/detl/{shuttleNo}") + public R shuttleSensorDetl(@PathVariable("shuttleNo") Integer shuttleNo){ + ShuttleSensorDataVo vo = new ShuttleSensorDataVo(); + for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) { + if (shuttleNo.equals(shuttleSlave.getId())) { + vo.setShuttleNo(shuttleSlave.getId()); + // 鑾峰彇绌挎杞︿俊鎭� + ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleSlave.getId()); + if (shuttleThread == null) { + return R.error("璁惧涓嶅湪绾�"); + } + ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); + if (shuttleProtocol == null) { + return R.error("璁惧涓嶅湪绾�"); + } + + // 绌挎杞﹀紓甯� ----------- + + // 绌挎杞︽彁绀轰俊鎭� ---------------------- + + // 浠诲姟淇℃伅 ---------------- + vo.setPakInTask(shuttleProtocol.isPakInTask()); + vo.setPakOutTask(shuttleProtocol.isPakOutTask()); + vo.setPakMoveTask(shuttleProtocol.isPakMoveTask()); + vo.setGoHpTask(shuttleProtocol.isGoHpTask()); + vo.setGoOHpTask(shuttleProtocol.isGoOHpTask()); + vo.setGoHpAvoid(shuttleProtocol.isGoHpAvoid()); + vo.setGoOHpAvoid(shuttleProtocol.isGoOHpAvoid()); + vo.setPakInEmpty(shuttleProtocol.isPakInEmpty()); + vo.setPakInFinish(shuttleProtocol.isPakInFinish()); + vo.setPakOutEmpty(shuttleProtocol.isPakOutEmpty()); + vo.setPakOutFinish(shuttleProtocol.isPakOutFinish()); + vo.setGoHpAvoidFinish(shuttleProtocol.isGoHpAvoidFinish()); + vo.setGoOHpAvoidFinish(shuttleProtocol.isGoOHpAvoidFinish()); + vo.setGoHpAvoidErr(shuttleProtocol.isGoHpAvoidErr()); + vo.setGoOHpAvoidErr(shuttleProtocol.isGoOHpAvoidErr()); + + // 鐘舵�佷俊鎭� ------------- + + break; + } + } + return R.ok().add(vo); + } + + @PostMapping("/detl/update") + @ManagerAuth + public R steUpdate(ShuttleDataVo vo){ + BasShuttle basShuttle = basShuttleService.selectById(vo.getShuttleNo()); + if (basShuttle == null) { + return R.error(); + } + // 鑾峰彇鍥涘悜绌挎杞︿俊鎭� + ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, vo.getShuttleNo()); + ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); + if (shuttleProtocol == null) { + throw new CoolException(vo.getShuttleNo() + "鍙峰洓鍚戠┛姊溅涓嶅湪绾匡紝鏃犳硶淇濆瓨"); + } +// if (!Cools.isEmpty(vo.getRow(), vo.getBay(), vo.getLev())) { +// if (!shuttleThread.modifyPosHandle(vo.getRow(), vo.getBay(), vo.getLev())) { +// throw new CoolException("鏈嶅姟鍣ㄩ敊璇�"); +// } +// } + ShuttleCommand shuttleCommand = new ShuttleCommand(); + shuttleCommand.setTaskNo(vo.getWorkNo()); + if (MessageQueue.offer(SlaveType.Shuttle, vo.getShuttleNo(), new Task(2, shuttleCommand))) { + } else { + throw new CoolException("鍛戒护涓嬪彂澶辫触"); + } + basShuttle.setRow(vo.getRow()); + basShuttle.setBay(vo.getBay()); + basShuttle.setLev(vo.getLev()); + + basShuttle.setPakMk(vo.getPakMk()); + basShuttle.setWrkNo(vo.getWorkNo()); + basShuttle.setUpdateTime(new Date()); + if (!basShuttleService.updateById(basShuttle)) { + throw new CoolException("淇敼澶辫触"); + } + return R.ok(); + } + + /****************************************************************/ + /************************** 鎵嬪姩鎿嶄綔 ******************************/ + /****************************************************************/ + + @ManagerAuth(memo = "鎵嬪姩鎿嶄綔") + @PostMapping("/operator/shuttle") + public R shuttleOperator(ShuttleOperatorParam param){ + if (Cools.isEmpty(param.getShuttleNo(), param.getShuttleTaskMode())) { + return R.parse(BaseRes.PARAM); + } + + for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) { + if (param.getShuttleNo().equals(shuttleSlave.getId())) { + ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleSlave.getId()); + if (shuttleThread == null) { + throw new CoolException("鍥涘悜绌挎杞︿笉鍦ㄧ嚎"); + } + ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); + if (shuttleProtocol == null) { + throw new CoolException("鍥涘悜绌挎杞︿笉鍦ㄧ嚎"); + } + ShuttleTaskModeType shuttleTaskModeType = ShuttleTaskModeType.get(param.getShuttleTaskMode()); + ShuttleCommand shuttleCommand = new ShuttleCommand(); + shuttleCommand.setShuttleNo(shuttleSlave.getId()); // 鍥涘悜绌挎杞︾紪鍙� +// if (param.getShuttleTaskMode() == 16) { +// steCommand.setComplete(true); +// } else if (param.getSteTaskMode() == 99) { +// steCommand.setControlMode((short) 1); +// } else if (param.getSteTaskMode() == 100) { +// steCommand.setControlMode((short) 0); +// } else { +// if (steTaskModeType == null) { +// throw new CoolException("浠诲姟绫诲瀷閿欒"); +// } +// steCommand.setTaskNo(param.getTaskNo()); // 宸ヤ綔鍙� +// steCommand.setTaskMode(steTaskModeType); +// } + if (MessageQueue.offer(SlaveType.Shuttle, shuttleSlave.getId(), new Task(2, shuttleCommand))) { + return R.ok(); + } else { + throw new CoolException("鍛戒护涓嬪彂澶辫触"); + } + } + } + return R.error(); + } + +} diff --git a/src/main/java/com/zy/asrs/domain/param/ShuttleOperatorParam.java b/src/main/java/com/zy/asrs/domain/param/ShuttleOperatorParam.java new file mode 100644 index 0000000..3e198e3 --- /dev/null +++ b/src/main/java/com/zy/asrs/domain/param/ShuttleOperatorParam.java @@ -0,0 +1,26 @@ +package com.zy.asrs.domain.param; + +import lombok.Data; + +@Data +public class ShuttleOperatorParam { + + // 鍥涘悜绌挎杞﹀彿 + private Integer shuttleNo; + + // 鍛戒护绫诲瀷 + private Short shuttleTaskMode; + + // 浠诲姟鍙� + private Integer taskNo = 0; + + // 鐩爣搴撲綅-鎺� + private Short row; + + // 鐩爣搴撲綅-鍒� + private Short bay; + + // 鐩爣搴撲綅-灞� + private Short lev; + +} diff --git a/src/main/java/com/zy/asrs/domain/vo/ShuttleDataVo.java b/src/main/java/com/zy/asrs/domain/vo/ShuttleDataVo.java new file mode 100644 index 0000000..82a7f81 --- /dev/null +++ b/src/main/java/com/zy/asrs/domain/vo/ShuttleDataVo.java @@ -0,0 +1,22 @@ +package com.zy.asrs.domain.vo; + +import lombok.Data; + +@Data +public class ShuttleDataVo { + + // 鍥涘悜绌挎杞﹀彿 + private Integer shuttleNo; + + // 宸ヤ綔鍙� + private Integer workNo; + + private Integer row; + + private Integer bay; + + private Integer lev; + + private String pakMk; + +} diff --git a/src/main/java/com/zy/asrs/domain/vo/ShuttleMsgTableVo.java b/src/main/java/com/zy/asrs/domain/vo/ShuttleMsgTableVo.java new file mode 100644 index 0000000..7963b64 --- /dev/null +++ b/src/main/java/com/zy/asrs/domain/vo/ShuttleMsgTableVo.java @@ -0,0 +1,44 @@ +package com.zy.asrs.domain.vo; + +import lombok.Data; + +@Data +public class ShuttleMsgTableVo { + + // 鍥涘悜绌挎杞﹀彿 + private Integer shuttleNo; + + // 宸ヤ綔鍙� + private Integer workNo = 0; + + // 鐘舵�� + private String status = "-"; + + // 婧愮珯 + private String sourceStaNo = "-"; + + // 鐩爣绔� + private String staNo = "-"; + + // 婧愬簱浣� + private String sourceLocNo = "-"; + + // 鐩爣搴撲綅 + private String locNo = "-"; + + // 寮傚父 + private String error = ""; + + // 鍘熺偣 + private String origin = ""; + + // 鍛戒护 + private String command = ""; + + // 閫熷害 + private Double speed = 0.0D; + + // 浣滀笟鏍囪 + private String pakMk = "-"; + +} diff --git a/src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java b/src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java new file mode 100644 index 0000000..03ef340 --- /dev/null +++ b/src/main/java/com/zy/asrs/domain/vo/ShuttleSensorDataVo.java @@ -0,0 +1,90 @@ +package com.zy.asrs.domain.vo; + +import lombok.Data; + +@Data +public class ShuttleSensorDataVo { + + /** + * 鍥涘悜绌挎杞﹀彿 + */ + private Integer shuttleNo; + + // 浠诲姟淇℃伅 --------------------------------------------------------- + /** + * 96.鍏ュ簱浠诲姟涓� + */ + private boolean pakInTask; + + /** + * 97. 鍑哄簱浠诲姟涓� + */ + private boolean pakOutTask; + + /** + * 98. 绉诲簱浠诲姟涓� + */ + private boolean pakMoveTask; + + /** + * 99. 鍥炲師鐐逛换鍔′腑 + */ + private boolean goHpTask; + + /** + * 100. 鍘诲弽鍘熺偣浠诲姟涓� + */ + private boolean goOHpTask; + + /** + * 101. 鍘诲師鐐归伩璁╀綅 + */ + private boolean goHpAvoid; + + /** + * 102. 鍘诲弽鍘熺偣閬胯浣� + */ + private boolean goOHpAvoid; + + /** + * 104. 鍏ュ簱鍙栫┖缁撴潫 + */ + private boolean pakInEmpty; + + /** + * 105. 鍏ュ簱姝e父缁撴潫 + */ + private boolean pakInFinish; + + /** + * 106. 鍑哄簱鍙栫┖缁撴潫 + */ + private boolean pakOutEmpty; + + /** + * 107. 鍑哄簱姝e父缁撴潫 + */ + private boolean pakOutFinish; + + /** + * 108. 鍘诲師鐐归伩璁╁畬鎴� + */ + private boolean goHpAvoidFinish; + + /** + * 109. 鍘诲弽鍘熺偣閬胯瀹屾垚 + */ + private boolean goOHpAvoidFinish; + + /** + * 110. 鍘诲師鐐归伩璁╁畬鎴� + */ + private boolean goHpAvoidErr; + + /** + * 111. 鍘诲弽鍘熺偣閬胯瀹屾垚 + */ + private boolean goOHpAvoidErr; + + +} diff --git a/src/main/java/com/zy/asrs/domain/vo/ShuttleStateTableVo.java b/src/main/java/com/zy/asrs/domain/vo/ShuttleStateTableVo.java new file mode 100644 index 0000000..70e3c4a --- /dev/null +++ b/src/main/java/com/zy/asrs/domain/vo/ShuttleStateTableVo.java @@ -0,0 +1,63 @@ +package com.zy.asrs.domain.vo; + +import lombok.Data; + +@Data +public class ShuttleStateTableVo { + + // 鍥涘悜绌挎杞﹀彿 + private Integer shuttleNo; + + // 鐘舵�� + private String status = "-"; + + // 鏈夌墿 + private String loading = "-"; + + /** + * 浠诲姟鍙� + */ + public Integer taskNo; + + // 姝e湪鎵ц浠诲姟 + private String execute; + + // 浠诲姟瀹屾垚锛岀瓑寰匴CS纭 + private String waiting; + + // 鎺� + private Short row; + + // 鍒� + private Short bay; + + // 灞� + private Short lev; + + // 寮傚父鐮�1 + private String alarm1 = "-"; + + // 寮傚父鐮�2 + private String alarm2 = "-"; + + /** + * 鐢垫睜鐢甸噺 + */ + public String batteryPower = "-"; + + /** + * 褰撳墠閫熷害 + */ + public Double speed; + + /** + * 鍏呯數鐘舵�� + */ + public String chargeStatus = "-"; + + /** + * 褰撳墠浣嶇疆 + */ + public String loca = "-"; + +} diff --git a/src/main/java/com/zy/asrs/entity/BasShuttle.java b/src/main/java/com/zy/asrs/entity/BasShuttle.java new file mode 100644 index 0000000..999eb2b --- /dev/null +++ b/src/main/java/com/zy/asrs/entity/BasShuttle.java @@ -0,0 +1,258 @@ +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 com.core.common.SpringUtils; +import com.zy.system.service.UserService; +import com.zy.system.entity.User; +import java.text.SimpleDateFormat; +import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; +import com.core.common.SpringUtils; +import com.zy.system.service.UserService; +import com.zy.system.entity.User; +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_bas_shuttle") +public class BasShuttle implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 鍥涘悜绌挎杞﹀彿 + */ + @ApiModelProperty(value= "鍥涘悜绌挎杞﹀彿") + @TableId(value = "shuttle_no", type = IdType.INPUT) + @TableField("shuttle_no") + private Integer shuttleNo; + + /** + * 鐘舵�� 1: 姝e父 0: 绂佺敤 + */ + @ApiModelProperty(value= "鐘舵�� 1: 姝e父 0: 绂佺敤 ") + private Integer status; + + /** + * 浣滀笟鎬� + */ + @ApiModelProperty(value= "浣滀笟鎬�") + @TableField("shuttle_status") + private Integer shuttleStatus; + + /** + * 浠诲姟鍙� + */ + @ApiModelProperty(value= "浠诲姟鍙�") + @TableField("wrk_no") + private Integer wrkNo; + + /** + * 鎺� + */ + @ApiModelProperty(value= "鎺�") + private Integer row; + + /** + * 鍒� + */ + @ApiModelProperty(value= "鍒�") + private Integer bay; + + /** + * 灞� + */ + @ApiModelProperty(value= "灞�") + private Integer lev; + + /** + * 鍘嗗彶鎺� + */ + @ApiModelProperty(value= "鍘嗗彶鎺�") + @TableField("his_row") + private Integer hisRow; + + /** + * 鍘嗗彶鍒� + */ + @ApiModelProperty(value= "鍘嗗彶鍒�") + @TableField("his_bay") + private Integer hisBay; + + /** + * 鍘嗗彶灞� + */ + @ApiModelProperty(value= "鍘嗗彶灞�") + @TableField("his_lev") + private Integer hisLev; + + /** + * 鏆傚瓨搴撲綅 + */ + @ApiModelProperty(value= "鏆傚瓨搴撲綅") + @TableField("idle_loc") + private String idleLoc; + + /** + * 鑷姩鍏呯數 + */ + @ApiModelProperty(value= "鑷姩鍏呯數") + @TableField("auto_charge") + private Integer autoCharge; + + /** + * 鐢甸噺绾� + */ + @ApiModelProperty(value= "鐢甸噺绾�") + @TableField("charge_line") + private Integer chargeLine; + + /** + * 娣诲姞浜哄憳 + */ + @ApiModelProperty(value= "娣诲姞浜哄憳") + @TableField("create_by") + private Long createBy; + + /** + * 娣诲姞鏃堕棿 + */ + @ApiModelProperty(value= "娣诲姞鏃堕棿") + @TableField("create_time") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 淇敼浜哄憳 + */ + @ApiModelProperty(value= "淇敼浜哄憳") + @TableField("update_by") + private Long updateBy; + + /** + * 淇敼鏃堕棿 + */ + @ApiModelProperty(value= "淇敼鏃堕棿") + @TableField("update_time") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 澶囨敞 + */ + @ApiModelProperty(value= "澶囨敞") + private String memo; + + /** + * 鎻愬崌鏈哄彿 + */ + @ApiModelProperty(value= "鎻愬崌鏈哄彿") + @TableField("lift_no") + private Integer liftNo; + + /** + * 鏍囪 + */ + @ApiModelProperty(value= "鏍囪") + @TableField("pak_mk") + private String pakMk; + + public BasShuttle() {} + + public BasShuttle(Integer shuttleNo,Integer status,Integer shuttleStatus,Integer wrkNo,Integer row,Integer bay,Integer lev,Integer hisRow,Integer hisBay,Integer hisLev,String idleLoc,Integer autoCharge,Integer chargeLine,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo,Integer liftNo) { + this.shuttleNo = shuttleNo; + this.status = status; + this.shuttleStatus = shuttleStatus; + this.wrkNo = wrkNo; + this.row = row; + this.bay = bay; + this.lev = lev; + this.hisRow = hisRow; + this.hisBay = hisBay; + this.hisLev = hisLev; + this.idleLoc = idleLoc; + this.autoCharge = autoCharge; + this.chargeLine = chargeLine; + this.createBy = createBy; + this.createTime = createTime; + this.updateBy = updateBy; + this.updateTime = updateTime; + this.memo = memo; + this.liftNo = liftNo; + } + +// BasShuttle basShuttle = new BasShuttle( +// null, // 鍥涘悜绌挎杞﹀彿[闈炵┖] +// null, // 鐘舵�� +// null, // 浣滀笟鎬� +// null, // 浠诲姟鍙� +// null, // 鎺� +// null, // 鍒� +// null, // 灞� +// null, // 鍘嗗彶鎺� +// null, // 鍘嗗彶鍒� +// null, // 鍘嗗彶灞� +// null, // 鏆傚瓨搴撲綅 +// null, // 鑷姩鍏呯數 +// null, // 鐢甸噺绾� +// null, // 娣诲姞浜哄憳 +// null, // 娣诲姞鏃堕棿 +// null, // 淇敼浜哄憳 +// null, // 淇敼鏃堕棿 +// null, // 澶囨敞 +// null // 鎻愬崌鏈哄彿 +// ); + + public String getStatus$(){ + if (null == this.status){ return null; } + switch (this.status){ + case 1: + return "姝e父"; + case 0: + return "绂佺敤"; + default: + return String.valueOf(this.status); + } + } + + public String getCreateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.selectById(this.createBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getUsername()); + } + return null; + } + + public String getCreateTime$(){ + if (Cools.isEmpty(this.createTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); + } + + public String getUpdateBy$(){ + UserService service = SpringUtils.getBean(UserService.class); + User user = service.selectById(this.updateBy); + if (!Cools.isEmpty(user)){ + return String.valueOf(user.getUsername()); + } + return null; + } + + public String getUpdateTime$(){ + if (Cools.isEmpty(this.updateTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); + } + + +} diff --git a/src/main/java/com/zy/asrs/mapper/BasShuttleMapper.java b/src/main/java/com/zy/asrs/mapper/BasShuttleMapper.java new file mode 100644 index 0000000..d85304a --- /dev/null +++ b/src/main/java/com/zy/asrs/mapper/BasShuttleMapper.java @@ -0,0 +1,12 @@ +package com.zy.asrs.mapper; + +import com.zy.asrs.entity.BasShuttle; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface BasShuttleMapper extends BaseMapper<BasShuttle> { + +} diff --git a/src/main/java/com/zy/asrs/service/BasShuttleService.java b/src/main/java/com/zy/asrs/service/BasShuttleService.java new file mode 100644 index 0000000..ed45783 --- /dev/null +++ b/src/main/java/com/zy/asrs/service/BasShuttleService.java @@ -0,0 +1,8 @@ +package com.zy.asrs.service; + +import com.zy.asrs.entity.BasShuttle; +import com.baomidou.mybatisplus.service.IService; + +public interface BasShuttleService extends IService<BasShuttle> { + +} diff --git a/src/main/java/com/zy/asrs/service/impl/BasShuttleServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasShuttleServiceImpl.java new file mode 100644 index 0000000..7c3f623 --- /dev/null +++ b/src/main/java/com/zy/asrs/service/impl/BasShuttleServiceImpl.java @@ -0,0 +1,12 @@ +package com.zy.asrs.service.impl; + +import com.zy.asrs.mapper.BasShuttleMapper; +import com.zy.asrs.entity.BasShuttle; +import com.zy.asrs.service.BasShuttleService; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service("basShuttleService") +public class BasShuttleServiceImpl extends ServiceImpl<BasShuttleMapper, BasShuttle> implements BasShuttleService { + +} diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java index 0380f0b..4651f27 100644 --- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java +++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java @@ -30,13 +30,11 @@ import com.zy.core.model.command.LedCommand; import com.zy.core.model.command.SteCommand; import com.zy.core.model.protocol.CrnProtocol; +import com.zy.core.model.protocol.ShuttleProtocol; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.model.protocol.SteProtocol; 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.core.thread.SteThread; +import com.zy.core.thread.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -612,6 +610,27 @@ } /** + * 鍏ュ嚭搴� ===>> 鍥涘悜绌挎杞﹀叆鍑哄簱浣滀笟涓嬪彂 + */ + public synchronized void shuttleIoExecute() { + for (ShuttleSlave shuttle : slaveProperties.getShuttle()) { + //鑾峰彇鍥涘悜绌挎杞︿俊鎭� + ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttle.getId()); + ShuttleProtocol shuttleProtocol = shuttleThread.getShuttleProtocol(); + if (shuttleProtocol == null) { + continue; + } + + // 鍙湁褰撳洓鍚戠┛姊溅绌洪棽 骞朵笖鏃犱换鍔℃椂鎵嶇户缁墽琛� + if (shuttleProtocol.getBusyStatusType() == ShuttleStatusType.IDLE && shuttleProtocol.getTaskNo() == 0) { + //鍏ュ嚭搴撻�昏緫 + //..... + } + } + + } + + /** * 鍏ュ嚭搴� ===>> 鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂 */ public synchronized void crnIoExecute(){ diff --git a/src/main/java/com/zy/core/MainProcess.java b/src/main/java/com/zy/core/MainProcess.java index c5895a9..6e02faa 100644 --- a/src/main/java/com/zy/core/MainProcess.java +++ b/src/main/java/com/zy/core/MainProcess.java @@ -57,6 +57,8 @@ mainService.crnStnToOutStn(); // 鍏ュ嚭搴� ===>> 鍫嗗灈鏈哄叆鍑哄簱浣滀笟涓嬪彂 mainService.crnIoExecute(); + // 鍏ュ嚭搴� ===>> 鍥涘悜绌挎杞﹀叆鍑哄簱浣滀笟涓嬪彂 + mainService.shuttleIoExecute(); // 鍏ュ簱 ===>> 鎵ц鍫嗗灈鏈哄宸ヤ綔妗g殑瀹屾垚鎿嶄綔 mainService.storeFinished(); // 鍏ュ簱 ===>> 鎵ц绌挎杞﹀宸ヤ綔妗g殑瀹屾垚鎿嶄綔 diff --git a/src/main/java/com/zy/core/ServerBootstrap.java b/src/main/java/com/zy/core/ServerBootstrap.java index 151df14..6d94ede 100644 --- a/src/main/java/com/zy/core/ServerBootstrap.java +++ b/src/main/java/com/zy/core/ServerBootstrap.java @@ -3,10 +3,7 @@ import com.zy.core.cache.MessageQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.SlaveType; -import com.zy.core.model.CrnSlave; -import com.zy.core.model.DevpSlave; -import com.zy.core.model.LedSlave; -import com.zy.core.model.SteSlave; +import com.zy.core.model.*; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.*; import lombok.extern.slf4j.Slf4j; @@ -73,6 +70,10 @@ for (Slave ste : slaveProperties.getSte()) { MessageQueue.init(SlaveType.Ste, ste); } + // 鍒濆鍖栧洓鍚戠┛姊溅mq + for (Slave shuttle : slaveProperties.getShuttle()) { + MessageQueue.init(SlaveType.Shuttle, shuttle); + } } private void initThread(){ @@ -97,6 +98,13 @@ new Thread((Runnable) devpThread).start(); SlaveConnection.put(SlaveType.Devp, devp.getId(), devpThread); } + // 鍒濆鍖栧洓鍚戠┛姊溅 + News.info("鍒濆鍖栧洓鍚戠┛姊溅......................................................"); + for (ShuttleSlave shuttleSlave : slaveProperties.getShuttle()) { + ShuttleThread shuttleThread = new ShuttleThread(shuttleSlave); + new Thread(shuttleThread).start(); + SlaveConnection.put(SlaveType.Shuttle, shuttleSlave.getId(), shuttleThread); + } // 鍒濆鍖栨潯鐮佹壂鎻忎华绾跨▼ News.info("鍒濆鍖栨潯鐮佹壂鎻忎华绾跨▼..................................................."); for (Slave barcode : slaveProperties.getBarcode()) { diff --git a/src/main/java/com/zy/core/cache/MessageQueue.java b/src/main/java/com/zy/core/cache/MessageQueue.java index ed5b018..bc17bec 100644 --- a/src/main/java/com/zy/core/cache/MessageQueue.java +++ b/src/main/java/com/zy/core/cache/MessageQueue.java @@ -29,6 +29,8 @@ private static final Map<Integer, ConcurrentLinkedQueue<Task>> SCALE_EXCHANGE = new ConcurrentHashMap<>(); // 鍙拌溅mq浜ゆ崲鏈� private static final Map<Integer, ConcurrentLinkedQueue<Task>> CAR_EXCHANGE = new ConcurrentHashMap<>(); + //鍥涘悜绌挎杞q浜ゆ崲鏈� + private static final Map<Integer, ConcurrentLinkedQueue<Task>> SHUTTLE_EXCHANGE = new ConcurrentHashMap<>(); /** * mq 浜ゆ崲鏈哄垵濮嬪寲 @@ -56,6 +58,9 @@ case Car: CAR_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>()); break; + case Shuttle: + SHUTTLE_EXCHANGE.put(slave.getId(), new ConcurrentLinkedQueue<>()); + break; default: break; } @@ -81,6 +86,8 @@ return SCALE_EXCHANGE.get(id).offer(task); case Car: return CAR_EXCHANGE.get(id).offer(task); + case Shuttle: + return SHUTTLE_EXCHANGE.get(id).offer(task); default: return false; } @@ -106,6 +113,8 @@ return SCALE_EXCHANGE.get(id).poll(); case Car: return CAR_EXCHANGE.get(id).poll(); + case Shuttle: + return SHUTTLE_EXCHANGE.get(id).poll(); default: return null; } @@ -130,6 +139,8 @@ return SCALE_EXCHANGE.get(id).peek(); case Car: return CAR_EXCHANGE.get(id).peek(); + case Shuttle: + return SHUTTLE_EXCHANGE.get(id).peek(); default: return null; } @@ -158,6 +169,9 @@ case Car: CAR_EXCHANGE.get(id).clear(); break; + case Shuttle: + SHUTTLE_EXCHANGE.get(id).clear(); + break; default: break; } diff --git a/src/main/java/com/zy/core/cache/OutputQueue.java b/src/main/java/com/zy/core/cache/OutputQueue.java index b8bf8fa..6a18ab3 100644 --- a/src/main/java/com/zy/core/cache/OutputQueue.java +++ b/src/main/java/com/zy/core/cache/OutputQueue.java @@ -17,5 +17,7 @@ public static ArrayBlockingQueue<JSONObject> BARCODE = new ArrayBlockingQueue<>(32); // 绌挎杞﹁緭鍑烘棩蹇� public static ArrayBlockingQueue<String> STE = new ArrayBlockingQueue<>(32); + //鍥涘悜绌挎杞﹁緭鍑烘棩蹇� + public static ArrayBlockingQueue<String> SHUTTLE = new ArrayBlockingQueue<>(32); } diff --git a/src/main/java/com/zy/core/enums/ShuttleErrorCodeType.java b/src/main/java/com/zy/core/enums/ShuttleErrorCodeType.java new file mode 100644 index 0000000..bd4797d --- /dev/null +++ b/src/main/java/com/zy/core/enums/ShuttleErrorCodeType.java @@ -0,0 +1,50 @@ +package com.zy.core.enums; + +/** + * 鍥涘悜绌挎杞� + * Wm204 閿欒缂栧彿 + */ +public enum ShuttleErrorCodeType { + + NORMAL(0, "鏃犻敊璇�"), + PCB_SUBMODULE(1, "PCB瀛愭ā鍧�"), + PCB_PLATE(2, "PCB鏉�"), + SERVO(10, "浼烘湇"), + CANOPEN(11, "canopen"), + RUN_ERROR(14, "杩愯閿欒"), + SYSTEM_ERROR(16, "绯荤粺閿欒") + ; + + public Integer id; + public String desc; + + ShuttleErrorCodeType(Integer id, String desc) { + this.id = id; + this.desc = desc; + } + + public static ShuttleErrorCodeType get(Integer id) { + if (null == id) { + return null; + } + for (ShuttleErrorCodeType type : ShuttleErrorCodeType.values()) { + if (type.id.equals(id.intValue())) { + return type; + } + } + return null; + } + + public static ShuttleErrorCodeType get(ShuttleErrorCodeType type) { + if (null == type) { + return null; + } + for (ShuttleErrorCodeType shuttleErrorCodeType : ShuttleErrorCodeType.values()) { + if (shuttleErrorCodeType == type) { + return shuttleErrorCodeType; + } + } + return null; + } + +} diff --git a/src/main/java/com/zy/core/enums/ShuttlePlcInputStatusType.java b/src/main/java/com/zy/core/enums/ShuttlePlcInputStatusType.java new file mode 100644 index 0000000..d9df63f --- /dev/null +++ b/src/main/java/com/zy/core/enums/ShuttlePlcInputStatusType.java @@ -0,0 +1,41 @@ +package com.zy.core.enums; + +/** + * 鍥涘悜绌挎杞� + * Wm207 PLC杈撳叆鐘舵�� + */ +public enum ShuttlePlcInputStatusType { + + LIFT_STATUS(Byte.parseByte("6"), "鎵樼洏椤堕儴浼犳劅鍣ㄧ姸鎬�") + ; + + public byte id; + public String desc; + + ShuttlePlcInputStatusType(byte id, String desc) { + this.id = id; + this.desc = desc; + } + + public static ShuttlePlcInputStatusType get(byte id) { + for (ShuttlePlcInputStatusType type : ShuttlePlcInputStatusType.values()) { + if (type.id == id) { + return type; + } + } + return null; + } + + public static ShuttlePlcInputStatusType get(ShuttlePlcInputStatusType type) { + if (null == type) { + return null; + } + for (ShuttlePlcInputStatusType shuttlePlcInputStatusType : ShuttlePlcInputStatusType.values()) { + if (shuttlePlcInputStatusType == type) { + return shuttlePlcInputStatusType; + } + } + return null; + } + +} diff --git a/src/main/java/com/zy/core/enums/ShuttlePlcOutputStatusType.java b/src/main/java/com/zy/core/enums/ShuttlePlcOutputStatusType.java new file mode 100644 index 0000000..dd67492 --- /dev/null +++ b/src/main/java/com/zy/core/enums/ShuttlePlcOutputStatusType.java @@ -0,0 +1,45 @@ +package com.zy.core.enums; + +/** + * 鍥涘悜绌挎杞� + * WM205 Plc杈撳嚭鐘舵�両O + */ +public enum ShuttlePlcOutputStatusType { + + NULL(Byte.parseByte("0"), "绌�"), + LIFT(Byte.parseByte("1"), "椤跺崌浣�"), + TURN(Byte.parseByte("2"), "杞悜浣�"), + BRAKE(Byte.parseByte("3"), "鎶遍椄浣�"), + CHARGE(Byte.parseByte("4"), "鍐茬數浣�") + ; + + public byte id; + public String desc; + + ShuttlePlcOutputStatusType(byte id, String desc) { + this.id = id; + this.desc = desc; + } + + public static ShuttlePlcOutputStatusType get(byte id) { + for (ShuttlePlcOutputStatusType type : ShuttlePlcOutputStatusType.values()) { + if (type.id == id) { + return type; + } + } + return null; + } + + public static ShuttlePlcOutputStatusType get(ShuttlePlcOutputStatusType type) { + if (null == type) { + return null; + } + for (ShuttlePlcOutputStatusType shuttlePlcOutputStatusType : ShuttlePlcOutputStatusType.values()) { + if (shuttlePlcOutputStatusType == type) { + return shuttlePlcOutputStatusType; + } + } + return null; + } + +} diff --git a/src/main/java/com/zy/core/enums/ShuttleStatusType.java b/src/main/java/com/zy/core/enums/ShuttleStatusType.java new file mode 100644 index 0000000..36fc6d4 --- /dev/null +++ b/src/main/java/com/zy/core/enums/ShuttleStatusType.java @@ -0,0 +1,45 @@ +package com.zy.core.enums; + +/** + * 鍥涘悜绌挎杞� + * Wm200 灏忚溅蹇欑姸鎬佷綅 + */ +public enum ShuttleStatusType { + + IDLE(false, "绌洪棽"), + BUSY(true, "蹇�"), + ; + + public Boolean id; + public String desc; + + ShuttleStatusType(Boolean id,String desc) { + this.id = id; + this.desc = desc; + } + + public static ShuttleStatusType get(Boolean id) { + if (null == id) { + return null; + } + for (ShuttleStatusType type : ShuttleStatusType.values()) { + if (type.id.equals(id.booleanValue())) { + return type; + } + } + return BUSY; + } + + public static ShuttleStatusType get(ShuttleStatusType type) { + if (null == type) { + return null; + } + for (ShuttleStatusType shuttleStatusType : ShuttleStatusType.values()) { + if (shuttleStatusType == type) { + return shuttleStatusType; + } + } + return null; + } + +} diff --git a/src/main/java/com/zy/core/enums/ShuttleTaskModeType.java b/src/main/java/com/zy/core/enums/ShuttleTaskModeType.java new file mode 100644 index 0000000..a24d901 --- /dev/null +++ b/src/main/java/com/zy/core/enums/ShuttleTaskModeType.java @@ -0,0 +1,40 @@ +package com.zy.core.enums; + +public enum ShuttleTaskModeType { + + INIT(0, "鍒濆"), // 鍒濆 + ; + + public Integer id; + public String desc; + + ShuttleTaskModeType(Integer id, String desc) { + this.id = id; + this.desc = desc; + } + + public static ShuttleTaskModeType get(Short id) { + if (null == id) { + return null; + } + for (ShuttleTaskModeType type : ShuttleTaskModeType.values()) { + if (type.id.equals(id.intValue())) { + return type; + } + } + return null; + } + + public static ShuttleTaskModeType get(ShuttleTaskModeType type) { + if (null == type) { + return null; + } + for (ShuttleTaskModeType shuttleTaskModeType : ShuttleTaskModeType.values()) { + if (shuttleTaskModeType == type) { + return shuttleTaskModeType; + } + } + return null; + } + +} diff --git a/src/main/java/com/zy/core/enums/SlaveType.java b/src/main/java/com/zy/core/enums/SlaveType.java index c6c2f6c..86d676a 100644 --- a/src/main/java/com/zy/core/enums/SlaveType.java +++ b/src/main/java/com/zy/core/enums/SlaveType.java @@ -9,6 +9,7 @@ Scale, Car, Ste, + Shuttle, ; public static SlaveType findInstance(String s){ diff --git a/src/main/java/com/zy/core/model/ShuttleSlave.java b/src/main/java/com/zy/core/model/ShuttleSlave.java new file mode 100644 index 0000000..2635e5f --- /dev/null +++ b/src/main/java/com/zy/core/model/ShuttleSlave.java @@ -0,0 +1,46 @@ +package com.zy.core.model; + +import com.zy.core.Slave; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.ArrayList; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ShuttleSlave extends Slave { + + private Integer rack; + + private Integer slot; + + private Boolean demo; + + // 绌挎杞﹀叆搴撶珯鐐� + private List<Sta> shuttleInStn = new ArrayList<>(); + + // 绌挎杞﹀嚭搴撶珯鐐� + private List<Sta> shuttleOutStn = new ArrayList<>(); + + @Data + public static class Sta { + + // 杈撻�佺嚎plc缂栧彿 + private Integer devpPlcId; + + // 绌挎杞︾珯鐐圭紪鍙� + private Integer staNo; + + // 鎺� + private Integer row; + + // 鍒� + private Integer bay; + + // 灞� + private Integer lev; + + } + +} diff --git a/src/main/java/com/zy/core/model/command/ShuttleCommand.java b/src/main/java/com/zy/core/model/command/ShuttleCommand.java new file mode 100644 index 0000000..7acb6d6 --- /dev/null +++ b/src/main/java/com/zy/core/model/command/ShuttleCommand.java @@ -0,0 +1,98 @@ +package com.zy.core.model.command; + +import lombok.Data; + +@Data +public class ShuttleCommand { + + /** + * 鍥涘悜绌挎杞﹀彿 + */ + private Integer shuttleNo = 0; + + /** + * 浠诲姟鍙� + */ + private Integer taskNo = 0; + + /** + * 浣滀笟绫诲瀷 + */ + private Short taskMode = 0; + + /** + * 浠诲姟纭 false锛氭湭纭 true锛氬凡纭 + */ + private Boolean complete = Boolean.FALSE; + + /** + * 鎺у埗鎸囦护瀛� + */ + private Integer commandWord; + + /** + * 鍚浜岀淮缂栧彿 + */ + private String startCodeNum; + + /** + * 涓棿浜岀淮缂栧彿 + */ + private String middleCodeNum; + + /** + * 鐩爣浜岀淮缂栧彿 + */ + private String distCodeNum; + + /** + * 璧风偣鍒扮洰鏍囩偣鐨勮窛绂婚暱搴� + */ + private Integer startToDistDistance; + + /** + * 涓棿鐐瑰埌鐩爣鐐圭殑璺濈闀垮害 + */ + private Integer middleToDistDistance; + + /** + * 灏忚溅杩愯鏂瑰悜 + */ + private Integer runDirection; + + /** + * 鎵樼洏椤跺崌 + */ + private Integer palletLift; + + /** + * 灏忚溅寮哄埗绉诲姩璺濈 + */ + private Integer forceMoveDistance; + + /** + * 鍏呯數寮�鍏� + */ + private Integer chargeSwitch; + + /** + * 灏忚溅IO鎺у埗 + */ + private byte IOControl; + + /** + * 灏忚溅杩愯閫熷害 + */ + private Integer runSpeed; + + /** + * 灏忚溅闆疯揪澶囩敤 + */ + private Integer radarTmp; + + /** + * 鎸囦护缁撴潫浣� + */ + private Integer commandEnd; + +} diff --git a/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java b/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java new file mode 100644 index 0000000..b82f97b --- /dev/null +++ b/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java @@ -0,0 +1,294 @@ +package com.zy.core.model.protocol; + +import com.zy.core.enums.ShuttleStatusType; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +/** + * 鍥涘悜绌挎杞� + */ +@Slf4j +@Data +public class ShuttleProtocol { + + /** + * 鍥涘悜绌挎杞﹀彿 + */ + private Short shuttleNo; + + /** + * 浠诲姟鍙� + */ + public Short taskNo = 0; + + /** + * 鎺� + */ + public Short row; + + /** + * 鍒� + */ + public Short bay; + + /** + * 灞� + */ + public Short lev; + + /** + * 鎺у埗鎸囦护瀛� + */ + private Integer commandWord; + + /** + * 鍚浜岀淮缂栧彿 + */ + private Integer startCodeNum; + + /** + * 涓棿浜岀淮缂栧彿 + */ + private Integer middleCodeNum; + + /** + * 鐩爣浜岀淮缂栧彿 + */ + private Integer distCodeNum; + + /** + * 璧风偣鍒扮洰鏍囩偣鐨勮窛绂婚暱搴� + */ + private Integer startToDistDistance; + + /** + * 涓棿鐐瑰埌鐩爣鐐圭殑璺濈闀垮害 + */ + private Integer middleToDistDistance; + + /** + * 灏忚溅杩愯鏂瑰悜 + */ + private Integer runDirection; + + /** + * 鎵樼洏椤跺崌 + */ + private Integer palletLift; + + /** + * 灏忚溅寮哄埗绉诲姩璺濈 + */ + private Integer forceMoveDistance; + + /** + * 鍏呯數寮�鍏� + */ + private Integer chargeSwitch; + + /** + * 灏忚溅IO鎺у埗 + */ + private Integer IOControl; + + /** + * 灏忚溅杩愯閫熷害 + */ + private Integer runSpeed; + + /** + * 灏忚溅闆疯揪澶囩敤 + */ + private Integer radarTmp; + + /** + * 鎸囦护缁撴潫浣� + */ + private Integer commandEnd; + + + /** + * 灏忚溅蹇欑姸鎬佷綅 + * true: 蹇� + * false: 绌洪棽 + */ + private Boolean busyStatus; + + /** + * 灏忚溅蹇欑姸鎬佷綅鏋氫妇 + */ + private ShuttleStatusType busyStatusType; + + /** + * 褰撳墠浜岀淮鐮� + * 0涓虹┖ + */ + private String currentCode; + + /** + * 鐢垫睜鐢甸噺鐧惧垎姣� + */ + private Double batteryPower; + + /** + * 鐢垫睜娓╁害 + */ + private Double batteryTemp; + + /** + * 閿欒缂栧彿 + */ + private Integer errorCode; + + /** + * Plc杈撳嚭鐘舵�両O + */ + private byte plcOutputStatusIO; + + /** + * 閿欒淇℃伅鐮� + */ + private Integer statusErrorCode; + + /** + * PLC杈撳叆鐘舵�� + */ + private byte plcInputStatus; + + /** + * 褰撳墠鎴栬�呬箣鍓嶈鍒扮殑浜岀淮鐮佸�� + */ + private String currentOrBeforeCode; + + /** + * 璇诲埌鐨勪簩缁寸爜X鏂瑰悜鍋忕Щ閲� + */ + private Integer codeOffsetX; + + /** + * 璇诲埌鐨勪簩缁寸爜Y鏂瑰悜鍋忕Щ閲� + */ + private Integer codeOffsetY; + + /** + * 褰撳墠鐨勭數鍘嬪�� + */ + private Double currentVoltage; + + /** + * 褰撳墠鐨勬ā鎷熼噺鍊� + */ + private Integer currentAnalogValue; + + /** + * 褰撳墠鐨勫崌闄嶄己鏈嶉�熷害 + */ + private Double currentLiftServoSpeed; + + /** + * 褰撳墠鐨勮璧颁己鏈嶉�熷害 + */ + private Double currentMoveServoSpeed; + + /** + * 褰撳墠鐨勫崌闄嶄己鏈嶈礋杞界巼 + */ + private Double currentLiftServoLoad; + + /** + * 褰撳墠鐨勮璧颁己鏈嶈礋杞界巼 + */ + private Double currentMoveServoLoad; + + /** + * 浣滀笟鏍囪 + */ + private String pakMk = "-"; + + // 浠诲姟淇℃伅 --------------------------------------------------------- + /** + * 96.鍏ュ簱浠诲姟涓� + */ + private boolean pakInTask; + + /** + * 97. 鍑哄簱浠诲姟涓� + */ + private boolean pakOutTask; + + /** + * 98. 绉诲簱浠诲姟涓� + */ + private boolean pakMoveTask; + + /** + * 99. 鍥炲師鐐逛换鍔′腑 + */ + private boolean goHpTask; + + /** + * 100. 鍘诲弽鍘熺偣浠诲姟涓� + */ + private boolean goOHpTask; + + /** + * 101. 鍘诲師鐐归伩璁╀綅 + */ + private boolean goHpAvoid; + + /** + * 102. 鍘诲弽鍘熺偣閬胯浣� + */ + private boolean goOHpAvoid; + + /** + * 104. 鍏ュ簱鍙栫┖缁撴潫 + */ + private boolean pakInEmpty; + + /** + * 105. 鍏ュ簱姝e父缁撴潫 + */ + private boolean pakInFinish; + + /** + * 106. 鍑哄簱鍙栫┖缁撴潫 + */ + private boolean pakOutEmpty; + + /** + * 107. 鍑哄簱姝e父缁撴潫 + */ + private boolean pakOutFinish; + + /** + * 108. 鍘诲師鐐归伩璁╁畬鎴� + */ + private boolean goHpAvoidFinish; + + /** + * 109. 鍘诲弽鍘熺偣閬胯瀹屾垚 + */ + private boolean goOHpAvoidFinish; + + /** + * 110. 鍘诲師鐐归伩璁╁畬鎴� + */ + private boolean goHpAvoidErr; + + /** + * 111. 鍘诲弽鍘熺偣閬胯瀹屾垚 + */ + private boolean goOHpAvoidErr; + + public void setBusyStatus(Boolean status) { + this.busyStatus = status; + this.busyStatusType = ShuttleStatusType.get(status); + } + + public void setBusyStatus(ShuttleStatusType type) { + this.busyStatus = type.id.booleanValue(); + this.busyStatusType = type; + } + +} diff --git a/src/main/java/com/zy/core/properties/SlaveProperties.java b/src/main/java/com/zy/core/properties/SlaveProperties.java index b40fca2..4d026aa 100644 --- a/src/main/java/com/zy/core/properties/SlaveProperties.java +++ b/src/main/java/com/zy/core/properties/SlaveProperties.java @@ -1,10 +1,7 @@ package com.zy.core.properties; import com.zy.core.Slave; -import com.zy.core.model.CrnSlave; -import com.zy.core.model.DevpSlave; -import com.zy.core.model.LedSlave; -import com.zy.core.model.SteSlave; +import com.zy.core.model.*; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @@ -42,4 +39,6 @@ private List<Slave> car = new ArrayList<>(); + private List<ShuttleSlave> shuttle = new ArrayList<>(); + } diff --git a/src/main/java/com/zy/core/thread/ShuttleThread.java b/src/main/java/com/zy/core/thread/ShuttleThread.java new file mode 100644 index 0000000..224377b --- /dev/null +++ b/src/main/java/com/zy/core/thread/ShuttleThread.java @@ -0,0 +1,275 @@ +package com.zy.core.thread; + +import HslCommunication.Core.Transfer.DataFormat; +import HslCommunication.Core.Types.OperateResult; +import HslCommunication.Core.Types.OperateResultExOne; +import HslCommunication.ModBus.ModbusTcpNet; +import HslCommunication.Profinet.Siemens.SiemensPLCS; +import HslCommunication.Profinet.Siemens.SiemensS7Net; +import com.alibaba.fastjson.JSON; +import com.core.common.DateUtils; +import com.core.common.RadixTools; +import com.core.exception.CoolException; +import com.zy.core.News; +import com.zy.core.ThreadHandler; +import com.zy.core.cache.MessageQueue; +import com.zy.core.cache.OutputQueue; +import com.zy.core.cache.SlaveConnection; +import com.zy.core.enums.ShuttleStatusType; +import com.zy.core.enums.SlaveType; +import com.zy.core.model.ShuttleSlave; +import com.zy.core.model.SteSlave; +import com.zy.core.model.Task; +import com.zy.core.model.command.ShuttleCommand; +import com.zy.core.model.command.SteCommand; +import com.zy.core.model.protocol.ShuttleProtocol; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.text.MessageFormat; +import java.util.Date; + +/** + * 鍥涘悜绌挎杞︾嚎绋� + */ +@Data +@Slf4j +public class ShuttleThread implements Runnable, ThreadHandler { + + private ModbusTcpNet modbusTcpNet; + private ShuttleSlave slave; + private ShuttleProtocol shuttleProtocol; + private SiemensS7Net siemensS7Net; + + public ShuttleThread(ShuttleSlave slave) { + this.slave = slave; + } + + @Override + public void run() { + this.connect(); + while (true) { + try { + int step = 1; + Task task = MessageQueue.poll(SlaveType.Shuttle, slave.getId()); + if (task != null) { + step = task.getStep(); + } + switch (step) { + // 璇绘暟鎹� + case 1: + readStatus(); + break; + // 鍐欏叆鏁版嵁 + case 2: + write((ShuttleCommand) task.getData()); + break; + default: + break; + } + Thread.sleep(500); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @Override + public boolean connect() { + boolean result = false; + //-------------------------鍥涘悜绌挎杞﹁繛鎺ユ柟娉�------------------------// + modbusTcpNet = new ModbusTcpNet(slave.getIp(), slave.getPort(), (byte) 0x01); + // 褰撲綘闇�瑕佹寚瀹氭牸寮忕殑鏁版嵁瑙f瀽鏃讹紝灏遍渶瑕佽缃笅闈㈢殑杩欎釜淇℃伅 + modbusTcpNet.setDataFormat(DataFormat.ABCD); + OperateResult connect = modbusTcpNet.ConnectServer(); + if(connect.IsSuccess){ + result = true; + OutputQueue.CRN.offer(MessageFormat.format( "銆恵0}銆戝洓鍚戠┛姊溅plc杩炴帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); + log.info("鍥涘悜绌挎杞lc杩炴帴鎴愬姛 ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort()); + } else { + OutputQueue.CRN.offer(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅plc杩炴帴澶辫触锛侊紒锛� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); + log.error("鍥涘悜绌挎杞lc杩炴帴澶辫触锛侊紒锛� ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort()); + } + modbusTcpNet.ConnectClose(); + //-------------------------鍥涘悜绌挎杞﹁繛鎺ユ柟娉�------------------------// + return result; + } + + @Override + public void close() { + + } + + private void readStatus() { + try { + OperateResultExOne<byte[]> result = modbusTcpNet.Read("0", (short) 17); + if (result.IsSuccess) { + if (null == shuttleProtocol) { + shuttleProtocol = new ShuttleProtocol(); + shuttleProtocol.setShuttleNo(slave.getId().shortValue()); + } + + //----------璁剧疆鍥涘悜绌挎杞︾姸鎬�----------- + //鑾峰彇鏁版嵁 + byte[] content = result.Content; + + //--------鎺у埗瀛�-------- + //鎺у埗鎸囦护瀛� + shuttleProtocol.setCommandWord(modbusTcpNet.getByteTransform().TransUInt16(content, 0)); + //鍚浜岀淮缂栧彿 + shuttleProtocol.setStartCodeNum(modbusTcpNet.getByteTransform().TransUInt16(content, 2)); + //涓棿浜岀淮缂栧彿 + shuttleProtocol.setMiddleCodeNum(modbusTcpNet.getByteTransform().TransUInt16(content, 4)); + //鐩爣浜岀淮缂栧彿 + shuttleProtocol.setDistCodeNum(modbusTcpNet.getByteTransform().TransUInt16(content, 6)); + //璧风偣鍒扮洰鏍囩偣鐨勮窛绂婚暱搴� + shuttleProtocol.setStartToDistDistance(modbusTcpNet.getByteTransform().TransInt32(content, 8)); + //涓棿鐐瑰埌鐩爣鐐圭殑璺濈闀垮害 + shuttleProtocol.setMiddleToDistDistance(modbusTcpNet.getByteTransform().TransInt32(content, 12)); + //灏忚溅杩愯鏂瑰悜 + shuttleProtocol.setRunDirection(modbusTcpNet.getByteTransform().TransUInt16(content, 16)); + //鎵樼洏椤跺崌 + shuttleProtocol.setPalletLift(modbusTcpNet.getByteTransform().TransUInt16(content,18)); + //灏忚溅寮哄埗绉诲姩璺濈 + shuttleProtocol.setForceMoveDistance(modbusTcpNet.getByteTransform().TransInt32(content, 20)); + //鍏呯數寮�鍏� + shuttleProtocol.setChargeSwitch(modbusTcpNet.getByteTransform().TransUInt16(content,24)); + //灏忚溅IO鎺у埗 + shuttleProtocol.setIOControl(modbusTcpNet.getByteTransform().TransUInt16(content,26)); + //灏忚溅杩愯閫熷害 + shuttleProtocol.setRunSpeed(modbusTcpNet.getByteTransform().TransUInt16(content,28)); + //灏忚溅闆疯揪澶囩敤 + shuttleProtocol.setRadarTmp(modbusTcpNet.getByteTransform().TransUInt16(content,30)); + //鎸囦护缁撴潫浣� + shuttleProtocol.setCommandEnd(modbusTcpNet.getByteTransform().TransUInt16(content,32)); + + + //---------鐘舵�佸瓧--------- +// shuttleProtocol.setBusyStatus(modbusTcpNet.getByteTransform().TransUInt16(content,32)); + + ///璁剧疆鍥涘悜绌挎杞︾姸鎬�-end + OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId())); + //璇诲彇鍥涘悜绌挎杞﹁澶囦俊鎭紝鎻愪緵鏌ヨ + //..... + + + // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴� + //..... + + + }else { + OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆憑1}鍥涘悜绌挎杞lc鐘舵�佷俊鎭け璐�", DateUtils.convert(new Date()), slave.getId())); + throw new CoolException(MessageFormat.format( "鍥涘悜绌挎杞lc鐘舵�佷俊鎭け璐� ===>> [id:{0}] [ip:{1}] [port:{2}]", slave.getId(), slave.getIp(), slave.getPort())); + } + } catch (Exception e) { + OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); + initShuttle(); + } + } + + private boolean write(ShuttleCommand command){ + if (null == command) { + News.error("鍥涘悜绌挎杞﹀啓鍏ュ懡浠や负绌�"); + return false; + } + + //鍒ゆ柇灏忚溅鏄惁鍦ㄥ厖鐢� + SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, 1); + if (devpThread.charge1){ + + } + + command.setShuttleNo(slave.getId()); + OperateResult result = null; + // 寮�濮嬩换鍔� + //... + + + try { + // 鏃ュ織璁板綍 + if (!command.getComplete() && command.getTaskMode() != 0) { + //鏃ュ織璁板綍淇濆瓨鍒版暟鎹簱涓� + //..... + } + } catch (Exception ignore) {} + + if (result != null && result.IsSuccess) { + // 缁存姢鏁版嵁搴撴帓鍒楀眰 +// if (!steProtocol.getWaiting()) { +// if (!Cools.isEmpty(command.getRow(), command.getBay(), command.getLev())) { +// this.modifyPos(command.getRow().intValue(), command.getBay().intValue(), command.getLev().intValue()); +// } +// } + + News.info("鍥涘悜绌挎杞﹀懡浠や笅鍙慬id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command)); + OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] >>>>> 鍛戒护涓嬪彂锛� {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command))); + return true; + } else { + OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝啓鍏ュ洓鍚戠┛姊溅plc鏁版嵁澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); + News.error("鍐欏叆鍥涘悜绌挎杞lc鏁版嵁澶辫触 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort()); + return false; + } + } + + /** + * 鍒濆鍖栧洓鍚戠┛姊溅 + */ + private void initShuttle() { + if (null == shuttleProtocol) { + shuttleProtocol = new ShuttleProtocol(); + } + shuttleProtocol.setShuttleNo(slave.getId().shortValue()); + shuttleProtocol.setBusyStatus(ShuttleStatusType.BUSY); + shuttleProtocol.setCurrentCode("0"); + } + + /******************************************************************************************/ + /**************************************** 娴嬭瘯涓撶敤 *****************************************/ + /*****************************************************************************************/ + public static void main(String[] args) throws InterruptedException { + ShuttleSlave slave = new ShuttleSlave(); + slave.setId(1); + slave.setIp("192.168.4.24"); + slave.setPort(502); + ShuttleThread thread = new ShuttleThread(slave); + thread.connect(); + thread.readStatus(); + System.out.println(JSON.toJSONString(thread.shuttleProtocol)); + + // 浠诲姟浣滀笟 +// SteCommand command = new SteCommand(); +// command.setSteNo(1); // 鍫嗗灈鏈虹紪鍙� +// Random random = new Random(); +// int taskNo = random.nextInt(9090); +// command.setTaskNo(taskNo); // 宸ヤ綔鍙� +// command.setTaskMode(SteTaskModeType.MOVE_LEFT); // 浠诲姟妯″紡 +// thread.write(command); + + // 浠诲姟瀹屾垚 +// SteCommand command = new SteCommand(); +// command.setSteNo(1); // 鍫嗗灈鏈虹紪鍙� +// command.setComplete(Boolean.TRUE); // 浠诲姟妯″紡 +// thread.write(command); + + // 鎺у埗妯″紡 +// SteCommand command = new SteCommand(); +// command.setControlMode((short) 1); +// thread.write(command); + + // 澶嶄綅淇″彿 +// SteCommand command = new SteCommand(); +// command.setReset(Boolean.TRUE); +// thread.write(command); + + // 鍒犻櫎鎸囦护 +// SteCommand command = new SteCommand(); +// command.setDelete(Boolean.TRUE); +// thread.write(command); + + // 绌挎杞﹁繍琛岀姝� +// SteCommand command = new SteCommand(); +// command.setRun((short)0); +// thread.write(command); + + } +} diff --git a/src/main/resources/mapper/BasShuttleMapper.xml b/src/main/resources/mapper/BasShuttleMapper.xml new file mode 100644 index 0000000..724891e --- /dev/null +++ b/src/main/resources/mapper/BasShuttleMapper.xml @@ -0,0 +1,29 @@ +<?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.BasShuttleMapper"> + + <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 --> + <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasShuttle"> + <result column="shuttle_no" property="shuttleNo" /> + <result column="status" property="status" /> + <result column="shuttle_status" property="shuttleStatus" /> + <result column="wrk_no" property="wrkNo" /> + <result column="row" property="row" /> + <result column="bay" property="bay" /> + <result column="lev" property="lev" /> + <result column="his_row" property="hisRow" /> + <result column="his_bay" property="hisBay" /> + <result column="his_lev" property="hisLev" /> + <result column="idle_loc" property="idleLoc" /> + <result column="auto_charge" property="autoCharge" /> + <result column="charge_line" property="chargeLine" /> + <result column="create_by" property="createBy" /> + <result column="create_time" property="createTime" /> + <result column="update_by" property="updateBy" /> + <result column="update_time" property="updateTime" /> + <result column="memo" property="memo" /> + <result column="lift_no" property="liftNo" /> + + </resultMap> + +</mapper> diff --git a/src/main/webapp/static/css/shuttle.css b/src/main/webapp/static/css/shuttle.css new file mode 100644 index 0000000..b507363 --- /dev/null +++ b/src/main/webapp/static/css/shuttle.css @@ -0,0 +1,334 @@ +body { + background-color: #6CA7A8; +} +.button-window { + float: left; + width: 100%; + height: 100%; + padding: 10px; + background-color: #6CA7A8; + border-radius: 5px; + box-shadow: 0 0 3px rgba(0 0 0 .3); +} +/* -------------------- 绗竴妯″潡 -------------------- */ +.log-board { + background-color: #fff; + border-radius: 5px; + box-shadow: 0 0 3px rgba(0,0,0,.3); + height: 25%; +} +/* 宸� */ +.command-log { + float: left; + height: 100%; + width: 20%; + text-align: center; +} +.command-log h2 { + padding: 10px; +} + +.shuttle-command-item { + padding: 4px 0; + margin-top: 5px; +} +.shuttle-command-item label { + font-size: 20px; + font-weight: bold; + vertical-align: middle; +} +.demoBtn { + vertical-align: middle; + /*width: 30%;*/ + height: 30px; + left: 0; + top: 0; + padding: 5px 15px; + text-shadow: inherit; + font-size: 15px; + margin-left: 5px; + margin-right: 5px; + display: inline-block; + background-color: #FF5722; + border: none; + color: #FFF; + box-shadow: 1px 1px 5px #B6B6B6; + border-radius: 3px; + cursor: pointer; +} +.demoBtn:hover { + opacity: 0.8 +} +.demoBtn:focus { + outline: 0; +} + +/* 鍙� */ +.shuttle-state { + float: left; + height: 100%; + width: 80%; + overflow: auto; +} +/* 绌挎杞︾姸鎬佽〃 */ +#shuttle-state-table { + font-size: 12px; + border-collapse: collapse; + margin: 0 auto; + text-align: center; +} +#shuttle-state-table td, #shuttle-state-table th { + border: 1px solid #cad9ea; + color: #666; + height: 25px; +} +#shuttle-state-table thead th { + background-color: #CCE8EB; + width: 300px; +} +#shuttle-state-table tr:nth-child(odd) { + background: #fff; +} +#shuttle-state-table tr:nth-child(even) { + background: #F5FAFA; +} + +/* -------------------- 绗簩妯″潡 -------------------- */ +.shuttle-msg { + /*overflow: auto;*/ + margin-top: 10px; + height: 23%; + background-color: #fff; + border-radius: 5px; + box-shadow: 0 0 3px rgba(0,0,0,.3); +} +/* 鍫嗗灈鏈虹姸鎬佷俊鎭〃 */ +#shuttle-msg-table { + font-size: 12px; + border-collapse: collapse; + margin: 0 auto; + text-align: center; +} +#shuttle-msg-table td, #shuttle-msg-table th { + border: 1px solid #f1f1f1; + color: #666; + height: 30px; +} +#shuttle-msg-table thead th { + background-color: #fff; + width: 400px; +} +#shuttle-msg-table tr:nth-child(odd) { + background: #fff; +} +#shuttle-msg-table tr:nth-child(even) { + background: #fff; +} + +/* -------------------- 绗笁妯″潡 -------------------- */ + +.shuttle-operation { + position: relative; + margin-top: 10px; + height: 25%; + background-color: #fff; + border-radius: 5px; + box-shadow: 0 0 3px rgba(0,0,0,.3); +} + +/* 浠诲姟璁惧閫夋嫨妗� */ +.task-select { + width: 13%; + height: 100%; + overflow: hidden; + display: inline-block; + padding: 20px 0 10px 20px; + /*clear: right;*/ +} +.operator-item { + display: inline-block; + height: 100%; + text-align: center; + position: relative; + vertical-align: middle; + padding: 0 20px; +} +.operator-item .select-title { + display: inline-block; + position: absolute; + top: -11px; + left: 50%; + transform: translate(-50%, 0); + background-color: #fff; + color: #2e95d3; + font-size: 12px; + border: 1px solid #8d8d8d; + border-radius: 5px; + padding: 5px; + z-index: 999; +} +.operator-item .select-container { + padding: 30px 0; + height: 100%; + border: 1px solid #8d8d8d; + border-radius: 5px; +} +#shuttle-select .select-container label { + display: block; + padding: 5px 40px; + vertical-align: middle; margin-top:-2px; margin-bottom:1px; + +} +.select-container input { + display: inline-block; + font-size: 12px; + vertical-align: middle; margin-top:-2px; margin-bottom:1px; +} +.select-container-item { + display: inline-block; + padding: 0 10px; +} +.select-container-item input { + height: 20px; + border: 1px solid #8D8D8D; + border-radius: 3px; + width: 80px; + outline: none; +} + +/* 浠诲姟浣滀笟閫夋嫨妗� */ +.task-operator { + width: 86%; + height: 100%; + overflow: hidden; + padding: 5px 0 10px 20px; + display: inline-block; + margin-right: 10px; +} +.task-operator fieldset { + padding: 15px 20px 5px 50px; + /*border-width: 1px;*/ + /*border-style: solid;*/ + height: 100%; + border: 1px solid #8d8d8d; + border-radius: 5px; +} +.task-operator legend { + background-color: #fff; + color: #2e95d3; + font-size: 12px; + border: 1px solid #8d8d8d; + border-radius: 5px; + padding: 5px; + z-index: 999; +} +button.item { + margin-top: 5px; + border: 1px solid #333; + font-size: 13px; + padding: 1px 1px 1px 1px; + width: 100px; + height: 40px; + outline: none; + cursor: pointer; + color: #333; + background-color: transparent; + margin-right: 5px; + border-radius: 5px; +} +button.item:hover { + background-color: #333; + color: #fff; +} + +/* 鎵嬪姩鎿嶄綔閬僵 */ +.shuttle-operation-shade { + position: absolute; + height: 100%; + width: 100%; + z-index: 1000; + text-align: center; + padding: 80px 0; +} +.shuttle-operation-shade-span { + font-size: xx-large; + font-weight: bold; + color: red; +} + +/* -------------------- 绗洓妯″潡 -------------------- */ +.shuttle-output-board { + margin-top: 10px; + height: 20%; + background-color: #fff; + border-radius: 5px; + box-shadow: 0 0 3px rgba(0,0,0,.3); +} +#shuttle-output { + border-left: none; + border-right: none; + border-top: 1px solid #9d9d9d; + border-bottom: 1px solid #333; + width: 100%; + height: 100%; + overflow: auto; + resize:none; + color: #666; +} + + +/* 璇︽儏寮瑰嚭灞� */ +#shuttle-detl { + padding: 30px 10px 0 25px; + overflow: hidden; +} +#shuttle-detl form { + overflow: hidden; +} +.form-item { + margin-bottom: 10px; +} +.form-label { + display: inline-block; + width: 130px; + text-align: right; +} +.form-input { + display: inline-block; + padding-left: 15px; +} +.form-input input { + outline-style: none ; + border: 1px solid #ccc; + border-radius: 3px; + padding: 5px 8px; + width: 150px; + height: 30px; + font-size: 14px; + font-weight: bolder; +} +.form-input input:focus{ + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6) +} +.form-button-container { + text-align: center; +} +.form-button { + margin: 10px 10px; + width: 50px; + height: 30px; + color:white; + background-color:cornflowerblue; + border-radius: 3px; + border-width: 0; + outline: none; + font-size: 15px; + text-align: center; + cursor: pointer; +} +.form-button:hover { + opacity: 0.7; +} diff --git a/src/main/webapp/static/js/map.json b/src/main/webapp/static/js/map.json index c0e9b7c..6670040 100644 --- a/src/main/webapp/static/js/map.json +++ b/src/main/webapp/static/js/map.json @@ -1072,8 +1072,8 @@ "value": -1, "data": "" }, { - "value": 4, - "data": "200" + "value": -1, + "data": "" }, { "value": -1, "data": "" @@ -1151,11 +1151,11 @@ "value": -1, "data": "" }, { - "value": 4, - "data": "201" + "value": -1, + "data": "" }, { - "value": 4, - "data": "202" + "value": -1, + "data": "" }, { "value": -1, "data": "" @@ -1233,11 +1233,11 @@ "value": -1, "data": "" }, { - "value": 4, - "data": "203" + "value": -1, + "data": "" }, { "value": 4, - "data": "204" + "data": "100" }, { "value": -1, "data": "" @@ -1316,10 +1316,10 @@ "data": "" }, { "value": 4, - "data": "205" + "data": "104" }, { "value": 4, - "data": "206" + "data": "101" }, { "value": -1, "data": "" @@ -1397,11 +1397,11 @@ "value": -1, "data": "" }, { - "value": -1, - "data": "" + "value": 4, + "data": "103" }, { "value": 4, - "data": "207" + "data": "102" }, { "value": -1, "data": "" @@ -1483,7 +1483,7 @@ "data": "" }, { "value": 4, - "data": "208" + "data": "" }, { "value": 0, "data": "" diff --git a/src/main/webapp/views/index.html b/src/main/webapp/views/index.html index 738eb63..043106d 100644 --- a/src/main/webapp/views/index.html +++ b/src/main/webapp/views/index.html @@ -21,7 +21,8 @@ <li><a id="console" onclick="nav(this.id)" class="nav-select" href="#">涓绘帶鍥�</a></li> <li><a id="pipeline" onclick="nav(this.id)" class="nav-unselect" href="#">杈撻�佽澶�</a></li> <li><a id="crn" onclick="nav(this.id)" class="nav-unselect" href="#">鍫嗗灈鏈�</a></li> - <li><a id="ste" onclick="nav(this.id)" class="nav-unselect" href="#">绌挎杞�</a></li> +<!-- <li><a id="ste" onclick="nav(this.id)" class="nav-unselect" href="#">绌挎杞�</a></li>--> + <li><a id="shuttle" onclick="nav(this.id)" class="nav-unselect" href="#">鍥涘悜绌挎杞�</a></li> </ul> </div> </div> diff --git a/src/main/webapp/views/shuttle.html b/src/main/webapp/views/shuttle.html new file mode 100644 index 0000000..f1eafbb --- /dev/null +++ b/src/main/webapp/views/shuttle.html @@ -0,0 +1,786 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>鍥涘悜绌挎杞︾洃鎺х鐞�</title> + <link rel="stylesheet" type="text/css" href="../static/css/normalize.css"> + <link rel="stylesheet" type="text/css" href="../static/css/common.css"> + <link rel="stylesheet" type="text/css" href="../static/layui/css/layui.css"> + <link rel="stylesheet" href="../static/css/shuttle.css"> + <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script> + <script type="text/javascript" src="../static/js/layer/layer.js"></script> + <script type="text/javascript" src="../static/layui/layui.js"></script> + <script type="text/javascript" src="../static/js/common.js"></script> +</head> +<body> + <div style="padding: 10px;height: 100%;float: left;width: 6%"> + <div class="button-window"></div> + </div> + <div style="height: 100%;padding-left: 6%"> + <div style="padding: 10px;height: 100%"> + <!-- 鏃ュ織鐩戞帶鏉� --> + <div class="log-board"> + <div class="command-log" id="commandLogId"> +<!-- <div data-shuttleNo="1" class="shuttle-command-item">--> +<!-- <label>1#</label>--> +<!-- <button class="demoBtn pos-btn">鏁版嵁缁存姢</button>--> +<!-- <button id="mode-1" class="demoBtn mode-btn" >璁惧淇℃伅</button>--> +<!-- </div>--> + </div> + <!-- 鍫嗗灈鏈虹姸鎬佷綅淇℃伅 --> + <div class="shuttle-state"> + <table id="shuttle-state-table"> + <thead> + <tr> + <th>鍥涘悜绌挎杞�</th> + <th>寰呭畾</th> + <th>鐘舵��</th> + <th>鏈夌墿</th> + <th>鍦ㄨ建</th> + <th>鐢甸噺</th> + <th>鎺�</th> + <th>鍒�</th> + <th>灞�</th> + <th>绛夊緟WCS纭</th> + <th>瀹氫綅</th> + <th>鍏呯數鐘舵��</th> + <th>鎶ヨ淇℃伅1</th> + <th>鎶ヨ淇℃伅2</th> + </tr> + </thead> + <tbody> + </tbody> + </table> + </div> + </div> + <!-- 绌挎杞︾姸鎬� --> + <div class="shuttle-msg"> + <table id="shuttle-msg-table"> + <thead> + <tr> + <th>鍥涘悜绌挎杞�</th> + <th>宸ヤ綔鍙�</th> + <th>鐘舵��</th> + <th>婧愮珯</th> + <th>鐩爣绔�</th> + <th>婧愬簱浣�</th> + <th>鐩爣搴撲綅</th> + <th>閫熷害</th> + <th>浣滀笟鏍囪</th> + </tr> + </thead> + <tbody> + </tbody> + </table> + </div> + <!-- 鎵嬪姩鎿嶄綔 --> + <div class="shuttle-operation"> + <!-- 閬僵灞� --> + <div class="shuttle-operation-shade"> + <span class="shuttle-operation-shade-span"> + WCS 绯荤粺杩愯涓紝璇峰仠姝㈠悗鎿嶄綔 + </span> + </div> + <!-- 璁惧浠诲姟閫夋嫨 --> + <div class="task-select"> + <!-- 閫夋嫨 --> + <div id="shuttle-select" class="operator-item"> + <span class="select-title">鍥涘悜绌挎杞﹀彿</span> + <div class="select-container" id="shuttleRadioBoxId"> +<!-- <label><input type="radio" name="shuttleSelect" value="1" checked> 1鍙风┛姊溅</label>--> + </div> + </div> + </div> + + <!-- 璁惧浠诲姟鎿嶄綔 --> + <div class="task-operator"> + <div style="display: flex;"> + <div class="task-operator" style="height: auto;width: auto;"> + <div class="operator-item" style="height: auto"> + <span class="select-title">婧愮珯/婧愬簱浣�</span> + <div class="select-container" style="height: auto"> + <div class="select-container-item"> + <span>绔�</span> + <label><input id="sourceStaNo" type="number" name="points" min="0" /></label> + </div> + <div class="select-container-item"> + <span>鎺�</span> + <label><input id="sourceRow" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label> + </div> + <div class="select-container-item"> + <span>鍒�</span> + <label><input id="sourceBay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label> + </div> + <div class="select-container-item"> + <span>灞�</span> + <label><input id="sourceLev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label> + </div> + </div> + </div> + </div> + + <div class="task-operator" style="height: auto;width: auto;"> + <div class="operator-item" style="height: auto"> + <span class="select-title">婧愮珯/婧愬簱浣�</span> + <div class="select-container" style="height: auto"> + <div class="select-container-item"> + <span>绔�</span> + <label><input id="distStaNo" type="number" name="points" min="0" /></label> + </div> + <div class="select-container-item"> + <span>鎺�</span> + <label><input id="distRow" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label> + </div> + <div class="select-container-item"> + <span>鍒�</span> + <label><input id="distBay" type="number" name="points" min="0" style="background-color: #a9eeff" value="0" /></label> + </div> + <div class="select-container-item"> + <span>灞�</span> + <label><input id="distLev" type="number" name="points" min="1" style="background-color: #a9eeff" value="1" /></label> + </div> + </div> + </div> + </div> + </div> + + <fieldset style="height: auto;padding-bottom: 20px;"> + <legend>鎵嬪姩鎿嶄綔</legend> + <div class="button-group"> + <button class="item" onclick="shuttleOperator(4)">鎵樼洏椤跺崌</button> + <button class="item" onclick="shuttleOperator(4)">鎵樼洏鏀句笅</button> + <button class="item" onclick="shuttleOperator(5)">宸︾Щ</button> + <button class="item" onclick="shuttleOperator(6)">鍙崇Щ</button> + <button class="item" onclick="shuttleOperator(7)">鍓嶇Щ</button> + <button class="item" onclick="shuttleOperator(8)">鍚庣Щ</button> + <button class="item" onclick="shuttleOperator(9)">寮哄埗绉诲姩</button> + <button class="item" onclick="shuttleOperator(16)">浠诲姟瀹屾垚</button> + </div> + </fieldset> + </div> + + </div> + <!-- 绌挎杞︽棩蹇楄緭鍑� --> + <div class="shuttle-output-board"> + <textarea id="shuttle-output"></textarea> + </div> + </div> + </div> + + <div id="shuttle-detl" style="display: none"> + <div> + <div class="form-item"> + <label class="form-label">鍥涘悜绌挎杞﹀彿:</label> + <div class="form-input"> + <input id="shuttleNo" name="shuttleNo" class="layui-input" lay-verify="required|number" autocomplete="off" disabled="disabled"> + </div> + </div> + <div class="form-item"> + <label class="form-label">宸ヤ綔鍙�:</label> + <div class="form-input"> + <input id="workNo" name="workNo" type="number" class="layui-input" lay-verify="number" autocomplete="off"> + </div> + </div> + <div class="form-item"> + <label class="form-label">鎺�:</label> + <div class="form-input"> + <input id="row" name="row" type="number" class="layui-input" lay-verify="number" autocomplete="off"> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍒�:</label> + <div class="form-input"> + <input id="bay" name="bay" type="number" class="layui-input" autocomplete="off"> + </div> + </div> + <div class="form-item"> + <label class="form-label">灞�:</label> + <div class="form-input"> + <input id="lev" name="lev" type="number" class="layui-input" autocomplete="off"> + </div> + </div> + <div class="form-item"> + <label class="form-label">浣滀笟鏍囪:</label> + <div class="form-input"> + <input id="pakMk" name="pakMk" type="text" class="layui-input" autocomplete="off"> + </div> + </div> + <div class="form-item form-button-container"> + <button class="form-button" id="save">淇濆瓨</button> + <button class="form-button" id="cancel" style="background-color: #D0D0D0">鍙栨秷</button> + </div> + </div> + </div> + <div id="shuttle-detl2" style="display: none"> + <div style="width: 1400px"> + <div class="form-item" style="text-align: left"> + <spen style="margin: 20px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted;"> + 寮傚父锛�<spen style="color: #FD482C;">鉁�</spen> + </spen> + <spen style="margin: 20px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style: double;"> + 姝e父锛�<spen style="color: #00FF00;">鈥�</spen> + </spen> + </div> + <div style="float:left;margin: 10px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted;"> + <div class="form-item" style="text-align: center"> + <label>鍥涘悜绌挎杞﹀紓甯�</label> + </div> + <div class="form-item"> + <label class="form-label">鍥涘悜绌挎杞﹀彿:</label> + <div class="form-input"> + <input id="shuttleNo1" name="shuttleNo" class="layui-input" lay-verify="required|number" autocomplete="off" disabled="disabled" readonly> + </div> + </div> + + </div> + <div style="float:left;margin: 10px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted"> + <div class="form-item" style="text-align: center"> + <label>鍥涘悜绌挎杞︽彁绀轰俊鎭�</label> + </div> + + </div> + <div style="float:left;margin: 10px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted"> + <div class="form-item" style="text-align: center"> + <label>浠诲姟淇℃伅</label> + </div> + <div class="form-item"> + <label class="form-label">鍏ュ簱浠诲姟涓�:</label> + <div class="form-input"> + <input id="pakInTask" name="pakInTask" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍑哄簱浠诲姟涓�:</label> + <div class="form-input"> + <input id="pakOutTask" name="pakOutTask" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">绉诲簱浠诲姟涓�:</label> + <div class="form-input"> + <input id="pakMoveTask" name="pakMoveTask" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍥炲師鐐逛换鍔′腑:</label> + <div class="form-input"> + <input id="goHpTask" name="goHpTask" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍘诲弽鍘熺偣浠诲姟涓�:</label> + <div class="form-input"> + <input id="goOHpTask" name="goOHpTask" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍘诲師鐐归伩璁╀綅:</label> + <div class="form-input"> + <input id="goHpAvoid" name="goHpAvoid" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍘诲弽鍘熺偣閬胯浣�:</label> + <div class="form-input"> + <input id="goOHpAvoid" name="goOHpAvoid" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍏ュ簱鍙栫┖缁撴潫:</label> + <div class="form-input"> + <input id="pakInEmpty" name="pakInEmpty" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍏ュ簱姝e父缁撴潫:</label> + <div class="form-input"> + <input id="pakInFinish" name="pakInFinish" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍑哄簱鍙栫┖缁撴潫:</label> + <div class="form-input"> + <input id="pakOutEmpty" name="pakOutEmpty" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍑哄簱姝e父缁撴潫:</label> + <div class="form-input"> + <input id="pakOutFinish" name="pakOutFinish" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍘诲師鐐归伩璁╁畬鎴�:</label> + <div class="form-input"> + <input id="goHpAvoidFinish" name="goHpAvoidFinish" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍘诲弽鍘熺偣閬胯瀹屾垚:</label> + <div class="form-input"> + <input id="goOHpAvoidFinish" name="goOHpAvoidFinish" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍘诲師鐐归伩璁╁畬鎴�:</label> + <div class="form-input"> + <input id="goHpAvoidErr" name="goHpAvoidErr" class="layui-input" autocomplete="off" readonly> + </div> + </div> + <div class="form-item"> + <label class="form-label">鍘诲弽鍘熺偣閬胯瀹屾垚:</label> + <div class="form-input"> + <input id="goOHpAvoidErr" name="goOHpAvoidErr" class="layui-input" autocomplete="off" readonly> + </div> + </div> + </div> + <div style="float:left;margin: 10px 10px 10px 10px; padding: 10px 10px 10px 10px;border: black;border-width: 3px;border-style:dotted"> + <div class="form-item" style="text-align: center"> + <label>鐘舵�佷俊鎭�</label> + </div> +<!-- <div class="form-item">--> +<!-- <label class="form-label">鑱旀満妯″紡:</label>--> +<!-- <div class="form-input">--> +<!-- <input id="autoMode" name="autoMode" class="layui-input" autocomplete="off" readonly>--> +<!-- </div>--> +<!-- </div>--> +<!-- <div class="form-item">--> +<!-- <label class="form-label">鐢靛帇杩囦綆:</label>--> +<!-- <div class="form-input">--> +<!-- <input id="voltageLow" name="voltageLow" class="layui-input" autocomplete="off" readonly>--> +<!-- </div>--> +<!-- </div>--> + </div> + </div> + </div> +</body> +</html> +<script> + // 绌虹櫧琛屾暟 + var shuttleStateTableBlankRows = 0; + var shuttleMsgTableBlankRows = 0; + // 瀹為檯琛屾暟 + var shuttleStateTableFullRows = 0; + var shuttleMsgTableFullRows = 0; + // 鍒濆鍖� + var shuttleOutputDom = document.getElementById("shuttle-output"); + $(document).ready(function() { + initShuttleStateTable(); + getShuttleStateInfo(); + initShuttleMsgTable(); + getShuttleMsgInfo(); + operatorBlockShow(); + setShuttleRadio(); + }); + + setInterval(function () { + getShuttleStateInfo() + getShuttleMsgInfo(); + },1000) + setInterval(function () { + getShuttleOutput(); + operatorBlockShow(); + },500); + + // 鍒ゆ柇鎵嬪姩鎿嶄綔妯″潡鏄惁鍙敤 + function operatorBlockShow() { + if (parent.systemRunning) { + $('.shuttle-operation').css("opacity", "0.5"); + $('.shuttle-operation-shade').show(); + $('.shuttle-operation-shade-span').show(); + } else { + $('.shuttle-operation').css("opacity", "1"); + $('.shuttle-operation-shade').hide(); + $('.shuttle-operation-shade-span').hide(); + } + } + + var layerIdx; + $(document).on('click ','.pos-btn', function () { + let shuttleNo = Number($(this).parent().attr("data-shuttleNo")); + layerIdx = layer.open({ + type: 1, + title: false, + shadeClose: true, + offset: [$(this).offset().top + 30 + 'px', $(this).offset().left + 'px'], + anim: 5, + shade: [0], + area: ['310px', '370px'], + closeBtn: 0, + content: $("#shuttle-detl"), + success: function(layero, index){ + http.get(baseUrl+ "/shuttle/detl/"+shuttleNo, null, function (res) { + $('#shuttleNo').val(shuttleNo); + $('#workNo').val(res.data.workNo); + $('#row').val(res.data.row); + $('#bay').val(res.data.bay); + $('#lev').val(res.data.lev); + $('#crnNo').val(res.data.crnNo); + $('#pakMk').val(res.data.pakMk); + }) + }, + end: function () { + $('#shuttleNo').val(""); + $('#workNo').val(""); + $('#row').val(""); + $('#bay').val(""); + $('#lev').val(""); + $('#crnNo').val(""); + $('#pakMk').val(""); + } + }) + }) + + var layerIdx0; + $(document).on('click ','.mode-btn', function () { + let shuttleNo = Number($(this).parent().attr("data-shuttleNo")); + layerIdx0 = layer.open({ + type: 1, + title: false, + shadeClose: true, + offset: [$(this).offset().top + 30 + 'px', $(this).offset().left + 'px'], + anim: 5, + shade: [0], + area: ['70%', '85%'], + closeBtn: 0, + content: $("#shuttle-detl2"), + success: function(layero, index){ + console.log(shuttleNo) + http.get(baseUrl+ "/shuttle/sensor/detl/"+shuttleNo, null, function (res) { + $('#shuttleNo1').val(res.data.shuttleNo); + // getColor(res.data.liftErr,'#liftErr'); + // getColor(res.data.inFetchErr,'#inFetchErr'); + // getColor(res.data.outFetchErr,'#outFetchErr'); + // getColor(res.data.antiErr,'#antiErr'); + // getColor(res.data.liftSwitchErr,'#liftSwitchErr'); + // getColor(res.data.trackErr,'#trackErr'); + // getColor(res.data.timeoutErr,'#timeoutErr'); + // getColor(res.data.connectErr,'#connectErr'); + // getColor(res.data.emergencyErr,'#emergencyErr'); + // getColor(res.data.taskTypeErr,'#taskTypeErr'); + // getColor(res.data.taskNoErr,'#taskNoErr'); + // getColor(res.data.newTaskErr,'#newTaskErr'); + // getColor(res.data.errTaskErr,'#errTaskErr'); + // getColor(res.data.stopErr,'#stopErr'); + // getColor(res.data.offlineTaskErr,'#offlineTaskErr'); + // getColor(res.data.startTaskErr,'#startTaskErr'); + // getColor(res.data.voltageTaskErr,'#voltageTaskErr'); + // getColor(res.data.devpErr,'#devpErr'); + // getColor(res.data.online,'#online'); + // getColor(res.data.notOnTrack,'#notOnTrack'); + // getColor(res.data.lowVoltage,'#lowVoltage'); + // getColor(res.data.electricityLoss,'#electricityLoss'); + // getColor(res.data.forcedTravel,'#forcedTravel'); + // getColor(res.data.demoMode,'#demoMode'); + // getColor(res.data.brushConnect,'#brushConnect'); + // getColor(res.data.taskManualForbid,'#taskManualForbid'); + // getColor(res.data.onlineManualForbid,'#onlineManualForbid'); + // getColor(res.data.devpEmergency,'#devpEmergency'); + // getColor(res.data.taskInterrupt,'#taskInterrupt'); + // getColor(res.data.taskClear,'#taskClear'); + // getColor(res.data.taskConfirmTimeout,'#taskConfirmTimeout'); + // getColor(res.data.taskWithCharge,'#taskWithCharge'); + getColor(res.data.pakInTask,'#pakInTask'); + getColor(res.data.pakOutTask,'#pakOutTask'); + getColor(res.data.pakMoveTask,'#pakMoveTask'); + getColor(res.data.goHpTask,'#goHpTask'); + getColor(res.data.goOHpTask,'#goOHpTask'); + getColor(res.data.goHpAvoid,'#goHpAvoid'); + getColor(res.data.goOHpAvoid,'#goOHpAvoid'); + getColor(res.data.pakInEmpty,'#pakInEmpty'); + getColor(res.data.pakInFinish,'#pakInFinish'); + getColor(res.data.pakOutEmpty,'#pakOutEmpty'); + getColor(res.data.pakOutFinish,'#pakOutFinish'); + getColor(res.data.goHpAvoidFinish,'#goHpAvoidFinish'); + getColor(res.data.goOHpAvoidFinish,'#goOHpAvoidFinish'); + getColor(res.data.goHpAvoidErr,'#goHpAvoidErr'); + getColor(res.data.goOHpAvoidErr,'#goOHpAvoidErr'); + // getColor(res.data.autoMode,'#autoMode'); + // getColor(res.data.voltageLow,'#voltageLow'); + }) + }, + end: function () { + $('#shuttleNo').val(""); + } + }) + }) + + function getColor(res,e){ + $(e).val(res?"鉁�":"鈥�"); + if (res){ + $(e).attr("style", "color: #FD482C;"); + }else { + $(e).attr("style", "color: #00FF00;"); + } + } + + // $(document).on('click ','.mode-btn', function () { + // let shuttleNo = Number($(this).parent().attr("data-shuttleNo")); + // layer.confirm("鏀瑰彉" + shuttleNo + ' 鍙风┛姊溅鍦ㄧ嚎鐘舵�佸悧锛�', function(){ + // var index = layer.load(1, { + // shade: [0.1,'#fff'] + // }); + // $.ajax({ + // url: baseUrl+ "/shuttle/mode/switch", + // headers: {'token': localStorage.getItem('token')}, + // data: { + // shuttleNo: Number(shuttleNo), + // password: 'root' + // }, + // method: 'POST', + // success: function (res) { + // layer.close(index); + // if (res.code === 200){ + // layer.msg(res.msg, {icon: 1}); + // } else if (res.code === 403){ + // window.location.href = baseUrl+"/login"; + // } else { + // layer.msg(res.msg, {icon: 2}); + // } + // } + // }); + // }); + // }) + + + + $(document).on('click ','#save', function () { + http.post(baseUrl+ "/shuttle/detl/update", { + shuttleNo: $('#shuttleNo').val(), + workNo: $('#workNo').val(), + row: $('#row').val(), + bay: $('#bay').val(), + lev: $('#lev').val(), + crnNo: $('#crnNo').val(), + pakMk: $('#pakMk').val(), + }, function (res) { + layer.msg("淇敼鎴愬姛", {icon: 1,}); + layer.close(layerIdx); + }) + }) + + $(document).on('click ','#cancel', function () { + layer.close(layerIdx); + }) + + function setShuttleRadio() { + $.ajax({ + url: baseUrl+ "/shuttle/table/shuttle/state", + headers: {'token': localStorage.getItem('token')}, + method: 'POST', + success: function (res) { + if (res.code === 200){ + let table = res.data; + for (let i=1;i<=table.length;i++){ + //娓叉煋鍥涘悜绌挎杞﹂�夐」html + let shuttleRadioBox = '<label><input type="radio" name="shuttleSelect" '; + if (i === 1) { + shuttleRadioBox += 'checked ' + } + shuttleRadioBox += 'value="' + table[i - 1].shuttleNo + '"> ' + table[i - 1].shuttleNo + '鍙风┛姊溅</label>' + $("#shuttleRadioBoxId").append(shuttleRadioBox) + + + //娓叉煋鍥涘悜绌挎杞︽暟鎹淮鎶ゅ拰璁惧淇℃伅html + let shuttleCommandLogBox = '<div class="shuttle-command-item" data-shuttleNo="' + table[i - 1].shuttleNo + '">\n' + + '<label>' + table[i - 1].shuttleNo + '#</label>\n' + + '<button class="demoBtn pos-btn">鏁版嵁缁存姢</button>\n' + + '<button class="demoBtn mode-btn" id="mode-' + table[i - 1].shuttleNo + '">璁惧淇℃伅</button>\n' + + '</div>' + $("#commandLogId").append(shuttleCommandLogBox); + } + } else if (res.code === 403){ + window.location.href = baseUrl+"/login"; + } else { + console.log(res.msg); + } + } + }); + } + + // 鍥涘悜绌挎杞︿俊鎭〃鑾峰彇 ---- 琛ㄤ竴 + function getShuttleStateInfo() { + let tableEl = $('#shuttle-state-table'); + $.ajax({ + url: baseUrl+ "/shuttle/table/shuttle/state", + headers: {'token': localStorage.getItem('token')}, + method: 'POST', + success: function (res) { + if (res.code === 200){ + let table = res.data; + if (table.length > shuttleStateTableBlankRows && table.length !== shuttleStateTableFullRows) { + initShuttleStateTable(table.length-shuttleStateTableBlankRows); + shuttleStateTableFullRows = table.length; + } + for (let i=1;i<=table.length;i++){ + // $("#mode-"+table[i-1].shuttleNo).html(table[i-1].statusVal===0?'鑱旀満':'鑴辨満'); + let tr = tableEl.find("tr").eq(i); + setVal(tr.children("td").eq(0), table[i-1].shuttleNo); + setVal(tr.children("td").eq(1), table[i-1].status); + setVal(tr.children("td").eq(2), table[i-1].status); + setVal(tr.children("td").eq(3), table[i-1].loading); + setVal(tr.children("td").eq(4), table[i-1].track); + setVal(tr.children("td").eq(5), table[i-1].batteryPower); + setVal(tr.children("td").eq(6), table[i-1].row); + setVal(tr.children("td").eq(7), table[i-1].bay); + setVal(tr.children("td").eq(8), table[i-1].lev); + setVal(tr.children("td").eq(9), table[i-1].waiting); + setVal(tr.children("td").eq(10), table[i-1].loca); + setVal(tr.children("td").eq(11), table[i-1].chargeStatus); + setVal(tr.children("td").eq(12), table[i-1].alarm1); + setVal(tr.children("td").eq(13), table[i-1].alarm2); + } + } else if (res.code === 403){ + window.location.href = baseUrl+"/login"; + } else { + console.log(res.msg); + } + } + }); + } + + // 鍥涘悜绌挎杞︽暟鎹〃鑾峰彇 ---- 琛ㄤ簩 + function getShuttleMsgInfo() { + let tableEl = $('#shuttle-msg-table'); + $.ajax({ + url: baseUrl+ "/shuttle/table/shuttle/msg", + headers: {'token': localStorage.getItem('token')}, + method: 'POST', + success: function (res) { + if (res.code === 200){ + var table = res.data; + if (table.length > shuttleMsgTableBlankRows && table.length !== shuttleMsgTableFullRows) { + initShuttleMsgTable(table.length-shuttleMsgTableBlankRows); + shuttleMsgTableFullRows = table.length; + } + for (var i=1;i<=table.length;i++){ + var tr = tableEl.find("tr").eq(i); + setVal(tr.children("td").eq(0), table[i-1].shuttleNo); + setVal(tr.children("td").eq(1), table[i-1].workNo); + setVal(tr.children("td").eq(2), table[i-1].status); + setVal(tr.children("td").eq(3), table[i-1].sourceStaNo); + setVal(tr.children("td").eq(4), table[i-1].staNo); + setVal(tr.children("td").eq(5), table[i-1].sourceLocNo); + setVal(tr.children("td").eq(6), table[i-1].locNo); + setVal(tr.children("td").eq(7), table[i-1].speed); + setVal(tr.children("td").eq(8), table[i-1].pakMk); + } + } else if (res.code === 403){ + window.location.href = baseUrl+"/login"; + } else { + console.log(res.msg); + } + } + }); + } + + // 绌挎杞︽棩蹇楄緭鍑� ----------------------------------------------------------------------- + function getShuttleOutput() { + $.ajax({ + url: baseUrl + "/shuttle/output/shuttle", + headers: {'token': localStorage.getItem('token')}, + method: 'POST', + success: function (res) { + if (res.code === 200) { + shuttleOutput(res.data); + } else if (res.code === 403) { + window.location.href = baseUrl + "/login"; + } else { + console.log(res.msg); + } + } + }) + } + + // 浠诲姟鎸囦护涓嬪彂 + function shuttleOperator(shuttleTaskMode) { + http.post(baseUrl+"/shuttle/operator/shuttle", { + shuttleNo: $('input[name="shuttleSelect"]:checked').val(), + shuttleTaskMode: shuttleTaskMode + }, function (res) { + layer.msg(res.msg, {icon: 1}); + }); + } + + + // ------------------------------------------------------------------------------------------------ + + // 鍥涘悜绌挎杞︿俊鎭〃鑾峰彇 ----- 琛ㄤ竴 + function initShuttleStateTable(row) { + let line; + if (row === undefined){ + let one = $('#shuttle-state-table thead').height(); + let total = $('.shuttle-state').height(); + let count = total / one; + count = parseInt(count) - 1; + shuttleStateTableBlankRows = count; + line = count; + } else { + line = row; + } + let html = ""; + for (let i = 0; i < line; i ++){ + html += " <tr>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " </tr>\n"; + } + $('#shuttle-state-table tbody').after(html); + } + + // 绌挎杞︽暟鎹〃鑾峰彇 ----- 琛ㄤ簩 + function initShuttleMsgTable(row) { + let line; + if (row === undefined){ + let one = $('#shuttle-msg-table thead').height(); + let total = $('.shuttle-msg').height(); + let count = total / one; + count = parseInt(count) - 1; + shuttleMsgTableBlankRows = count; + line = count; + } else { + line = row; + } + let html = ""; + for (let i = 0; i < line; i ++){ + html += " <tr>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " <td></td>\n" + + " </tr>\n"; + } + $('#shuttle-msg-table tbody').after(html); + } + + // 鏃ュ織杈撳嚭妗� + function shuttleOutput(content){ + shuttleOutputDom.value += content; + shuttleOutputDom.scrollTop = shuttleOutputDom.scrollHeight; + } + +</script> -- Gitblit v1.9.1