diff --git a/dk-modules/business/src/main/resources/templates/alert.ftl b/dk-modules/business/src/main/resources/templates/alert.ftl index 7937b57..749a3fe 100644 --- a/dk-modules/business/src/main/resources/templates/alert.ftl +++ b/dk-modules/business/src/main/resources/templates/alert.ftl @@ -829,6 +829,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + 标签 + + + @@ -1012,6 +1039,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + ${item.labelCn?if_exists} + + + diff --git a/dk-modules/business/src/main/resources/templates/pdfAlert.ftl b/dk-modules/business/src/main/resources/templates/pdfAlert.ftl index 34a8e52..3fcd56c 100644 --- a/dk-modules/business/src/main/resources/templates/pdfAlert.ftl +++ b/dk-modules/business/src/main/resources/templates/pdfAlert.ftl @@ -50,6 +50,7 @@ 预警名称 所属部门 预警状态 + 标签 经纬度 预警时间 @@ -60,6 +61,7 @@ ${item.jobName?if_exists} ${item.deptName?if_exists} ${item.handleType?if_exists} + ${item.labelCn?if_exists} ${item.lng?if_exists} ${item.lat?if_exists} ${item.createTime?datetime?string('yyyy-MM-dd HH:mm:ss')} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteSystemFeign.java b/dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteSystemFeign.java index 83f5f4e..26306e2 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteSystemFeign.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteSystemFeign.java @@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; +import java.util.Map; @FeignClient(name = "gateway",path = "system") public interface RemoteSystemFeign { @@ -17,4 +18,9 @@ public interface RemoteSystemFeign { @GetMapping(value = "/config/configKeyFeign/{configKey}") public String getConfigKeyFeign(@PathVariable String configKey); + + //根据目标值类型查询用户信息 + @GetMapping("/user/list/target") + public List> listTargetTypeByUser(List> params); + } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceProController.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceProController.java index 43f11c0..b029899 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceProController.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceProController.java @@ -1,23 +1,20 @@ package org.dromara.sample.manage.controller; -import cn.hutool.core.lang.Dict; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.sdk.common.HttpResultResponse; import org.dromara.common.sdk.common.PaginationData; import org.dromara.sample.manage.model.dto.DeviceProDTO; import org.dromara.sample.manage.model.entity.DeviceProEntity; import org.dromara.sample.manage.model.entity.DeviceProUserEntity; import org.dromara.sample.manage.service.IDeviceProService; -import org.dromara.system.api.model.LoginUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Map; @RestController @Slf4j @@ -87,11 +84,27 @@ public class DeviceProController { */ @Operation(summary = "新增/更新项目人员。", description = "新增/更新项目人员。") @PostMapping("/{proId}/update") - public HttpResultResponse updateDeviceProUser(@RequestBody List userEntity,@PathVariable Integer proId) { + public HttpResultResponse updateDeviceProUser(@RequestBody List userEntity, @PathVariable Integer proId) { + return HttpResultResponse.success(deviceProService.updateDeviceProUser(userEntity,proId)); } + /** + * 新增/更新项目人员。 + * @param userEntity + * @return + */ + @Operation(summary = "新增/更新项目人员新", description = "新增/更新项目人员新") + @PostMapping("/{proId}/update/new") + public HttpResultResponse updateDeviceProUserNew(@RequestBody List> userEntity, @PathVariable Integer proId) { + //目标类型 targetType 1、用户 2、角色 3、部门 targetKey 目标值 List> params + + + return HttpResultResponse.success(deviceProService.updateDeviceProUserNew(userEntity,proId)); + } + + @Operation(summary = "查询项目人员。", description = "查询项目人员") @GetMapping("/{proId}/user/page") public HttpResultResponse> pageProUser(@PathVariable Integer proId, @@ -102,6 +115,7 @@ public class DeviceProController { return HttpResultResponse.success(deviceProService.pageProUser(searchValue,proId,pageQuery)); } + @Operation(summary = "删除项目人员", description = "删除项目人员") @DeleteMapping("/{proId}/{proUserId}/user/delete") public HttpResultResponse deleteProUser(@PathVariable Integer proId, diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceProService.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceProService.java index 1e96f0f..d644a00 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceProService.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceProService.java @@ -2,24 +2,13 @@ package org.dromara.sample.manage.service; import cn.hutool.core.lang.Dict; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.fasterxml.jackson.databind.JsonNode; -import org.apache.ibatis.annotations.Param; -import org.dromara.common.sdk.cloudapi.device.ControlSourceEnum; -import org.dromara.common.sdk.cloudapi.device.DeviceOsdHost; -import org.dromara.common.sdk.cloudapi.device.DockModeCodeEnum; -import org.dromara.common.sdk.cloudapi.device.DroneModeCodeEnum; -import org.dromara.common.sdk.common.HttpResultResponse; import org.dromara.common.sdk.common.PaginationData; -import org.dromara.common.sdk.config.version.GatewayManager; -import org.dromara.common.websocket.dto.BizCodeEnum; import org.dromara.sample.manage.model.dto.*; import org.dromara.sample.manage.model.entity.DeviceProEntity; import org.dromara.sample.manage.model.entity.DeviceProUserEntity; -import org.dromara.sample.manage.model.param.DeviceQueryParam; -import java.util.Collection; import java.util.List; -import java.util.Optional; +import java.util.Map; /** * @author sean.zhou @@ -36,7 +25,9 @@ public interface IDeviceProService { Boolean updateDevicePro(DeviceProEntity deviceProEntity); - Boolean updateDeviceProUser(List userEntity,Integer proId); + Boolean updateDeviceProUser(List userEntity, Integer proId); + + Boolean updateDeviceProUserNew(List> userEntity, Integer proId); Boolean updateDevice(Dict dict); @@ -58,4 +49,5 @@ public interface IDeviceProService { Boolean initProRedisCache(); + } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceProServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceProServiceImpl.java index ac3f9c9..5c2223e 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceProServiceImpl.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceProServiceImpl.java @@ -2,73 +2,32 @@ package org.dromara.sample.manage.service.impl; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.Dict; -import cn.hutool.core.stream.StreamUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; -import org.apache.ibatis.executor.BatchResult; -import org.dromara.common.core.constant.Constants; import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.redis.utils.RedisOpsUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.sdk.cloudapi.device.*; -import org.dromara.common.sdk.cloudapi.firmware.*; -import org.dromara.common.sdk.cloudapi.firmware.api.AbstractFirmwareService; -import org.dromara.common.sdk.cloudapi.property.api.AbstractPropertyService; -import org.dromara.common.sdk.cloudapi.tsa.DeviceIconUrl; -import org.dromara.common.sdk.cloudapi.tsa.TopologyDeviceModel; import org.dromara.common.sdk.common.*; -import org.dromara.common.sdk.config.version.GatewayManager; -import org.dromara.common.sdk.exception.CloudSDKException; -import org.dromara.common.sdk.mqtt.IMqttTopicService; -import org.dromara.common.sdk.mqtt.MqttGatewayPublish; -import org.dromara.common.sdk.mqtt.events.EventsSubscribe; -import org.dromara.common.sdk.mqtt.osd.OsdSubscribe; -import org.dromara.common.sdk.mqtt.property.PropertySetReplyResultEnum; -import org.dromara.common.sdk.mqtt.property.PropertySetSubscribe; -import org.dromara.common.sdk.mqtt.requests.RequestsSubscribe; -import org.dromara.common.sdk.mqtt.services.ServicesReplyData; -import org.dromara.common.sdk.mqtt.services.ServicesSubscribe; -import org.dromara.common.sdk.mqtt.services.TopicServicesResponse; -import org.dromara.common.sdk.mqtt.state.StateSubscribe; -import org.dromara.common.sdk.mqtt.status.StatusSubscribe; -import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.common.websocket.dto.BizCodeEnum; -import org.dromara.sample.common.error.CommonErrorEnum; -import org.dromara.sample.component.mqtt.model.EventsReceiver; -import org.dromara.sample.control.model.enums.DroneAuthorityEnum; +import org.dromara.sample.feign.RemoteSystemFeign; import org.dromara.sample.manage.mapper.IDeviceMapper; import org.dromara.sample.manage.mapper.IDeviceProMapper; import org.dromara.sample.manage.mapper.IDeviceProUserMapper; -import org.dromara.sample.manage.mapper.IDeviceQrtzMapper; import org.dromara.sample.manage.model.dto.*; import org.dromara.sample.manage.model.entity.DeviceEntity; import org.dromara.sample.manage.model.entity.DeviceProEntity; import org.dromara.sample.manage.model.entity.DeviceProUserEntity; -import org.dromara.sample.manage.model.entity.DeviceQrtzDateEntity; -import org.dromara.sample.manage.model.enums.DeviceFirmwareStatusEnum; -import org.dromara.sample.manage.model.enums.PropertySetFieldEnum; -import org.dromara.sample.manage.model.enums.UserTypeEnum; -import org.dromara.sample.manage.model.param.DeviceQueryParam; -import org.dromara.sample.manage.model.receiver.BasicDeviceProperty; import org.dromara.sample.manage.service.*; -import org.dromara.sample.websocket.service.IWebSocketMessageService; -import org.dromara.system.api.domain.vo.RemoteUserVo; import org.dromara.system.api.model.LoginUser; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -91,6 +50,9 @@ public class DeviceProServiceImpl implements IDeviceProService { @Autowired private IDeviceProUserMapper deviceProUserMapper; + @Autowired + RemoteSystemFeign remoteSystemFeign; + @Override public PaginationData listDeviceProEntityMap(Page page, DeviceProDTO deviceProDTO) { @@ -128,8 +90,7 @@ public class DeviceProServiceImpl implements IDeviceProService { } @Override - @Transactional(rollbackFor = Exception.class) - public Boolean updateDeviceProUser(List userEntity,Integer proId) { + public Boolean updateDeviceProUser(List userEntity, Integer proId) { try { List proUserEntityList = deviceProUserMapper.selectList(new LambdaQueryWrapper().eq(DeviceProUserEntity::getDeviceProId, proId)); @@ -153,6 +114,48 @@ public class DeviceProServiceImpl implements IDeviceProService { } } + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateDeviceProUserNew(List> userEntity, Integer proId) { + try { + List> resultList = remoteSystemFeign.listTargetTypeByUser(userEntity); + + //构建DeviceProUserEntity集合 + List userEntityList = new ArrayList<>(); + + resultList.forEach(resultMap -> { + DeviceProUserEntity deviceProUserEntity = new DeviceProUserEntity(); + deviceProUserEntity.setDeviceProId(proId); + deviceProUserEntity.setUserId(Long.valueOf(resultMap.get("userId") + "")); + deviceProUserEntity.setUserName(resultMap.get("userName") + ""); + deviceProUserEntity.setNickName(resultMap.get("nickName") + ""); + + userEntityList.add(deviceProUserEntity); + }); + + + List proUserEntityList = deviceProUserMapper.selectList(new LambdaQueryWrapper().eq(DeviceProUserEntity::getDeviceProId, proId)); + + List different = userEntityList.stream() + .filter(user -> proUserEntityList.stream().noneMatch(u -> u.getUserId().equals(user.getUserId()))) + .toList(); + + + if (ObjectUtil.isNotEmpty(different)){ + //添加新的项目组成员 + deviceProUserMapper.insert(different); + } + + //更新设备组redis缓存 + Boolean flag = updateDeviceProCache("update",null); + + return true; + } catch (ServiceException e) { + log.error(e.getMessage(),e); + return false; + } + } + /** * 更新设备组人员缓存 * @return @@ -364,6 +367,7 @@ public class DeviceProServiceImpl implements IDeviceProService { return this.updateDeviceProCache("init",null); } + @Override public Boolean saveAndUpdate(DeviceProEntity entity) { boolean flag = true; diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysUserController.java index 365b7dc..da371fd 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -37,6 +37,7 @@ import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * 用户信息 @@ -334,4 +335,14 @@ public class SysUserController extends BaseController { return R.ok(userService.selectUserListByDept(deptId)); } + /** + * 用于设备组添加成员,根据目标值类型查询 + * @param params + * @return + */ + @GetMapping("/list/target") + public List> listTargetTypeByUser(List> params){ + return userService.listTargetTypeByUser(params); + } + } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/ISysUserService.java b/dk-modules/system/src/main/java/org/dromara/system/service/ISysUserService.java index 2d0e9e0..839016b 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/ISysUserService.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -7,6 +7,7 @@ import org.dromara.system.domain.vo.SysUserExportVo; import org.dromara.system.domain.vo.SysUserVo; import java.util.List; +import java.util.Map; /** * 用户 业务层 @@ -280,4 +281,11 @@ public interface ISysUserService { List selectFlwByIds(List userIds, Long deptId); List allList(SysUserBo user); + + /** + * 用于设备组添加成员,根据目标值类型查询 + * @param params + * @return + */ + List> listTargetTypeByUser(List> params); } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java index d099397..f4aebdd 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java @@ -1,6 +1,8 @@ package org.dromara.system.service.impl; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -226,10 +228,10 @@ public class SysDepartBoundaryServiceImpl extends ServiceImpl deptVoList = deptService.selectSecondByParentId(deptId); List secondDeptIdList = StreamUtils.toList(deptVoList, SysDeptVo::getDeptId); - secondDeptIdList.add(deptId); return this.baseMapper.listJson(secondDeptIdList.stream().distinct().toList()); + } /** diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 54b5d6a..1602daf 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -37,9 +37,8 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * 用户 业务层处理 @@ -613,6 +612,85 @@ public class SysUserServiceImpl implements ISysUserService { return baseMapper.allList(user); } + /** + * 用于设备组添加成员,根据目标值类型查询 + * @param params + * @return + */ + @Override + public List> listTargetTypeByUser(List> params) { + //1、定义返回值 + List> result = new ArrayList<>(); + + //2、根据传过来的集合中的目标值类型分组 + Map>> targetMap = params.stream().collect(Collectors.groupingBy(p -> Integer.valueOf(p.get("targetType") + ""))); + + //3、根据目标值的遍历 + targetMap.keySet().forEach(targetType -> { + + List currentUserList = new ArrayList<>(); + + //4、获取相应目标类型的目标值集合 + List> targetMapList = targetMap.get(targetType); + + //5、如果为空则结束当前循环 + if (ObjectUtil.isEmpty(targetMapList)) { + return; + } + + //不为空再根据集合中的目标值转换成long集合 + List targetKeyList = targetMapList.stream().map(p -> Long.valueOf(p.get("targetKey") + "")).distinct().toList(); + + //根据目标值类型找到对应的解析方法 + switch (targetType) { + case 1: + currentUserList= this.baseMapper.selectList(new LambdaQueryWrapper().in(SysUser::getUserId, targetKeyList)); + + break; + case 2: + //角色 + List userRoleIds = Optional.ofNullable(userRoleMapper.selectList( + new LambdaQueryWrapper() + .in(SysUserRole::getRoleId, targetKeyList))) + .orElse(List.of()) + .stream() + .map(SysUserRole::getUserId) + .filter(Objects::nonNull) + .distinct() + .toList(); + + currentUserList = this.baseMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, userRoleIds)); + + break; + case 3: + //部门 + currentUserList = this.baseMapper.selectList(new LambdaQueryWrapper().in(SysUser::getDeptId, targetKeyList)); + + break; + default: + break; + } + + //拿到目标值获取的信息进行构建返回格式 + currentUserList.forEach(sysUser -> { + Map userMap = new HashMap<>(); + //用户 + userMap.put("userId",sysUser.getUserId()); + userMap.put("userName",sysUser.getUserName()); + userMap.put("nickName",sysUser.getNickName()); + + //防止重复存入 + if (result.stream().noneMatch(p-> Long.valueOf(p.get("userId") + "").equals(sysUser.getUserId()))) { + result.add(userMap); + } + }); + + }); + + + return result; + } + /** * 通过用户ID查询用户账户 *