From a9cf56a7be8b5e27e2c3dcb416b734093e7a8dc3 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期三, 28 一月 2026 12:54:15 +0800
Subject: [PATCH] Merge branch 'rcs_master' into ctu_conveyor
---
version/db/new.sql | 33 +
zy-acs-common/src/main/java/com/zy/acs/common/utils/Base62.java | 17
zy-acs-flow/src/page/sta/StaCreate.jsx | 47 ++
zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java | 20
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java | 24
version/doc/RCS开发进度表.xlsx | 0
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/StaServiceImpl.java | 25 +
zy-acs-flow/src/page/travel/TravelList.jsx | 56 ++
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java | 24
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Sta.java | 29 +
zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyTakeFromShelvesLoc.java | 15
zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java | 5
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java | 4
zy-acs-flow/src/i18n/zh.js | 18
zy-acs-common/src/main/java/com/zy/acs/common/utils/Utils.java | 5
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java | 46 +-
zy-acs-flow/src/page/sta/StaEdit.jsx | 47 +
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java | 113 +++--
zy-acs-common/src/main/java/com/zy/acs/common/domain/HeightDepthDto.java | 34 +
zy-acs-flow/src/i18n/en.js | 18
zy-acs-flow/src/map/tool.js | 6
zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/conveyor/ConveyorController.java | 25 +
zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/conveyor/SiemensConveyorStationService.java | 2
zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyReleaseToConveyorSta.java | 12
zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/dto/ConveyorQueryResult.java | 8
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/BusServiceImpl.java | 31 +
zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyTakeFromConveyorSta.java | 13
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/StaController.java | 2
zy-acs-flow/src/page/sta/rowSx.jsx | 14
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Segment.java | 10
zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyReleaseToShelvesLoc.java | 14
version/doc/AGV-RCS 通信协议 V1.1.xlsx | 0
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java | 5
version/doc/charge/AGV自动充电机-调度无线启动模式充电流程图.docx | 0
zy-acs-flow/src/page/sta/StaPanel.jsx | 10
zy-acs-manager/src/main/resources/application.yml | 2
version/doc/charge/APL-AGV锂电智能充电机调度标准协议-Modbus RTU V4.2.xlsx | 0
zy-acs-flow/src/page/sta/StaList.jsx | 7
zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java | 2
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/SegmentService.java | 7
zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java | 37 +
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Travel.java | 75 --
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TravelServiceImpl.java | 91 ++++
zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/ConveyorAutoRunScheduler.java | 178 ++++++++
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/TravelService.java | 10
/dev/null | 0
version/db/sqlIndex | 4
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/StaService.java | 3
zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/AgvService.java | 2
49 files changed, 897 insertions(+), 253 deletions(-)
diff --git a/version/db/new.sql b/version/db/new.sql
index d7a24af..df955d1 100644
--- a/version/db/new.sql
+++ b/version/db/new.sql
@@ -1,2 +1,31 @@
-alter table man_code
- add dir_rule varchar(255) null comment '鏂瑰悜瑙勫垯' after corner;
+alter table man_travel
+ add roller_waiting int(1) default 0 null comment '婊氱瓛绾跨瓑寰�' after task_ids;
+
+alter table man_travel
+ add roller_waiting_code bigint null comment '婊氱瓛绾跨瓑寰呭湴鐮�' after roller_waiting;
+
+alter table man_travel_log
+ add roller_waiting int(1) default 0 null comment '婊氱瓛绾跨瓑寰�' after task_ids;
+
+alter table man_travel_log
+ add roller_waiting_code bigint null comment '婊氱瓛绾跨瓑寰呭湴鐮�' after roller_waiting;
+
+CREATE INDEX idx_agv_state_wait
+ ON man_travel (agv_id, state, roller_waiting, deleted);
+
+
+
+
+alter table man_sta
+ add height decimal(24, 9) null comment '浣滀笟楂樺害' after offset;
+
+alter table man_sta
+ add depth decimal(24, 9) null comment '浣滀笟娣卞害' after height;
+
+
+
+alter table man_sta
+ add inbound_wait int null comment '杩炵画鍏ュ簱绛夊緟' after angle;
+
+alter table man_sta
+ add outbound_wait int null comment '杩炵画鍑哄簱绛夊緟' after inbound_wait;
diff --git a/version/db/sqlIndex b/version/db/sqlIndex
index a1317b0..c3bae29 100644
--- a/version/db/sqlIndex
+++ b/version/db/sqlIndex
@@ -1,3 +1,4 @@
+# todo idx ==> deleted
# man_action
CREATE INDEX idx_agv_action ON man_action(agv_id, action_sts);
CREATE INDEX idx_group_io_time ON man_action(group_id, io_time);
@@ -8,7 +9,8 @@
# man_action_type
CREATE INDEX idx_action_type_uuid ON man_action_type(uuid);
# man_travel
-CREATE INDEX idx_agv_id_state on man_travel(agv_id, state);
+CREATE INDEX idx_agv_id_state ON man_travel(agv_id, state);
+CREATE INDEX idx_agv_state_wait ON man_travel (agv_id, state, roller_waiting, deleted);
# man_agv_model
CREATE INDEX idx_agv_model_type ON man_agv_model(type);
# man_bus_sts
diff --git "a/version/doc/AGV-RCS \351\200\232\344\277\241\345\215\217\350\256\256 V1.0.xlsx" "b/version/doc/AGV-RCS \351\200\232\344\277\241\345\215\217\350\256\256 V1.0.xlsx"
deleted file mode 100644
index 2813849..0000000
--- "a/version/doc/AGV-RCS \351\200\232\344\277\241\345\215\217\350\256\256 V1.0.xlsx"
+++ /dev/null
Binary files differ
diff --git "a/version/doc/AGV-RCS \351\200\232\344\277\241\345\215\217\350\256\256 V1.1.xlsx" "b/version/doc/AGV-RCS \351\200\232\344\277\241\345\215\217\350\256\256 V1.1.xlsx"
new file mode 100644
index 0000000..c884034
--- /dev/null
+++ "b/version/doc/AGV-RCS \351\200\232\344\277\241\345\215\217\350\256\256 V1.1.xlsx"
Binary files differ
diff --git "a/version/doc/RCS\345\274\200\345\217\221\350\277\233\345\272\246\350\241\250.xlsx" "b/version/doc/RCS\345\274\200\345\217\221\350\277\233\345\272\246\350\241\250.xlsx"
index bbb5c25..d60d657 100644
--- "a/version/doc/RCS\345\274\200\345\217\221\350\277\233\345\272\246\350\241\250.xlsx"
+++ "b/version/doc/RCS\345\274\200\345\217\221\350\277\233\345\272\246\350\241\250.xlsx"
Binary files differ
diff --git "a/version/doc/charge/AGV\350\207\252\345\212\250\345\205\205\347\224\265\346\234\272-\350\260\203\345\272\246\346\227\240\347\272\277\345\220\257\345\212\250\346\250\241\345\274\217\345\205\205\347\224\265\346\265\201\347\250\213\345\233\276.docx" "b/version/doc/charge/AGV\350\207\252\345\212\250\345\205\205\347\224\265\346\234\272-\350\260\203\345\272\246\346\227\240\347\272\277\345\220\257\345\212\250\346\250\241\345\274\217\345\205\205\347\224\265\346\265\201\347\250\213\345\233\276.docx"
new file mode 100644
index 0000000..0a8c8c2
--- /dev/null
+++ "b/version/doc/charge/AGV\350\207\252\345\212\250\345\205\205\347\224\265\346\234\272-\350\260\203\345\272\246\346\227\240\347\272\277\345\220\257\345\212\250\346\250\241\345\274\217\345\205\205\347\224\265\346\265\201\347\250\213\345\233\276.docx"
Binary files differ
diff --git "a/version/doc/charge/APL-AGV\351\224\202\347\224\265\346\231\272\350\203\275\345\205\205\347\224\265\346\234\272\350\260\203\345\272\246\346\240\207\345\207\206\345\215\217\350\256\256-Modbus RTU V4.2.xlsx" "b/version/doc/charge/APL-AGV\351\224\202\347\224\265\346\231\272\350\203\275\345\205\205\347\224\265\346\234\272\350\260\203\345\272\246\346\240\207\345\207\206\345\215\217\350\256\256-Modbus RTU V4.2.xlsx"
new file mode 100644
index 0000000..7ccee68
--- /dev/null
+++ "b/version/doc/charge/APL-AGV\351\224\202\347\224\265\346\231\272\350\203\275\345\205\205\347\224\265\346\234\272\350\260\203\345\272\246\346\240\207\345\207\206\345\215\217\350\256\256-Modbus RTU V4.2.xlsx"
Binary files differ
diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/domain/HeightDepthDto.java b/zy-acs-common/src/main/java/com/zy/acs/common/domain/HeightDepthDto.java
new file mode 100644
index 0000000..add3672
--- /dev/null
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/domain/HeightDepthDto.java
@@ -0,0 +1,34 @@
+package com.zy.acs.common.domain;
+
+import com.zy.acs.framework.exception.CoolException;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class HeightDepthDto implements Serializable {
+
+ private static final long serialVersionUID = 1304095271854524735L;
+
+ // 楂樺害锛坢m锛�
+ private Short height;
+
+ // 娣卞害锛坢m锛�
+ private Short depth;
+
+ public HeightDepthDto() {
+ }
+
+ public HeightDepthDto(Number height, Number depth) {
+ this.height = toShort(height);
+ this.depth = toShort(depth);
+ }
+
+ private static Short toShort(Number value) {
+ if (value == null) {
+ throw new CoolException("HeightDepthDto parameter is null");
+ }
+ return value.shortValue();
+ }
+
+}
diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyReleaseToConveyorSta.java b/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyReleaseToConveyorSta.java
index b43b712..de4f0f6 100644
--- a/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyReleaseToConveyorSta.java
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyReleaseToConveyorSta.java
@@ -20,6 +20,15 @@
@Override
public byte[] writeToBytes() {
return Utils.reverse(RadixTools.shortToByte(this.height));
+
+// byte[] heightBytes = Utils.reverse(RadixTools.shortToByte(this.height));
+// byte[] depthBytes = Utils.reverse(RadixTools.shortToByte(this.depth));
+// return Utils.merge(heightBytes, depthBytes);
+
+// byte heightByte = (byte) ((this.height == null ? 0 : this.height) & 0xFF);
+// byte depthByte = (byte) ((this.depth == null ? 0 : this.depth) & 0xFF);
+// return Utils.merge(heightByte, depthByte);
+// return new byte[]{ heightByte, depthByte };
}
@Override
@@ -30,4 +39,7 @@
// 鍙栬揣楂樺害
private Short height;
+ // 鍙栬揣娣卞害
+ private Short depth;
+
}
diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyReleaseToShelvesLoc.java b/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyReleaseToShelvesLoc.java
index 1ea4a50..be3593e 100644
--- a/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyReleaseToShelvesLoc.java
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyReleaseToShelvesLoc.java
@@ -1,8 +1,8 @@
package com.zy.acs.common.domain.protocol.action;
-import com.zy.acs.framework.common.RadixTools;
import com.zy.acs.common.domain.protocol.IActionBody;
import com.zy.acs.common.utils.Utils;
+import com.zy.acs.framework.common.RadixTools;
import lombok.Data;
import java.io.Serializable;
@@ -20,6 +20,15 @@
@Override
public byte[] writeToBytes() {
return Utils.reverse(RadixTools.shortToByte(this.height));
+
+// byte[] heightBytes = Utils.reverse(RadixTools.shortToByte(this.height));
+// byte[] depthBytes = Utils.reverse(RadixTools.shortToByte(this.depth));
+// return Utils.merge(heightBytes, depthBytes);
+
+// byte heightByte = (byte) ((this.height == null ? 0 : this.height) & 0xFF);
+// byte depthByte = (byte) ((this.depth == null ? 0 : this.depth) & 0xFF);
+// return Utils.merge(heightByte, depthByte);
+// return new byte[]{ heightByte, depthByte };
}
@Override
@@ -30,4 +39,7 @@
// 鍙栬揣楂樺害
private Short height;
+ // 鍙栬揣娣卞害
+ private Short depth;
+
}
diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyTakeFromConveyorSta.java b/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyTakeFromConveyorSta.java
index 30c5611..fed00bb 100644
--- a/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyTakeFromConveyorSta.java
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyTakeFromConveyorSta.java
@@ -20,7 +20,17 @@
@Override
public byte[] writeToBytes() {
return Utils.reverse(RadixTools.shortToByte(this.height));
+
+// byte[] heightBytes = Utils.reverse(RadixTools.shortToByte(this.height));
+// byte[] depthBytes = Utils.reverse(RadixTools.shortToByte(this.depth));
+// return Utils.merge(heightBytes, depthBytes);
+
+// byte heightByte = (byte) ((this.height == null ? 0 : this.height) & 0xFF);
+// byte depthByte = (byte) ((this.depth == null ? 0 : this.depth) & 0xFF);
+// return Utils.merge(heightByte, depthByte);
+// return new byte[]{ heightByte, depthByte };
}
+
@Override
public void readFromBytes(byte[] messageBodyBytes) {
@@ -30,4 +40,7 @@
// 鍙栬揣楂樺害
private Short height;
+ // 鍙栬揣娣卞害
+ private Short depth;
+
}
diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyTakeFromShelvesLoc.java b/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyTakeFromShelvesLoc.java
index 7ff3adc..ee8ee86 100644
--- a/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyTakeFromShelvesLoc.java
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/domain/protocol/action/ReadyTakeFromShelvesLoc.java
@@ -1,8 +1,8 @@
package com.zy.acs.common.domain.protocol.action;
-import com.zy.acs.framework.common.RadixTools;
import com.zy.acs.common.domain.protocol.IActionBody;
import com.zy.acs.common.utils.Utils;
+import com.zy.acs.framework.common.RadixTools;
import lombok.Data;
import java.io.Serializable;
@@ -20,7 +20,17 @@
@Override
public byte[] writeToBytes() {
return Utils.reverse(RadixTools.shortToByte(this.height));
+
+// byte[] heightBytes = Utils.reverse(RadixTools.shortToByte(this.height));
+// byte[] depthBytes = Utils.reverse(RadixTools.shortToByte(this.depth));
+// return Utils.merge(heightBytes, depthBytes);
+
+// byte heightByte = (byte) ((this.height == null ? 0 : this.height) & 0xFF);
+// byte depthByte = (byte) ((this.depth == null ? 0 : this.depth) & 0xFF);
+// return Utils.merge(heightByte, depthByte);
+// return new byte[]{ heightByte, depthByte };
}
+
@Override
public void readFromBytes(byte[] messageBodyBytes) {
@@ -30,4 +40,7 @@
// 鍙栬揣楂樺害
private Short height;
+ // 鍙栬揣娣卞害
+ private Short depth;
+
}
diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/utils/Base62.java b/zy-acs-common/src/main/java/com/zy/acs/common/utils/Base62.java
new file mode 100644
index 0000000..26ddd1f
--- /dev/null
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/utils/Base62.java
@@ -0,0 +1,17 @@
+package com.zy.acs.common.utils;
+
+public class Base62 {
+
+ private static final char[] CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
+
+ public static String encode(long value) {
+ if (value == 0) return "0";
+ StringBuilder sb = new StringBuilder();
+ while (value > 0) {
+ sb.append(CHARS[(int) (value % 62)]);
+ value /= 62;
+ }
+ return sb.reverse().toString();
+ }
+
+}
diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/utils/Utils.java b/zy-acs-common/src/main/java/com/zy/acs/common/utils/Utils.java
index a484c83..4829d51 100644
--- a/zy-acs-common/src/main/java/com/zy/acs/common/utils/Utils.java
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/utils/Utils.java
@@ -1,6 +1,7 @@
package com.zy.acs.common.utils;
import com.zy.acs.framework.common.Cools;
+import com.zy.acs.framework.common.SnowflakeIdWorker;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
@@ -252,6 +253,10 @@
return str;
}
+ public static void main(String[] args) {
+ System.out.println(Base62.encode(new SnowflakeIdWorker().nextId()));
+ }
+
public static String generateSeqNum(String lastSeqNum) {
if (Cools.isEmpty(lastSeqNum)) {
return zeroFill("1", 4);
diff --git a/zy-acs-flow/src/i18n/en.js b/zy-acs-flow/src/i18n/en.js
index 082291b..f80d1d6 100644
--- a/zy-acs-flow/src/i18n/en.js
+++ b/zy-acs-flow/src/i18n/en.js
@@ -92,7 +92,8 @@
earlier: 'Earlier...',
},
validate: {
- pwdMisMatch: 'The password confirmation is not the same as the password.'
+ pwdMisMatch: 'The password confirmation is not the same as the password.',
+ gtZero: 'The value must be greater than 0.',
},
settings: {
base: 'Base',
@@ -287,7 +288,11 @@
staType: "station type",
code: "code",
offset: "offset",
+ height: "height",
+ depth: "depth",
angle: 'angle',
+ inboundWait: 'inbound wait(ms)',
+ outboundWait: 'outbound wait(ms)',
autoing: "autoing",
loading: "loading",
inEnable: "in enable",
@@ -493,6 +498,8 @@
currSeg: "curr seg",
taskContent: "tasks",
taskIds: "task list",
+ rollerWaiting: 'roller waiting',
+ rollerWaitingCode: 'waiting code',
state: "state",
},
segment: {
@@ -664,6 +671,7 @@
bottomOffset: 'bottom offset',
},
sta: {
+ depthHint: 'Set depth to 0 to keep the default value.',
enums: {
type: {
in: 'UNLOAD',
@@ -722,6 +730,14 @@
},
},
},
+ travel: {
+ enums: {
+ state: {
+ running: 'RUNNING',
+ finish: 'FINISH',
+ },
+ },
+ },
jam: {
enums: {
state: {
diff --git a/zy-acs-flow/src/i18n/zh.js b/zy-acs-flow/src/i18n/zh.js
index 32006ac..914a9ce 100644
--- a/zy-acs-flow/src/i18n/zh.js
+++ b/zy-acs-flow/src/i18n/zh.js
@@ -92,7 +92,8 @@
earlier: '鏇存棭...',
},
validate: {
- pwdMisMatch: '瀵嗙爜涓嶄竴鑷�'
+ pwdMisMatch: '瀵嗙爜涓嶄竴鑷�',
+ gtZero: '璇疯緭鍏ュぇ浜�0鐨勬暟鍊�',
},
settings: {
base: '鍩烘湰璁剧疆',
@@ -287,7 +288,11 @@
staType: "绔欑偣绫诲瀷",
code: "鍦伴潰鐮�",
offset: "鍋忕Щ閲�",
+ height: "浣滀笟楂樺害",
+ depth: "浣滀笟娣卞害",
angle: '浣滀笟瑙掑害',
+ inboundWait: '鍏ュ簱绛夊緟(姣)',
+ outboundWait: '鍑哄簱绛夊緟(姣)',
autoing: "鑷姩",
loading: "杞借揣",
inEnable: "鍙叆",
@@ -493,6 +498,8 @@
currSeg: "褰撳墠浣滀笟",
taskContent: "浠诲姟鍐呭",
taskIds: "浠诲姟鍒楄〃",
+ rollerWaiting: '婊氱瓛绾跨瓑寰�',
+ rollerWaitingCode: '绛夊緟浣嶅湴鐮�',
state: "鐘舵��",
},
segment: {
@@ -664,6 +671,7 @@
bottomOffset: '搴曢儴鍋忕Щ閲�',
},
sta: {
+ depthHint: '娣卞害璁剧疆涓� 0 琛ㄧず娌跨敤榛樿鍊笺��',
enums: {
type: {
in: '鏀捐揣',
@@ -722,6 +730,14 @@
},
},
},
+ travel: {
+ enums: {
+ state: {
+ running: '姝e湪杩愯',
+ finish: '宸插畬鎴�',
+ },
+ },
+ },
jam: {
enums: {
state: {
diff --git a/zy-acs-flow/src/map/tool.js b/zy-acs-flow/src/map/tool.js
index c348d14..1323f30 100644
--- a/zy-acs-flow/src/map/tool.js
+++ b/zy-acs-flow/src/map/tool.js
@@ -194,8 +194,8 @@
y: (event.global.y - batchMoveStartPos.y) / scaleY
};
for (let sprite of selectedSprites) {
- sprite.position.x = sprite.batchMoveStartPos.x - mouseMovement.x;
- sprite.position.y = sprite.batchMoveStartPos.y - mouseMovement.y;
+ sprite.position.x = sprite.batchMoveStartPos.x + mouseMovement.x;
+ sprite.position.y = sprite.batchMoveStartPos.y + mouseMovement.y;
}
}
}
@@ -855,7 +855,7 @@
if (backpackCount !== prevBackpackCount || battery !== prevBattery) {
const agvStatusMode = getAgvStatusMode(backpackCount, battery);
- const agvTexture = generateAgvSpriteTexture(agvStatusMode);
+ const agvTexture = generateAgvSpriteTexture(agvModel, agvStatusMode);
agvSprite.texture = PIXI.Texture.from(agvTexture, { resourceOptions: { scale: 1 } });
// update backpackCount and battery
agvSprite.data.backpackCount = backpackCount;
diff --git a/zy-acs-flow/src/page/sta/StaCreate.jsx b/zy-acs-flow/src/page/sta/StaCreate.jsx
index 7eec5ab..7df05c8 100644
--- a/zy-acs-flow/src/page/sta/StaCreate.jsx
+++ b/zy-acs-flow/src/page/sta/StaCreate.jsx
@@ -1,4 +1,4 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
+import React, { useMemo } from "react";
import {
CreateBase,
useTranslate,
@@ -36,6 +36,12 @@
const translate = useTranslate();
const notify = useNotify();
+ const greaterThanZero = useMemo(() => (value) => {
+ if (value === undefined || value === null || value === '') {
+ return undefined;
+ }
+ return Number(value) >= 0 ? undefined : translate('validate.gtZero');
+ }, [translate]);
const handleClose = (event, reason) => {
if (reason !== "backdropClick") {
@@ -150,21 +156,50 @@
<NumberInput
label="table.field.sta.capacity"
source="capacity"
- validate={required()}
+ validate={[required(), greaterThanZero]}
/>
</Grid>
- <Grid item xs={6} display="flex" gap={1}>
+ {/* <Grid item xs={6} display="flex" gap={1}>
<NumberInput
label="table.field.sta.offset"
source="offset"
validate={required()}
+ />
+ </Grid> */}
+ <Grid item xs={6} display="flex" gap={1}>
+ <NumberInput
+ label="table.field.sta.height"
+ source="height"
+ validate={[required(), greaterThanZero]}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <NumberInput
+ label="table.field.sta.depth"
+ source="depth"
+ helperText={translate('page.sta.depthHint')}
+ validate={[required(), greaterThanZero]}
/>
</Grid>
<Grid item xs={6} display="flex" gap={1}>
<NumberInput
label="table.field.sta.angle"
source="angle"
- validate={required()}
+ validate={[required(), greaterThanZero]}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <NumberInput
+ label="table.field.sta.inboundWait"
+ source="inboundWait"
+ validate={greaterThanZero}
+ />
+ </Grid>
+ <Grid item xs={6} display="flex" gap={1}>
+ <NumberInput
+ label="table.field.sta.outboundWait"
+ source="outboundWait"
+ validate={greaterThanZero}
/>
</Grid>
{/* <Grid item xs={6} display="flex" gap={1}>
@@ -216,9 +251,9 @@
</ReferenceInput>
</Grid> */}
- <Grid item xs={6} display="flex" gap={1}>
+ {/* <Grid item xs={6} display="flex" gap={1}>
<StatusSelectInput />
- </Grid>
+ </Grid> */}
<Grid item xs={12} display="flex" gap={1}>
<Stack direction="column" spacing={1} width={'100%'}>
<MemoInput />
diff --git a/zy-acs-flow/src/page/sta/StaEdit.jsx b/zy-acs-flow/src/page/sta/StaEdit.jsx
index a203a00..fcf3d15 100644
--- a/zy-acs-flow/src/page/sta/StaEdit.jsx
+++ b/zy-acs-flow/src/page/sta/StaEdit.jsx
@@ -42,6 +42,12 @@
const StaEdit = () => {
const translate = useTranslate();
+ const greaterThanZero = useMemo(() => (value) => {
+ if (value === undefined || value === null || value === '') {
+ return undefined;
+ }
+ return Number(value) >= 0 ? undefined : translate('validate.gtZero');
+ }, [translate]);
return (
<Edit
@@ -127,20 +133,45 @@
<NumberInput
label="table.field.sta.capacity"
source="capacity"
- validate={required()}
+ validate={[required(), greaterThanZero]}
/>
<NumberInput
+ label="table.field.sta.angle"
+ source="angle"
+ validate={[required(), greaterThanZero]}
+ />
+ {/* <NumberInput
label="table.field.sta.offset"
source="offset"
validate={required()}
+ /> */}
+ </Stack>
+ <Stack direction='row' gap={2}>
+ <NumberInput
+ label="table.field.sta.height"
+ source="height"
+ validate={[required(), greaterThanZero]}
+ />
+ <NumberInput
+ label="table.field.sta.depth"
+ source="depth"
+ helperText={translate('page.sta.depthHint')}
+ validate={[required(), greaterThanZero]}
/>
</Stack>
<Stack direction='row' gap={2}>
<NumberInput
- label="table.field.sta.angle"
- source="angle"
- validate={required()}
+ label="table.field.sta.inboundWait"
+ source="inboundWait"
+ validate={greaterThanZero}
/>
+ <NumberInput
+ label="table.field.sta.outboundWait"
+ source="outboundWait"
+ validate={greaterThanZero}
+ />
+ </Stack>
+ <Stack direction='row' gap={2}>
{/* <NumberInput
label="table.field.sta.occCnt"
source="occCnt"
@@ -152,14 +183,14 @@
<NumberInput
label="table.field.sta.rsvInCnt"
source="rsvInCnt"
- // InputProps={{ readOnly: true }}
- // disabled
+ // InputProps={{ readOnly: true }}
+ // disabled
/>
<NumberInput
label="table.field.sta.rsvOutCnt"
source="rsvOutCnt"
- // InputProps={{ readOnly: true }}
- // disabled
+ // InputProps={{ readOnly: true }}
+ // disabled
/>
</Stack>
</Grid>
diff --git a/zy-acs-flow/src/page/sta/StaList.jsx b/zy-acs-flow/src/page/sta/StaList.jsx
index d5475ac..658904b 100644
--- a/zy-acs-flow/src/page/sta/StaList.jsx
+++ b/zy-acs-flow/src/page/sta/StaList.jsx
@@ -134,7 +134,8 @@
expand={() => <StaPanel />}
expandSingle={true}
rowSx={rowSx(drawerVal || null)}
- omit={['id', 'uuid', 'name', 'zpallet', 'updateBy', 'createTime', 'createBy', 'memo']}
+ omit={['id', 'uuid', 'name', 'offset', 'zpallet'
+ , 'updateTime', 'updateBy', 'createTime', 'createBy', 'memo']}
>
<NumberField source="id" />
<ReferenceField source="zoneId" label="table.field.sta.zoneId" reference="zone" link={false} sortable={false}>
@@ -157,7 +158,11 @@
<NumberField source="rsvInCnt" label="table.field.sta.rsvInCnt" />
<NumberField source="rsvOutCnt" label="table.field.sta.rsvOutCnt" />
<NumberField source="offset" label="table.field.sta.offset" />
+ <NumberField source="height" label="table.field.sta.height" />
+ <NumberField source="depth" label="table.field.sta.depth" />
<NumberField source="angle" label="table.field.sta.angle" />
+ <NumberField source="inboundWait" label="table.field.sta.inboundWait" />
+ <NumberField source="outboundWait" label="table.field.sta.outboundWait" />
{/* <TextField source="autoing" label="table.field.sta.autoing" />
<TextField source="loading" label="table.field.sta.loading" />
<TextField source="inEnable" label="table.field.sta.inEnable" />
diff --git a/zy-acs-flow/src/page/sta/StaPanel.jsx b/zy-acs-flow/src/page/sta/StaPanel.jsx
index b247569..d73a5bb 100644
--- a/zy-acs-flow/src/page/sta/StaPanel.jsx
+++ b/zy-acs-flow/src/page/sta/StaPanel.jsx
@@ -41,7 +41,11 @@
{ labelKey: 'table.field.sta.capacity', valueKey: 'capacity' },
{ labelKey: 'table.field.sta.rsvInCnt', valueKey: 'rsvInCnt' },
{ labelKey: 'table.field.sta.rsvOutCnt', valueKey: 'rsvOutCnt' },
- { labelKey: 'table.field.sta.offset', valueKey: 'offset' },
+ // { labelKey: 'table.field.sta.offset', valueKey: 'offset' },
+ { labelKey: 'table.field.sta.height', valueKey: 'height' },
+ { labelKey: 'table.field.sta.depth', valueKey: 'depth' },
+ { labelKey: 'table.field.sta.inboundWait', valueKey: 'inboundWait' },
+ { labelKey: 'table.field.sta.outboundWait', valueKey: 'outboundWait' },
{ labelKey: 'table.field.sta.zpallet', valueKey: 'zpallet' },
];
@@ -159,14 +163,14 @@
{/* <Typography variant="subtitle2" color="textSecondary" gutterBottom>
{translate('common.field.status')}
</Typography> */}
- <Grid container spacing={2}>
+ {/* <Grid container spacing={2}>
{STATUS_FIELDS.map(({ key, labelKey }) => (
<Grid item xs={6} sm={3} key={key}>
<StatusIndicator labelKey={labelKey} value={record[key]} />
</Grid>
))}
</Grid>
- <Divider sx={{ my: 2 }} />
+ <Divider sx={{ my: 2 }} /> */}
<Box>
<Typography variant="subtitle1" gutterBottom>
diff --git a/zy-acs-flow/src/page/sta/rowSx.jsx b/zy-acs-flow/src/page/sta/rowSx.jsx
index ac14e60..2c60897 100644
--- a/zy-acs-flow/src/page/sta/rowSx.jsx
+++ b/zy-acs-flow/src/page/sta/rowSx.jsx
@@ -15,6 +15,20 @@
backgroundColor: 'action.selected',
};
}
+ if (record.staType$ === 'ROLLER')
+ return {
+ ...style,
+ borderLeftColor: orange[500],
+ borderLeftWidth: 5,
+ borderLeftStyle: 'solid',
+ };
+ if (record.staType$ === 'RACK')
+ return {
+ ...style,
+ borderLeftColor: blue[500],
+ borderLeftWidth: 5,
+ borderLeftStyle: 'solid',
+ };
if (record.connect)
return {
...style,
diff --git a/zy-acs-flow/src/page/travel/TravelList.jsx b/zy-acs-flow/src/page/travel/TravelList.jsx
index 3d49a3f..04b27f2 100644
--- a/zy-acs-flow/src/page/travel/TravelList.jsx
+++ b/zy-acs-flow/src/page/travel/TravelList.jsx
@@ -30,6 +30,7 @@
ReferenceArrayInput,
AutocompleteInput,
DeleteButton,
+ FunctionField,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
@@ -57,23 +58,42 @@
},
}));
+const tabs = [
+ { id: 'RUNNING', name: 'page.travel.enums.state.running' },
+ { id: 'FINISH', name: 'page.travel.enums.state.finish' },
+];
+
const filters = [
<SearchInput source="condition" alwaysOn />,
<DateInput label='common.time.after' source="timeStart" alwaysOn />,
<DateInput label='common.time.before' source="timeEnd" alwaysOn />,
-
<TextInput source="uuid" label="table.field.travel.uuid" />,
<TextInput source="travelId" label="table.field.travel.travelId" />,
- <ReferenceInput source="agvId" label="table.field.travel.agvId" reference="agv">
+ <ReferenceInput source="agvId" label="table.field.travel.agvId" reference="agv" alwaysOn>
<AutocompleteInput label="table.field.travel.agvId" optionText="uuid" filterToQuery={(val) => ({ uuid: val })} />
</ReferenceInput>,
- <ReferenceInput source="currSeg" label="table.field.travel.currSeg" reference="segment">
- <AutocompleteInput label="table.field.travel.currSeg" optionText="id" filterToQuery={(val) => ({ id: val })} />
+ <SelectInput
+ label="table.field.travel.rollerWaiting"
+ source="rollerWaiting"
+ choices={[
+ { id: '1', name: 'common.enums.statusTrue' },
+ { id: '0', name: 'common.enums.statusFalse' },
+ ]}
+ alwaysOn
+ />,
+ <ReferenceInput source="rollerWaitingCode" label="table.field.travel.rollerWaitingCode" reference="code">
+ <AutocompleteInput label="table.field.travel.rollerWaitingCode" optionText="data" filterToQuery={(val) => ({ uuid: val })} />
</ReferenceInput>,
- <TextInput source="taskContent" label="table.field.travel.taskContent" />,
- <TextInput source="taskIds" label="table.field.travel.taskIds" />,
- <TextInput source="state" label="table.field.travel.state" />,
-
+ // <ReferenceInput source="currSeg" label="table.field.travel.currSeg" reference="segment">
+ // <AutocompleteInput label="table.field.travel.currSeg" optionText="id" filterToQuery={(val) => ({ id: val })} />
+ // </ReferenceInput>,
+ <SelectInput
+ source="state"
+ label="table.field.travel.state"
+ choices={tabs}
+ translateChoice
+ alwaysOn
+ />,
<TextInput label="common.field.memo" source="memo" />,
<SelectInput
label="common.field.status"
@@ -109,7 +129,7 @@
actions={(
<TopToolbar>
<FilterButton />
- <MyCreateButton onClick={() => { setCreateDialog(true) }} />
+ {/* <MyCreateButton onClick={() => { setCreateDialog(true) }} /> */}
<SelectColumnsButton preferenceKey='travel' />
<MyExportButton />
</TopToolbar>
@@ -122,7 +142,7 @@
rowClick={(id, resource, record) => false}
expand={() => <TravelPanel />}
expandSingle={true}
- omit={['id', 'updateBy', 'createTime', 'createBy', 'memo']}
+ omit={['id', 'currSeg', 'rollerWaitingCode', 'updateBy', 'createTime', 'createBy', 'memo']}
>
<NumberField source="id" />
<TextField source="uuid" label="table.field.travel.uuid" />
@@ -134,8 +154,16 @@
<TextField source="id" />
</ReferenceField>
<TextField source="taskIds" label="table.field.travel.taskIds" />
- <TextField source="state" label="table.field.travel.state" />
-
+ <BooleanField source="rollerWaitingBool" label="table.field.travel.rollerWaiting" sortable={false} />
+ <ReferenceField source="rollerWaitingCode" label="table.field.travel.rollerWaitingCode" reference="code" link={false} sortable={false}>
+ <TextField source="data" />
+ </ReferenceField>
+ {/* <TextField source="state" label="table.field.travel.state" /> */}
+ <FunctionField label="table.field.travel.state" cellClassName="state" render={record => (
+ <>
+ {translate(tabs.find(item => item.id === record.state)?.name)}
+ </>
+ )} />
<ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
<TextField source="nickname" />
</ReferenceField>
@@ -146,10 +174,10 @@
<DateField source="createTime" label="common.field.createTime" showTime />
{/* <BooleanField source="statusBool" label="common.field.status" sortable={false} /> */}
<TextField source="memo" label="common.field.memo" sortable={false} />
- <WrapperField cellClassName="opt" label="common.field.opt">
+ {/* <WrapperField cellClassName="opt" label="common.field.opt">
<EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
<DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
- </WrapperField>
+ </WrapperField> */}
</StyledDatagrid>
</List>
<TravelCreate
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java
index 0ae549d..60c5160 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DemoController.java
@@ -1,6 +1,8 @@
package com.zy.acs.manager.core;
+import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.acs.common.domain.HeightDepthDto;
import com.zy.acs.common.enums.AgvStatusType;
import com.zy.acs.framework.common.R;
import com.zy.acs.manager.core.integrate.conveyor.ConveyorStationService;
@@ -9,16 +11,17 @@
import com.zy.acs.manager.core.service.PatrolService;
import com.zy.acs.manager.manager.entity.*;
import com.zy.acs.manager.manager.enums.FuncStaType;
-import com.zy.acs.manager.manager.enums.StaReserveType;
import com.zy.acs.manager.manager.enums.StatusType;
import com.zy.acs.manager.manager.service.*;
import com.zy.acs.manager.system.controller.BaseController;
+import com.zy.acs.manager.system.service.ConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Optional;
import java.util.stream.Collectors;
/**
@@ -44,10 +47,14 @@
private AgvModelService agvModelService;
@Autowired
private StaService staService;
+ @Autowired
+ private SegmentService segmentService;
// @Autowired
// private ConveyorStationService siemensConveyorStationService;
@Autowired
private ConveyorStationService siemensConveyorStationService;
+ @Autowired
+ private ConfigService configService;
@RequestMapping(value = "/system/info", method = {RequestMethod.GET, RequestMethod.POST})
public R systemInfo() {
@@ -56,9 +63,12 @@
@RequestMapping(value = "/system/demo", method = {RequestMethod.GET, RequestMethod.POST})
public R demo() {
- Sta sta = staService.selectByStaNo("1006");
- boolean b = siemensConveyorStationService.allowAgvWork(sta, null, null, StaReserveType.IN);
- return R.ok().add(b);
+ Double defaultShelfDepth = configService.getVal("defaultShelfDepth", Double.class);
+
+ defaultShelfDepth = Optional.ofNullable(defaultShelfDepth).orElse((double) 0);
+ Double ss = 10.0;
+ String jsonString = JSON.toJSONString(new HeightDepthDto(ss, defaultShelfDepth));
+ return R.ok(jsonString);
}
// http://localhost:8088/demo/auto/go/standby
@@ -151,8 +161,6 @@
@Autowired
private MapService mapService;
- @Autowired
- private SegmentService segmentService;
@GetMapping("/astarDemo") // astar spend time: 3866, count:3855
public R astarDemo() {
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java
index 4cedd28..ce8ef78 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/HandlerController.java
@@ -3,8 +3,8 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zy.acs.common.constant.RedisConstant;
+import com.zy.acs.common.utils.Base62;
import com.zy.acs.common.utils.RedisSupport;
-import com.zy.acs.common.utils.Utils;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.framework.common.R;
import com.zy.acs.framework.common.SnowflakeIdWorker;
@@ -165,7 +165,8 @@
task.setAgvId(agv.getId());
task.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
List<Task> lastTasks = taskService.list(new LambdaQueryWrapper<Task>().orderByDesc(Task::getId));
- task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
+// task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
+ task.setSeqNum(Base62.encode(snowflakeIdWorker.nextId()));
task.setTaskType(param.getTaskMode().val());
task.setTaskSts(TaskStsType.WAITING.val());
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/conveyor/ConveyorController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/conveyor/ConveyorController.java
index 835bdad..b4d9a7b 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/conveyor/ConveyorController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/conveyor/ConveyorController.java
@@ -6,6 +6,7 @@
import com.zy.acs.manager.core.integrate.dto.ConveyorQueryParam;
import com.zy.acs.manager.core.integrate.dto.ConveyorQueryResult;
import com.zy.acs.manager.manager.entity.Sta;
+import com.zy.acs.manager.manager.entity.Task;
import com.zy.acs.manager.manager.enums.StatusType;
import com.zy.acs.manager.manager.service.StaService;
import com.zy.acs.manager.system.controller.BaseController;
@@ -38,8 +39,16 @@
.orderByAsc(Sta::getStaNo)
);
for (Sta sta : list) {
- resultList.add(new ConveyorQueryResult(sta.getStaNo()
- , !staService.hasWorkingAgv(sta.getId())));
+ Long staId = sta.getId();
+ boolean conveyable = !staService.hasWorkingAgv(staId);
+ String taskNo = null;
+ if (conveyable) {
+ Task task = staService.checkoutTask(staId);
+ if (null != task) {
+ taskNo = task.getSeqNum();
+ }
+ }
+ resultList.add(new ConveyorQueryResult(sta.getStaNo(), conveyable, taskNo));
}
} else {
for (String staNo : staNos) {
@@ -48,8 +57,16 @@
resultList.add(new ConveyorQueryResult(staNo, Boolean.FALSE));
continue;
}
- resultList.add(new ConveyorQueryResult(staNo
- , !staService.hasWorkingAgv(sta.getId())));
+ Long staId = sta.getId();
+ boolean conveyable = !staService.hasWorkingAgv(staId);
+ String taskNo = null;
+ if (conveyable) {
+ Task task = staService.checkoutTask(staId);
+ if (null != task) {
+ taskNo = task.getSeqNum();
+ }
+ }
+ resultList.add(new ConveyorQueryResult(staNo, conveyable, taskNo));
}
}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/conveyor/SiemensConveyorStationService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/conveyor/SiemensConveyorStationService.java
index 8e7e549..05a08f7 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/conveyor/SiemensConveyorStationService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/conveyor/SiemensConveyorStationService.java
@@ -46,7 +46,7 @@
final String staNo = sta.getStaNo();
// url
- String url = this.buildUrl("/station/query");
+ String url = this.buildUrl("/cv/station/query");
// headers
Map<String, String> headers = new HashMap<>();
// params
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/dto/ConveyorQueryResult.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/dto/ConveyorQueryResult.java
index f49be52..8b19a90 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/dto/ConveyorQueryResult.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/dto/ConveyorQueryResult.java
@@ -9,6 +9,8 @@
private Boolean conveyable;
+ private String taskNo;
+
public ConveyorQueryResult() {
}
@@ -17,4 +19,10 @@
this.conveyable = conveyable;
}
+ public ConveyorQueryResult(String staNo, Boolean conveyable, String taskNo) {
+ this.staNo = staNo;
+ this.conveyable = conveyable;
+ this.taskNo = taskNo;
+ }
+
}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java
index 75d0fc2..f6060a4 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/OpenController.java
@@ -24,7 +24,7 @@
@Autowired
private MainService mainService;
- @PreAuthorize("hasAuthority('open:bus:submit')")
+// @PreAuthorize("hasAuthority('open:bus:submit')")
@PostMapping("/bus/submit")
@OperationLog("generate task from open api")
public R save(@RequestBody OpenBusSubmitParam param) {
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/ConveyorAutoRunScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/ConveyorAutoRunScheduler.java
new file mode 100644
index 0000000..7c24098
--- /dev/null
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/ConveyorAutoRunScheduler.java
@@ -0,0 +1,178 @@
+package com.zy.acs.manager.core.scheduler;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.acs.common.constant.RedisConstant;
+import com.zy.acs.common.utils.RedisSupport;
+import com.zy.acs.framework.common.Cools;
+import com.zy.acs.framework.common.SnowflakeIdWorker;
+import com.zy.acs.manager.common.domain.TaskDto;
+import com.zy.acs.manager.core.service.AreaGovernService;
+import com.zy.acs.manager.core.service.MainService;
+import com.zy.acs.manager.manager.controller.param.OpenBusSubmitParam;
+import com.zy.acs.manager.manager.entity.*;
+import com.zy.acs.manager.manager.enums.AgvModelType;
+import com.zy.acs.manager.manager.enums.BusStsType;
+import com.zy.acs.manager.manager.enums.LocStsType;
+import com.zy.acs.manager.manager.enums.StatusType;
+import com.zy.acs.manager.manager.service.*;
+import com.zy.acs.manager.manager.service.impl.CodeServiceImpl;
+import com.zy.acs.manager.system.service.ConfigService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+@Slf4j
+@Component
+public class ConveyorAutoRunScheduler {
+
+ private static final AgvModelType DEFAULT_AGV_MODEL = AgvModelType.CTU_BOX_TRANSPORT_AGV;
+
+ private final RedisSupport redis = RedisSupport.defaultRedisSupport;
+
+ @Autowired
+ private AgvService agvService;
+ @Autowired
+ private BusService busService;
+ @Autowired
+ private MainService mainService;
+ @Autowired
+ private ConfigService configService;
+ @Autowired
+ private LocService locService;
+ @Autowired
+ private StaService staService;
+ @Autowired
+ private AgvModelService agvModelService;
+ @Autowired
+ private SnowflakeIdWorker snowflakeIdWorker;
+ @Autowired
+ private AreaGovernService areaGovernService;
+ @Autowired
+ private CodeServiceImpl codeService;
+
+ // @Scheduled(fixedRate = 500) // 鍥哄畾棰戠巼鎵ц锛屼笉鍚屾
+ @Scheduled(fixedDelay = 1000) // 鍥哄畾棰戠巼鎵ц锛屽悓姝�
+// @Scheduled(cron = "0/1 * * * * ? ")
+ private void execute() {
+ //if (!configService.getVal("ConveyorTaskAssignMode", Boolean.class)) { return; }
+ AgvModel agvModel = agvModelService.getOne(new LambdaQueryWrapper<AgvModel>().eq(AgvModel::getType, DEFAULT_AGV_MODEL.toString()));
+ if (null == agvModel) { return; }
+
+ //this.autoRun(agvModel);
+ }
+
+ private void autoRun(AgvModel agvModel) {
+ int availableAgvCount = this.getAvailableAgvCount();
+ if (0 == availableAgvCount) { return; }
+
+// List<String> staPreNos = getStaPrefixes(staGroupList);
+ List<String> staPreNos = new ArrayList<>();
+ String memo = "DEMO_STA_" + String.join("-", staPreNos);
+
+
+ // 鏈�澶� ? 缁刡us杩愯
+ if (1 <= busService.count(new LambdaQueryWrapper<Bus>()
+ .in(Bus::getBusSts, BusStsType.RECEIVE.val(), BusStsType.PROGRESS.val())
+ .in(Bus::getMemo, memo)
+ )) { return; }
+
+
+ // 鍑哄簱
+ this.runLocToSta(agvModel, memo);
+
+ }
+
+
+ // 鍑哄簱
+ private void runLocToSta(AgvModel agvModel, String memo) {
+
+ // IDLE STA
+ List<Sta> idleList = new ArrayList<>();
+ idleList.add(staService.selectByStaNo("1001"));
+ idleList.add(staService.selectByStaNo("1007"));
+ if (Cools.isEmpty(idleList)) { return; }
+ Collections.shuffle(idleList);
+
+ OpenBusSubmitParam param = new OpenBusSubmitParam();
+ param.setBatch(String.valueOf(snowflakeIdWorker.nextId()).substring(13, 19));
+ for (int i = 0; i < agvModel.getBackpack() ; i++) {
+ Sta idleSta = idleList.get(i);
+ String staCode = codeService.getCacheById(idleSta.getCode()).getData();
+
+ Loc stockLoc = null;
+
+ // 鎵�鍦ㄥ尯鍩熺殑鏉$爜锛屽鏋滄病鏈塧rea缁戝畾锛屽氨鍏ㄥ湴鍥�
+ List<String> codeList = areaGovernService.queryCodesByOneCode(staCode);
+ if (Cools.isEmpty(codeList)) {
+ stockLoc = locService.selectRandOneByLocSts(LocStsType.STOCK.val(), 1);
+ } else {
+ Collections.shuffle(codeList);
+ for (String codeData : codeList) {
+ Code code = codeService.getCacheByData(codeData);
+ if (null == code) { break; }
+ List<Loc> locList = locService.list(new LambdaQueryWrapper<Loc>()
+ .eq(Loc::getCode, code.getId()).eq(Loc::getLocSts, LocStsType.STOCK.val()));
+ if (Cools.isEmpty(locList)) {
+ break;
+ } else if (locList.size() == 1) {
+ stockLoc = locList.get(0);
+ } else {
+ Collections.shuffle(locList);
+ stockLoc = locList.get(0);
+ }
+ if (null != stockLoc) {
+ break;
+ }
+ }
+ }
+
+ if (null == stockLoc) { break; }
+
+ TaskDto taskDto = new TaskDto();
+ taskDto.setOriLoc(stockLoc.getLocNo());
+ taskDto.setDestSta(idleSta.getStaNo());
+ taskDto.setPriority(100);
+ taskDto.setSeqNum(String.valueOf(snowflakeIdWorker.nextId()).substring(15, 19));
+
+ param.getTaskList().add(taskDto);
+ }
+ if (Cools.isEmpty(param.getTaskList())) { return; }
+
+ mainService.generateBusAndTask(param, memo);
+ }
+
+
+
+ public static List<String> getStaPrefixes(List<String> staGroupList) {
+ Set<String> rowSet = new HashSet<>();
+ for (String s : staGroupList) {
+ rowSet.add(s.split("-")[0]);
+ }
+ List<String> result = new ArrayList<>(rowSet);
+ result.sort(Comparator.comparingInt(Integer::parseInt));
+ return result;
+ }
+
+ private int getAvailableAgvCount() {
+ int res = 0;
+ List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val));
+ if (Cools.isEmpty(agvList)) {
+ return res;
+ }
+ for (Agv agv : agvList) {
+ if (null == redis.getObject(RedisConstant.AGV_ONLINE_FLAG, agv.getUuid())) {
+ continue;
+ }
+ if (!agv.getStatusBool()) {
+ continue;
+ }
+ res++;
+ }
+
+ return res;
+ }
+
+}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java
index f66e3ce..ae3b643 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/KernelScheduler.java
@@ -71,7 +71,7 @@
@Autowired
private LocService locService;
@Autowired
- private AgvModelService agvModelService;
+ private TravelService travelService;
@Autowired
private TransferStationHandler transferStationHandler;
@@ -124,6 +124,8 @@
for (Segment segment : segments) {
if (transferStationHandler.hasDelayAtSta(segment)) {
continue;
+ } else {
+ travelService.clearRollerWaiting(segment.getTravelId());
}
try {
txTemplate.executeWithoutResult(status -> {
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
index 0dc1f6f..4763a54 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
@@ -50,6 +50,8 @@
private AgvAreaDispatcher agvAreaDispatcher;
@Autowired
private SegmentService segmentService;
+ @Autowired
+ private TravelService travelService;
/**
* get available agv list which is idle
@@ -62,7 +64,6 @@
List<String> result = new ArrayList<>();
for (Agv agv : agvList) {
if (!hasRunning) {
- // 1. without running tasks
if (0 < taskService.count(new LambdaQueryWrapper<Task>()
.eq(Task::getAgvId, agv.getId())
.and(i -> i
@@ -73,10 +74,13 @@
)) {
continue;
}
- }
- // 2. in idle status
- if (!agvService.judgeEnable(agv.getId(), true)) {
- continue;
+ if (!agvService.judgeEnable(agv.getId(), true, true)) {
+ continue;
+ }
+ } else {
+ if (!agvService.judgeEnable(agv.getId(), true, false)) {
+ continue;
+ }
}
result.add(agv.getUuid());
@@ -221,15 +225,15 @@
// continue;
// }
// in TransferStationHandler.hasDelayAtSta
- Segment currSeg = segmentService.getRollerWaiting(agvId, sta.getCode(), TaskPosDto.PosType.ORI_STA);
- if (null == currSeg) {
+ Travel currTravelInRollerWaiting = travelService.findRollerWaitingTravel(agvId, currentCode.getId());
+ if (null == currTravelInRollerWaiting) {
continue;
}
// has enough backpack space to load
- Integer backpack = agvService.getBackpack(agvId);
- List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(null, agvId);
- if (usedBackpacks.size() >= backpack) {
+ Integer backpackCap = agvService.getBackpack(agvId);
+ List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(currTravelInRollerWaiting.getId(), agvId);
+ if (usedBackpacks.size() >= backpackCap) {
continue;
}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
index fbd9471..d1aa9eb 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -4,13 +4,11 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zy.acs.common.constant.RedisConstant;
-import com.zy.acs.common.domain.AgvAction;
-import com.zy.acs.common.domain.AgvActionItem;
-import com.zy.acs.common.domain.AgvProtocol;
-import com.zy.acs.common.domain.BaseResult;
+import com.zy.acs.common.domain.*;
import com.zy.acs.common.domain.protocol.*;
import com.zy.acs.common.domain.protocol.action.*;
import com.zy.acs.common.enums.*;
+import com.zy.acs.common.utils.Base62;
import com.zy.acs.common.utils.GsonUtils;
import com.zy.acs.common.utils.RedisSupport;
import com.zy.acs.common.utils.Utils;
@@ -251,33 +249,28 @@
, (task, agvNo, sta) -> {
Long agvId = agvService.getAgvId(agvNo);
-// List<Travel> travelList = travelService.list(new LambdaQueryWrapper<Travel>()
-// .eq(Travel::getAgvId, agvId)
-// .eq(Travel::getState, TravelStateType.RUNNING.toString())
-// .orderByDesc(Travel::getCreateTime));
-// if (Cools.isEmpty(travelList)) {
-// throw new BusinessException("[Agv: " + agvNo + "]allocate inbound failed to find travel");
+ Travel travel = travelService.findRunningTravel(agvId);
+ if (null == travel) {
+ throw new CoolException("[Agv:" + agvNo + "] allocate inbound failed: no roller waiting travel");
+ }
+
+ // curr segment
+ Segment currSeg = segmentService.getCurrWaitingSeg(travel.getId(), agvId);
+// if (null == currSeg) {
+// currSeg = segmentService.getCurrRunningSeg(travel.getId(), agvId, null);
// }
-// Travel travel = travelList.get(0);
-//
-// List<Segment> currSegments = segmentService.list(new LambdaQueryWrapper<Segment>()
-// .eq(Segment::getAgvId, agvId)
-// .eq(Segment::getTravelId, travel.getId())
-// );
- // load segment
- Segment currSeg = segmentService.getRollerWaiting(agvId, sta.getCode(), TaskPosDto.PosType.ORI_STA);
if (null == currSeg) {
- throw new BusinessException("[Agv:" + agvNo + "] allocate inbound failed: no roller waiting segment");
+ throw new CoolException("[Agv:" + agvNo + "] allocate inbound failed: no waiting segment");
}
// get backpack lev
int backpackLev = 0;
- int backpack = agvService.getBackpack(agvId);
+ int backpackCap = agvService.getBackpack(agvId);
List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(currSeg.getTravelId(), agvId);
- if (usedBackpacks.size() >= backpack) {
+ if (usedBackpacks.size() >= backpackCap) {
throw new CoolException("[Agv:" + agvNo + "] allocate inbound segment failed: no idle backpack to use");
}
- for (int lev = 1; lev <= backpack; lev++) {
+ for (int lev = 1; lev <= backpackCap; lev++) {
if (!usedBackpacks.contains(lev)) {
backpackLev = lev;
break;
@@ -363,7 +356,6 @@
// DEST-only sort
destPosList.sort((a, b) -> {
-
// 涓昏酱
double aFirst = a.getFirstWeight(sameGroupXy);
double bFirst = b.getFirstWeight(sameGroupXy);
@@ -381,11 +373,10 @@
// get placeSeg serial
int placeSegSerial;
- // query placeSeg idx
int idx = -1;
for (int i = 0; i < destPosList.size(); i++) {
- if (Objects.equals(destPosList.get(i).getCodeId(), newDto.getCodeId())
- && Objects.equals(destPosList.get(i).getTaskId(), newDto.getTaskId())) {
+ if (Objects.equals(destPosList.get(i).getTaskId(), newDto.getTaskId())
+ && Objects.equals(destPosList.get(i).getCodeId(), newDto.getCodeId())) {
idx = i;
break;
}
@@ -492,7 +483,7 @@
try {
// valid -----------------------------------------------
Agv agv = agvService.getById(agvId);
- if (!agvService.judgeEnable(agv.getId(), false)) {
+ if (!agvService.judgeEnable(agv.getId())) {
return;
}
if (!Cools.isEmpty(taskService.selectInSts(agvId, TaskStsType.ASSIGN, TaskStsType.PROGRESS))) {
@@ -512,9 +503,9 @@
return o2.getPriority() - o1.getPriority();
}
});
- Integer backpack = agvService.getBackpack(agvId);
- if (taskList.size() > backpack) {
- taskList = taskList.subList(0, backpack);
+ Integer backpackCap = agvService.getBackpack(agvId);
+ if (taskList.size() > backpackCap) {
+ taskList = taskList.subList(0, backpackCap);
}
AgvDetail agvDetail = agvDetailService.selectByAgvId(agvId);
@@ -584,7 +575,7 @@
}
- if (backpackLev > backpack) {
+ if (backpackLev > backpackCap) {
throw new BusinessException("瑙f瀽Task澶辫触,AGV鑳岀瘬宸叉弧......");
}
@@ -788,7 +779,8 @@
task.setAgvId(agvId);
task.setUuid(String.valueOf(snowflakeIdWorker.nextId()).substring(3));
List<Task> lastTasks = taskService.list(new LambdaQueryWrapper<Task>().orderByDesc(Task::getId));
- task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
+// task.setSeqNum(Utils.generateSeqNum(Cools.isEmpty(lastTasks)?null:lastTasks.get(0).getSeqNum()));
+ task.setSeqNum(Base62.encode(snowflakeIdWorker.nextId()));
task.setOriCode(agvDetail.getCode());
task.setDestCode(endCode.getId());
// lane
@@ -900,6 +892,8 @@
long actionPrepareSts = ActionStsType.PREPARE.val();
// JSONObject storeDirection = configService.getVal("storeDirection", JSONObject.class);
int angleOffsetVal = configService.getVal("mapAngleOffsetVal", Integer.class);
+ Double defaultShelfDepth = configService.getVal("defaultShelfDepth", Double.class);
+ defaultShelfDepth = Optional.ofNullable(defaultShelfDepth).orElse((double) 0);
String agvNo = agvService.getAgvNo(agvId);
// if (!agvService.judgeEnable(agvId)) {
// throw new CoolException("AGV[" + agvNo + "]褰撳墠涓嶅彲鐢�...");
@@ -1176,7 +1170,7 @@
ActionTypeType.ReadyTakeFromShelvesLoc.desc, // 鍚嶇О
(double) agvDirectionType.val, // 灞炴�у��
lastCode.getData(), // 鍦伴潰鐮�
- String.valueOf(oriLoc.getOffset()), // 鍔ㄤ綔鍙傛暟
+ JSON.toJSONString(new HeightDepthDto(oriLoc.getOffset(), defaultShelfDepth)), // 鍔ㄤ綔鍙傛暟
ActionTypeType.ReadyTakeFromShelvesLoc.val(), // 鍔ㄤ綔绫诲瀷
actionPrepareSts, // 鍔ㄤ綔杩涘害
agvId, // AGV
@@ -1239,7 +1233,7 @@
ActionTypeType.ReadyReleaseToShelvesLoc.desc, // 鍚嶇О
(double) agvDirectionType.val, // 灞炴�у��
lastCode.getData(), // 鍦伴潰鐮�
- String.valueOf(destLoc.getOffset()), // 鍔ㄤ綔鍙傛暟
+ JSON.toJSONString(new HeightDepthDto(destLoc.getOffset(), defaultShelfDepth)), // 鍔ㄤ綔鍙傛暟
ActionTypeType.ReadyReleaseToShelvesLoc.val(), // 鍔ㄤ綔绫诲瀷
actionPrepareSts, // 鍔ㄤ綔杩涘害
agvId, // AGV
@@ -1284,7 +1278,7 @@
ActionTypeType.ReadyTakeFromConveyorSta.desc, // 鍚嶇О
staWorkDirection, // 灞炴�у��
lastCode.getData(), // 鍦伴潰鐮�
- String.valueOf(oriSta.getOffset()), // 鍔ㄤ綔鍙傛暟
+ JSON.toJSONString(new HeightDepthDto(oriSta.getHeight(), Optional.ofNullable(oriSta.getDepth()).orElse((double) 0))), // 鍔ㄤ綔鍙傛暟
ActionTypeType.ReadyTakeFromConveyorSta.val(), // 鍔ㄤ綔绫诲瀷
actionPrepareSts, // 鍔ㄤ綔杩涘害
agvId, // AGV
@@ -1367,7 +1361,7 @@
ActionTypeType.ReadyReleaseToConveyorSta.desc, // 鍚嶇О
staWorkDirection, // 灞炴�у��
lastCode.getData(), // 鍦伴潰鐮�
- String.valueOf(destSta.getOffset()), // 鍔ㄤ綔鍙傛暟
+ JSON.toJSONString(new HeightDepthDto(destSta.getHeight(), Optional.ofNullable(destSta.getDepth()).orElse((double) 0))), // 鍔ㄤ綔鍙傛暟
ActionTypeType.ReadyReleaseToConveyorSta.val(), // 鍔ㄤ綔绫诲瀷
actionPrepareSts, // 鍔ㄤ綔杩涘害
agvId, // AGV
@@ -1640,14 +1634,22 @@
agvAction.add(new AgvActionItem<>(ReadyTakeFromShelvesLoc.class)
.setVal(action.getVal().intValue())
.setQrCode(action.getCode())
- .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
+ .bodySync((body) -> {
+ HeightDepthDto heightDepthDto = JSON.parseObject(action.getParams(), HeightDepthDto.class);
+ body.setHeight(heightDepthDto.getHeight());
+ body.setDepth(heightDepthDto.getDepth());
+ })
);
break;
case ReadyTakeFromConveyorSta:
agvAction.add(new AgvActionItem<>(ReadyTakeFromConveyorSta.class)
.setVal(action.getVal().intValue())
.setQrCode(action.getCode())
- .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
+ .bodySync((body) -> {
+ HeightDepthDto heightDepthDto = JSON.parseObject(action.getParams(), HeightDepthDto.class);
+ body.setHeight(heightDepthDto.getHeight());
+ body.setDepth(heightDepthDto.getDepth());
+ })
);
break;
case ReadyTakeFromAgvSite:
@@ -1661,21 +1663,22 @@
agvAction.add(new AgvActionItem<>(ReadyReleaseToShelvesLoc.class)
.setVal(action.getVal().intValue())
.setQrCode(action.getCode())
- .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
- );
- break;
- case LoadPlatformLift:
- agvAction.add(new AgvActionItem<>(LoadPlatformLift.class)
- .setVal(action.getVal().intValue())
- .setQrCode(action.getCode())
- .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
+ .bodySync((body) -> {
+ HeightDepthDto heightDepthDto = JSON.parseObject(action.getParams(), HeightDepthDto.class);
+ body.setHeight(heightDepthDto.getHeight());
+ body.setDepth(heightDepthDto.getDepth());
+ })
);
break;
case ReadyReleaseToConveyorSta:
agvAction.add(new AgvActionItem<>(ReadyReleaseToConveyorSta.class)
.setVal(action.getVal().intValue())
.setQrCode(action.getCode())
- .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
+ .bodySync((body) -> {
+ HeightDepthDto heightDepthDto = JSON.parseObject(action.getParams(), HeightDepthDto.class);
+ body.setHeight(heightDepthDto.getHeight());
+ body.setDepth(heightDepthDto.getDepth());
+ })
);
break;
case ReadyReleaseToAgvSite:
@@ -1683,6 +1686,13 @@
.setVal(action.getVal().intValue())
.setQrCode(action.getCode())
.bodySync(body -> body.setDepth((short) Double.parseDouble(action.getParams())))
+ );
+ break;
+ case LoadPlatformLift:
+ agvAction.add(new AgvActionItem<>(LoadPlatformLift.class)
+ .setVal(action.getVal().intValue())
+ .setQrCode(action.getCode())
+ .bodySync(body -> body.setHeight((short) Double.parseDouble(action.getParams())))
);
break;
case FinishPath:
@@ -1835,7 +1845,7 @@
Code code = codeService.getCacheByData(agv_06_up.getQrCode());
// query current segment
- Segment currSeg = segmentService.getCurrRunningSeg(agv.getId(), code.getId());
+ Segment currSeg = segmentService.getCurrRunningSeg(null, agv.getId(), code.getId());
if (null == currSeg) {
log.error("failed to find curr segment [{}]", agv.getUuid());
} else {
@@ -1868,6 +1878,7 @@
staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.OUT);
break;
}
+ log.info("AGV [{}] load permitted at conveyor station [{}]", protocol.getAgvNo(), sta.getStaNo());
success = true;
break;
case DEST_STA:
@@ -1883,10 +1894,11 @@
staReserveService.rollbackWaitingToReserved(sta, currTask, StaReserveType.IN);
break;
}
+ log.info("AGV [{}] unload permitted at conveyor station [{}]", protocol.getAgvNo(), sta.getStaNo());
success = true;
break;
default:
- log.error("agv[{}] has wrong posType [{}], segment [{}]", protocol.getAgvNo(), posType.toString(), currSeg.getId());
+ log.error("AGV [{}] has wrong posType [{}], segment [{}]", protocol.getAgvNo(), posType.toString(), currSeg.getId());
break;
}
}
@@ -1899,8 +1911,7 @@
AGV_06_DOWN agv_06_down = new AGV_06_DOWN();
agv_06_down.setSerialNo(agv_06_up.getSerialNo());
agv_06_down.setActionCode(agv_06_up.getActionCode());
- //agv_06_down.setResult(success ? 1 : 0);
- agv_06_down.setResult(1);
+ agv_06_down.setResult(success ? 1 : 0);
redis.push(RedisConstant.AGV_PATH_DOWN_FLAG, AgvProtocol.build(protocol.getAgvNo()).setMessageBody(agv_06_down));
}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
index 2e6afef..3d96fb0 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TrafficService.java
@@ -703,9 +703,12 @@
continue;
}
// 褰撳墠vehicle姝e湪杩涜婊氱瓛杈撻�佺嚎绛夊緟
- if (segmentService.isRollerWaiting(agvId)) {
+ if (travelService.hasRollerWaiting(agvId)) {
continue;
}
+// if (segmentService.isRollerWaiting(agvId)) {
+// continue;
+// }
return blockVehicleDto.getVehicle();
}
return null;
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java
index 12c37f9..361db5d 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/TransferStationHandler.java
@@ -12,13 +12,14 @@
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
@Slf4j
@Service
public class TransferStationHandler {
- private static final long LOAD_DELAY_MS = 15000L; // load ( inbound ) delay timeout
- private static final long PLACE_DELAY_MS = 15000L; // place ( outbound ) delay timeout
+ private static final int DEFAULT_LOAD_DELAY_MS = 15000; // load ( inbound ) delay timeout
+ private static final int DEFAULT_PLACE_DELAY_MS = 1000; // place ( outbound ) delay timeout
@Autowired
private SegmentService segmentService;
@@ -30,6 +31,8 @@
private CodeService codeService;
@Autowired
private StaService staService;
+ @Autowired
+ private TravelService travelService;
/**
* 鍙栬揣锛堝叆搴擄級锛氬湪鍙栧畬绗竴涓揣鐨勬椂鍊欙紝鎷呭績婊氱瓛杈撻�佺嚎浼氭湁涓嬩竴涓揣鐗╋紝鎵�浠ュ缓璁瓵GV鍦ㄥ師鍦扮瓑寰呬竴娈垫椂闂�
@@ -68,20 +71,21 @@
if (prePosType.equals(TaskPosDto.PosType.ORI_STA)) {
// 鑳岀瘬鏈弧鎵嶇瓑
- Integer backpack = agvService.getBackpack(agvId);
+ Integer backpackCap = agvService.getBackpack(agvId);
List<Integer> usedBackpacks = segmentService.selectUsedBackpacks(currSeg.getTravelId(), agvId);
- if (usedBackpacks.size() >= backpack) {
+ if (usedBackpacks.size() >= backpackCap) {
return false;
}
- // sign waiting
- if (currSeg.getRollerWaiting() == 0) {
- currSeg.setRollerWaiting(1);
- segmentService.updateById(currSeg);
- }
+ // mark roller waiting
+ travelService.markRollerWaiting(currSeg.getTravelId(), currentCode.getId());
+// if (currSeg.getRollerWaiting() == 0) {
+// currSeg.setRollerWaiting(1);
+// segmentService.updateById(currSeg);
+// }
// timeout
- return (now - preEndTime) < LOAD_DELAY_MS;
+ return (now - preEndTime) < Optional.ofNullable(rollerSta.getInboundWait()).orElse(DEFAULT_LOAD_DELAY_MS);
}
// outbound
@@ -95,14 +99,15 @@
return false;
}
- // sign waiting
- if (currSeg.getRollerWaiting() == 0) {
- currSeg.setRollerWaiting(1);
- segmentService.updateById(currSeg);
- }
+ // mark roller waiting
+ travelService.markRollerWaiting(currSeg.getTravelId(), currentCode.getId());
+// if (currSeg.getRollerWaiting() == 0) {
+// currSeg.setRollerWaiting(1);
+// segmentService.updateById(currSeg);
+// }
// timeout
- return (now - preEndTime) < PLACE_DELAY_MS;
+ return (now - preEndTime) < Optional.ofNullable(rollerSta.getOutboundWait()).orElse(DEFAULT_PLACE_DELAY_MS);
}
return false;
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/StaController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/StaController.java
index 40b0939..5bd01a2 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/StaController.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/StaController.java
@@ -12,6 +12,7 @@
import com.zy.acs.manager.common.utils.ExcelUtil;
import com.zy.acs.manager.manager.entity.Sta;
import com.zy.acs.manager.manager.entity.StaReserve;
+import com.zy.acs.manager.manager.enums.StatusType;
import com.zy.acs.manager.manager.service.StaReserveService;
import com.zy.acs.manager.manager.service.StaService;
import com.zy.acs.manager.system.controller.BaseController;
@@ -72,6 +73,7 @@
sta.setCreateTime(now);
sta.setUpdateBy(loginUserId);
sta.setUpdateTime(now);
+ sta.setStatus(StatusType.ENABLE.val);
if (!staService.save(sta)) {
return R.error("Save Fail");
}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Segment.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Segment.java
index a36e304..9f62586 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Segment.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Segment.java
@@ -8,7 +8,6 @@
import com.zy.acs.manager.manager.service.AgvService;
import com.zy.acs.manager.manager.service.CodeService;
import com.zy.acs.manager.manager.service.TaskService;
-import com.zy.acs.manager.manager.service.TravelService;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -167,15 +166,6 @@
private String memo;
public Segment() {}
-
- public String getTravelId$(){
- TravelService service = SpringUtils.getBean(TravelService.class);
- Travel travel = service.getById(this.travelId);
- if (!Cools.isEmpty(travel)){
- return String.valueOf(travel.getUuid());
- }
- return null;
- }
public String getTaskId$(){
TaskService service = SpringUtils.getBean(TaskService.class);
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Sta.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Sta.java
index ff9e23a..3b1b259 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Sta.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Sta.java
@@ -6,6 +6,7 @@
import com.zy.acs.framework.common.Cools;
import com.zy.acs.framework.common.SpringUtils;
import com.zy.acs.manager.manager.service.CodeService;
+import com.zy.acs.manager.manager.service.StaTypeService;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -55,8 +56,20 @@
@ApiModelProperty(value= "鍋忕Щ閲�")
private Double offset;
+ @ApiModelProperty(value= "浣滀笟楂樺害")
+ private Double height;
+
+ @ApiModelProperty(value= "浣滀笟娣卞害")
+ private Double depth;
+
@ApiModelProperty(value= "浣滀笟瑙掑害")
private String angle;
+
+ @ApiModelProperty(value= "杩炵画鍏ュ簱绛夊緟(ms)")
+ private Integer inboundWait;
+
+ @ApiModelProperty(value= "杩炵画鍑哄簱绛夊緟(ms)")
+ private Integer outboundWait;
@ApiModelProperty(value= "鑷姩")
private String autoing;
@@ -109,14 +122,14 @@
// return null;
// }
//
-// public String getStaType$(){
-// StaTypeService service = SpringUtils.getBean(StaTypeService.class);
-// StaType staType = service.getById(this.staType);
-// if (!Cools.isEmpty(staType)){
-// return String.valueOf(staType.getName());
-// }
-// return null;
-// }
+ public String getStaType$(){
+ StaTypeService service = SpringUtils.getBean(StaTypeService.class);
+ StaType staType = service.getById(this.staType);
+ if (!Cools.isEmpty(staType)){
+ return String.valueOf(staType.getUuid());
+ }
+ return null;
+ }
//
public String getCode$(){
CodeService service = SpringUtils.getBean(CodeService.class);
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Travel.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Travel.java
index c39f2f7..8d3db1d 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Travel.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/Travel.java
@@ -3,9 +3,6 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
-import com.zy.acs.framework.common.Cools;
-import com.zy.acs.framework.common.SpringUtils;
-import com.zy.acs.manager.manager.service.AgvService;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -62,6 +59,18 @@
private String taskIds;
/**
+ * 婊氱瓛绾跨瓑寰� 1: 鏄� 0: 鍚�
+ */
+ @ApiModelProperty(value= "婊氱瓛绾跨瓑寰� 1: 鏄� 0: 鍚� ")
+ private Integer rollerWaiting;
+
+ /**
+ * 婊氱瓛绾跨瓑寰呭湴鐮�
+ */
+ @ApiModelProperty(value= "婊氱瓛绾跨瓑寰呭湴鐮�")
+ private Long rollerWaitingCode;
+
+ /**
* 杩涘害
*/
@ApiModelProperty(value= "杩涘害")
@@ -115,65 +124,17 @@
@ApiModelProperty(value= "澶囨敞")
private String memo;
- public Travel() {}
-
- public Travel(String uuid,String travelId,Long agvId,Long currSeg,String taskContent,String taskIds,String state,Integer status,Integer deleted,Long tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
- this.uuid = uuid;
- this.travelId = travelId;
- this.agvId = agvId;
- this.currSeg = currSeg;
- this.taskContent = taskContent;
- this.taskIds = taskIds;
- this.state = state;
- this.status = status;
- this.deleted = deleted;
- this.tenantId = tenantId;
- this.createBy = createBy;
- this.createTime = createTime;
- this.updateBy = updateBy;
- this.updateTime = updateTime;
- this.memo = memo;
- }
-
-// Travel travel = new Travel(
-// null, // 缂栧彿
-// null, // 缁勭紪鍙�
-// null, // AGV
-// null, // 褰撳墠鑺傜偣
-// null, // 鍐呭
-// null, // 浠诲姟鍒楄〃
-// null, // 杩涘害
-// null, // 鐘舵�乕闈炵┖]
-// null, // 鏄惁鍒犻櫎[闈炵┖]
-// null, // 绉熸埛
-// null, // 娣诲姞浜哄憳
-// null, // 娣诲姞鏃堕棿[闈炵┖]
-// null, // 淇敼浜哄憳
-// null, // 淇敼鏃堕棿
-// null // 澶囨敞
-// );
-
- public String getAgvId$(){
- AgvService service = SpringUtils.getBean(AgvService.class);
- Agv agv = service.getById(this.agvId);
- if (!Cools.isEmpty(agv)){
- return String.valueOf(agv.getUuid());
- }
- return null;
- }
-
- public String getStatus$(){
- if (null == this.status){ return null; }
- switch (this.status){
+ public Boolean getRollerWaitingBool(){
+ if (null == this.rollerWaiting){ return null; }
+ switch (this.rollerWaiting){
case 1:
- return "姝e父";
+ return true;
case 0:
- return "鍐荤粨";
+ return false;
default:
- return String.valueOf(this.status);
+ return null;
}
}
-
public Boolean getStatusBool(){
if (null == this.status){ return null; }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/AgvService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/AgvService.java
index 6bc4935..12d54b0 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/AgvService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/AgvService.java
@@ -32,7 +32,7 @@
Boolean judgeEnable(Long agvId);
- Boolean judgeEnable(Long agvId, Boolean withBattery);
+ Boolean judgeEnable(Long agvId, Boolean withBattery, Boolean idleStatus);
Boolean judgeOnline(Long agvId);
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/SegmentService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/SegmentService.java
index 338dde8..a18a2dd 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/SegmentService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/SegmentService.java
@@ -1,7 +1,6 @@
package com.zy.acs.manager.manager.service;
import com.baomidou.mybatisplus.extension.service.IService;
-import com.zy.acs.manager.core.domain.TaskPosDto;
import com.zy.acs.manager.manager.entity.Segment;
import com.zy.acs.manager.manager.enums.SegmentStateType;
@@ -27,11 +26,11 @@
Boolean cancel(Long segmentId, Long userId);
- Segment getCurrRunningSeg(Long agvId, Long codeId);
+ Segment getCurrWaitingSeg(Long travelId, Long agvId);
+
+ Segment getCurrRunningSeg(Long travelId, Long agvId, Long codeId);
List<Integer> selectUsedBackpacks(Long travelId, Long agvId);
-
- Segment getRollerWaiting(Long agvId, Long codeId, TaskPosDto.PosType posType);
Boolean isRollerWaiting(Long agvId);
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/StaService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/StaService.java
index 3908f1b..c9fa9be 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/StaService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/StaService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.zy.acs.manager.manager.entity.Sta;
+import com.zy.acs.manager.manager.entity.Task;
import com.zy.acs.manager.manager.enums.StaTypeType;
import java.util.List;
@@ -16,6 +17,8 @@
List<Sta> queryAvailableInSta(Integer minAvailableQty);
+ Task checkoutTask(Long staId);
+
boolean isRoller(Long staId);
Boolean hasWorkingAgv(Long staId);
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/TravelService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/TravelService.java
index 781b975..b494a46 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/TravelService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/TravelService.java
@@ -9,4 +9,14 @@
void finishAll(Long agvId);
+ Travel findRunningTravel(Long agvId);
+
+ Travel findRollerWaitingTravel(Long agvId, Long code);
+
+ Boolean hasRollerWaiting(Long agvId);
+
+ Boolean markRollerWaiting(Long travelId, Long codeId);
+
+ Boolean clearRollerWaiting(Long travelId);
+
}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
index fedc29c..4fb9bd3 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
@@ -190,19 +190,21 @@
@Override
public Boolean judgeEnable(Long agvId) {
- return this.judgeEnable(agvId, false);
+ return this.judgeEnable(agvId, false, true);
}
@Override
- public Boolean judgeEnable(Long agvId, Boolean isLowBattery) {
+ public Boolean judgeEnable(Long agvId, Boolean isLowBattery, Boolean idleStatus) {
String agvNo = this.getAgvNo(agvId);
AgvModel agvModel = agvModelService.getByAgvId(agvId);
- if (0 < segmentService.count(new LambdaQueryWrapper<Segment>()
- .eq(Segment::getAgvId, agvId)
- .eq(Segment::getState, SegmentStateType.RUNNING.toString())
- )) {
+ if (idleStatus) {
+ if (0 < segmentService.count(new LambdaQueryWrapper<Segment>()
+ .eq(Segment::getAgvId, agvId)
+ .eq(Segment::getState, SegmentStateType.RUNNING.toString())
+ )) {
// log.warn("[{}]鍙稟gv姝e湪蹇欑 - segment......", agvNo);
- return false;
+ return false;
+ }
}
if (!this.judgeOnline(agvId)) {
// log.warn("[{}]鍙稟gv涓嶆槸鍦ㄧ嚎鐘舵��......", agvNo);
@@ -216,9 +218,11 @@
if (null == agvDetail.getSoc() || agvDetail.getSoc() == 0) {
return false;
}
- if (!agvDetail.getAgvStatus().equals(AgvStatusType.IDLE) && !agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
- log.warn("[{}]鍙稟gv涓嶆槸绌洪棽鐘舵��......", agvNo);
- return false;
+ if (idleStatus) {
+ if (!agvDetail.getAgvStatus().equals(AgvStatusType.IDLE) && !agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
+ log.warn("[{}]鍙稟gv涓嶆槸绌洪棽鐘舵��......", agvNo);
+ return false;
+ }
}
if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
if (agvDetail.getSoc() < agvModel.getQuaBattery()) {
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/BusServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/BusServiceImpl.java
index 21e8ad2..0d12a98 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/BusServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/BusServiceImpl.java
@@ -8,11 +8,14 @@
import com.zy.acs.manager.common.domain.TaskDto;
import com.zy.acs.manager.manager.controller.param.OpenBusSubmitParam;
import com.zy.acs.manager.manager.entity.Bus;
+import com.zy.acs.manager.manager.entity.Loc;
import com.zy.acs.manager.manager.entity.Task;
import com.zy.acs.manager.manager.enums.BusStsType;
+import com.zy.acs.manager.manager.enums.LocStsType;
import com.zy.acs.manager.manager.enums.TaskStsType;
import com.zy.acs.manager.manager.mapper.BusMapper;
import com.zy.acs.manager.manager.service.BusService;
+import com.zy.acs.manager.manager.service.LocService;
import com.zy.acs.manager.manager.service.TaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -26,10 +29,37 @@
@Autowired
private TaskService taskService;
+ @Autowired
+ private LocService locService;
@Override
public Bus selectByUuid(String uuid) {
return this.getOne(new LambdaQueryWrapper<Bus>().eq(Bus::getUuid, uuid));
+ }
+
+ private void test(OpenBusSubmitParam param) {
+ if (Cools.isEmpty(param)) {
+ return;
+ }
+ List<TaskDto> taskList = param.getTaskList();
+ if (Cools.isEmpty(taskList)) {
+ return;
+ }
+ for (TaskDto dto : taskList) {
+ if (dto.getPriority() == 9527) {
+ if (Cools.isEmpty(dto.getDestLoc())) {
+ List<Loc> locList = locService.list(new LambdaQueryWrapper<Loc>()
+ .ge(Loc::getRow, 31).eq(Loc::getLocSts, LocStsType.IDLE.val()));
+ if (Cools.isEmpty(locList)) {
+ log.error("there is no such idle loc");
+ break;
+ }
+ Collections.shuffle(locList);
+ Loc loc = locList.get(0);
+ dto.setDestLoc(loc.getLocNo());
+ }
+ }
+ }
}
@Override
@@ -40,6 +70,7 @@
if (Cools.isEmpty(param.getBatch())) {
return "Batch cannot be empty!";
}
+ this.test(param);
Set<String> oriStaNoSet = new HashSet<>();
Set<String> oriLocNoSet = new HashSet<>();
Set<String> destStaNoSet = new HashSet<>();
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java
index 18fb10e..ea56edf 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/SegmentServiceImpl.java
@@ -4,7 +4,6 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zy.acs.framework.common.Cools;
import com.zy.acs.framework.exception.CoolException;
-import com.zy.acs.manager.core.domain.TaskPosDto;
import com.zy.acs.manager.manager.entity.Segment;
import com.zy.acs.manager.manager.entity.Task;
import com.zy.acs.manager.manager.enums.ActionStsType;
@@ -154,39 +153,42 @@
}
@Override
- public Segment getCurrRunningSeg(Long agvId, Long codeId) {
+ public Segment getCurrWaitingSeg(Long travelId, Long agvId) {
List<Segment> segments = this.list(new LambdaQueryWrapper<Segment>()
+ .eq(Segment::getTravelId, travelId)
.eq(Segment::getAgvId, agvId)
- .eq(Segment::getState, SegmentStateType.RUNNING.toString())
- .eq(Segment::getEndNode, codeId)
+ .eq(Segment::getState, SegmentStateType.WAITING.toString())
.orderByDesc(Segment::getId)
);
-
if (Cools.isEmpty(segments)) {
+ }
+ return segments.stream().findFirst().orElse(null);
+ }
+ @Override
+ public Segment getCurrRunningSeg(Long travelId, Long agvId, Long codeId) {
+ if (null == agvId) {
+ return null;
+ }
+ LambdaQueryWrapper<Segment> wrapper = new LambdaQueryWrapper<Segment>()
+ .eq(Segment::getAgvId, agvId)
+ .eq(Segment::getState, SegmentStateType.RUNNING.toString());
+ if (null != travelId) {
+ wrapper.eq(Segment::getTravelId, travelId);
+ }
+ if (null != codeId) {
+ wrapper.eq(Segment::getEndNode, codeId);
+ }
+ wrapper.orderByDesc(Segment::getId);
+ List<Segment> segments = this.list(wrapper);
+ if (Cools.isEmpty(segments)) {
}
return segments.stream().findFirst().orElse(null);
}
@Override
public List<Integer> selectUsedBackpacks(Long travelId, Long agvId) {
- return this.baseMapper.selectUsedBackpacks(agvId, travelId);
- }
-
- @Override
- public Segment getRollerWaiting(Long agvId, Long codeId, TaskPosDto.PosType posType) {
- List<Segment> segments = this.list(new LambdaQueryWrapper<Segment>()
- .eq(Segment::getAgvId, agvId)
- .eq(Segment::getState, SegmentStateType.WAITING.toString())
- .eq(Segment::getEndNode, codeId)
- .eq(Segment::getPosType, posType.toString())
- .eq(Segment::getRollerWaiting, 1)
- .orderByDesc(Segment::getId)
- );
- if (Cools.isEmpty(segments)) {
- return null;
- }
- return segments.get(0);
+ return this.baseMapper.selectUsedBackpacks(travelId, agvId);
}
@Override
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/StaServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/StaServiceImpl.java
index c0871c6..8afdba0 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/StaServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/StaServiceImpl.java
@@ -5,10 +5,7 @@
import com.zy.acs.framework.common.Cools;
import com.zy.acs.manager.core.domain.TaskPosDto;
import com.zy.acs.manager.manager.entity.*;
-import com.zy.acs.manager.manager.enums.SegmentStateType;
-import com.zy.acs.manager.manager.enums.StaTypeType;
-import com.zy.acs.manager.manager.enums.StatusType;
-import com.zy.acs.manager.manager.enums.TravelStateType;
+import com.zy.acs.manager.manager.enums.*;
import com.zy.acs.manager.manager.mapper.StaMapper;
import com.zy.acs.manager.manager.service.*;
import org.springframework.beans.factory.annotation.Autowired;
@@ -28,6 +25,10 @@
private SegmentService segmentService;
@Autowired
private TravelService travelService;
+ @Autowired
+ private StaReserveService staReserveService;
+ @Autowired
+ private TaskService taskService;
@Override
public Sta selectByStaNo(String staNo) {
@@ -56,6 +57,22 @@
}
@Override
+ public Task checkoutTask(Long staId) {
+ StaReserve reserve = staReserveService.getOne(new LambdaQueryWrapper<StaReserve>()
+ .eq(StaReserve::getStaId, staId)
+ .eq(StaReserve::getState, StaReserveStateType.CONFIRMED.toString())
+ .eq(StaReserve::getType, StaReserveType.IN.toString())
+ .eq(StaReserve::getStatus, StatusType.ENABLE.val)
+ .orderByDesc(StaReserve::getConfirmedAt)
+ .last("limit 1")
+ );
+ if (null == reserve) {
+ return null;
+ }
+ return taskService.getById(reserve.getTaskId());
+ }
+
+ @Override
public boolean isRoller(Long staId) {
if (staId == null) {
return false;
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TravelServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TravelServiceImpl.java
index 7010598..2006b40 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TravelServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/TravelServiceImpl.java
@@ -1,7 +1,10 @@
package com.zy.acs.manager.manager.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zy.acs.framework.common.Cools;
+import com.zy.acs.framework.exception.CoolException;
import com.zy.acs.manager.manager.entity.Segment;
import com.zy.acs.manager.manager.entity.Travel;
import com.zy.acs.manager.manager.enums.SegmentStateType;
@@ -9,13 +12,13 @@
import com.zy.acs.manager.manager.mapper.TravelMapper;
import com.zy.acs.manager.manager.service.SegmentService;
import com.zy.acs.manager.manager.service.TravelService;
-import com.zy.acs.framework.exception.CoolException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
+import java.util.Objects;
@Slf4j
@Service("travelService")
@@ -60,4 +63,90 @@
}
}
+ @Override
+ public Travel findRunningTravel(Long agvId) {
+ return this.getOne(new LambdaQueryWrapper<Travel>()
+ .eq(Travel::getAgvId, agvId)
+ .eq(Travel::getState, TravelStateType.RUNNING.toString())
+ .orderByDesc(Travel::getCreateTime)
+ .last("limit 1")
+ );
+ }
+
+ @Override
+ public Travel findRollerWaitingTravel(Long agvId, Long code) {
+ return this.getOne(new LambdaQueryWrapper<Travel>()
+ .eq(Travel::getAgvId, agvId)
+ .eq(Travel::getState, TravelStateType.RUNNING.toString())
+ .eq(Travel::getRollerWaiting, 1)
+ .eq(Travel::getRollerWaitingCode, code)
+ .orderByDesc(Travel::getCreateTime)
+ .last("limit 1")
+ );
+ }
+
+ @Override
+ public Boolean hasRollerWaiting(Long agvId) {
+ if (null == agvId) {
+ return false;
+ }
+ return 0 < this.count(new LambdaQueryWrapper<Travel>()
+ .eq(Travel::getAgvId, agvId)
+ .eq(Travel::getState, TravelStateType.RUNNING.toString())
+ .eq(Travel::getRollerWaiting, 1)
+ );
+ }
+
+ @Override
+ public Boolean markRollerWaiting(Long travelId, Long codeId) {
+ if (Cools.isEmpty(travelId, codeId)) {
+ return false;
+ }
+ Travel travel = this.getById(travelId);
+ if (travel == null) {
+ return false;
+ }
+ if (!TravelStateType.RUNNING.toString().equals(travel.getState())) {
+ return false;
+ }
+ if (travel.getRollerWaiting() == 1
+ && Objects.equals(travel.getRollerWaitingCode(), codeId)) {
+ return true;
+ }
+ travel.setRollerWaiting(1);
+ travel.setRollerWaitingCode(codeId);
+ if (!this.updateById(travel)) {
+ log.error("travel [{}] failed to mark roller waiting (code={})", travelId, codeId);
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public Boolean clearRollerWaiting(Long travelId) {
+ if (null == travelId) {
+ return false;
+ }
+ Travel travel = this.getById(travelId);
+ if (travel == null) {
+ return false;
+ }
+// if (!TravelStateType.RUNNING.toString().equals(travel.getState())) {
+// return false;
+// }
+ if (travel.getRollerWaiting() == 0 && Cools.isEmpty(travel.getRollerWaitingCode())) {
+ return true;
+ }
+ if (!this.update(
+ new LambdaUpdateWrapper<Travel>()
+ .eq(Travel::getId, travelId)
+ .set(Travel::getRollerWaiting, 0)
+ .set(Travel::getRollerWaitingCode, null)
+ )) {
+ log.error("travel [{}] failed to clear roller waiting", travelId);
+ return false;
+ }
+ return true;
+ }
+
}
diff --git a/zy-acs-manager/src/main/resources/application.yml b/zy-acs-manager/src/main/resources/application.yml
index a7a7617..94987b1 100644
--- a/zy-acs-manager/src/main/resources/application.yml
+++ b/zy-acs-manager/src/main/resources/application.yml
@@ -51,7 +51,7 @@
index: 8
convey-plc:
- host: 10.10.10.212
+ host: 10.10.10.222
port: 9090
floyd:
--
Gitblit v1.9.1