From 873cf303c2e8cdead697eb326baad73846d39d34 Mon Sep 17 00:00:00 2001 From: zcxlsm Date: Sat, 28 Jun 2025 13:42:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(sis):=20=20-=20=E4=BA=BA=E5=83=8F=E6=8E=88?= =?UTF-8?q?=E6=9D=83=20=20-=20=E4=B8=8A=E4=BC=A0=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SisAccessControlController.java | 2 +- .../controller/SisAuthRecordController.java | 106 +++++++ .../dromara/sis/domain/SisAccessControl.java | 5 + .../org/dromara/sis/domain/SisAuthRecord.java | 46 +++ .../sis/domain/bo/SisAuthRecordBo.java | 50 ++++ .../sis/domain/vo/SisAccessControlVo.java | 11 +- .../sis/domain/vo/SisAuthRecordVo.java | 53 ++++ .../sis/domain/vo/SisPersonLibImgVo.java | 2 +- .../sis/mapper/SisAuthRecordMapper.java | 15 + .../sis/service/ISisAuthRecordService.java | 69 +++++ .../impl/SisAuthRecordServiceImpl.java | 272 ++++++++++++++++++ .../impl/SisPersonLibImgServiceImpl.java | 101 +------ 12 files changed, 626 insertions(+), 106 deletions(-) create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAuthRecordController.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAuthRecord.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAuthRecordBo.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAuthRecordVo.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAuthRecordService.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAccessControlController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAccessControlController.java index b818c26d..62287cc3 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAccessControlController.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAccessControlController.java @@ -75,7 +75,7 @@ public class SisAccessControlController extends BaseController { @SaCheckPermission("sis:accessControl:add") @Log(title = "门禁设备", businessType = BusinessType.INSERT) @RepeatSubmit() - @PostMapping() + @PostMapping("add") public R add(@Validated(AddGroup.class) @RequestBody SisAccessControlBo bo) { return toAjax(sisAccessControlService.insertByBo(bo)); } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAuthRecordController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAuthRecordController.java new file mode 100644 index 00000000..1537f749 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAuthRecordController.java @@ -0,0 +1,106 @@ +package org.dromara.sis.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.sis.domain.vo.SisAuthRecordVo; +import org.dromara.sis.domain.bo.SisAuthRecordBo; +import org.dromara.sis.service.ISisAuthRecordService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 授权记录 + * 前端访问路由地址为:/sis/authRecord + * + * @author lsm + * @date 2025-06-28 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/authRecord") +public class SisAuthRecordController extends BaseController { + + private final ISisAuthRecordService sisAuthRecordService; + + /** + * 查询授权记录列表 + */ + @SaCheckPermission("sis:authRecord:list") + @GetMapping("/list") + public TableDataInfo list(SisAuthRecordBo bo, PageQuery pageQuery) { + return sisAuthRecordService.queryPageList(bo, pageQuery); + } + + /** + * 导出授权记录列表 + */ + @SaCheckPermission("sis:authRecord:export") + @Log(title = "授权记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SisAuthRecordBo bo, HttpServletResponse response) { + List list = sisAuthRecordService.queryList(bo); + ExcelUtil.exportExcel(list, "授权记录", SisAuthRecordVo.class, response); + } + + /** + * 获取授权记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("sis:authRecord:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("id") Long id) { + return R.ok(sisAuthRecordService.queryById(id)); + } + + /** + * 新增授权记录 + */ + @SaCheckPermission("sis:authRecord:add") + @Log(title = "授权记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SisAuthRecordBo bo) { + return toAjax(sisAuthRecordService.insertByBo(bo)); + } + + /** + * 修改授权记录 + */ + @SaCheckPermission("sis:authRecord:edit") + @Log(title = "授权记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SisAuthRecordBo bo) { + return toAjax(sisAuthRecordService.updateByBo(bo)); + } + + /** + * 删除授权记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("sis:authRecord:remove") + @Log(title = "授权记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("ids") Long[] ids) { + return toAjax(sisAuthRecordService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAccessControl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAccessControl.java index 3a3112f9..911f416a 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAccessControl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAccessControl.java @@ -83,5 +83,10 @@ public class SisAccessControl extends TenantEntity { */ private String outCode; + /** + * 组织编码 + */ + private String orgCode; + } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAuthRecord.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAuthRecord.java new file mode 100644 index 00000000..edeeb047 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAuthRecord.java @@ -0,0 +1,46 @@ +package org.dromara.sis.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 授权记录对象 sis_auth_record + * + * @author lsm + * @since 2025-06-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sis_auth_record") +public class SisAuthRecord extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + + /** + * 人像id + */ + private Long imgId; + + /** + * 门禁id + */ + private String acId; + + /** + * 设备id + */ + private String eqbId; + + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAuthRecordBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAuthRecordBo.java new file mode 100644 index 00000000..83435d77 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAuthRecordBo.java @@ -0,0 +1,50 @@ +package org.dromara.sis.domain.bo; + +import org.dromara.sis.domain.SisAuthRecord; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.List; + +/** + * 授权记录业务对象 sis_auth_record + * + * @author lsm + * @since 2025-06-28 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SisAuthRecord.class, reverseConvertGenerate = false) +public class SisAuthRecordBo extends BaseEntity { + + /** + * 主键id + */ + @NotNull(message = "主键id不能为空", groups = {EditGroup.class}) + private Long id; + + /** + * 人像id + */ + @NotNull(message = "图像id不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long imgId; + + /** + * 门禁id列表 + */ + @NotNull(message = "门禁id列表能为空", groups = {AddGroup.class, EditGroup.class}) + private List acIds; + + /** + * 设备id列表 + */ + @NotNull(message = "设备id列表不能为空", groups = {AddGroup.class, EditGroup.class}) + private List eqbIds; + + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAccessControlVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAccessControlVo.java index f6681c9c..8a4d5793 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAccessControlVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAccessControlVo.java @@ -3,14 +3,11 @@ package org.dromara.sis.domain.vo; import org.dromara.sis.domain.SisAccessControl; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import java.io.Serial; import java.io.Serializable; -import java.util.Date; @@ -18,7 +15,7 @@ import java.util.Date; * 门禁设备视图对象 sis_access_control * * @author lxj - * @date 2025-06-25 + * @since 2025-06-25 */ @Data @ExcelIgnoreUnannotated @@ -100,4 +97,10 @@ public class SisAccessControlVo implements Serializable { @ExcelProperty(value = "外部编码") private String outCode; + /** + * 组织编码 + */ + @ExcelProperty(value = "外部编码") + private String orgCode; + } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAuthRecordVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAuthRecordVo.java new file mode 100644 index 00000000..a05d17a7 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAuthRecordVo.java @@ -0,0 +1,53 @@ +package org.dromara.sis.domain.vo; + +import org.dromara.sis.domain.SisAuthRecord; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 授权记录视图对象 sis_auth_record + * + * @author lsm + * @since 2025-06-28 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SisAuthRecord.class) +public class SisAuthRecordVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @ExcelProperty(value = "主键id") + private Long id; + + /** + * 人像id + */ + @ExcelProperty(value = "人像id") + private Long imgId; + + /** + * 门禁id列表 + */ + @ExcelProperty(value = "门禁id列表") + private List acIds; + + /** + * 设备id列表 + */ + @ExcelProperty(value = "设备id列表") + private List eqbIds; + + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibImgVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibImgVo.java index bbd686fb..3e110128 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibImgVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibImgVo.java @@ -35,7 +35,7 @@ public class SisPersonLibImgVo implements Serializable { * 人员库编码 */ @ExcelProperty(value = "人员库Id") - private String libId; + private Long libId; /** * 人像名称 diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java new file mode 100644 index 00000000..f5061055 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java @@ -0,0 +1,15 @@ +package org.dromara.sis.mapper; + +import org.dromara.sis.domain.SisAuthRecord; +import org.dromara.sis.domain.vo.SisAuthRecordVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 授权记录Mapper接口 + * + * @author lsm + * @date 2025-06-28 + */ +public interface SisAuthRecordMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAuthRecordService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAuthRecordService.java new file mode 100644 index 00000000..b314e488 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAuthRecordService.java @@ -0,0 +1,69 @@ +package org.dromara.sis.service; + +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; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 授权记录Service接口 + * + * @author lsm + * @date 2025-06-28 + */ +public interface ISisAuthRecordService { + + /** + * 查询授权记录 + * + * @param id 主键 + * @return 授权记录 + */ + SisAuthRecordVo queryById(Long id); + + /** + * 分页查询授权记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 授权记录分页列表 + */ + TableDataInfo queryPageList(SisAuthRecordBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的授权记录列表 + * + * @param bo 查询条件 + * @return 授权记录列表 + */ + List queryList(SisAuthRecordBo bo); + + /** + * 新增授权记录 + * + * @param bo 授权记录 + * @return 是否新增成功 + */ + Boolean insertByBo(SisAuthRecordBo bo); + + /** + * 修改授权记录 + * + * @param bo 授权记录 + * @return 是否修改成功 + */ + Boolean updateByBo(SisAuthRecordBo bo); + + /** + * 校验并批量删除授权记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java new file mode 100644 index 00000000..c10f24b4 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java @@ -0,0 +1,272 @@ +package org.dromara.sis.service.impl; + +import cn.hutool.core.lang.Assert; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +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.SisLibDeviceImgRefBo; +import org.dromara.sis.domain.bo.SisLibDeviceRefBo; +import org.dromara.sis.domain.vo.*; +import org.dromara.sis.sdk.e8.AccessControlService; +import org.dromara.sis.sdk.e8.VoucherControlService; +import org.dromara.sis.sdk.e8.domain.accessControl.req.CustomerAuthAddReq; +import org.dromara.sis.sdk.e8.domain.voucher.req.IssueVoucherReq; +import org.dromara.sis.sdk.unview.UnViewAiBoxApi; +import org.dromara.sis.sdk.unview.model.UvModel; +import org.dromara.sis.service.*; +import org.springframework.stereotype.Service; +import org.dromara.sis.domain.bo.SisAuthRecordBo; +import org.dromara.sis.domain.SisAuthRecord; +import org.dromara.sis.mapper.SisAuthRecordMapper; +import org.springframework.transaction.annotation.Transactional; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; + +/** + * 授权记录Service业务层处理 + * + * @author lsm + * @since 2025-06-28 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SisAuthRecordServiceImpl implements ISisAuthRecordService { + + private final UnViewAiBoxApi unViewAiBoxApi; + private final SisAuthRecordMapper baseMapper; + private final VoucherControlService vouchService; + private final ISisPersonLibService sisPersonLibService; + private final AccessControlService accessControlService; + private final ISisPersonLibImgService sisPersonLibImgService; + private final ISisLibDeviceRefService sisLibDeviceRefService; + private final ISisAccessControlService sisAccessControlService; + private final ISisLibDeviceImgRefService sisLibDeviceImgRefService; + private final ISisAccessControlDeviceService sisAccessControlDeviceService; + + /** + * 查询授权记录 + * + * @param id 主键 + * @return 授权记录 + */ + @Override + public SisAuthRecordVo queryById(Long id) { + SisAuthRecord sisAuthRecord = baseMapper.selectById(id); + if (sisAuthRecord == null) return null; + List acIds = Arrays.stream(sisAuthRecord.getAcId().split(",")).map(Long::parseLong).toList(); + List eqbIds = Arrays.stream(sisAuthRecord.getEqbId().split(",")).map(Long::parseLong).toList(); + SisAuthRecordVo vo = MapstructUtils.convert(sisAuthRecord, SisAuthRecordVo.class); + vo.setAcIds(acIds); + vo.setEqbIds(eqbIds); + return vo; + } + + /** + * 分页查询授权记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 授权记录分页列表 + */ + @Override + public TableDataInfo queryPageList(SisAuthRecordBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的授权记录列表 + * + * @param bo 查询条件 + * @return 授权记录列表 + */ + @Override + public List queryList(SisAuthRecordBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SisAuthRecordBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(SisAuthRecord::getId); + lqw.eq(bo.getImgId() != null, SisAuthRecord::getImgId, bo.getImgId()); + return lqw; + } + + /** + * 新增授权记录 + * + * @param bo 授权记录 + * @return 是否新增成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SisAuthRecordBo bo) { + SisAuthRecord add = MapstructUtils.convert(bo, SisAuthRecord.class); + Assert.notNull(add, "数据处理失败"); + add.setAcId(StringUtils.join(bo.getAcIds(), ",")); + add.setEqbId(StringUtils.join(bo.getEqbIds(), ",")); + boolean flag = baseMapper.insert(add) > 0; + log.info("图片{},开始对{}门禁授权,下发{}设备照片", add.getImgId(), bo.getAcIds(), bo.getEqbIds()); + if (flag) { + SisPersonLibImgVo imgVo = sisPersonLibImgService.queryById(bo.getImgId()); + Assert.notNull(imgVo, "图片不存在,id=" + bo.getImgId()); + + SisPersonLibVo libVo = sisPersonLibService.queryById(imgVo.getLibId()); + Assert.notNull(libVo, "图像库不存在,id=" + imgVo.getLibId()); + + + try { + long eqp_lib_id; + Integer eqp_lib_img_id; + String eqp_lib_img_url; + byte[] imageByte = Files.readAllBytes(Paths.get(imgVo.getImgUrl())); + + // TODO 图片开始下发到宇视盒子 + log.info("图片开始下发到宇视盒子"); + for (Long eqpId : bo.getEqbIds()) { + SisAccessControlDeviceVo vo = sisAccessControlDeviceService.queryById(eqpId); + Assert.notNull(vo, "门禁控制设备不存在,id=" + eqpId); + log.info(libVo.getLibType() == 1 ? "准备写入门禁设备,code={}" : "准备写入工服设备,code={}", vo.getEqpNo()); + + UvModel.UvSystemInfo systemInfo = new UvModel.UvSystemInfo(); + systemInfo.setAccount(vo.getEqpAccount()); + systemInfo.setPassword(vo.getEqpPwd()); + systemInfo.setIp(vo.getEqpIp()); + systemInfo.setPort(vo.getEqpPort()); + + // 获取宇视线上库ID + SisLibDeviceRefBo refBo = new SisLibDeviceRefBo(); + refBo.setEqpId(eqpId); + refBo.setLibId(libVo.getId()); + List refVo = sisLibDeviceRefService.queryList(refBo); + Assert.notNull(refVo, "系统库与设备库关联关系不存在!libId:{},eqpId:{}", libVo.getId(), eqpId); + eqp_lib_id = refVo.get(0).getEqpLibId(); + + if (libVo.getLibType() == 1) { + // 宇视添加人像 + UvModel.AddPersonParams addPersonParams = new UvModel.AddPersonParams(); + addPersonParams.setPerson_name(imgVo.getImgName()); + addPersonParams.setImage_base64(Base64.getEncoder().encodeToString(imageByte)); + addPersonParams.setLib_id(Math.toIntExact(eqp_lib_id)); + addPersonParams.setSex(imgVo.getSex()); + addPersonParams.setEmail(imgVo.getEmail()); + addPersonParams.setTel(imgVo.getTel()); + addPersonParams.setCertificate_type(imgVo.getCertificateType()); + addPersonParams.setCertificate_no(imgVo.getCertificateNo()); + addPersonParams.setBirth_date(imgVo.getBirthDate()); + // 发起请求获取响应 + UvModel.AddPersonResult addResult = unViewAiBoxApi.addPerson(systemInfo, addPersonParams); + eqp_lib_img_id = addResult.getPerson_id(); + + } else { + UvModel.WorkClothesInfo addResult = unViewAiBoxApi.addWorkClothes(systemInfo, Math.toIntExact(eqp_lib_id), Base64.getEncoder().encodeToString(imageByte)); + eqp_lib_img_id = addResult.getWorkclothes_id(); + } + Assert.notNull(eqp_lib_img_id, "图片上传宇视盒子失败"); + log.info("图片上传宇视盒子完成,eqp_lib_img_id = {}", eqp_lib_img_id); + + SisLibDeviceImgRefBo ref = new SisLibDeviceImgRefBo(); + ref.setLibId(libVo.getId()); + ref.setImgId(add.getId()); + ref.setEqpId(eqpId); + ref.setEqpLibId(eqp_lib_id); + ref.setEqpLibImgId(eqp_lib_img_id.longValue()); + Boolean insert = sisLibDeviceImgRefService.insertByBo(ref); + Assert.isTrue(insert, "写入图片关联关系表失败!"); + } + log.info("图片开始下发完成!"); + + // TODO 对门禁设备授权 + log.info("图片开始对门禁设备授权"); + for (Long acId : bo.getAcIds()) { + SisAccessControlVo acVo = sisAccessControlService.queryById(acId); + Assert.notNull(acVo, "门禁设备不存在"); + + // TODO 阶段调试E8人脸设备,非E8人脸设备不处理 + if (acVo.getControlType() == 1 || acVo.getAccessType() == 2) continue; + + log.info("照片上传E8平台,id=" + bo.getImgId()); + String url = vouchService.uploadFace(imageByte); + Assert.notNull(url, "图片上传E8平台失败"); + eqp_lib_img_url = url; + + log.info("E8平台发行凭证"); + IssueVoucherReq req = new IssueVoucherReq(); + req.setCardType(34); + req.setVoucherType(70); + // TODO 临时默认人员 + req.setPersonID(539696740646981L); + req.setTxtData(eqp_lib_img_url); + Boolean issue = vouchService.issueVoucher(req); + Assert.isTrue(issue, "E8平台发行凭证失败"); + + log.info("E8平台授权"); + CustomerAuthAddReq authReq = new CustomerAuthAddReq(); + authReq.setAuthType(0); + authReq.setScheduleId(1L); + authReq.setPersonIds(Collections.singletonList(539696740646981L)); + authReq.setStartTime("2025-06-25 11: 23: 39"); + authReq.setEndTime("2025-07-25 11: 23: 39"); + + CustomerAuthAddReq.AuthGroupData authGroupData = new CustomerAuthAddReq.AuthGroupData(); + authGroupData.setId(Long.parseLong(acVo.getOutCode())); + authGroupData.setType(1); + authReq.setAuthData(List.of(authGroupData)); + Boolean auth = accessControlService.addCustomerAuth(authReq); + Assert.isTrue(auth, "E8平台授权失败"); + } + log.info("门禁设备授权完成"); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + } + return flag; + } + + /** + * 修改授权记录 + * + * @param bo 授权记录 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(SisAuthRecordBo bo) { + SisAuthRecord update = MapstructUtils.convert(bo, SisAuthRecord.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SisAuthRecord entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除授权记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisPersonLibImgServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisPersonLibImgServiceImpl.java index db298125..8d8c2a89 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisPersonLibImgServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisPersonLibImgServiceImpl.java @@ -12,20 +12,15 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.sis.domain.SisPersonLibImg; import org.dromara.sis.domain.bo.AccessControlLibDeviceBo; -import org.dromara.sis.domain.bo.SisLibDeviceImgRefBo; -import org.dromara.sis.domain.bo.SisLibDeviceRefBo; import org.dromara.sis.domain.bo.SisPersonLibImgBo; import org.dromara.sis.domain.vo.*; import org.dromara.sis.mapper.SisPersonLibImgMapper; -import org.dromara.sis.sdk.e8.VoucherControlService; import org.dromara.sis.sdk.unview.UnViewAiBoxApi; import org.dromara.sis.sdk.unview.model.UvModel; import org.dromara.sis.service.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.*; /** @@ -40,12 +35,9 @@ import java.util.*; public class SisPersonLibImgServiceImpl implements ISisPersonLibImgService { private final SisPersonLibImgMapper baseMapper; - private final VoucherControlService vouchService; private final UnViewAiBoxApi unViewAiBoxApi; - private final ISisPersonLibService sisPersonLibService; private final ISisLibDeviceRefService libDeviceRefService; private final ISisLibDeviceImgRefService libDeviceImgRefService; - private final ISisAccessControlDeviceService sisAccessControlDeviceService; /** * 查询人像信息 @@ -112,98 +104,7 @@ public class SisPersonLibImgServiceImpl implements ISisPersonLibImgService { public Boolean insertByBo(SisPersonLibImgBo bo) { SisPersonLibImg add = MapstructUtils.convert(bo, SisPersonLibImg.class); Assert.notNull(add, "数据处理失败"); - // 生成编码 - boolean flag = baseMapper.insert(add) > 0; - log.info("图片[{}]开始写入系统,result={}", add.getImgName(), flag); - if (flag) { - // 获取人像库关联设备Id - SisPersonLibVo libVo = sisPersonLibService.queryById(bo.getLibId()); - if (libVo.getLibType() == 1L) { - Assert.notNull(libVo, "人像库不存在,id=" + bo.getLibId()); - } else { - Assert.notNull(libVo, "工服库不存在,id=" + bo.getLibId()); - } - - try { - long eqp_lib_id; - Integer eqp_lib_img_id; - String eqp_lib_img_url = null; - // 根据图片路径读取图片 - byte[] imageByte = Files.readAllBytes(Paths.get(bo.getImgUrl())); - for (Long eqpId : libVo.getEqpIds()) { - // 查询设备信息 - SisAccessControlDeviceVo vo = sisAccessControlDeviceService.queryById(eqpId); - Assert.notNull(vo, "门禁控制设备不存在,id=" + eqpId); - if (libVo.getLibType() == 1) { - log.info("准备写入{}门禁设备人像库", vo.getEqpNo()); - } else { - log.info("准备写入{}门禁设备工服库", vo.getEqpNo()); - } - - UvModel.UvSystemInfo systemInfo = new UvModel.UvSystemInfo(); - systemInfo.setAccount(vo.getEqpAccount()); - systemInfo.setPassword(vo.getEqpPwd()); - systemInfo.setIp(vo.getEqpIp()); - systemInfo.setPort(vo.getEqpPort()); - - // 获取宇视线上库ID - SisLibDeviceRefBo refBo = new SisLibDeviceRefBo(); - refBo.setEqpId(eqpId); - refBo.setLibId(bo.getLibId()); - List refVo = libDeviceRefService.queryList(refBo); - Assert.notNull(refVo, "系统库与设备库关联关系不存在!libId:{},eqpId:{}", bo.getLibId(), eqpId); - eqp_lib_id = refVo.get(0).getEqpLibId(); - - if (libVo.getLibType() == 1) { - // 宇视添加人像 - UvModel.AddPersonParams addPersonParams = new UvModel.AddPersonParams(); - addPersonParams.setPerson_name(bo.getImgName()); - addPersonParams.setImage_base64(Base64.getEncoder().encodeToString(imageByte)); - addPersonParams.setLib_id(Math.toIntExact(eqp_lib_id)); - addPersonParams.setSex(bo.getSex()); - addPersonParams.setEmail(bo.getEmail()); - addPersonParams.setTel(bo.getTel()); - addPersonParams.setCertificate_type(bo.getCertificateType()); - addPersonParams.setCertificate_no(bo.getCertificateNo()); - addPersonParams.setBirth_date(bo.getBirthDate()); - // 发起请求获取响应 - UvModel.AddPersonResult addResult = unViewAiBoxApi.addPerson(systemInfo, addPersonParams); - eqp_lib_img_id = addResult.getPerson_id(); - - } else { - UvModel.WorkClothesInfo addResult = unViewAiBoxApi.addWorkClothes(systemInfo, Math.toIntExact(eqp_lib_id), Base64.getEncoder().encodeToString(imageByte)); - eqp_lib_img_id = addResult.getWorkclothes_id(); - } - Assert.notNull(eqp_lib_img_id, "图片上传宇视盒子失败"); - log.info("图片上传宇视盒子完成,eqp_lib_img_id = {}", eqp_lib_img_id); - // TODO 新增E8人像 - if (bo.getIsSyncE8()) { - // 调用e8人像上传接口 - String url = vouchService.uploadFace(imageByte); - Assert.notNull(url, "图片上传E8平台失败"); - eqp_lib_img_url = url; - } - - SisLibDeviceImgRefBo ref = new SisLibDeviceImgRefBo(); - ref.setLibId(bo.getLibId()); - ref.setImgId(add.getId()); - ref.setEqpId(eqpId); - ref.setEqpLibId(eqp_lib_id); - ref.setEqpLibImgId(eqp_lib_img_id.longValue()); - // E8 - if (bo.getIsSyncE8()) { - ref.setEqpLibImgUrl(eqp_lib_img_url); - } - Boolean insert = libDeviceImgRefService.insertByBo(ref); - Assert.isTrue(insert, "写入图片关联关系表失败!"); - log.info("同步上传照片完成!"); - } - } catch (Exception e) { - // 处理异常并重新抛出 - throw new RuntimeException(e.getMessage()); - } - } - return flag; + return baseMapper.insert(add) > 0; } /**