Skip to content

Commit 1d72e15

Browse files
authored
Dev 功能完善 (#10)
* 完善 README.md * 细节完善 * 优化「剩余充电次数」相关功能 * 新增硬件设备单板测试软件 * Netty 部分代码整体优化,采用中介者模式进行明显分层
1 parent a61ba07 commit 1d72e15

39 files changed

+2579
-158
lines changed

clustermanage-server/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>cc.bitky.clustermanage</groupId>
88
<artifactId>clustermanage-server</artifactId>
9-
<version>0.9.2-release</version>
9+
<version>0.9.3-release</version>
1010
<packaging>jar</packaging>
1111

1212
<name>clustermanage-server</name>

clustermanage-server/src/main/java/cc/bitky/clustermanage/ClustermanageServerApplication.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ private static void initSetting() {
5252
ServerSetting.DEFAULT_EMPLOYEE_CARD_NUMBER = exSetting.员工默认卡号;
5353
ServerSetting.DEFAULT_EMPLOYEE_NAME = exSetting.员工默认姓名;
5454
ServerSetting.DEFAULT_EMPLOYEE_DEPARTMENT = exSetting.员工默认部门;
55+
ServerSetting.AUTO_REPEAT_REQUEST_TIMES = exSetting.检错重发最大重复次数;
5556
}
5657
}
5758
}

clustermanage-server/src/main/java/cc/bitky/clustermanage/db/presenter/DbDevicePresenter.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import cc.bitky.clustermanage.db.bean.Device;
1313
import cc.bitky.clustermanage.db.repository.DeviceRepository;
14+
import cc.bitky.clustermanage.server.message.ChargeStatus;
1415
import cc.bitky.clustermanage.server.message.tcp.TcpMsgResponseStatus;
1516

1617
@Service
@@ -48,7 +49,7 @@ Device handleMsgDeviceStatus(TcpMsgResponseStatus msgStatus) {
4849
if (device == null) return null;
4950
int rawStatus = device.getStatus();
5051
int newStatus = msgStatus.getStatus();
51-
if (newStatus > 6 || newStatus < 0) newStatus = 50;
52+
if (newStatus > 6 || newStatus < 0) newStatus = ChargeStatus.CRASH;
5253

5354
// if (rawStatus >= 5) {
5455
// logger.info("设备「" + msgStatus.getGroupId() + ", " + msgStatus.getDeviceId() + "」『"
@@ -64,7 +65,7 @@ Device handleMsgDeviceStatus(TcpMsgResponseStatus msgStatus) {
6465
return device;
6566
}
6667

67-
if (rawStatus == 2 && newStatus == 3) {
68+
if (rawStatus == ChargeStatus.CHARGING && newStatus == ChargeStatus.FULL && device.getRemainChargeTime() > 0) {
6869
device.setRemainChargeTime(device.getRemainChargeTime() - 1);
6970
}
7071
device.setStatus(newStatus);
@@ -78,8 +79,8 @@ Device handleMsgDeviceStatus(TcpMsgResponseStatus msgStatus) {
7879
/**
7980
* 获取设备的集合
8081
*
81-
* @param groupId 组 Id
82-
* @param deviceId 设备 Id
82+
* @param groupId 组 Id
83+
* @param deviceId 设备 Id
8384
* @return 设备的集合
8485
*/
8586
List<Device> getDevices(int groupId, int deviceId) {

clustermanage-server/src/main/java/cc/bitky/clustermanage/db/presenter/KyDbPresenter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public Device handleMsgDeviceStatus(TcpMsgResponseStatus tcpMsgResponseStatus, b
135135
logger.info("无指定设备对应的员工和考勤表,且无法自动创建");
136136
}
137137
long l5 = System.currentTimeMillis();
138-
logger.info("时间耗费:" + (l2 - l1) + "ms; " + (l3 - l2) + "ms; " + (l4 - l3) + "ms; " + (l5 - l4) + "ms");
138+
logger.info("时间耗费:" + (l2 - l1) + "ms; " + (l3 - l2) + "ms; " + (l4 - l3) + "ms; " + (l5 - l4) + "ms");
139139
return device;
140140
}
141141

clustermanage-server/src/main/java/cc/bitky/clustermanage/global/ExSetting.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ public class ExSetting {
77
public String 员工默认部门;
88
public int 部署剩余充电次数阈值;
99
public int 帧发送间隔;
10+
public int 检错重发最大重复次数;
1011
}

clustermanage-server/src/main/java/cc/bitky/clustermanage/global/ServerSetting.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,16 @@ public class ServerSetting {
4848
*/
4949
public static final int COMMAND_DELAY_WAITING_TIME = 30;
5050

51+
/**
52+
* 检错重发最大次数,服务器向 TCP 通道发送 CAN 帧,最大重复发送次数
53+
*/
54+
public static int AUTO_REPEAT_REQUEST_TIMES = 5;
55+
5156
//-----------------------接收到充电状态帧时的处理策略----------------------------
5257
/**
5358
* 项目版本号
5459
*/
55-
public static final String VERSION = "0.9.2";
60+
public static final String VERSION = "0.9.3";
5661
/**
5762
* 主机名
5863
*/

clustermanage-server/src/main/java/cc/bitky/clustermanage/server/bean/KyServerCenterHandler.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ boolean marchConfirmCard(String cardNumber) {
135135
return kyDbPresenter.marchConfirmCard(cardNumber);
136136
}
137137

138+
/**
139+
* 获取 CAN 帧发送队列的信息
140+
* @return CAN帧发送队列信息集合
141+
*/
138142
QueueInfo obtainQueueFrame() {
139143
int size = getSendingMsgRepo().getLinkedBlockingDeque().size();
140144
int capacity = ServerSetting.LINKED_DEQUE_LIMIT_CAPACITY;

clustermanage-server/src/main/java/cc/bitky/clustermanage/server/bean/ServerTcpMessageHandler.java

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,21 @@
2020
import cc.bitky.clustermanage.server.message.web.WebMsgInitMarchConfirmCardResponse;
2121
import cc.bitky.clustermanage.server.schedule.MsgKey;
2222
import cc.bitky.clustermanage.server.schedule.SendingMsgRepo;
23-
import cc.bitky.clustermanage.tcp.server.netty.SendWebMessagesListener;
23+
import cc.bitky.clustermanage.tcp.TcpMediator;
2424
import io.netty.util.internal.StringUtil;
2525

2626
@Service
2727
public class ServerTcpMessageHandler {
2828
private final KyDbPresenter kyDbPresenter;
29+
private final TcpMediator tcpMediator;
2930
private Logger logger = LoggerFactory.getLogger(getClass());
30-
private SendWebMessagesListener sendWebMessagesListener;
3131
private KyServerCenterHandler kyServerCenterHandler;
3232

3333
@Autowired
34-
public ServerTcpMessageHandler(KyDbPresenter kyDbPresenter) {
34+
public ServerTcpMessageHandler(KyDbPresenter kyDbPresenter, TcpMediator tcpMediator) {
3535
this.kyDbPresenter = kyDbPresenter;
36+
this.tcpMediator = tcpMediator;
37+
tcpMediator.setServerTcpMessageHandler(this);
3638
}
3739

3840
public SendingMsgRepo getSendingMsgRepo() {
@@ -54,6 +56,7 @@ public void handleResDeviceStatus(TcpMsgResponseStatus message) {
5456
logger.info("收到:设备状态请求的回复");
5557
long l1 = System.currentTimeMillis();
5658
Device device = kyDbPresenter.handleMsgDeviceStatus(message, ServerSetting.AUTO_CREATE_DEVICE_EMPLOYEE);
59+
//部署剩余充电次数
5760
if (device != null) {
5861
deployRemainChargeTimes(device);
5962
}
@@ -63,7 +66,6 @@ public void handleResDeviceStatus(TcpMsgResponseStatus message) {
6366

6467
/**
6568
* 其他功能消息处理方法
66-
*
6769
*/
6870
public void handleTcpMsg() {
6971

@@ -74,11 +76,13 @@ public void handleTcpMsg() {
7476
*
7577
* @param device 处理后的 Device
7678
*/
77-
7879
private void deployRemainChargeTimes(Device device) {
79-
if (device.getRemainChargeTime() <= ServerSetting.DEPLOY_REMAIN_CHARGE_TIMES) {
80+
81+
//当当前充电状态为「充满」,并且剩余充电次数小于或等于阈值时,部署剩余充电次数
82+
if (device.getStatus() == 3 && device.getRemainChargeTime() <= ServerSetting.DEPLOY_REMAIN_CHARGE_TIMES) {
8083
int remainTimes = device.getRemainChargeTime();
8184
remainTimes = remainTimes > 0 ? remainTimes : 0;
85+
remainTimes = remainTimes <= 100 ? remainTimes : 100;
8286
sendMsgToTcpSpecial(new WebMsgDeployRemainChargeTimes(device.getGroupId(), device.getDeviceId(), remainTimes), true, true);
8387
}
8488
}
@@ -198,10 +202,6 @@ private void handleReceivedCard(IMessage message) {
198202
}
199203
}
200204

201-
public void setSendWebMessagesListener(SendWebMessagesListener sendWebMessagesListener) {
202-
this.sendWebMessagesListener = sendWebMessagesListener;
203-
}
204-
205205
/**
206206
* 「特殊的」将特殊的 Message 发送至 Netty 的处理通道
207207
*
@@ -228,21 +228,7 @@ boolean sendMsgTrafficControl(IMessage message) {
228228
.newTimeout(timeout -> sendMsgTrafficControl(message), ServerSetting.COMMAND_DELAY_WAITING_TIME, TimeUnit.SECONDS);
229229
return true;
230230
}
231-
return sendMsgToTcp(message);
232-
}
233-
234-
/**
235-
* 直接将 Message 发送至 Netty 的处理通道
236-
*
237-
* @param message 普通消息 Message
238-
* @return 是否发送成功
239-
*/
240-
private boolean sendMsgToTcp(IMessage message) {
241-
if (sendWebMessagesListener == null) {
242-
logger.warn("Server 模块未能与 Netty 模块建立连接,故不能发送消息集合");
243-
return false;
244-
}
245-
return sendWebMessagesListener.sendMessagesToTcp(message);
231+
return tcpMediator.sendMsgToNetty(message);
246232
}
247233

248234
void setKyServerCenterHandler(KyServerCenterHandler kyServerCenterHandler) {

clustermanage-server/src/main/java/cc/bitky/clustermanage/server/bean/ServerWebMessageHandler.java

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import cc.bitky.clustermanage.server.message.web.WebMsgDeployEmployeeCardNumber;
1515
import cc.bitky.clustermanage.server.message.web.WebMsgDeployEmployeeDepartment;
1616
import cc.bitky.clustermanage.server.message.web.WebMsgDeployEmployeeName;
17+
import cc.bitky.clustermanage.server.message.web.WebMsgDeployRemainChargeTimes;
18+
import cc.bitky.clustermanage.web.bean.QueueDevice;
1719
import cc.bitky.clustermanage.web.bean.QueueInfo;
1820

1921
@Service
@@ -94,62 +96,72 @@ public boolean saveCardNumber(String[] freeCards, CardType card) {
9496
/**
9597
* 从数据库中获取并更新设备的信息
9698
*
97-
* @param groupId 设备组 ID
98-
* @param deviceId 设备 ID
99-
* @param name 是否更新姓名
100-
* @param department 是否更新部门
101-
* @param cardNumber 是否更新卡号
102-
* @param maxGroupId 若更新多个设备组,可指定更新设备组的 ID 范围为: 1 - maxgroupId
99+
* @param groupId 设备组 ID
100+
* @param deviceId 设备 ID
101+
* @param queueDevice 需要部署的设备信息
102+
* @param maxGroupId 若更新多个设备组,可指定更新设备组的 ID 范围为: 1 - maxGroupId
103103
* @return 更新是否成功
104104
*/
105-
public boolean obtainDeployDeviceMsg(int groupId, int deviceId, boolean name, boolean department, boolean cardNumber, int maxGroupId) {
105+
public boolean obtainDeployDeviceMsg(int groupId, int deviceId, QueueDevice queueDevice, int maxGroupId) {
106106
if (groupId == 255 || groupId == 0) {
107107
if (maxGroupId == 0)
108108
maxGroupId = kyDbPresenter.obtainDeviceGroupCount();
109109
if (maxGroupId == 0) return false;
110110
for (int i = 1; i <= maxGroupId; i++) {
111-
getDeviceInfo(i, deviceId).forEach(device -> deployEmployeeMsg(name, department, cardNumber, device));
111+
getDeviceInfo(i, deviceId).forEach(device -> deployEmployeeMsg(queueDevice, device));
112112
}
113113

114114
} else getDeviceInfo(groupId, deviceId)
115-
.forEach(device -> deployEmployeeMsg(name, department, cardNumber, device));
115+
.forEach(device -> deployEmployeeMsg(queueDevice, device));
116116
return true;
117117
}
118118

119119
/**
120120
* 部署员工的姓名,单位,卡号
121121
*
122-
* @param name 员工的姓名
123-
* @param department 员工的部门
124-
* @param cardNumber 员工的卡号
125-
* @param device 员工对应的设备
122+
* @param device 员工对应的设备
123+
* @param queueDevice 需要部署的设备信息
126124
*/
127-
private void deployEmployeeMsg(boolean name, boolean department, boolean cardNumber, Device device) {
125+
private void deployEmployeeMsg(QueueDevice queueDevice, Device device) {
126+
boolean name = queueDevice.isPostName();
127+
boolean department = queueDevice.isPostDepartment();
128+
boolean cardNumber = queueDevice.isPostCardNumber();
129+
boolean remainChargeTime = queueDevice.isPostRemainChargeTime();
128130

129-
boolean autoInit = ServerSetting.DEPLOY_DEVICES_INIT;
131+
boolean AUTO_INIT = ServerSetting.DEPLOY_DEVICES_INIT;
130132

131133
if (device == null) return;
132134

135+
//部署卡号
133136
if (cardNumber && device.getCardNumber() != null)
134137
kyServerCenterHandler.sendMsgTrafficControl(new WebMsgDeployEmployeeCardNumber(device.getGroupId(), device.getDeviceId(), device.getCardNumber()));
135-
else if (cardNumber && autoInit)
138+
else if (cardNumber && AUTO_INIT)
136139
kyServerCenterHandler.sendMsgTrafficControl(new WebMsgDeployEmployeeCardNumber(device.getGroupId(), device.getDeviceId(), ServerSetting.DEFAULT_EMPLOYEE_CARD_NUMBER));
137140

141+
//部署剩余充电次数
142+
if (remainChargeTime) {
143+
int remainTimes = device.getRemainChargeTime();
144+
remainTimes = remainTimes > 0 ? remainTimes : 0;
145+
remainTimes = remainTimes <= 100 ? remainTimes : 100;
146+
kyServerCenterHandler.sendMsgTrafficControl(new WebMsgDeployRemainChargeTimes(device.getGroupId(), device.getDeviceId(), remainTimes));
147+
}
138148

149+
//部署姓名和单位
139150
if (!(name || department)) return;
140151
Employee employee = kyDbPresenter.obtainEmployeeByEmployeeObjectId(device.getEmployeeObjectId());
141152

142153
if (employee != null) {
143154
if (name && employee.getName() != null)
144155
kyServerCenterHandler.sendMsgTrafficControl(new WebMsgDeployEmployeeName(device.getGroupId(), device.getDeviceId(), employee.getName()));
145-
else if (name && autoInit)
156+
else if (name && AUTO_INIT)
146157
kyServerCenterHandler.sendMsgTrafficControl(new WebMsgDeployEmployeeName(device.getGroupId(), device.getDeviceId(), ServerSetting.DEFAULT_EMPLOYEE_NAME));
158+
147159
if (department && employee.getDepartment() != null)
148160
kyServerCenterHandler.sendMsgTrafficControl(new WebMsgDeployEmployeeDepartment(device.getGroupId(), device.getDeviceId(), employee.getDepartment()));
149-
else if (department && autoInit)
161+
else if (department && AUTO_INIT)
150162
kyServerCenterHandler.sendMsgTrafficControl(new WebMsgDeployEmployeeDepartment(device.getGroupId(), device.getDeviceId(), ServerSetting.DEFAULT_EMPLOYEE_DEPARTMENT));
151163

152-
} else if (autoInit) {
164+
} else if (AUTO_INIT) {
153165
if (name)
154166
kyServerCenterHandler.sendMsgTrafficControl(new WebMsgDeployEmployeeName(device.getGroupId(), device.getDeviceId(), ServerSetting.DEFAULT_EMPLOYEE_NAME));
155167
if (department)
@@ -159,6 +171,5 @@ else if (department && autoInit)
159171

160172
public QueueInfo obtainQueueFrame() {
161173
return kyServerCenterHandler.obtainQueueFrame();
162-
163174
}
164175
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package cc.bitky.clustermanage.server.message;
2+
3+
public interface ChargeStatus {
4+
5+
/**
6+
* 未初始化
7+
*/
8+
int UNINIT = 0;
9+
10+
/**
11+
* 使用中
12+
*/
13+
int USING = 1;
14+
15+
/**
16+
* 充电中
17+
*/
18+
int CHARGING = 2;
19+
20+
/**
21+
* 已充满
22+
*/
23+
int FULL = 3;
24+
25+
/**
26+
* 通信故障
27+
*/
28+
int TRAFFIC_ERROR = 4;
29+
30+
/**
31+
* 充电故障
32+
*/
33+
int CHARGE_ERROR = 5;
34+
35+
/**
36+
* 矿灯未挂好
37+
*/
38+
int HUNG_ERROR = 6;
39+
40+
/**
41+
* 多种故障
42+
*/
43+
int CRASH = 50;
44+
}

0 commit comments

Comments
 (0)