From eb5eb35a7ef56a01a4c788a8c2efef9fc7b823e7 Mon Sep 17 00:00:00 2001 From: Junjie <fallin.jie@qq.com> Date: 星期一, 27 三月 2023 14:04:54 +0800 Subject: [PATCH] 四向穿梭车线程完善 --- src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java | 6 src/main/resources/mapper/BasShuttleOptMapper.xml | 21 +++ src/main/java/com/zy/asrs/service/BasShuttleOptService.java | 8 + src/main/java/com/zy/asrs/service/impl/BasShuttleOptServiceImpl.java | 12 + src/main/java/com/zy/core/thread/ShuttleThread.java | 166 +++++++++++++---------- src/main/java/com/zy/asrs/mapper/BasShuttleOptMapper.java | 12 + src/main/java/com/zy/asrs/mapper/WrkMastMapper.java | 2 src/main/resources/mapper/WrkMastMapper.xml | 7 + src/main/java/com/zy/asrs/entity/BasShuttleOpt.java | 151 +++++++++++++++++++++ 9 files changed, 311 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/zy/asrs/entity/BasShuttleOpt.java b/src/main/java/com/zy/asrs/entity/BasShuttleOpt.java new file mode 100644 index 0000000..8739111 --- /dev/null +++ b/src/main/java/com/zy/asrs/entity/BasShuttleOpt.java @@ -0,0 +1,151 @@ +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 com.core.common.SpringUtils; +import com.zy.system.service.UserService; +import com.zy.system.entity.User; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import com.baomidou.mybatisplus.annotations.TableName; +import java.io.Serializable; + +@Data +@TableName("asr_bas_shuttle_opt") +public class BasShuttleOpt implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value= "") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 浠诲姟鍙� + */ + @ApiModelProperty(value= "浠诲姟鍙�") + @TableField("wrk_no") + private Integer wrkNo; + + /** + * 绌挎杞﹀彿 + */ + @ApiModelProperty(value= "绌挎杞﹀彿") + @TableField("shuttle_no") + private Integer shuttleNo; + + /** + * 涓嬪彂鏃堕棿 + */ + @ApiModelProperty(value= "涓嬪彂鏃堕棿") + @TableField("send_time") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date sendTime; + + /** + * 浣滀笟 + */ + @ApiModelProperty(value= "浣滀笟") + private String mode; + + /** + * 璧风偣搴撲綅 + */ + @ApiModelProperty(value= "璧风偣搴撲綅") + @TableField("source_loc_no") + private String sourceLocNo; + + /** + * 鐩爣搴撲綅 + */ + @ApiModelProperty(value= "鐩爣搴撲綅") + @TableField("dist_loc_no") + private String distLocNo; + + /** + * 淇敼鏃堕棿 + */ + @ApiModelProperty(value= "淇敼鏃堕棿") + @TableField("update_time") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 淇敼浜哄憳 + */ + @ApiModelProperty(value= "淇敼浜哄憳") + @TableField("update_by") + private Long updateBy; + + /** + * 澶囨敞 + */ + @ApiModelProperty(value= "澶囨敞") + private String memo; + + /** + * 鍛戒护 + */ + @ApiModelProperty(value= "鍛戒护") + private String command; + + public BasShuttleOpt() {} + + public BasShuttleOpt(Integer wrkNo,Integer shuttleNo,Date sendTime,String mode,String sourceLocNo,String distLocNo,Date updateTime,Long updateBy,String memo,String command) { + this.wrkNo = wrkNo; + this.shuttleNo = shuttleNo; + this.sendTime = sendTime; + this.mode = mode; + this.sourceLocNo = sourceLocNo; + this.distLocNo = distLocNo; + this.updateTime = updateTime; + this.updateBy = updateBy; + this.memo = memo; + this.command = command; + } + +// BasShuttleOpt basShuttleOpt = new BasShuttleOpt( +// null, // 浠诲姟鍙� +// null, // 绌挎杞﹀彿 +// null, // 涓嬪彂鏃堕棿 +// null, // 浣滀笟 +// null, // 璧风偣搴撲綅 +// null, // 鐩爣搴撲綅 +// null, // 淇敼鏃堕棿 +// null, // 淇敼浜哄憳 +// null, // 澶囨敞 +// null // 鍛戒护 +// ); + + public String getSendTime$(){ + if (Cools.isEmpty(this.sendTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.sendTime); + } + + public String getUpdateTime$(){ + if (Cools.isEmpty(this.updateTime)){ + return ""; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); + } + + 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; + } + + +} diff --git a/src/main/java/com/zy/asrs/mapper/BasShuttleOptMapper.java b/src/main/java/com/zy/asrs/mapper/BasShuttleOptMapper.java new file mode 100644 index 0000000..311b4e9 --- /dev/null +++ b/src/main/java/com/zy/asrs/mapper/BasShuttleOptMapper.java @@ -0,0 +1,12 @@ +package com.zy.asrs.mapper; + +import com.zy.asrs.entity.BasShuttleOpt; +import com.baomidou.mybatisplus.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface BasShuttleOptMapper extends BaseMapper<BasShuttleOpt> { + +} diff --git a/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java b/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java index e2804a1..791fe3d 100644 --- a/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java +++ b/src/main/java/com/zy/asrs/mapper/WrkMastMapper.java @@ -95,4 +95,6 @@ List<WrkMast> selectAll(@Param("staNo")Integer staNo); WrkMast selectAllC(); + + List<WrkMast> selectWorkWaiting(Integer workNo); } diff --git a/src/main/java/com/zy/asrs/service/BasShuttleOptService.java b/src/main/java/com/zy/asrs/service/BasShuttleOptService.java new file mode 100644 index 0000000..2c95587 --- /dev/null +++ b/src/main/java/com/zy/asrs/service/BasShuttleOptService.java @@ -0,0 +1,8 @@ +package com.zy.asrs.service; + +import com.zy.asrs.entity.BasShuttleOpt; +import com.baomidou.mybatisplus.service.IService; + +public interface BasShuttleOptService extends IService<BasShuttleOpt> { + +} diff --git a/src/main/java/com/zy/asrs/service/impl/BasShuttleOptServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasShuttleOptServiceImpl.java new file mode 100644 index 0000000..b72a156 --- /dev/null +++ b/src/main/java/com/zy/asrs/service/impl/BasShuttleOptServiceImpl.java @@ -0,0 +1,12 @@ +package com.zy.asrs.service.impl; + +import com.zy.asrs.mapper.BasShuttleOptMapper; +import com.zy.asrs.entity.BasShuttleOpt; +import com.zy.asrs.service.BasShuttleOptService; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service("basShuttleOptService") +public class BasShuttleOptServiceImpl extends ServiceImpl<BasShuttleOptMapper, BasShuttleOpt> implements BasShuttleOptService { + +} diff --git a/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java b/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java index a64075c..7205ca1 100644 --- a/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java +++ b/src/main/java/com/zy/core/model/protocol/ShuttleProtocol.java @@ -1,6 +1,7 @@ package com.zy.core.model.protocol; import com.zy.core.enums.ShuttleStatusType; +import com.zy.core.model.command.ShuttleAssignCommand; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -22,6 +23,11 @@ private Short taskNo = 0; /** + * 浠诲姟鎸囦护 + */ + private ShuttleAssignCommand assignCommand; + + /** * 婧愬簱浣� */ private String sourceLocNo; diff --git a/src/main/java/com/zy/core/thread/ShuttleThread.java b/src/main/java/com/zy/core/thread/ShuttleThread.java index 2586420..ffc4717 100644 --- a/src/main/java/com/zy/core/thread/ShuttleThread.java +++ b/src/main/java/com/zy/core/thread/ShuttleThread.java @@ -7,7 +7,10 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.core.common.DateUtils; +import com.core.common.SpringUtils; import com.core.exception.CoolException; +import com.zy.asrs.entity.BasShuttleOpt; +import com.zy.asrs.service.BasShuttleOptService; import com.zy.common.model.NavigateNode; import com.zy.common.utils.CommonUtils; import com.zy.common.utils.NavigatePositionConvert; @@ -19,6 +22,7 @@ import com.zy.core.cache.OutputQueue; import com.zy.core.enums.ShuttleRunDirection; import com.zy.core.enums.ShuttleStatusType; +import com.zy.core.enums.ShuttleTaskModeType; import com.zy.core.enums.SlaveType; import com.zy.core.model.ShuttleSlave; import com.zy.core.model.Task; @@ -170,7 +174,7 @@ //鍥涘悜绌挎杞︾┖闂层�佹湁浠诲姟涓旀爣璁颁负true锛岄渶瑕佹墽琛屼换鍔$殑涓嬩竴鏉℃寚浠� if (shuttleProtocol.getBusyStatusType() == ShuttleStatusType.IDLE && shuttleProtocol.getTaskNo() != 0 && shuttleProtocol.getPakMk()) { //鎵ц涓嬩竴姝ユ寚浠� - executeWork(shuttleProtocol.getTaskNo()); + executeWork(shuttleProtocol.getAssignCommand()); } }else { @@ -178,6 +182,7 @@ throw new CoolException(MessageFormat.format( "鍥涘悜绌挎杞lc鐘舵�佷俊鎭け璐� ===>> [id:{0}] [ip:{1}] [port:{2}]", slave.getId(), slave.getIp(), slave.getPort())); } } catch (Exception e) { + e.printStackTrace(); OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅plc鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); initShuttle(); } @@ -286,91 +291,92 @@ //鍒嗛厤浠诲姟 private void assignWork(ShuttleAssignCommand assignCommand) { + //灏嗘map瀛樺叆redis涓� + HashMap<String, Object> map = new HashMap<>(); + + //璁$畻璺緞 + List<NavigateNode> calc = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getDistLocNo(), assignCommand.getTaskMode().intValue()); + if (calc != null) { + //鑾峰彇鍒嗘璺緞 + ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc); + //璺緞鏁版嵁 + map.put("path", data); + } + + //宸ヤ綔鍙� + map.put("wrk_no", assignCommand.getTaskNo()); + //鍛戒护鎵ц姝ュ簭 + map.put("commandStep", 0); + //鍛戒护 + map.put("assignCommand", assignCommand); + shuttleProtocol.setTaskNo(assignCommand.getTaskNo()); + shuttleProtocol.setAssignCommand(assignCommand); + //浠诲姟鏁版嵁淇濆瓨鍒皉edis + redisUtil.set("wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(map)); + //鎵ц涓嬪彂浠诲姟 + executeWork(assignCommand); + } + + //鎵ц涓嬪彂鐨勬寚浠� + private void executeWork(ShuttleAssignCommand assignCommand) { + //璇诲彇redis鏁版嵁 + Object o = redisUtil.get("wrk_no_" + assignCommand.getTaskNo()); + HashMap map = JSON.parseObject(o.toString(), HashMap.class); + //褰撳墠姝ュ簭 + int commandStep = Integer.parseInt(map.get("commandStep").toString()); + //path璺緞鏁扮洰 + int size = 0; + //涓嬪彂鍛戒护 ShuttleCommand command = new ShuttleCommand(); switch (assignCommand.getTaskMode()) { - case 1: - case 2: - //璁$畻璺緞 - List<NavigateNode> calc = NavigateUtils.calc(assignCommand.getSourceLocNo(), assignCommand.getDistLocNo(), assignCommand.getTaskMode().intValue()); - if (calc != null) { - //鑾峰彇鍒嗘璺緞 - ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(calc); - //灏嗘map瀛樺叆redis涓� - HashMap<String, Object> map = new HashMap<>(); - //鍛戒护鎵ц姝ュ簭 - map.put("commandStep", 0); - //璺緞鏁版嵁 - map.put("path", data); - //宸ヤ綔鍙� - map.put("wrk_no", assignCommand.getTaskNo()); - //浠诲姟鏁版嵁淇濆瓨鍒皉edis - redisUtil.set("wrk_no_" + assignCommand.getTaskNo(), JSON.toJSONString(map)); - shuttleProtocol.setTaskNo(assignCommand.getTaskNo()); + case 1://鍏ュ簱 + case 2://鍑哄簱 + //褰撳墠璺緞鏁版嵁 + Object data = map.get("path"); + ArrayList pathList = JSON.parseObject(data.toString(), ArrayList.class); + //鍙栫涓�鏉¤矾寰� + Object o1 = pathList.get(commandStep); + ArrayList path = JSON.parseObject(o1.toString(), ArrayList.class); - //鎵ц涓嬪彂浠诲姟 - executeWork(assignCommand.getTaskNo()); - } + size = path.size(); + //寮�濮嬭矾寰� + JSONObject startPath = JSON.parseObject(path.get(0).toString()); + //鐩爣璺緞 + JSONObject endPath = JSON.parseObject(path.get(size - 1).toString()); + + command.setCommandWord((short) 1); + command.setStartCodeNum(NavigatePositionConvert.xyToPosition(startPath.getIntValue("x"), startPath.getIntValue("y"))); + command.setMiddleCodeNum((short) 0); + command.setDistCodeNum(NavigatePositionConvert.xyToPosition(endPath.getIntValue("x"), endPath.getIntValue("y"))); + command.setStartToDistDistance(1000); + command.setMiddleToDistDistance(1000); + command.setRunDirection(ShuttleRunDirection.get(startPath.get("direction").toString()).id); + command.setPalletLift((short) 1); + command.setForceMoveDistance(1000); + command.setChargeSwitch((short) 2); + command.setIOControl((short) 0); + command.setRunSpeed((short) 1000); + command.setRadarTmp((short) 0); + break; - case 3: - case 4: + case 3://鎵樼洏椤跺崌 + case 4://鎵樼洏涓嬮檷 command.setCommandWord((short) 2); command.setPalletLift(assignCommand.getTaskMode() == 3 ? (short)1 : (short)2); command.setCommandEnd((short) 1); - write(command); break; - case 5: - case 6: - case 7: - case 8: + case 5://寮哄埗宸︾Щ + case 6://寮哄埗鍙崇Щ + case 7://寮哄埗涓婄Щ + case 8://寮哄埗涓嬬Щ command.setCommandWord((short) 3); command.setForceMoveDistance(1000); command.setRunDirection((short) (assignCommand.getTaskMode() - 4)); command.setCommandEnd((short) 1); - write(command); break; } - } - - //鎵ц涓嬪彂鐨勬寚浠� - private void executeWork(Short taskNo) { - //璇诲彇redis鏁版嵁 - Object o = redisUtil.get("wrk_no_" + taskNo); - HashMap map = JSON.parseObject(o.toString(), HashMap.class); - //褰撳墠姝ュ簭 - int commandStep = Integer.parseInt(map.get("commandStep").toString()); - //褰撳墠璺緞鏁版嵁 - Object data = map.get("path"); - ArrayList pathList = JSON.parseObject(data.toString(), ArrayList.class); - //鍙栫涓�鏉¤矾寰� - Object o1 = pathList.get(commandStep); - ArrayList path = JSON.parseObject(o1.toString(), ArrayList.class); - - int size = path.size(); - //寮�濮嬭矾寰� - JSONObject startPath = JSON.parseObject(path.get(0).toString()); - System.out.println(startPath); - //鐩爣璺緞 - JSONObject endPath = JSON.parseObject(path.get(size - 1).toString()); - System.out.println(endPath); - - //涓嬪彂鍛戒护 - ShuttleCommand command = new ShuttleCommand(); - command.setCommandWord((short) 1); - command.setStartCodeNum(NavigatePositionConvert.xyToPosition(startPath.getIntValue("x"), startPath.getIntValue("y"))); - command.setMiddleCodeNum((short) 0); - command.setDistCodeNum(NavigatePositionConvert.xyToPosition(endPath.getIntValue("x"), endPath.getIntValue("y"))); - command.setStartToDistDistance(1000); - command.setMiddleToDistDistance(1000); - command.setRunDirection(ShuttleRunDirection.get(startPath.get("direction").toString()).id); - command.setPalletLift((short) 1); - command.setForceMoveDistance(1000); - command.setChargeSwitch((short) 2); - command.setIOControl((short) 0); - command.setRunSpeed((short) 1000); - command.setRadarTmp((short) 0); command.setCommandEnd((short) 1); - //涓嬪彂鍛戒护 if (!write(command)) { News.error("鍥涘悜绌挎杞﹀懡浠や笅鍙戝け璐ワ紝绌挎杞﹀彿={}锛屼换鍔℃暟鎹�={}", shuttleProtocol.getShuttleNo(), JSON.toJSON(command)); @@ -391,12 +397,24 @@ }else { //宸叉墽琛屽畬鎴� //淇濆瓨鏁版嵁鍒版暟鎹簱鍋氭祦姘� + BasShuttleOptService shuttleOptService = SpringUtils.getBean(BasShuttleOptService.class); + if (shuttleOptService != null) { + BasShuttleOpt opt = new BasShuttleOpt( + assignCommand.getTaskNo().intValue(), + assignCommand.getShuttleNo().intValue(), + new Date(), + ShuttleTaskModeType.get(assignCommand.getTaskMode()).desc, + assignCommand.getSourceLocNo(), + assignCommand.getDistLocNo(), + null, + null, + null, + JSON.toJSONString(command) + ); + shuttleOptService.insert(opt); + } //鍒犻櫎redis redisUtil.del("wrk_no_" + map.get("wrk_no").toString()); - - //銆傘�傘�� - //1銆佸懡浠や笅鏂归渶瑕佸垽鏂皬杞︾┖闂茬姸鎬� - //2銆� } } diff --git a/src/main/resources/mapper/BasShuttleOptMapper.xml b/src/main/resources/mapper/BasShuttleOptMapper.xml new file mode 100644 index 0000000..dd0694a --- /dev/null +++ b/src/main/resources/mapper/BasShuttleOptMapper.xml @@ -0,0 +1,21 @@ +<?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.BasShuttleOptMapper"> + + <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 --> + <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasShuttleOpt"> + <id column="id" property="id" /> + <result column="wrk_no" property="wrkNo" /> + <result column="shuttle_no" property="shuttleNo" /> + <result column="send_time" property="sendTime" /> + <result column="mode" property="mode" /> + <result column="source_loc_no" property="sourceLocNo" /> + <result column="dist_loc_no" property="distLocNo" /> + <result column="update_time" property="updateTime" /> + <result column="update_by" property="updateBy" /> + <result column="memo" property="memo" /> + <result column="command" property="command" /> + + </resultMap> + +</mapper> diff --git a/src/main/resources/mapper/WrkMastMapper.xml b/src/main/resources/mapper/WrkMastMapper.xml index f098ac4..2d90877 100644 --- a/src/main/resources/mapper/WrkMastMapper.xml +++ b/src/main/resources/mapper/WrkMastMapper.xml @@ -234,5 +234,12 @@ #{item} </foreach> </select> + + <select id="selectWorkWaiting" resultMap="BaseResultMap"> + select * + from dbo.asr_wrk_mast + where 1=1 + wrk_no=#{workNo} and wrk_sts in (4,7) + </select> </mapper> -- Gitblit v1.9.1