This commit is contained in:
2026-07-14 12:43:23 +08:00
parent 8f7a35e3c7
commit 29ecbf321f
52 changed files with 1197 additions and 324 deletions

View File

@@ -35,7 +35,7 @@ import lombok.extern.slf4j.Slf4j;
@RestController
@Slf4j
@RequestMapping("/iot/alarm")
public class AlarmController extends BaseController{
public class AlarmController extends BaseController {
@Autowired
@@ -45,9 +45,9 @@ public class AlarmController extends BaseController{
@GetMapping("/list")
@ApiOperation("告警分页列表")
public TableDataInfo list(AlarmQueryDTO queryDTO) {
// startPage();
// return alarmService.selectAlarmPage(queryDTO);
return alarmService.selectAlarmPage(queryDTO);
startPage();
return getDataTable(alarmService.selectAlarmPage(queryDTO));
}
// @PreAuthorize("@ss.hasPermi('iot:alarm:query')")

View File

@@ -0,0 +1,42 @@
package com.maibu.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.maibu.core.business.AlarmOrderConfig;
import com.maibu.core.controller.BaseController;
import com.maibu.core.domain.AjaxResult;
import com.maibu.core.page.TableDataInfo;
import com.maibu.dto.BaseQueryDTO;
import com.maibu.service.impl.AlarmOrderConfigService;
@RestController
@RequestMapping("/iot/alarmOrderConfig")
public class AlarmOrderConfigController extends BaseController {
@Autowired
private AlarmOrderConfigService service;
@PostMapping("/save")
public AjaxResult save(@RequestBody AlarmOrderConfig config) {
return AjaxResult.success(service.save(config));
}
@PostMapping("/list")
public TableDataInfo list(@RequestBody BaseQueryDTO dto) {
startPage();
return getDataTable(service.list(dto));
}
@PostMapping("/delete")
public AjaxResult delete(@RequestBody List<Long> ids) {
return AjaxResult.success(service.delete(ids));
}
}

View File

@@ -14,7 +14,7 @@ import com.maibu.core.business.DeviceRunParam;
import com.maibu.core.controller.BaseController;
import com.maibu.core.domain.AjaxResult;
import com.maibu.core.page.TableDataInfo;
import com.maibu.dto.DeviceRunParamQueryDTO;
import com.maibu.dto.BaseQueryDTO;
import com.maibu.service.impl.DeviceRunParamService;
@RestController
@@ -31,7 +31,7 @@ public class DeviceRunParamController extends BaseController {
}
@PostMapping("/list")
public TableDataInfo list(@RequestBody DeviceRunParamQueryDTO dto) {
public TableDataInfo list(@RequestBody BaseQueryDTO dto) {
startPage();
return getDataTable(service.list(dto));
}

View File

@@ -3,7 +3,6 @@ package com.maibu.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

View File

@@ -19,6 +19,7 @@ import com.maibu.annotation.Log;
import com.maibu.core.business.IOTWorkOrder;
import com.maibu.core.business.dto.WorkOrderDispatchDTO;
import com.maibu.core.business.dto.WorkOrderQueryDTO;
import com.maibu.core.business.dto.WorkOrderStartDTO;
import com.maibu.core.controller.BaseController;
import com.maibu.core.domain.AjaxResult;
import com.maibu.core.page.TableDataInfo;
@@ -77,12 +78,11 @@ public class IOTWorkOrderController extends BaseController {
return toAjax(workOrderService.dispatchWorkOrder(dispatchDTO));
}
//@PreAuthorize("@ss.hasPermi('iot:workOrder:start')")
@Log(title = "工单开始", businessType = BusinessType.UPDATE)
@PutMapping("/start/{id}")
@PostMapping("/start")
@ApiOperation("开始执行工单")
public AjaxResult start(@PathVariable Long id) {
return toAjax(workOrderService.startWorkOrder(id));
public AjaxResult start(@RequestBody WorkOrderStartDTO dto) {
return toAjax(workOrderService.startWorkOrder(dto));
}
// @PreAuthorize("@ss.hasPermi('iot:workOrder:complete')")

View File

@@ -0,0 +1,45 @@
package com.maibu.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.maibu.core.business.DeviceRunParam;
import com.maibu.core.business.OrderModel;
import com.maibu.core.controller.BaseController;
import com.maibu.core.domain.AjaxResult;
import com.maibu.core.page.TableDataInfo;
import com.maibu.dto.BaseQueryDTO;
import com.maibu.service.impl.OrderModelService;
@RestController
@RequestMapping("/iot/orderModel")
public class OrderModelController extends BaseController {
@Autowired
private OrderModelService service;
@PostMapping("/save")
public AjaxResult save(@RequestBody OrderModel orderModel) {
return AjaxResult.success(service.save(orderModel));
}
@PostMapping("/list")
public TableDataInfo list(@RequestBody BaseQueryDTO dto) {
startPage();
return getDataTable(service.list(dto));
}
@PostMapping("/delete")
public AjaxResult delete(@RequestBody List<Long> ids) {
return AjaxResult.success(service.delete(ids));
}
}

View File

@@ -5,7 +5,8 @@ import com.maibu.core.domain.BaseEntity;
import lombok.Data;
@Data
public class DeviceRunParamQueryDTO extends BaseEntity {
public class BaseQueryDTO extends BaseEntity {
private Long siteId;
private String deviceId;
private Long orgId;
}

View File

@@ -12,4 +12,6 @@ public class ErrorQueryDTO extends BaseEntity {
private ErrorSource errorSource;
private String errorCode;
private ErrorLevel errorLevel;
private Long orgId;
private Long siteId;
}

View File

@@ -1 +1,36 @@
package com.maibu.service;
package com.maibu.service;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.extension.service.IService;
import com.maibu.core.business.alarm_center.Alarm;
import com.maibu.core.business.dto.AlarmHandleDTO;
import com.maibu.core.business.dto.AlarmQueryDTO;
public interface IAlarmService extends IService<Alarm> {
List<Alarm> selectAlarmPage(AlarmQueryDTO queryDTO);
List<Alarm> selectAlarmList(AlarmQueryDTO queryDTO);
Alarm selectAlarmById(Long id);
int insertAlarm(Alarm alarm);
int updateAlarm(Alarm alarm);
int handleAlarm(AlarmHandleDTO handleDTO);
int deleteAlarmById(Long id);
int deleteAlarmByIds(Long[] ids);
Map<String, Object> getAlarmStatistics();
Map<String, Object> getAlarmStatistics(AlarmQueryDTO queryDTO);
}

View File

@@ -1,5 +0,0 @@
package com.maibu.service;
public interface IWebRtcService {
}

View File

@@ -1,14 +1,15 @@
package com.maibu.service;
import java.util.List;
import java.util.Map;
import com.baomidou.mybatisplus.extension.service.IService;
import com.maibu.core.business.IOTWorkOrder;
import com.maibu.core.business.dto.WorkOrderDispatchDTO;
import com.maibu.core.business.dto.WorkOrderQueryDTO;
import com.maibu.core.business.dto.WorkOrderStartDTO;
import com.maibu.core.page.TableDataInfo;
import java.util.List;
import java.util.Map;
public interface IWorkOrderService extends IService<IOTWorkOrder> {
TableDataInfo selectWorkOrderPage(WorkOrderQueryDTO queryDTO);
@@ -23,7 +24,7 @@ public interface IWorkOrderService extends IService<IOTWorkOrder> {
int dispatchWorkOrder(WorkOrderDispatchDTO dispatchDTO);
int startWorkOrder(Long id);
boolean startWorkOrder(WorkOrderStartDTO dto);
int completeWorkOrder(IOTWorkOrder workOrder);

View File

@@ -0,0 +1,56 @@
package com.maibu.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.maibu.core.business.AlarmOrderConfig;
import com.maibu.dto.BaseQueryDTO;
import com.maibu.mapper.AlarmOrderConfigMapper;
import com.maibu.memory.GlobalMemory;
import com.maibu.memory.SiteMemory;
@Service
public class AlarmOrderConfigService {
@Autowired
private AlarmOrderConfigMapper alarmOrderConfigMapper;
public boolean save(AlarmOrderConfig alarmOrderConfig) {
SiteMemory siteMemory = GlobalMemory.getSiteMemory(alarmOrderConfig.getOrgId(),
alarmOrderConfig.getSiteId());
if (siteMemory != null) {
siteMemory.saveAlarmOrderConfig(alarmOrderConfig);
}
return alarmOrderConfigMapper.saveOrUpdate(alarmOrderConfig);
}
public List<AlarmOrderConfig> list(BaseQueryDTO dto) {
LambdaQueryWrapper<AlarmOrderConfig> queryWrapper = new LambdaQueryWrapper<>();
if (dto != null) {
if (dto.getSiteId() != null) {
queryWrapper.eq(AlarmOrderConfig::getSiteId, dto.getSiteId());
}
}
return alarmOrderConfigMapper.selectList(queryWrapper);
}
public int delete(List<Long> ids) {
List<AlarmOrderConfig> alarmOrderConfigs = alarmOrderConfigMapper
.selectBatchIds(ids);
if (!CollectionUtils.isEmpty(alarmOrderConfigs)) {
alarmOrderConfigs.forEach(x -> {
SiteMemory siteMemory = GlobalMemory.getSiteMemory(x.getOrgId(), x.getSiteId());
if (siteMemory != null) {
siteMemory.removeAlarmOrderConfig(x.getErrorCode());
}
});
}
int i = alarmOrderConfigMapper.deleteBatchIds(ids);
return i;
}
}

View File

@@ -1,12 +1,23 @@
package com.maibu.service.impl;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.maibu.core.business.Device;
import com.maibu.core.business.alarm_center.Alarm;
import com.maibu.core.business.alarm_center.AlarmMessage;
import com.maibu.core.business.device.NettyDevice;
import com.maibu.core.business.dto.AlarmHandleDTO;
import com.maibu.core.business.dto.AlarmQueryDTO;
import com.maibu.core.domain.model.LoginUser;
@@ -24,18 +35,6 @@ import com.maibu.utils.json.JsonUtils;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@Slf4j
public class AlarmServiceImpl extends ServiceImpl<AlarmMapper, Alarm> implements IAlarmService {
@@ -43,27 +42,23 @@ public class AlarmServiceImpl extends ServiceImpl<AlarmMapper, Alarm> implements
@Autowired
private DeviceMapper deviceMapper;
@Autowired
private AlarmMapper alarmMapper;
@Override
public TableDataInfo selectAlarmPage(AlarmQueryDTO queryDTO) {
validateQueryParams(queryDTO);
public List<Alarm> selectAlarmPage(AlarmQueryDTO queryDTO) {
// validateQueryParams(queryDTO);
LambdaQueryWrapper<Alarm> wrapper = buildQueryWrapper(queryDTO);
Page<Alarm> page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize());
Page<Alarm> result = baseMapper.selectPage(page, wrapper);
TableDataInfo tableDataInfo = new TableDataInfo();
tableDataInfo.setRows(result.getRecords());
tableDataInfo.setTotal(result.getTotal());
return tableDataInfo;
List<Alarm> list = alarmMapper.selectList(wrapper);
return list;
}
@Override
public List<Alarm> selectAlarmList(AlarmQueryDTO queryDTO) {
validateQueryParams(queryDTO);
LambdaQueryWrapper<Alarm> wrapper = buildQueryWrapper(queryDTO);
return baseMapper.selectList(wrapper);
return alarmMapper.selectList(wrapper);
}
@Override
@@ -72,7 +67,7 @@ public class AlarmServiceImpl extends ServiceImpl<AlarmMapper, Alarm> implements
LambdaQueryWrapper<Alarm> wrapper = buildQueryWrapper(queryDTO);
List<Alarm> alarms = baseMapper.selectList(wrapper);
List<Alarm> alarms = alarmMapper.selectList(wrapper);
Map<String, Object> statistics = new HashMap<>();
statistics.put("total", alarms.size());
statistics.put("pending", alarms.stream().filter(a -> a.getHandleStatus() == 1).count());
@@ -172,70 +167,63 @@ public class AlarmServiceImpl extends ServiceImpl<AlarmMapper, Alarm> implements
private LambdaQueryWrapper<Alarm> buildQueryWrapper(AlarmQueryDTO queryDTO) {
LambdaQueryWrapper<Alarm> wrapper = new LambdaQueryWrapper<>();
Long userId = SecurityUtils.getUserId();
LoginUser loginUser = SecurityUtils.getLoginUser();
Long userOrgId = loginUser.getOrgId();
Long userSiteId = loginUser.getSiteId();
// Long userId = SecurityUtils.getUserId();
// LoginUser loginUser = SecurityUtils.getLoginUser();
// Long userOrgId = loginUser.getOrgId();
// Long userSiteId = loginUser.getSiteId();
// 数据权限过滤(核心修复:防止组织管理员越权)
if (!SecurityUtils.isAdmin(userId)) {
if (queryDTO.getSiteId() != null) {
// 修复:组织管理员指定场站查询时,必须同时满足 orgId 匹配
String sql = "SELECT 1 FROM iot_device d WHERE d.device_id = iot_alarm.device_id AND d.site_id = {0}";
if (userOrgId != null) {
sql += " AND d.org_id = " + userOrgId;
}
wrapper.exists(sql, queryDTO.getSiteId());
} else if (userSiteId != null) {
wrapper.exists("SELECT 1 FROM iot_device d WHERE d.device_id = iot_alarm.device_id AND d.site_id = {0}",
userSiteId);
} else if (userOrgId != null) {
wrapper.exists("SELECT 1 FROM iot_device d WHERE d.device_id = iot_alarm.device_id AND d.org_id = {0}",
userOrgId);
}
}
// if (!SecurityUtils.isAdmin(userId)) {
// if (queryDTO.getSiteId() != null) {
// // 修复:组织管理员指定场站查询时,必须同时满足 orgId 匹配
// String sql = "SELECT 1 FROM iot_device d WHERE d.device_id =
// iot_alarm.device_id AND d.site_id = {0}";
// if (userOrgId != null) {
// sql += " AND d.org_id = " + userOrgId;
// }
// wrapper.exists(sql, queryDTO.getSiteId());
// } else if (userSiteId != null) {
// wrapper.exists("SELECT 1 FROM iot_device d WHERE d.device_id =
// iot_alarm.device_id AND d.site_id = {0}",
// userSiteId);
// } else if (userOrgId != null) {
// wrapper.exists("SELECT 1 FROM iot_device d WHERE d.device_id =
// iot_alarm.device_id AND d.org_id = {0}",
// userOrgId);
// }
// }
if (queryDTO.getDeviceId() != null) {
if (!StringUtils.isEmpty(queryDTO.getAlarmNo())) {
wrapper.like(Alarm::getAlarmNo, queryDTO.getAlarmNo());
}
if (!StringUtils.isEmpty(queryDTO.getDeviceId())) {
wrapper.eq(Alarm::getDeviceId, queryDTO.getDeviceId());
}
if (queryDTO.getSiteId() != null) {
wrapper.eq(Alarm::getSiteId, queryDTO.getSiteId());
}
if (!StringUtils.isEmpty(queryDTO.getDeviceId())) {
wrapper.eq(Alarm::getDeviceId, queryDTO.getDeviceId());
}
if (queryDTO.getAlarmLevel() != null) {
wrapper.eq(Alarm::getAlarmLevel, queryDTO.getAlarmLevel());
}
if (queryDTO.getAlarmType() != null) {
wrapper.eq(Alarm::getAlarmType, queryDTO.getAlarmType());
}
if (queryDTO.getDeviceType() != null) {
wrapper.eq(Alarm::getDeviceType, queryDTO.getDeviceType());
}
if (queryDTO.getHandleStatus() != null) {
wrapper.eq(Alarm::getHandleStatus, queryDTO.getHandleStatus());
}
// if (queryDTO.getStartTime() != null) {
// wrapper.ge(Alarm::getAlarmTime, queryDTO.getStartTime());
// }
// if (queryDTO.getEndTime() != null) {
// wrapper.le(Alarm::getAlarmTime, queryDTO.getEndTime());
// }
if (queryDTO.getStartTime() != null) {
wrapper.ge(Alarm::getAlarmTime, queryDTO.getStartTime());
}
if (queryDTO.getEndTime() != null) {
wrapper.le(Alarm::getAlarmTime, queryDTO.getEndTime());
}
if (StringUtils.isNotEmpty(queryDTO.getKeyword())) {
wrapper.and(w -> w.like(Alarm::getAlarmNo, queryDTO.getKeyword())
.or()
.like(Alarm::getAlarmContent, queryDTO.getKeyword()));
}
wrapper.orderByDesc(Alarm::getAlarmTime);
return wrapper;
}
@Override
public Alarm selectAlarmById(Long id) {
Alarm alarm = baseMapper.selectById(id);
Alarm alarm = alarmMapper.selectById(id);
if (alarm == null)
throw new ServiceException("告警不存在");
@@ -255,24 +243,24 @@ public class AlarmServiceImpl extends ServiceImpl<AlarmMapper, Alarm> implements
alarm.setTenantId(SecurityUtils.getLoginUser().getOrgId());
alarm.setAlarmTime(LocalDateTime.now());
alarm.setHandleStatus(1);
return baseMapper.insert(alarm);
return alarmMapper.insert(alarm);
}
@Override
public int updateAlarm(Alarm alarm) {
Long userId = SecurityUtils.getUserId();
if (!SecurityUtils.isAdmin(userId) && alarm.getId() != null) {
Alarm existAlarm = baseMapper.selectById(alarm.getId());
Alarm existAlarm = alarmMapper.selectById(alarm.getId());
if (existAlarm != null && existAlarm.getDeviceId() != null) {
validateDeviceAccess(existAlarm.getDeviceId());
}
}
return baseMapper.updateById(alarm);
return alarmMapper.updateById(alarm);
}
@Override
public int handleAlarm(AlarmHandleDTO handleDTO) {
Alarm alarm = baseMapper.selectById(handleDTO.getAlarmId());
Alarm alarm = alarmMapper.selectById(handleDTO.getAlarmId());
if (alarm == null)
throw new ServiceException("告警不存在");
@@ -292,19 +280,19 @@ public class AlarmServiceImpl extends ServiceImpl<AlarmMapper, Alarm> implements
if (handleDTO.getHandleStatus() == 3) {
updateAlarm.setRecoverTime(LocalDateTime.now());
}
return baseMapper.updateById(updateAlarm);
return alarmMapper.updateById(updateAlarm);
}
@Override
public int deleteAlarmById(Long id) {
Long userId = SecurityUtils.getUserId();
if (!SecurityUtils.isAdmin(userId)) {
Alarm alarm = baseMapper.selectById(id);
Alarm alarm = alarmMapper.selectById(id);
if (alarm != null && alarm.getDeviceId() != null) {
validateDeviceAccess(alarm.getDeviceId());
}
}
return baseMapper.deleteById(id);
return alarmMapper.deleteById(id);
}
@Override
@@ -312,13 +300,13 @@ public class AlarmServiceImpl extends ServiceImpl<AlarmMapper, Alarm> implements
Long userId = SecurityUtils.getUserId();
if (!SecurityUtils.isAdmin(userId)) {
for (Long id : ids) {
Alarm alarm = baseMapper.selectById(id);
Alarm alarm = alarmMapper.selectById(id);
if (alarm != null && alarm.getDeviceId() != null) {
validateDeviceAccess(alarm.getDeviceId());
}
}
}
return baseMapper.deleteBatchIds(Arrays.asList(ids));
return alarmMapper.deleteBatchIds(Arrays.asList(ids));
}
@Override
@@ -341,7 +329,7 @@ public class AlarmServiceImpl extends ServiceImpl<AlarmMapper, Alarm> implements
}
wrapper.ge(Alarm::getAlarmTime, LocalDateTime.now().minusDays(7));
List<Alarm> alarms = baseMapper.selectList(wrapper);
List<Alarm> alarms = alarmMapper.selectList(wrapper);
Map<String, Object> statistics = new HashMap<>();
statistics.put("total", alarms.size());
statistics.put("pending", alarms.stream().filter(a -> a.getHandleStatus() == 1).count());
@@ -372,22 +360,26 @@ public class AlarmServiceImpl extends ServiceImpl<AlarmMapper, Alarm> implements
alarm.setDeviceName(alarmMessage.getDeviceName());
alarm.setDeviceType(ErrorSource.MOWER);
alarm.setAlarmTime(LocalDateTime.now());
alarm.setOrgId(alarmMessage.getOrgId());
alarm.setSiteId(alarmMessage.getSiteId());
alarm.setAlarmTime(LocalDateTime.now());
pushErrorMessage(alarmMessage.getDeviceName(), JsonUtils.toJsonString(alarm));
list.add(alarm);
}
baseMapper.insertBatch(list);
alarmMapper.saveOrUpdateBatch(list);
// todo 推送websocket?
}
public void pushErrorMessage(String deviceId, String dto) {
try {
GlobalMemory.mqttClientUtil.publish(String.format(MqttTopic.DEVICE_ERROR_PUSH_TOPIC, deviceId), dto);
// List<NettyDevice> controlMasters = sessionManager.getAllSlaveControl(deviceId);
// List<NettyDevice> controlMasters =
// sessionManager.getAllSlaveControl(deviceId);
// if (!CollectionUtils.isEmpty(controlMasters)) {
// controlMasters.forEach(x -> {
// websocketMesDispather.dispather(x.getConnectorId(), dto);
// log.info("推送错误信息 device:{},content:{}", deviceId, dto);
// });
// controlMasters.forEach(x -> {
// websocketMesDispather.dispather(x.getConnectorId(), dto);
// log.info("推送错误信息 device:{},content:{}", deviceId, dto);
// });
// }
} catch (MqttException e) {
log.error("推送错误信息失败 device:{}error:{}", deviceId, e.getMessage());

View File

@@ -1,6 +1,5 @@
package com.maibu.service.impl;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
@@ -10,7 +9,7 @@ import org.springframework.util.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.maibu.core.business.DeviceRunParam;
import com.maibu.dto.DeviceRunParamQueryDTO;
import com.maibu.dto.BaseQueryDTO;
import com.maibu.mapper.DeviceRunParamMapper;
import com.maibu.memory.GlobalMemory;
import com.maibu.memory.SiteMemory;
@@ -29,7 +28,7 @@ public class DeviceRunParamService {
return deviceRunParamMapper.saveOrUpdate(deviceRunParam);
}
public List<DeviceRunParam> list(DeviceRunParamQueryDTO dto) {
public List<DeviceRunParam> list(BaseQueryDTO dto) {
LambdaQueryWrapper<DeviceRunParam> queryWrapper = new LambdaQueryWrapper<>();
if (dto != null) {
if (dto.getSiteId() != null) {
@@ -65,3 +64,4 @@ public class DeviceRunParamService {
}
}

View File

@@ -5,11 +5,14 @@ import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.maibu.core.business.ErrorIdentificationStandard;
import com.maibu.dto.ErrorQueryDTO;
import com.maibu.mapper.ErrorIdentificationStandardMapper;
import com.maibu.memory.GlobalMemory;
import com.maibu.memory.SiteMemory;
@Service
public class ErrorIdentificationService {
@@ -18,6 +21,12 @@ public class ErrorIdentificationService {
private ErrorIdentificationStandardMapper errorIdentificationStandardMapper;
public boolean save(ErrorIdentificationStandard errorIdentificationStandard) {
SiteMemory siteMemory = GlobalMemory.getSiteMemory(errorIdentificationStandard.getOrgId(),
errorIdentificationStandard.getSiteId());
if (siteMemory != null) {
siteMemory.saveErrorIdentificationStandard(errorIdentificationStandard);
}
return errorIdentificationStandardMapper.saveOrUpdate(errorIdentificationStandard);
}
@@ -36,11 +45,27 @@ public class ErrorIdentificationService {
if (dto.getErrorSource() != null) {
queryWrapper.eq(ErrorIdentificationStandard::getErrorSource, dto.getErrorSource());
}
if (dto.getOrgId() != null) {
queryWrapper.eq(ErrorIdentificationStandard::getOrgId, dto.getOrgId());
}
if (dto.getSiteId() != null) {
queryWrapper.eq(ErrorIdentificationStandard::getSiteId, dto.getSiteId());
}
}
return errorIdentificationStandardMapper.selectList(queryWrapper);
}
public int delete(List<Long> ids) {
List<ErrorIdentificationStandard> errorIdentificationStandards = errorIdentificationStandardMapper
.selectBatchIds(ids);
if (!CollectionUtils.isEmpty(errorIdentificationStandards)) {
errorIdentificationStandards.forEach(x -> {
SiteMemory siteMemory = GlobalMemory.getSiteMemory(x.getOrgId(), x.getSiteId());
if (siteMemory != null) {
siteMemory.removeErrorIdentificationStandard(x);
}
});
}
int i = errorIdentificationStandardMapper.deleteBatchIds(ids);
return i;
}

View File

@@ -0,0 +1,111 @@
package com.maibu.service.impl;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.maibu.core.business.OrderModel;
import com.maibu.core.business.dto.DeviceTaskCommandDTO;
import com.maibu.core.business.dto.uav.FlightTaskCreateDTO;
import com.maibu.core.business.inter.mower.MowerCommandDispather;
import com.maibu.core.business.inter.uav.UAVCommandDispather;
import com.maibu.core.enums.OrderType;
import com.maibu.dto.BaseQueryDTO;
import com.maibu.mapper.OrderModelMapper;
import com.maibu.memory.GlobalMemory;
import com.maibu.memory.SiteMemory;
@Service
public class OrderModelService {
@Autowired
private OrderModelMapper orderModelMapper;
@Autowired
private UAVCommandDispather dispather;
@Autowired
private MowerCommandDispather mowerDispather;
public boolean save(OrderModel orderModel) {
SiteMemory siteMemory = GlobalMemory.getSiteMemory(orderModel.getOrgId(),
orderModel.getSiteId());
if (siteMemory != null) {
siteMemory.saveOrderModel(orderModel);
}
return orderModelMapper.saveOrUpdate(orderModel);
}
public List<OrderModel> list(BaseQueryDTO dto) {
LambdaQueryWrapper<OrderModel> queryWrapper = new LambdaQueryWrapper<>();
if (dto != null && dto.getSiteId() != null) {
queryWrapper.eq(OrderModel::getSiteId, dto.getSiteId());
}
return orderModelMapper.selectList(queryWrapper);
}
public OrderModel selectByDeviceId(String deviceId) {
LambdaQueryWrapper<OrderModel> queryWrapper = new LambdaQueryWrapper<>();
if (!StringUtils.isEmpty(deviceId)) {
queryWrapper.eq(OrderModel::getDeviceId, deviceId);
}
return orderModelMapper.selectOne(queryWrapper);
}
public int delete(List<Long> ids) {
List<OrderModel> orderModels = orderModelMapper
.selectBatchIds(ids);
if (!CollectionUtils.isEmpty(orderModels)) {
orderModels.forEach(x -> {
SiteMemory siteMemory = GlobalMemory.getSiteMemory(x.getOrgId(), x.getSiteId());
if (siteMemory != null) {
siteMemory.removeOrderModel(x.getId());
}
});
}
int i = orderModelMapper.deleteBatchIds(ids);
return i;
}
public void createTask(String deviceId, Long siteId, Long orgId, Long modelId) {
SiteMemory siteMemory = GlobalMemory.getSiteMemory(orgId, siteId);
OrderModel orderModel = siteMemory.getOrderModel(modelId);
OrderType orderType = orderModel.getOrderType();
// 割草机
if (orderType != null && orderType.getType() == 1) {
Long routeId = orderModel.getRouteId();
DeviceTaskCommandDTO dto = new DeviceTaskCommandDTO();
dto.setDeviceId(deviceId);
dto.setRouteId(routeId);
dto.setOrgId(orgId);
dto.setSiteId(siteId);
dto.setStartTime(LocalDateTime.now());
mowerDispather.dispathDeviceTask(dto);
}
// 无人机
if (orderType != null && orderType.getType() == 2) {
String waylineId = orderModel.getWaylineId();
FlightTaskCreateDTO dto = new FlightTaskCreateDTO();
dto.setWayline_uuid(waylineId);
dto.setSn(deviceId);
String name = orderType.getValue() + "-"
+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
dto.setName(name);
dto.setRth_altitude(orderModel.getRthAltitude());
dto.setRth_mode(orderModel.getRthMode());
dispather.dispathFightTask(dto);
}
// 其他
if (orderType != null && orderType.getType() == 3) {
}
}
}

View File

@@ -1,25 +1,5 @@
package com.maibu.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.maibu.core.business.Device;
import com.maibu.core.business.IOTWorkOrder;
import com.maibu.core.business.dto.WorkOrderDispatchDTO;
import com.maibu.core.business.dto.WorkOrderQueryDTO;
import com.maibu.core.domain.model.LoginUser;
import com.maibu.core.enums.ErrorLevel;
import com.maibu.core.page.TableDataInfo;
import com.maibu.exception.ServiceException;
import com.maibu.mapper.DeviceMapper;
import com.maibu.mapper.IotWorkOrderMapper;
import com.maibu.service.IAlarmService;
import com.maibu.service.IWorkOrderService;
import com.maibu.utils.SecurityUtils;
import com.maibu.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
@@ -27,6 +7,32 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.maibu.core.business.Device;
import com.maibu.core.business.IOTWorkOrder;
import com.maibu.core.business.OrderModel;
import com.maibu.core.business.dto.WorkOrderDispatchDTO;
import com.maibu.core.business.dto.WorkOrderQueryDTO;
import com.maibu.core.business.dto.WorkOrderStartDTO;
import com.maibu.core.domain.model.LoginUser;
import com.maibu.core.enums.ErrorLevel;
import com.maibu.core.enums.OrderType;
import com.maibu.core.page.TableDataInfo;
import com.maibu.exception.ServiceException;
import com.maibu.mapper.DeviceMapper;
import com.maibu.mapper.IotWorkOrderMapper;
import com.maibu.mapper.OrderModelMapper;
import com.maibu.service.IAlarmService;
import com.maibu.service.IWorkOrderService;
import com.maibu.utils.SecurityUtils;
import com.maibu.utils.StringUtils;
@Service
public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWorkOrder> implements IWorkOrderService {
@@ -36,6 +42,15 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
@Autowired
private IAlarmService alarmService;
@Autowired
private IotWorkOrderMapper iotWorkOrderMapper;
@Autowired
private OrderModelMapper orderModelMapper;
@Autowired
private OrderModelService orderModelService;
@Override
public TableDataInfo selectWorkOrderPage(WorkOrderQueryDTO queryDTO) {
validateQueryParams(queryDTO);
@@ -75,10 +90,12 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
}
private void validateSiteAccess(Long siteId) {
if (siteId == null) return;
if (siteId == null)
return;
Long userId = SecurityUtils.getUserId();
if (SecurityUtils.isAdmin(userId)) return;
if (SecurityUtils.isAdmin(userId))
return;
LoginUser loginUser = SecurityUtils.getLoginUser();
Long userSiteId = loginUser.getSiteId();
@@ -92,8 +109,7 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
Long count = deviceMapper.selectCount(
new LambdaQueryWrapper<Device>()
.eq(Device::getSiteId, siteId)
.eq(Device::getOrgId, userOrgId)
);
.eq(Device::getOrgId, userOrgId));
if (count == 0) {
throw new ServiceException("无权访问该场站");
}
@@ -103,16 +119,17 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
}
private void validateDeviceAccess(Long deviceId) {
if (deviceId == null) return;
if (deviceId == null)
return;
Long userId = SecurityUtils.getUserId();
if (SecurityUtils.isAdmin(userId)) return;
if (SecurityUtils.isAdmin(userId))
return;
Device device = deviceMapper.selectOne(
new LambdaQueryWrapper<Device>()
.eq(Device::getDeviceId, deviceId)
.select(Device::getOrgId, Device::getSiteId)
);
.select(Device::getOrgId, Device::getSiteId));
if (device == null) {
throw new ServiceException("设备不存在");
@@ -210,7 +227,8 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
@Override
public IOTWorkOrder selectWorkOrderById(Long id) {
IOTWorkOrder workOrder = baseMapper.selectById(id);
if (workOrder == null) throw new ServiceException("工单不存在");
if (workOrder == null)
throw new ServiceException("工单不存在");
Long userId = SecurityUtils.getUserId();
if (!SecurityUtils.isAdmin(userId)) {
@@ -245,7 +263,7 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
@Override
public int insertWorkOrder(IOTWorkOrder workOrder) {
workOrder.setOrderNo(generateUniqueOrderNo());
workOrder.setTenantId(SecurityUtils.getLoginUser().getOrgId());
// workOrder.setTenantId(SecurityUtils.getLoginUser().getOrgId());
workOrder.setOrgId(SecurityUtils.getLoginUser().getOrgId());
workOrder.setCreateTime(LocalDateTime.now());
if (workOrder.getOrderStatus() == null) {
@@ -254,18 +272,20 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
return baseMapper.insert(workOrder);
}
/* @Override
public int updateWorkOrder(IOTWorkOrder workOrder) {
Long userId = SecurityUtils.getUserId();
if (!SecurityUtils.isAdmin(userId)) {
IOTWorkOrder existWorkOrder = baseMapper.selectById(workOrder.getId());
if (existWorkOrder != null) {
validateWorkOrderAccess(existWorkOrder);
}
}
workOrder.setUpdateTime(LocalDateTime.now());
return baseMapper.updateById(workOrder);
}*/
/*
* @Override
* public int updateWorkOrder(IOTWorkOrder workOrder) {
* Long userId = SecurityUtils.getUserId();
* if (!SecurityUtils.isAdmin(userId)) {
* IOTWorkOrder existWorkOrder = baseMapper.selectById(workOrder.getId());
* if (existWorkOrder != null) {
* validateWorkOrderAccess(existWorkOrder);
* }
* }
* workOrder.setUpdateTime(LocalDateTime.now());
* return baseMapper.updateById(workOrder);
* }
*/
@Override
public int updateWorkOrder(IOTWorkOrder workOrder) {
@@ -310,11 +330,11 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
return baseMapper.updateById(updateEntity);
}
@Override
public int dispatchWorkOrder(WorkOrderDispatchDTO dispatchDTO) {
IOTWorkOrder workOrder = baseMapper.selectById(dispatchDTO.getOrderId());
if (workOrder == null) throw new ServiceException("工单不存在");
if (workOrder == null)
throw new ServiceException("工单不存在");
Long userId = SecurityUtils.getUserId();
if (!SecurityUtils.isAdmin(userId)) {
@@ -337,28 +357,36 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
}
@Override
public int startWorkOrder(Long id) {
IOTWorkOrder workOrder = baseMapper.selectById(id);
if (workOrder == null) throw new ServiceException("工单不存在");
Long userId = SecurityUtils.getUserId();
if (!SecurityUtils.isAdmin(userId)) {
validateWorkOrderAccess(workOrder);
public boolean startWorkOrder(WorkOrderStartDTO dto) {
List<Long> ids = dto.getIds();
List<IOTWorkOrder> workOrders = baseMapper.selectBatchIds(ids);
if (CollectionUtils.isEmpty(workOrders)) {
throw new ServiceException("工单不存在");
}
IOTWorkOrder updateWorkOrder = new IOTWorkOrder();
updateWorkOrder.setId(id);
updateWorkOrder.setOrderStatus(3);
updateWorkOrder.setActualStartTime(LocalDateTime.now());
updateWorkOrder.setUpdateTime(LocalDateTime.now());
updateWorkOrder.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return baseMapper.updateById(updateWorkOrder);
Long userId = SecurityUtils.getUserId();
String userName = SecurityUtils.getUsername();
workOrders.forEach(workOrder -> {
workOrder.setOrderStatus(3);
workOrder.setActualStartTime(LocalDateTime.now());
workOrder.setUpdateTime(LocalDateTime.now());
workOrder.setUpdateBy(userName);
workOrder.setAssigneeId(userId);
workOrder.setAssigneeName(userName);
// todo 派发自定义的路径规划任务
Long modelId = workOrder.getModelId();
if (modelId == null) return;
Long siteId = workOrder.getSiteId();
Long orgId = workOrder.getOrgId();
orderModelService.createTask(dto.getDeviceId(), siteId, orgId, modelId);
});
return baseMapper.saveOrUpdateBatch(workOrders);
}
@Override
public int completeWorkOrder(IOTWorkOrder workOrder) {
IOTWorkOrder existWorkOrder = baseMapper.selectById(workOrder.getId());
if (existWorkOrder == null) throw new ServiceException("工单不存在");
if (existWorkOrder == null)
throw new ServiceException("工单不存在");
Long userId = SecurityUtils.getUserId();
if (!SecurityUtils.isAdmin(userId)) {
@@ -379,7 +407,8 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
@Override
public int suspendWorkOrder(Long id) {
IOTWorkOrder workOrder = baseMapper.selectById(id);
if (workOrder == null) throw new ServiceException("工单不存在");
if (workOrder == null)
throw new ServiceException("工单不存在");
Long userId = SecurityUtils.getUserId();
if (!SecurityUtils.isAdmin(userId)) {
@@ -452,7 +481,8 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
.filter(w -> w.getCreateTime().toLocalDate().equals(LocalDateTime.now().toLocalDate()))
.count());
statistics.put("highPriority", workOrders.stream().filter(w -> w.getPriorityLevel().equals(ErrorLevel.ERROR)).count());
statistics.put("highPriority",
workOrders.stream().filter(w -> w.getPriorityLevel().equals(ErrorLevel.ERROR)).count());
return statistics;
}
@@ -469,8 +499,7 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
Device device = deviceMapper.selectOne(
new LambdaQueryWrapper<Device>()
.eq(Device::getDeviceId, alarm.getDeviceId())
.select(Device::getOrgId, Device::getSiteId)
);
.select(Device::getOrgId, Device::getSiteId));
if (device != null) {
LoginUser loginUser = SecurityUtils.getLoginUser();
if (!loginUser.getOrgId().equals(device.getOrgId())) {
@@ -483,7 +512,7 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
workOrder.setOrderNo(generateUniqueOrderNo());
workOrder.setOrderTitle(alarm.getAlarmTitle());
workOrder.setSourceType(7);
workOrder.setOrderType(2);
workOrder.setOrderType(OrderType.MOWER_ERROR);
workOrder.setPriorityLevel(alarm.getAlarmLevel());
workOrder.setDeviceId(alarm.getDeviceId());
workOrder.setDeviceName(alarm.getDeviceName());
@@ -512,10 +541,9 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
}
}
private String generateOrderNo() {
String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
return "WO" + dateStr + String.format("%04d", (int)(Math.random() * 10000));
return "WO" + dateStr + String.format("%04d", (int) (Math.random() * 10000));
}
private synchronized String generateUniqueOrderNo() {
@@ -537,5 +565,35 @@ public class WorkOrderServiceImpl extends ServiceImpl<IotWorkOrderMapper, IOTWor
throw new ServiceException("生成工单号失败,请稍后重试");
}
}
// 生成工单的方法
public IOTWorkOrder generateWorkOrders(Long siteId, String deviceId, Long orgId, Long modelId) {
OrderModel orderModel = orderModelMapper.selectById(modelId);
if (orderModel == null) {
throw new ServiceException("工单模板不存在");
}
IOTWorkOrder workOrder = new IOTWorkOrder();
workOrder.setOrderNo(generateOrderNo(orderModel.getOrderType().getValue()));
workOrder.setOrderTitle(workOrder.getOrderNo());
// workOrder.setSourceType(orderModel.ge());
workOrder.setOrderType(orderModel.getOrderType());
workOrder.setPriorityLevel(orderModel.getErrorLevel());
workOrder.setDeviceId(deviceId);
workOrder.setSiteId(siteId);
workOrder.setOrgId(orgId);
workOrder.setOrderStatus(1);
workOrder.setCreateTime(LocalDateTime.now());
workOrder.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return workOrder;
}
private String generateOrderNo(String prefix) {
String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
return prefix + "-" + dateStr;
}
public boolean saveAll(List<IOTWorkOrder> list) {
return iotWorkOrderMapper.saveOrUpdateBatch(list);
}
}

View File

@@ -1,7 +1,10 @@
package com.maibu.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.maibu.core.business.Device;
import com.maibu.core.domain.entity.SysRole;
import com.maibu.core.domain.entity.SysSite;
import com.maibu.core.domain.model.LoginUser;
import com.maibu.exception.ServiceException;
import com.maibu.mapper.SysRegionMapper;
import com.maibu.mapper.SysSiteMapper;
@@ -14,6 +17,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
@Service
@@ -25,6 +29,9 @@ public class SysSiteService {
@Autowired
private SysRegionService sysRegionService;
@Autowired
private ISysRoleService roleService;
public List<SysSite> list(SysSite site) {
LambdaQueryWrapper<SysSite> queryWrapper = new LambdaQueryWrapper<>();
if (site != null && !StringUtils.isEmpty(site.getSiteName())) {
@@ -72,4 +79,25 @@ public class SysSiteService {
return sysSiteMapper.selectList(queryWrapper);
}
public List<SysSite> selectByUserId(LoginUser loginUser) {
SysRole sysRole = roleService.selectRoleById(loginUser.getRoleId());
if (sysRole != null) {
String roleKey = sysRole.getRoleKey();
LambdaQueryWrapper<SysSite> queryWrapper = new LambdaQueryWrapper<>();
if (!StringUtils.isEmpty(roleKey)) {
if ("manager".equals(roleKey)) {
queryWrapper.eq(SysSite::getOrgId, loginUser.getOrgId());
} else if ("siteManager".equals(roleKey)) {
queryWrapper.eq(SysSite::getId, loginUser.getSiteId());
} else if ("admin".equals(roleKey)) {
} else {
queryWrapper.eq(SysSite::getId, loginUser.getSiteId());
}
return sysSiteMapper.selectList(queryWrapper);
}
}
return null;
}
}