88e030b7
王彪总
init project
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
|
/**
* 业主车辆查询命令类
*
* 该类用于处理管理员查询业主车辆信息的请求,支持分页查询,
* 并提供车辆关联的房屋信息、车位信息和物联网设备状态的补充查询功能
*
* @author Java110
* @version 1.0
* @since 2023
*/
package com.java110.user.cmd.owner;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.java110.core.annotation.Java110Cmd;
import com.java110.core.context.CmdContextUtils;
import com.java110.core.context.ICmdDataFlowContext;
import com.java110.core.event.cmd.Cmd;
import com.java110.core.event.cmd.CmdEvent;
import com.java110.dto.machine.MachineTranslateDto;
import com.java110.dto.owner.OwnerCarDto;
import com.java110.dto.owner.OwnerRoomRelDto;
import com.java110.dto.parking.ParkingSpaceDto;
import com.java110.dto.privilege.BasePrivilegeDto;
import com.java110.dto.room.RoomDto;
import com.java110.intf.common.IMachineTranslateV1InnerServiceSMO;
import com.java110.intf.community.IMenuInnerServiceSMO;
import com.java110.intf.community.IParkingSpaceInnerServiceSMO;
import com.java110.intf.community.IRoomInnerServiceSMO;
import com.java110.intf.user.IOwnerCarInnerServiceSMO;
import com.java110.intf.user.IOwnerRoomRelInnerServiceSMO;
import com.java110.intf.user.IStaffCommunityV1InnerServiceSMO;
import com.java110.utils.exception.CmdException;
import com.java110.utils.util.Assert;
import com.java110.utils.util.BeanConvertUtil;
import com.java110.utils.util.ListUtil;
import com.java110.utils.util.StringUtil;
import com.java110.vo.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Java110Cmd(serviceCode = "owner.queryAdminOwnerCars")
public class QueryAdminOwnerCarsCmd extends Cmd {
@Autowired
private IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl;
@Autowired
private IMenuInnerServiceSMO menuInnerServiceSMOImpl;
@Autowired
private IParkingSpaceInnerServiceSMO parkingSpaceInnerServiceSMOImpl;
@Autowired
private IOwnerRoomRelInnerServiceSMO ownerRoomRelInnerServiceSMOImpl;
@Autowired
private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
@Autowired
private IMachineTranslateV1InnerServiceSMO machineTranslateV1InnerServiceSMOImpl;
@Autowired
private IStaffCommunityV1InnerServiceSMO staffCommunityV1InnerServiceSMOImpl;
/**
* 请求参数验证方法
*
* 验证管理员权限和分页参数
*
* @param event 命令事件对象
* @param cmdDataFlowContext 命令数据流上下文
* @param reqJson 请求参数JSON对象
* @throws CmdException 当验证失败时抛出异常
*/
@Override
public void validate(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) throws CmdException {
// 验证管理员权限
super.validateAdmin(cmdDataFlowContext);
// 验证分页参数
super.validatePageInfo(reqJson);
}
/**
* 执行查询业主车辆命令
*
* 根据查询条件获取业主车辆列表,支持分页查询,并补充关联的房屋信息、车位信息和物联网状态
*
* @param event 命令事件对象
* @param cmdDataFlowContext 命令数据流上下文
* @param reqJson 请求参数JSON对象
* @throws CmdException 当执行过程中发生错误时抛出异常
*/
@Override
public void doCmd(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) throws CmdException {
// 将请求参数转换为OwnerCarDto对象
OwnerCarDto ownerCarDto = BeanConvertUtil.covertBean(reqJson, OwnerCarDto.class);
// 获取当前登录用户ID
String staffId = CmdContextUtils.getUserId(cmdDataFlowContext);
// 查询用户管理的社区ID列表
List<String> communityIds = staffCommunityV1InnerServiceSMOImpl.queryStaffCommunityIds(staffId);
// 如果用户有管理的社区,设置查询条件中的社区ID
if (!ListUtil.isNull(communityIds)) {
ownerCarDto.setCommunityIds(communityIds.toArray(new String[communityIds.size()]));
}
// 获取每页显示行数
int row = reqJson.getIntValue("row");
// 查询总记录数
int total = ownerCarInnerServiceSMOImpl.queryOwnerCarsCount(ownerCarDto);
List<OwnerCarDto> ownerCarDtoList = null;
// 如果有数据,查询车辆列表
if (total > 0) {
ownerCarDtoList = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
// 当数据量小于20条时,补充关联信息(避免大数据量时性能问题)
if (row < 20) {
// 补充车位信息
freshPs(ownerCarDtoList);
// 补充房屋信息
freshRoomInfo(ownerCarDtoList);
// 补充物联网设备状态
freshTransactionIotState(ownerCarDtoList);
}
} else {
// 没有数据时返回空列表
ownerCarDtoList = new ArrayList<>();
}
// 计算总页数并构建响应结果
ResponseEntity<String> responseEntity = ResultVo.createResponseEntity((int) Math.ceil((double) total / (double) row), total, ownerCarDtoList);
cmdDataFlowContext.setResponseEntity(responseEntity);
}
/**
* 刷新物联网设备状态信息
*
* 根据车辆关联的设备ID查询物联网设备的状态信息,并更新到车辆信息中
*
* @param ownerCarDtoList 业主车辆列表
*/
private void freshTransactionIotState(List<OwnerCarDto> ownerCarDtoList) {
// 参数校验
if (ownerCarDtoList == null || ownerCarDtoList.size() < 1) {
return;
}
// 收集所有有车位ID的车辆成员ID
List<String> memberIds = new ArrayList<>();
for (OwnerCarDto ownerCarDto : ownerCarDtoList) {
if (StringUtil.isEmpty(ownerCarDto.getPsId())) {
continue;
}
memberIds.add(ownerCarDto.getMemberId());
}
// 构建查询条件,查询物联网设备状态
MachineTranslateDto machineTranslateDto = new MachineTranslateDto();
machineTranslateDto.setObjIds(memberIds.toArray(new String[memberIds.size()]));
List<MachineTranslateDto> machineTranslateDtos = machineTranslateV1InnerServiceSMOImpl.queryObjStateInMachineTranslates(machineTranslateDto);
// 如果没有物联网设备状态数据,直接返回
if (ListUtil.isNull(machineTranslateDtos)) {
return;
}
// 将物联网设备状态信息更新到对应的车辆信息中
for (OwnerCarDto ownerCarDto : ownerCarDtoList) {
for (MachineTranslateDto tmpMachineTranslateDto : machineTranslateDtos) {
if (!ownerCarDto.getMemberId().equals(tmpMachineTranslateDto.getObjId())) {
continue;
}
// 设置物联网状态名称和备注
ownerCarDto.setIotStateName(tmpMachineTranslateDto.getStateName());
ownerCarDto.setIotRemark(tmpMachineTranslateDto.getRemark());
}
}
}
/**
* 刷新车位信息
*
* 根据车位ID查询车位详细信息,并更新到车辆信息中
*
* @param ownerCarDtoList 业主车辆列表
*/
private void freshPs(List<OwnerCarDto> ownerCarDtoList) {
// 参数校验
if (ownerCarDtoList == null || ownerCarDtoList.size() < 1) {
return;
}
// 收集所有有车位ID的车辆
List<String> psIds = new ArrayList<>();
for (OwnerCarDto ownerCarDto : ownerCarDtoList) {
if (StringUtil.isEmpty(ownerCarDto.getPsId())) {
continue;
}
psIds.add(ownerCarDto.getPsId());
}
// 构建车位查询条件
ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
parkingSpaceDto.setCommunityId(ownerCarDtoList.get(0).getCommunityId());
parkingSpaceDto.setPsIds(psIds.toArray(new String[psIds.size()]));
// 查询车位详细信息
List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
// 将车位信息更新到对应的车辆信息中
for (ParkingSpaceDto tmpParkingSpaceDto : parkingSpaceDtos) {
for (OwnerCarDto ownerCarDto : ownerCarDtoList) {
if (tmpParkingSpaceDto.getPsId().equals(ownerCarDto.getPsId())) {
// 设置区域编号、车位编号和停车类型
ownerCarDto.setAreaNum(tmpParkingSpaceDto.getAreaNum());
ownerCarDto.setNum(tmpParkingSpaceDto.getNum());
ownerCarDto.setParkingType(tmpParkingSpaceDto.getParkingType());
}
}
}
}
/**
* 刷新房屋信息
*
* 为每个车辆信息补充关联的房屋信息
*
* @param ownerCarDtos 业主车辆列表
*/
private void freshRoomInfo(List<OwnerCarDto> ownerCarDtos) {
// 遍历每个车辆,刷新房屋信息
for (OwnerCarDto ownerCarDto : ownerCarDtos) {
doFreshRoomInfo(ownerCarDto);
}
}
/**
* 为单个车辆信息刷新房屋信息
*
* 根据业主ID查询关联的房屋信息,并将房屋信息格式化后设置到车辆信息中
*
* @param ownerCarDto 业主车辆信息
*/
private void doFreshRoomInfo(OwnerCarDto ownerCarDto) {
// 构建业主房屋关系查询条件
OwnerRoomRelDto ownerRoomRelDto = new OwnerRoomRelDto();
ownerRoomRelDto.setOwnerId(ownerCarDto.getOwnerId());
ownerRoomRelDto.setPage(1);
// 限制最多显示3个房屋,避免页面显示混乱
ownerRoomRelDto.setRow(3);
// 查询业主房屋关系
List<OwnerRoomRelDto> ownerRoomRelDtos = ownerRoomRelInnerServiceSMOImpl.queryOwnerRoomRels(ownerRoomRelDto);
// 如果没有关联房屋,设置默认值
if (ListUtil.isNull(ownerRoomRelDtos)) {
ownerCarDto.setRoomName("-");
return;
}
// 收集所有房屋ID
List<String> roomIds = new ArrayList<>();
for (OwnerRoomRelDto tOwnerRoomRelDto : ownerRoomRelDtos) {
roomIds.add(tOwnerRoomRelDto.getRoomId());
}
// 构建房屋查询条件
RoomDto roomDto = new RoomDto();
roomDto.setCommunityId(ownerCarDto.getCommunityId());
roomDto.setRoomIds(roomIds.toArray(new String[roomIds.size()]));
// 查询房屋详细信息
List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
// 格式化房屋名称:楼层-单元-房号
String roomName = "";
for (RoomDto tRoomDto : roomDtos) {
roomName += (tRoomDto.getFloorNum() + "-" + tRoomDto.getUnitNum() + "-" + tRoomDto.getRoomNum() + "-" + "/");
}
// 去除末尾多余的斜杠
roomName = roomName.endsWith("/") ? roomName.substring(0, roomName.length() - 1) : roomName;
// 设置格式化后的房屋名称
ownerCarDto.setRoomName(roomName);
}
}
|