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); Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 根据系统库id列表获取设备库列表
*
* @param LibIds 系统图片id列表
* @return 设备库列表
*/
List<SisLibDeviceRefVo> queryListByLibId(Collection<Long> LibIds);
/** /**
* 通过personlIB id 查询关联关系 * 通过personlIB id 查询关联关系
* *

View File

@ -141,18 +141,6 @@ public class SisLibDeviceRefServiceImpl implements ISisLibDeviceRefService {
return baseMapper.deleteByIds(ids) > 0; 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 @Override
public List<SisLibDeviceRefVo> queryByLibIds(Collection<Long> ids) { public List<SisLibDeviceRefVo> queryByLibIds(Collection<Long> ids) {
LambdaQueryWrapper<SisLibDeviceRef> lqw = Wrappers.lambdaQuery(); LambdaQueryWrapper<SisLibDeviceRef> lqw = Wrappers.lambdaQuery();

View File

@ -1,5 +1,6 @@
package org.dromara.sis.service.impl; package org.dromara.sis.service.impl;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import org.dromara.common.core.constant.CodePrefixConstants; import org.dromara.common.core.constant.CodePrefixConstants;
import org.dromara.common.core.utils.MapstructUtils; 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 com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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.SisLibDeviceImgRefBo;
import org.dromara.sis.domain.bo.SisLibDeviceRefBo; import org.dromara.sis.domain.bo.SisLibDeviceRefBo;
import org.dromara.sis.domain.vo.SisLibDeviceImgRefVo; import org.dromara.sis.domain.vo.*;
import org.dromara.sis.domain.vo.SisLibDeviceRefVo;
import org.dromara.sis.sdk.e8.VoucherControlService; 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.model.UvModel;
import org.dromara.sis.sdk.unview.service.UnViewAiBoxApiService; import org.dromara.sis.service.*;
import org.dromara.sis.service.ISisLibDeviceImgRefService;
import org.dromara.sis.service.ISisLibDeviceRefService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.dromara.sis.domain.bo.SisPersonLibImgBo; import org.dromara.sis.domain.bo.SisPersonLibImgBo;
import org.dromara.sis.domain.vo.SisPersonLibImgVo;
import org.dromara.sis.domain.SisPersonLibImg; import org.dromara.sis.domain.SisPersonLibImg;
import org.dromara.sis.mapper.SisPersonLibImgMapper; import org.dromara.sis.mapper.SisPersonLibImgMapper;
import org.dromara.sis.service.ISisPersonLibImgService;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Base64; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/** /**
* 人像信息Service业务层处理 * 人像信息Service业务层处理
@ -47,9 +42,11 @@ public class SisPersonLibImgServiceImpl implements ISisPersonLibImgService {
private final SisPersonLibImgMapper baseMapper; private final SisPersonLibImgMapper baseMapper;
private final VoucherControlService vouchService; private final VoucherControlService vouchService;
private final UnViewAiBoxApiService unViewAiBoxApiService; private final UnViewAiBoxApi unViewAiBoxApi;
private final ISisPersonLibService sisPersonLibService;
private final ISisLibDeviceRefService libDeviceRefService; private final ISisLibDeviceRefService libDeviceRefService;
private final ISisLibDeviceImgRefService libDeviceImgRefService; private final ISisLibDeviceImgRefService libDeviceImgRefService;
private final ISisAccessControlDeviceService sisAccessControlDeviceService;
/** /**
* 查询人像信息 * 查询人像信息
@ -115,80 +112,84 @@ public class SisPersonLibImgServiceImpl implements ISisPersonLibImgService {
@Override @Override
public Boolean insertByBo(SisPersonLibImgBo bo) { public Boolean insertByBo(SisPersonLibImgBo bo) {
SisPersonLibImg add = MapstructUtils.convert(bo, SisPersonLibImg.class); SisPersonLibImg add = MapstructUtils.convert(bo, SisPersonLibImg.class);
Assert.notNull(add, "数据处理失败");
// 生成编码 // 生成编码
add.setImgCode(CodePrefixConstants.PERSON_LIB_IMAGE_CODE_PREFIX + IdUtil.getSnowflakeNextIdStr()); 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; boolean flag = baseMapper.insert(add) > 0;
log.info("图片[{}]开始写入系统result={}", add.getImgName(), flag);
if (flag) { if (flag) {
bo.setId(add.getId()); // 获取人像库关联设备Id
//TODO 写入关联表 SisPersonLibVo libVo = sisPersonLibService.queryById(bo.getLibId());
SisLibDeviceImgRefBo ref = new SisLibDeviceImgRefBo(); Assert.notNull(libVo, "人像库不存在id=" + bo.getLibId());
ref.setLibId(bo.getLibId()); try {
ref.setImgId(add.getId());
ref.setEqpId(eqp_id); long eqp_id;
ref.setEqpLibId(eqp_lib_id); long eqp_lib_id;
ref.setEqpLibImgId(eqp_lib_img_id.longValue()); Integer eqp_lib_img_id;
// E8 String eqp_lib_img_url = null;
if(bo.getIsSyncE8()){ // 根据图片路径读取图片
ref.setEqpLibImgUrl(eqp_lib_img_url); 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; return flag;
} }
@ -225,19 +226,28 @@ public class SisPersonLibImgServiceImpl implements ISisPersonLibImgService {
if (isValid) { if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验 //TODO 做一些业务上的校验,判断是否需要校验
List<SisLibDeviceImgRefVo> list = libDeviceImgRefService.queryListByImgIds(ids); 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> 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); Integer[] refImgIds = list.stream().map(SisLibDeviceImgRefVo::getEqpLibImgId).map(Long::intValue).toArray(Integer[]::new);
// 宇视鉴权信息 List<AccessControlLibDeviceBo> ls = libDeviceRefService.queryDeviceListByLibIds(refLibIds);
UvModel.UvSystemInfo systemInfo = new UvModel.UvSystemInfo();
systemInfo.setAccount("admin");
systemInfo.setPassword("nc123456.");
systemInfo.setIp("47.109.37.87");
systemInfo.setPort(4001);
Boolean unViewFlag = unViewAiBoxApiService.batchDeletePerson(systemInfo, refImgIds); ls.forEach(item -> {
if (!unViewFlag) return false; 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); Boolean refFlag = libDeviceImgRefService.deleteWithValidByIds(refIds, true);
if (!refFlag) return false; if (!refFlag) return false;