feat(sis):
Some checks are pending
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run

- 人像图片与宇视平台同步操作(新增,删除),关联表同步写入/删除,可选同步至E8平台
This commit is contained in:
zcxlsm 2025-06-28 00:50:50 +08:00
parent 9b2904ad06
commit e13230dc4e
3 changed files with 100 additions and 110 deletions

View File

@ -76,14 +76,6 @@ public interface ISisLibDeviceRefService {
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 根据系统库id列表获取设备库列表
*
* @param LibIds 系统图片id列表
* @return 设备库列表
*/
List<SisLibDeviceRefVo> queryListByLibId(Collection<Long> LibIds);
/**
* 通过personlIB id 查询关联关系
*

View File

@ -141,18 +141,6 @@ public class SisLibDeviceRefServiceImpl implements ISisLibDeviceRefService {
return baseMapper.deleteByIds(ids) > 0;
}
/**
* 根据系统库id列表获取设备库列表
*
* @param LibIds 系统图片id列表
* @return 设备库列表
*/
public List<SisLibDeviceRefVo> queryListByLibId(Collection<Long> LibIds){
LambdaQueryWrapper<SisLibDeviceRef> lqw = Wrappers.lambdaQuery();
lqw.in(SisLibDeviceRef::getLibId, LibIds);
return baseMapper.selectVoList(lqw);
}
@Override
public List<SisLibDeviceRefVo> queryByLibIds(Collection<Long> ids) {
LambdaQueryWrapper<SisLibDeviceRef> lqw = Wrappers.lambdaQuery();

View File

@ -1,5 +1,6 @@
package org.dromara.sis.service.impl;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import org.dromara.common.core.constant.CodePrefixConstants;
import org.dromara.common.core.utils.MapstructUtils;
@ -11,28 +12,22 @@ 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.AccessControlLibDeviceBo;
import org.dromara.sis.domain.bo.SisLibDeviceImgRefBo;
import org.dromara.sis.domain.bo.SisLibDeviceRefBo;
import org.dromara.sis.domain.vo.SisLibDeviceImgRefVo;
import org.dromara.sis.domain.vo.SisLibDeviceRefVo;
import org.dromara.sis.domain.vo.*;
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.sdk.unview.service.UnViewAiBoxApiService;
import org.dromara.sis.service.ISisLibDeviceImgRefService;
import org.dromara.sis.service.ISisLibDeviceRefService;
import org.dromara.sis.service.*;
import org.springframework.stereotype.Service;
import org.dromara.sis.domain.bo.SisPersonLibImgBo;
import org.dromara.sis.domain.vo.SisPersonLibImgVo;
import org.dromara.sis.domain.SisPersonLibImg;
import org.dromara.sis.mapper.SisPersonLibImgMapper;
import org.dromara.sis.service.ISisPersonLibImgService;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.*;
/**
* 人像信息Service业务层处理
@ -47,9 +42,11 @@ public class SisPersonLibImgServiceImpl implements ISisPersonLibImgService {
private final SisPersonLibImgMapper baseMapper;
private final VoucherControlService vouchService;
private final UnViewAiBoxApiService unViewAiBoxApiService;
private final UnViewAiBoxApi unViewAiBoxApi;
private final ISisPersonLibService sisPersonLibService;
private final ISisLibDeviceRefService libDeviceRefService;
private final ISisLibDeviceImgRefService libDeviceImgRefService;
private final ISisAccessControlDeviceService sisAccessControlDeviceService;
/**
* 查询人像信息
@ -115,80 +112,84 @@ public class SisPersonLibImgServiceImpl implements ISisPersonLibImgService {
@Override
public Boolean insertByBo(SisPersonLibImgBo bo) {
SisPersonLibImg add = MapstructUtils.convert(bo, SisPersonLibImg.class);
Assert.notNull(add, "数据处理失败");
// 生成编码
add.setImgCode(CodePrefixConstants.PERSON_LIB_IMAGE_CODE_PREFIX + IdUtil.getSnowflakeNextIdStr());
validEntityBeforeSave(add);
long eqp_id;
long eqp_lib_id;
Integer eqp_lib_img_id;
String eqp_lib_img_url = "";
try {
// 根据图片路径读取图片
byte[] imageByte = Files.readAllBytes(Paths.get(bo.getImgUrl()));
// TODO 新增E8人像
if (bo.getIsSyncE8()) {
// 调用e8人像上传接口
String url = vouchService.uploadFace(imageByte);
if (url == null) return false;
eqp_lib_img_url = url;
}
// TODO 同步到宇视人像照片
// 查询系统库与设备库的关联表 获取设备库Id
SisLibDeviceRefBo libDeviceRefBo = new SisLibDeviceRefBo();
libDeviceRefBo.setLibId(bo.getLibId());
List<SisLibDeviceRefVo> libDeviceRefVos = libDeviceRefService.queryList(libDeviceRefBo);
if (libDeviceRefVos.isEmpty()) return false;
eqp_id = libDeviceRefVos.get(0).getEqpId();
eqp_lib_id = libDeviceRefVos.get(0).getEqpLibId();
// 宇视鉴权信息
UvModel.UvSystemInfo systemInfo = new UvModel.UvSystemInfo();
systemInfo.setAccount("admin");
systemInfo.setPassword("nc123456.");
systemInfo.setIp("47.109.37.87");
systemInfo.setPort(4001);
// 宇视添加人像
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(Math.toIntExact(bo.getSex()));
addPersonParams.setEmail(bo.getEmail());
addPersonParams.setTel(bo.getTel());
addPersonParams.setCertificate_type(Math.toIntExact(bo.getCertificateType()));
addPersonParams.setCertificate_no(bo.getCertificateNo());
addPersonParams.setBirth_date(bo.getBirthDate());
// 发起请求获取响应
UvModel.AddPersonResult addPersonResult = unViewAiBoxApiService.addPerson(systemInfo, addPersonParams);
if (addPersonResult == null) return false;
eqp_lib_img_id = addPersonResult.getPerson_id();
} catch (Exception e) {
return false;
}
boolean flag = baseMapper.insert(add) > 0;
log.info("图片[{}]开始写入系统result={}", add.getImgName(), flag);
if (flag) {
bo.setId(add.getId());
//TODO 写入关联表
SisLibDeviceImgRefBo ref = new SisLibDeviceImgRefBo();
ref.setLibId(bo.getLibId());
ref.setImgId(add.getId());
ref.setEqpId(eqp_id);
ref.setEqpLibId(eqp_lib_id);
ref.setEqpLibImgId(eqp_lib_img_id.longValue());
// E8
if(bo.getIsSyncE8()){
ref.setEqpLibImgUrl(eqp_lib_img_url);
// 获取人像库关联设备Id
SisPersonLibVo libVo = sisPersonLibService.queryById(bo.getLibId());
Assert.notNull(libVo, "人像库不存在id=" + bo.getLibId());
try {
long eqp_id;
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);
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<SisLibDeviceRefVo> refVo = libDeviceRefService.queryList(refBo);
Assert.notNull(refVo, "系统库与设备库关联关系不存在libId:{},eqpId:{}", bo.getLibId(), eqpId);
eqp_lib_id = refVo.get(0).getEqpLibId();
// 宇视添加人像
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 addPersonResult = unViewAiBoxApi.addPerson(systemInfo, addPersonParams);
Assert.notNull(addPersonResult, "图片上传宇视盒子失败");
eqp_lib_img_id = addPersonResult.getPerson_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) {
return false;
}
libDeviceImgRefService.insertByBo(ref);
}
return flag;
}
@ -225,19 +226,28 @@ public class SisPersonLibImgServiceImpl implements ISisPersonLibImgService {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
List<SisLibDeviceImgRefVo> list = libDeviceImgRefService.queryListByImgIds(ids);
if(list.isEmpty()) return false;
if (list.isEmpty()) return false;
Collection<Long> refIds = list.stream().map(SisLibDeviceImgRefVo::getId).toList();
Collection<Long> refLibIds = list.stream().map(SisLibDeviceImgRefVo::getEqpLibId).toList();
Integer[] refImgIds = list.stream().map(SisLibDeviceImgRefVo::getEqpLibImgId).map(Long::intValue).toArray(Integer[]::new);
// 宇视鉴权信息
UvModel.UvSystemInfo systemInfo = new UvModel.UvSystemInfo();
systemInfo.setAccount("admin");
systemInfo.setPassword("nc123456.");
systemInfo.setIp("47.109.37.87");
systemInfo.setPort(4001);
List<AccessControlLibDeviceBo> ls = libDeviceRefService.queryDeviceListByLibIds(refLibIds);
Boolean unViewFlag = unViewAiBoxApiService.batchDeletePerson(systemInfo, refImgIds);
if (!unViewFlag) return false;
ls.forEach(item -> {
UvModel.UvSystemInfo systemInfo = new UvModel.UvSystemInfo();
systemInfo.setAccount(item.getEqpAccount());
systemInfo.setPassword(item.getEqpPwd());
systemInfo.setIp(item.getEqpIp());
systemInfo.setPort(item.getEqpPort());
if (item.getEqpLibType() == 1){
Boolean b = unViewAiBoxApi.batchDeletePerson(systemInfo, refImgIds);
log.info("删除宇视图片[{}]完成,result={}", refImgIds, b);
}else {
Boolean b = unViewAiBoxApi.deleteWorkClothes(systemInfo, item.getEqpLibId(), Arrays.stream(refImgIds).toList());
log.info("删除宇视服装[{}]完成,result={}", refImgIds, b);
}
});
Boolean refFlag = libDeviceImgRefService.deleteWithValidByIds(refIds, true);
if (!refFlag) return false;