feat(auth): 人员库授权功能调整

This commit is contained in:
2025-07-15 13:43:55 +08:00
parent 8b340c9e95
commit 172ede3eb3
8 changed files with 199 additions and 91 deletions

View File

@@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.core.domain.TreeNode;
import org.dromara.sis.domain.SisAuthRecord;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -73,7 +75,7 @@ public class SisAuthRecordController extends BaseController {
* 新增授权记录
*/
@SaCheckPermission("sis:authRecord:add")
@Log(title = "授权记录", businessType = BusinessType.INSERT)
@Log(title = "人员库授权", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SisAuthRecordBo bo) {
@@ -103,4 +105,24 @@ public class SisAuthRecordController extends BaseController {
@PathVariable("ids") Long[] ids) {
return toAjax(sisAuthRecordService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 查询库id授权的设备
*
* @param libId 人像库id
*/
@GetMapping("/authDevice/{libId}")
public R<List<SisAuthRecord>> queryAuthDevice(@PathVariable("libId") String libId) {
return R.ok(sisAuthRecordService.queryAuthDevice(libId));
}
/**
* 查询所有可授权设备
*
* @return List<TreeNode < Long>>
*/
@GetMapping("/authDevice/tree")
public R<List<TreeNode<Long>>> tree() {
return R.ok(sisAuthRecordService.authDeviceTree());
}
}

View File

@@ -1,22 +0,0 @@
package org.dromara.sis.domain.bo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
/**
* 人像库授权
*
* @author lxj
*/
@Data
public class AuthLibBo {
@NotNull(message = "人像库id不能为空")
private Long libId;
@NotNull(message = "设备列表不能为空")
private List<Long> deviceIds;
}

View File

@@ -1,44 +0,0 @@
package org.dromara.sis.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.sis.domain.SisAuthRecord;
import java.util.List;
/**
* 授权记录业务对象 sis_auth_record
*
* @author lxj
* @since 2025-06-28
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = SisAuthRecord.class, reverseConvertGenerate = false)
public class SingleAuthRecordBo extends BaseEntity {
/**
* 图像库Id
*/
@NotNull(message = "图像库Id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long libId;
/**
* 图像id列表
*/
@NotNull(message = "图像id列表不能为空", groups = {AddGroup.class, EditGroup.class})
private Long imgId;
/**
* 门禁id列表
*/
@NotNull(message = "门禁id列表能为空", groups = {AddGroup.class, EditGroup.class})
private List<Long> acIds;
}

View File

@@ -35,14 +35,8 @@ public class SisAuthRecordBo extends BaseEntity {
private Long libId;
/**
* 门禁idList
* 授权设备idList
*/
@NotEmpty(message = "门禁idList不能为空", groups = {AddGroup.class, EditGroup.class})
private Collection<Long> acIdList;
/**
* 电梯idList
*/
@NotEmpty(message = "电梯idList不能为空", groups = {AddGroup.class, EditGroup.class})
private Collection<Long> eleIdList;
@NotEmpty(message = "授权设备idList不能为空", groups = {AddGroup.class, EditGroup.class})
private Collection<Long> deviceIds;
}

View File

@@ -1,5 +1,7 @@
package org.dromara.sis.service;
import org.dromara.common.core.domain.TreeNode;
import org.dromara.sis.domain.SisAuthRecord;
import org.dromara.sis.domain.vo.SisAuthRecordVo;
import org.dromara.sis.domain.bo.SisAuthRecordBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -65,4 +67,26 @@ public interface ISisAuthRecordService {
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 查询库id授权的设备
*
* @param libId 人像库id
* @return List<SisAuthRecord>
*/
List<SisAuthRecord> queryAuthDevice(String libId);
/**
* 根据人像库id删除授权记录
*
* @param libId 人像库id
*/
Boolean deleteByLibId(Long libId);
/**
* 查询所有可授权设备树
*
* @return List<TreeNode<Long>>
*/
List<TreeNode<Long>> authDeviceTree();
}

View File

@@ -71,4 +71,12 @@ public interface ISisElevatorInfoService {
* @return 返回电梯列表
*/
List<SisElevatorInfoVo> queryAll();
/**
* 根据查询列表
*
* @param ids 电梯id
* @return 列表
*/
List<SisElevatorInfoVo> queryListByIds(Collection<Long> ids);
}

View File

@@ -1,6 +1,8 @@
package org.dromara.sis.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import org.dromara.common.core.domain.TreeNode;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
@@ -9,6 +11,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.domain.bo.SisAccessControlBo;
import org.dromara.sis.domain.bo.SisElevatorInfoBo;
import org.dromara.sis.domain.vo.SisAccessControlVo;
import org.dromara.sis.domain.vo.SisElevatorInfoVo;
import org.dromara.sis.service.ISisAccessControlService;
import org.dromara.sis.service.ISisElevatorInfoService;
import org.springframework.stereotype.Service;
import org.dromara.sis.domain.bo.SisAuthRecordBo;
import org.dromara.sis.domain.vo.SisAuthRecordVo;
@@ -34,6 +42,9 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService {
private final SisAuthRecordMapper baseMapper;
private final ISisAccessControlService accessControlService;
private final ISisElevatorInfoService elevatorInfoService;
/**
* 查询授权记录
*
@@ -88,27 +99,44 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService {
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(SisAuthRecordBo bo) {
boolean flag = false;
log.info("开始写入门禁授权记录acIds{}", bo.getAcIdList());
for (Long acId : bo.getAcIdList()) {
SisAuthRecord add = MapstructUtils.convert(bo, SisAuthRecord.class);
Assert.notNull(add, "数据处理失败");
if (CollUtil.isEmpty(bo.getDeviceIds())) {
return false;
}
add.setDeviceType(1);
add.setDeviceId(acId);
flag = baseMapper.insert(add) > 0;
// 每次授权先删除上一次授权信息
deleteByLibId(bo.getLibId());
// 过滤不是设备的节点数据
// 门禁设备
List<SisAccessControlVo> acVoList = accessControlService.queryListByIds(bo.getDeviceIds());
// 电梯设备
List<SisElevatorInfoVo> eleVoList = elevatorInfoService.queryListByIds(bo.getDeviceIds());
if (CollUtil.isEmpty(acVoList) || CollUtil.isEmpty(eleVoList)) {
return false;
}
// 批量写入授权数据
boolean flag = false;
log.info("开始写入门禁授权记录acIds{}", acVoList);
for (SisAccessControlVo ac : acVoList) {
SisAuthRecord authRecord = new SisAuthRecord();
authRecord.setDeviceType(1);
authRecord.setDeviceId(ac.getId());
authRecord.setLibId(bo.getLibId());
flag = baseMapper.insert(authRecord) > 0;
Assert.isTrue(flag, "写入门禁授权记录失败!");
}
log.info("写入门禁授权记录完成");
log.info("开始写入电梯授权记录eleIds{}", bo.getEleIdList());
for (Long ele : bo.getEleIdList()) {
SisAuthRecord add = MapstructUtils.convert(bo, SisAuthRecord.class);
Assert.notNull(add, "数据处理失败");
log.info("开始写入电梯授权记录eleIds{}", eleVoList);
for (SisElevatorInfoVo ele : eleVoList) {
SisAuthRecord authRecord = new SisAuthRecord();
add.setDeviceType(2);
add.setDeviceId(ele);
flag = baseMapper.insert(add) > 0;
authRecord.setDeviceType(2);
authRecord.setLibId(bo.getLibId());
authRecord.setDeviceId(ele.getElevatorId());
flag = baseMapper.insert(authRecord) > 0;
Assert.isTrue(flag, "写入电梯授权记录失败!");
}
log.info("写入电梯授权记录完成");
@@ -150,4 +178,91 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService {
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
* 查询库id授权的设备
*
* @param libId 人像库id
* @return List<SisAuthRecord>
*/
@Override
public List<SisAuthRecord> queryAuthDevice(String libId) {
LambdaQueryWrapper<SisAuthRecord> lqw = Wrappers.lambdaQuery();
lqw.eq(SisAuthRecord::getLibId, libId);
return baseMapper.selectList(lqw);
}
/**
* 根据人像库id删除授权记录
*
* @param libId 人像库id
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteByLibId(Long libId){
LambdaQueryWrapper<SisAuthRecord> lqw = Wrappers.lambdaQuery();
lqw.eq(SisAuthRecord::getLibId, libId);
return baseMapper.delete(lqw) > 0;
}
/**
* 查询所有可授权设备树
*
* @return List<TreeNode<Long>>
*/
@Override
public List<TreeNode<Long>> authDeviceTree(){
// 暂时将所有数据放入写死的根节点中
TreeNode<Long> root = new TreeNode<>();
root.setLevel(0);
root.setCode(0L);
root.setParentCode(-1L);
root.setLabel("授权设备");
// 创建门禁设备父节点
TreeNode<Long> accessNode = new TreeNode<>();
accessNode.setLevel(1);
accessNode.setCode(1L);
accessNode.setParentCode(0L);
accessNode.setLabel("门禁设备");
// 创建电梯父节点
TreeNode<Long> elevatorNode = new TreeNode<>();
elevatorNode.setLevel(1);
elevatorNode.setCode(2L);
elevatorNode.setParentCode(0L);
elevatorNode.setLabel("电梯设备");
List<SisAccessControlVo> acVoList = accessControlService.queryList(new SisAccessControlBo());
List<SisElevatorInfoVo> eleVoList = elevatorInfoService.queryList(new SisElevatorInfoBo());
List<TreeNode<Long>> acChildrenList = acVoList.stream().map(item -> {
TreeNode<Long> node = new TreeNode<>();
node.setLevel(2);
node.setCode(item.getId());
node.setParentCode(1L);
node.setLabel(item.getAccessName());
return node;
}).toList();
List<TreeNode<Long>> eleChildrenList = eleVoList.stream().map(item -> {
TreeNode<Long> node = new TreeNode<>();
node.setLevel(2);
node.setCode(item.getElevatorId());
node.setParentCode(2L);
node.setLabel(item.getElevatorName());
return node;
}).toList();
// 将子节点列表分别添加到对应的父节点
accessNode.setChildren(acChildrenList);
elevatorNode.setChildren(eleChildrenList);
// 最后将两个父节点添加到根节点
root.setChildren(List.of(accessNode, elevatorNode));
return List.of(root);
}
}

View File

@@ -253,4 +253,15 @@ public class SisElevatorInfoServiceImpl implements ISisElevatorInfoService {
public List<SisElevatorInfoVo> queryAll() {
return baseMapper.selectVoList();
}
/**
* 根据查询列表
*
* @param ids 电梯id
* @return 列表
*/
@Override
public List<SisElevatorInfoVo> queryListByIds(Collection<Long> ids){
return baseMapper.selectVoByIds(ids);
}
}