From d70d99fb9a36508437346a65568e7b0e47bdf637 Mon Sep 17 00:00:00 2001 From: zcxlsm Date: Thu, 10 Jul 2025 21:05:13 +0800 Subject: [PATCH] =?UTF-8?q?refactor(sis):=20-=20=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E5=BA=93=E4=B8=9A=E5=8A=A1=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4?= =?UTF-8?q?=20-=20=E4=BA=BA=E5=83=8F=E4=BF=A1=E6=81=AF=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4=20-=20=E5=8D=8E=E4=B8=BA?= =?UTF-8?q?=E7=9B=92=E5=AD=90=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/constant/CodePrefixConstants.java | 4 +- .../org/dromara/sis/domain/SisPersonLib.java | 12 +- .../dromara/sis/domain/SisPersonLibImg.java | 4 + .../dromara/sis/domain/bo/SisPersonLibBo.java | 33 -- .../sis/domain/bo/SisPersonLibImgBo.java | 5 + .../dromara/sis/domain/vo/SisPersonLibVo.java | 21 +- .../dromara/sis/sdk/huawei/HuaWeiBoxApi.java | 22 ++ .../sis/sdk/huawei/domain/AddHWPersonReq.java | 51 +++ .../huawei/service/HuaWeiBoxApiService.java | 53 +++ .../sis/sdk/huawei/utils/HuaWeiHttp.java | 74 ++++ .../impl/SisAuthRecordServiceImpl.java | 333 +++++++++--------- .../impl/SisPersonLibImgServiceImpl.java | 75 ++-- .../service/impl/SisPersonLibServiceImpl.java | 84 +---- 13 files changed, 410 insertions(+), 361 deletions(-) create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/HuaWeiBoxApi.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/domain/AddHWPersonReq.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/service/HuaWeiBoxApiService.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/utils/HuaWeiHttp.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CodePrefixConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CodePrefixConstants.java index 7d1e158..8b42cfd 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CodePrefixConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CodePrefixConstants.java @@ -12,9 +12,9 @@ public interface CodePrefixConstants { String SIS_DEVICE_CODE_PREFIX = "101"; /** - * 人像编码前缀 + * 华为人像编码前缀 */ - String PERSON_LIB_IMAGE_CODE_PREFIX = "102"; + String PERSON_LIB_IMAGE_CODE_PREFIX = "HW"; String ELEVATOR_CONTROL_CODE_PREFIX = "E01"; diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLib.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLib.java index 566e8a8..c8ec2d6 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLib.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLib.java @@ -12,7 +12,7 @@ import java.io.Serial; * 人像库对象 tb_person_lib * * @author mocheng - * @date 2025-06-24 + * @since 2025-06-24 */ @Data @EqualsAndHashCode(callSuper = true) @@ -37,14 +37,4 @@ public class SisPersonLib extends TenantEntity { * 人员库描述 */ private String libDesc; - - /** - * 库类型,1:人员库,2:工服库 - */ - private Integer libType; - - /** - * 库的业务类型 1: 门禁库,2: 黑名单库 - */ - private Integer busiType; } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLibImg.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLibImg.java index 0dc26c9..64bc16d 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLibImg.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLibImg.java @@ -73,5 +73,9 @@ public class SisPersonLibImg extends TenantEntity { */ private String birthDate; + /** + * 远程库图像ID + */ + private Long remoteImgId; } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibBo.java index 472e76a..c373261 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibBo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibBo.java @@ -8,12 +8,8 @@ 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.common.translation.annotation.Translation; -import org.dromara.common.translation.constant.TransConstant; import org.dromara.sis.domain.SisPersonLib; -import java.util.List; - /** * 人像库业务对象 tb_person_lib * @@ -36,37 +32,8 @@ public class SisPersonLibBo extends BaseEntity { @NotBlank(message = "人员库名称不能为空", groups = {AddGroup.class, EditGroup.class}) private String libName; - /** - * 设备编码,需要同步创建到设备中 - */ - @NotNull(message = "人像设备不能为空", groups = {AddGroup.class, EditGroup.class}) - private List eqpIds; - /** * 人员库描述 */ private String libDesc; - - /** - * 库类型,1:人员库,2:工服库 - */ - private Integer libType; - - /** - * 库类型名称 - */ - @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "libType", other = "sis_lib_type") - private String libTypeName; - - /** - * 库的业务类型 1: 门禁库,2: 黑名单库 - */ - private Integer busiType = 1; - - /** - * 门禁设备id - */ - private Long eqbId; - - } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibImgBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibImgBo.java index 3c59511..c83c985 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibImgBo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibImgBo.java @@ -79,4 +79,9 @@ public class SisPersonLibImgBo extends BaseEntity { */ private Boolean isSyncE8; + /** + * 远程库图像ID + */ + private Long remoteImgId; + } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibVo.java index 569928c..fadcb66 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibVo.java @@ -8,14 +8,13 @@ import org.dromara.sis.domain.SisPersonLib; import java.io.Serial; import java.io.Serializable; -import java.util.List; /** * 人像库视图对象 tb_person_lib * * @author mocheng - * @date 2025-06-24 + * @since 2025-06-24 */ @Data @ExcelIgnoreUnannotated @@ -42,22 +41,4 @@ public class SisPersonLibVo implements Serializable { */ @ExcelProperty(value = "人员库描述") private String libDesc; - - /** - * 库类型,1:人员库,2:工服库 - */ - @ExcelProperty(value = "库类型,1:人员库,2:工服库") - private Integer libType; - - /** - * 库的业务类型 1: 门禁库,2: 黑名单库 - */ - @ExcelProperty(value = "库的业务类型 1: 门禁库,2: 黑名单库") - private Integer busiType; - - /** - * 库关联的设备id列表 - */ - List eqpIds; - } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/HuaWeiBoxApi.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/HuaWeiBoxApi.java new file mode 100644 index 0000000..ebb3697 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/HuaWeiBoxApi.java @@ -0,0 +1,22 @@ +package org.dromara.sis.sdk.huawei; + +import org.dromara.sis.sdk.huawei.domain.AddHWPersonReq; + +import java.util.List; + +/** + * @apiNote HuaWeiBoxApi + * @author lsm + * @since 2025/7/10 +*/ +public interface HuaWeiBoxApi { + + /** + * 新增图片 + * + * @param req 入参 + * @return Long + */ + Long addPerson(List req); + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/domain/AddHWPersonReq.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/domain/AddHWPersonReq.java new file mode 100644 index 0000000..55e690d --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/domain/AddHWPersonReq.java @@ -0,0 +1,51 @@ +package org.dromara.sis.sdk.huawei.domain; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author lsm + * @apiNote AddHWPersonReq + * @since 2025/7/10 + */ +@Data +@NoArgsConstructor +public class AddHWPersonReq { + + /** + * img_id + */ + private String index; + + /** + * 名称 + */ + private String name; + + /** + * 性别 0:男 1:女 -1:未知 + */ + private String gender; + + /** + * 证件类型,枚举类型 0:身份证 1:护照 2:学生证 3:军官证 4:驾照 5:其他 + */ + private String credentialType; + + /** + * 证件号码 + */ + private String credentialNumber; + + /** + * 出生日期, 格式:yyyy-mm-dd,如2015-09-25 + */ + private String bornTime; + + /** + * base64 + */ + private List pictures; +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/service/HuaWeiBoxApiService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/service/HuaWeiBoxApiService.java new file mode 100644 index 0000000..6c33969 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/service/HuaWeiBoxApiService.java @@ -0,0 +1,53 @@ +package org.dromara.sis.sdk.huawei.service; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.dromara.sis.sdk.huawei.HuaWeiBoxApi; +import org.dromara.sis.sdk.huawei.domain.AddHWPersonReq; +import org.dromara.sis.sdk.huawei.utils.HuaWeiHttp; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author lsm + * @apiNote HuaWeiBoxApiService + * @since 2025/7/10 + */ +@Slf4j +@Service +public class HuaWeiBoxApiService implements HuaWeiBoxApi { + + @Resource + private HuaWeiHttp huaWeiHttp; + + /** + * 新增图片 + * + * @param req 入参 + * @return Long + */ + @Override + public Long addPerson(List req) { + String url = "/sdk_service/rest/facerepositories/201/peoples"; + + JSONObject json = new JSONObject(); + json.putOnce("peopleList", req); + String jsonReq = JSONUtil.toJsonStr(json); + + String jsonStrRes = huaWeiHttp.doPost(url, jsonReq); + JSONObject jsonRes = JSONUtil.parseObj(jsonStrRes); + + if (jsonRes.getInt("resultCode") != 0) { + log.error("新增图片失败,msg:{}", jsonRes.getStr("resultMsg")); + return null; + } + + JSONArray jsonArr = jsonRes.getJSONArray("ids"); + JSONObject obj = jsonArr.getJSONObject(0); + return Long.parseLong(obj.getStr("peopleId")); + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/utils/HuaWeiHttp.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/utils/HuaWeiHttp.java new file mode 100644 index 0000000..ae27269 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/utils/HuaWeiHttp.java @@ -0,0 +1,74 @@ +package org.dromara.sis.sdk.huawei.utils; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.json.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.redis.utils.RedisUtils; +import org.springframework.stereotype.Component; + +/** + * @author lsm + * @apiNote HuaWeiHttp + * @since 2025/7/10 + */ +@Slf4j +@Component +public class HuaWeiHttp { + + private static final String BASE_URL = "https://192.168.110.195:18531"; + private static final String USERNAME = "huawei"; + private static final String PASSWORD = "qweasd123"; + + // 每次调用请求需要登录,获取JSESSIONID + public Boolean login() { + JSONObject json = new JSONObject(); + json.putOnce("userName", USERNAME); + json.putOnce("password", PASSWORD); + json.putOnce("timeout", 1800); + + String url = BASE_URL + "/loginInfo/login/v1.0"; + String jsonStr = json.toString(); + // 发送请求获取响应 + // 使用 try-with-resources 确保资源释放 + try (HttpResponse response = HttpRequest.post(url) + .header("Content-Type", "application/json") + .header("Cache-Control", "no-cache") + .body(jsonStr) + .execute()) { + if (response.getStatus() == 200 && response.getCookie("JSESSIONID") != null) { + RedisUtils.setCacheObject("JSESSIONID", response.getCookie("JSESSIONID").toString()); + RedisUtils.expire("JSESSIONID", 1800); + return true; + } else { + log.error("华为盒子登录失败,msg:{}", response.body()); + } + } + return false; + } + + public String doPost(String url, String json) { + if (!RedisUtils.isExistsObject("JSESSIONID")) { + if (!this.login()) { + RedisUtils.deleteObject("JSESSIONID"); + return null; + } + } + + String api = BASE_URL + url; + + try (HttpResponse response = HttpRequest.post(api) + .header("Content-Type", "application/json") + .header("Cache-Control", "no-cache") + .header("Cookie", RedisUtils.getCacheObject("JSESSIONID")) + .body(json) + .execute()) { + if (response.isOk()) { + return response.body(); + } else { + log.error("请求失败,msg:{}", response.body()); + } + } + return null; + } +} 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 index dcfe11d..4c0ff00 100644 --- 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 @@ -30,6 +30,7 @@ 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.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -116,181 +117,163 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService { @Override @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(SisAuthRecordBo bo) { - List refVos = sisLibDeviceRefService.queryByLibIds(Collections.singleton(bo.getLibId())); - Assert.notEmpty(refVos, "图像库与设备关联关系不存在"); - List eqpIds = refVos.stream().map(SisLibDeviceRefVo::getEqpId).toList(); - - - /* boolean flag = false; - log.info("开始写入授权记录,图片:{}、门禁:{}、设备:{}", bo.getImgIds(), bo.getAcIds(), eqpIds); - for (Long imgId : bo.getImgIds()) { - for (Long acId : bo.getAcIds()) { - for (Long eqpId : eqpIds) { - SisAuthRecord add = MapstructUtils.convert(bo, SisAuthRecord.class); - Assert.notNull(add, "数据处理失败"); - add.setAcId(acId); - add.setImgId(imgId); - add.setEqbId(eqpId); - flag = baseMapper.insert(add) > 0; - Assert.isTrue(flag, "授权记录写入失败"); - } - } - } - log.info("授权记录写入完成");*/ - - SisPersonLibVo libVo = sisPersonLibService.queryById(bo.getLibId()); - Assert.notNull(libVo, "图像库不存在,id=" + (bo.getLibId())); - - List imgList = sisPersonLibImgService.queryListByIds(bo.getImgIds()); - Assert.notEmpty(imgList, "图片不存在"); - - List acList = sisAccessControlService.queryListByIds(bo.getAcIds()); - Assert.notEmpty(acList, "门禁设备不存在!"); - - - try { - log.info("开始对宇视盒子下发照片,图片:{}、设备:{}", bo.getImgIds(), eqpIds); - for (SisPersonLibImgVo imgVo : imgList) { - for (Long eqpId : eqpIds) { - long eqp_lib_id; - Integer eqp_lib_img_id; - - byte[] imageByte = remoteFileService.downloadToByteArray(imgVo.getImgOssId()); - Assert.notNull(imageByte, "图片下载失败"); -// byte[] imageByte = Files.readAllBytes(Paths.get(imgVo.getImgUrl())); - - 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(base64Helper(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), base64Helper(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(imgVo.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("图片开始下发完成!"); - - log.info("开始写入E8平台,图片:{}、门禁:{}", bo.getImgIds(), bo.getAcIds()); - for (SisPersonLibImgVo imgVo : imgList) { - byte[] imageByte = remoteFileService.downloadToByteArray(imgVo.getImgOssId()); - Assert.notNull(imageByte, "图片下载失败"); - - log.info("E8平台上传图片,{}", imgVo.getId()); - String url = e8VouchService.uploadFace(imageByte); - Assert.notNull(url, "E8平台上传图片失败"); - log.info("E8平台上传图片完成!"); - - log.info("E8平台发行凭证"); - IssueVoucherReq req = new IssueVoucherReq(); - // 34:普通用户卡 - req.setCardType(34); - // 70:人脸凭证 - req.setVoucherType(70); - // TODO 临时默认人员 - req.setPersonID(539696740646981L); - req.setTxtData(url); - Long vId = e8VouchService.issueVoucher(req); - Assert.notNull(vId, "E8平台发行凭证失败"); - log.info("E8平台发行凭证完成!"); - - log.info("E8平台授权凭证"); - // 查询E8授权门列表 - List authDoorList = e8DoorDeviceService.getPageAuthDoorDeviceList(); - Assert.notEmpty(authDoorList, "E8平台授权门列表为空"); - - // E8 授权列表 - List authList = new ArrayList<>(acList.size()); - // 授权记录 - List recordList = new ArrayList<>(acList.size()); - // E8授权门 - AuthDoorDeviceFindRes authDoor = null; - for (SisAccessControlVo sisAccessControlVo : acList) { - if (sisAccessControlVo.getControlType() != 1 && sisAccessControlVo.getAccessType() != 2) { - - // 通过门禁ID匹配授权门 - authDoor = authDoorList.stream().filter(item -> item.getDeviceId() == Long.parseLong(sisAccessControlVo.getOutCode())).findFirst().orElse(null); - - if (authDoor != null) { - CustomerAuthAddReq.AuthGroupData door = new CustomerAuthAddReq.AuthGroupData(); - door.setType(0); - door.setGatewayType(1); - // E8授权传入ID为门ID,非门禁ID - door.setId(authDoor.getId()); - authList.add(door); - - SisAuthRecord authRecord = new SisAuthRecord(); - authRecord.setDoorId(authDoor.getId()); - authRecord.setDeviceId(authDoor.getDeviceId()); - authRecord.setLibId(imgVo.getLibId()); - authRecord.setImgId(imgVo.getId()); - authRecord.setAcId(sisAccessControlVo.getId()); - recordList.add(authRecord); - } - } - } - - 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"); - authReq.setAuthData(authList); - Boolean auth = e8AccessControlService.addCustomerAuth(authReq); - Assert.isTrue(auth, "E8平台授权失败"); - log.info("E8平台授权完成!"); - boolean insert = baseMapper.insertBatch(recordList); - Assert.isTrue(insert, "写入E8关联关系表失败!"); - } - log.info("写入E8平台完成!"); - - } catch (Exception e) { - throw new RuntimeException(e.getMessage()); - } - +// List refVos = sisLibDeviceRefService.queryByLibIds(Collections.singleton(bo.getLibId())); +// Assert.notEmpty(refVos, "图像库与设备关联关系不存在"); +// List eqpIds = refVos.stream().map(SisLibDeviceRefVo::getEqpId).toList(); +// +// SisPersonLibVo libVo = sisPersonLibService.queryById(bo.getLibId()); +// Assert.notNull(libVo, "图像库不存在,id=" + (bo.getLibId())); +// +// List imgList = sisPersonLibImgService.queryListByIds(bo.getImgIds()); +// Assert.notEmpty(imgList, "图片不存在"); +// +// List acList = sisAccessControlService.queryListByIds(bo.getAcIds()); +// Assert.notEmpty(acList, "门禁设备不存在!"); +// +// +// try { +// log.info("开始对宇视盒子下发照片,图片:{}、设备:{}", bo.getImgIds(), eqpIds); +// for (SisPersonLibImgVo imgVo : imgList) { +// for (Long eqpId : eqpIds) { +// long eqp_lib_id; +// Integer eqp_lib_img_id; +// +// byte[] imageByte = remoteFileService.downloadToByteArray(imgVo.getImgOssId()); +// Assert.notNull(imageByte, "图片下载失败"); +// +// 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(base64Helper(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), base64Helper(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(imgVo.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("图片开始下发完成!"); +// +// log.info("开始写入E8平台,图片:{}、门禁:{}", bo.getImgIds(), bo.getAcIds()); +// for (SisPersonLibImgVo imgVo : imgList) { +// byte[] imageByte = remoteFileService.downloadToByteArray(imgVo.getImgOssId()); +// Assert.notNull(imageByte, "图片下载失败"); +// +// log.info("E8平台上传图片,{}", imgVo.getId()); +// String url = e8VouchService.uploadFace(imageByte); +// Assert.notNull(url, "E8平台上传图片失败"); +// log.info("E8平台上传图片完成!"); +// +// log.info("E8平台发行凭证"); +// IssueVoucherReq req = new IssueVoucherReq(); +// // 34:普通用户卡 +// req.setCardType(34); +// // 70:人脸凭证 +// req.setVoucherType(70); +// // TODO 临时默认人员 +// req.setPersonID(539696740646981L); +// req.setTxtData(url); +// Long vId = e8VouchService.issueVoucher(req); +// Assert.notNull(vId, "E8平台发行凭证失败"); +// log.info("E8平台发行凭证完成!"); +// +// log.info("E8平台授权凭证"); +// // 查询E8授权门列表 +// List authDoorList = e8DoorDeviceService.getPageAuthDoorDeviceList(); +// Assert.notEmpty(authDoorList, "E8平台授权门列表为空"); +// +// // E8 授权列表 +// List authList = new ArrayList<>(acList.size()); +// // 授权记录 +// List recordList = new ArrayList<>(acList.size()); +// // E8授权门 +// AuthDoorDeviceFindRes authDoor = null; +// for (SisAccessControlVo sisAccessControlVo : acList) { +// if (sisAccessControlVo.getControlType() != 1 && sisAccessControlVo.getAccessType() != 2) { +// +// // 通过门禁ID匹配授权门 +// authDoor = authDoorList.stream().filter(item -> item.getDeviceId() == Long.parseLong(sisAccessControlVo.getOutCode())).findFirst().orElse(null); +// +// if (authDoor != null) { +// CustomerAuthAddReq.AuthGroupData door = new CustomerAuthAddReq.AuthGroupData(); +// door.setType(0); +// door.setGatewayType(1); +// // E8授权传入ID为门ID,非门禁ID +// door.setId(authDoor.getId()); +// authList.add(door); +// +// SisAuthRecord authRecord = new SisAuthRecord(); +// authRecord.setDoorId(authDoor.getId()); +// authRecord.setDeviceId(authDoor.getDeviceId()); +// authRecord.setLibId(imgVo.getLibId()); +// authRecord.setImgId(imgVo.getId()); +// authRecord.setAcId(sisAccessControlVo.getId()); +// recordList.add(authRecord); +// } +// } +// } +// +// 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"); +// authReq.setAuthData(authList); +// Boolean auth = e8AccessControlService.addCustomerAuth(authReq); +// Assert.isTrue(auth, "E8平台授权失败"); +// log.info("E8平台授权完成!"); +// boolean insert = baseMapper.insertBatch(recordList); +// Assert.isTrue(insert, "写入E8关联关系表失败!"); +// } +// log.info("写入E8平台完成!"); +// +// } catch (Exception e) { +// throw new RuntimeException(e.getMessage()); +// } +// +// return true; return true; } 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 466b232..4b29383 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 @@ -1,22 +1,25 @@ package org.dromara.sis.service.impl; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.constant.CodePrefixConstants; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.resource.api.RemoteFileService; import org.dromara.sis.domain.SisPersonLibImg; -import org.dromara.sis.domain.bo.AccessControlLibDeviceBo; import org.dromara.sis.domain.bo.SisPersonLibImgBo; import org.dromara.sis.domain.vo.*; import org.dromara.sis.mapper.SisPersonLibImgMapper; -import org.dromara.sis.sdk.unview.UnViewAiBoxApi; -import org.dromara.sis.sdk.unview.model.UvModel; +import org.dromara.sis.sdk.huawei.HuaWeiBoxApi; +import org.dromara.sis.sdk.huawei.domain.AddHWPersonReq; import org.dromara.sis.service.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -35,10 +38,13 @@ import java.util.*; public class SisPersonLibImgServiceImpl implements ISisPersonLibImgService { private final SisPersonLibImgMapper baseMapper; - private final UnViewAiBoxApi unViewAiBoxApi; + private final HuaWeiBoxApi huaWeiBoxApi; private final ISisLibDeviceRefService libDeviceRefService; private final ISisLibDeviceImgRefService libDeviceImgRefService; + @DubboReference + private final RemoteFileService remoteFileService; + /** * 查询人像信息 * @@ -104,7 +110,32 @@ public class SisPersonLibImgServiceImpl implements ISisPersonLibImgService { public Boolean insertByBo(SisPersonLibImgBo bo) { SisPersonLibImg add = MapstructUtils.convert(bo, SisPersonLibImg.class); Assert.notNull(add, "数据处理失败"); - return baseMapper.insert(add) > 0; + boolean flag; + try { + AddHWPersonReq req = new AddHWPersonReq(); + req.setIndex(CodePrefixConstants.PERSON_LIB_IMAGE_CODE_PREFIX + IdUtil.getSnowflakeNextIdStr()); + req.setName(bo.getImgName()); + req.setGender(bo.getSex() == 1 ? "0" : bo.getSex() == 2 ? "1" : "-1"); + req.setBornTime(bo.getBirthDate()); + req.setCredentialType("0"); + req.setCredentialNumber(bo.getCertificateNo()); + + byte[] imageByte = remoteFileService.downloadToByteArray(bo.getImgOssId()); + ArrayList pictures = new ArrayList<>(); + pictures.add(Base64.getEncoder().encodeToString(imageByte)); + req.setPictures(pictures); + + Long pId = huaWeiBoxApi.addPerson(List.of(req)); + Assert.notNull(pId, "调用华为盒子新增图片失败"); + + add.setRemoteImgId(pId); + flag = baseMapper.insert(add) > 0; + Assert.isTrue(flag, "新增失败"); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + + return flag; } /** @@ -137,40 +168,6 @@ public class SisPersonLibImgServiceImpl implements ISisPersonLibImgService { @Override @Transactional(rollbackFor = Exception.class) public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - boolean del = baseMapper.deleteByIds(ids) > 0; - Assert.isTrue(del, "删除失败"); - - List list = libDeviceImgRefService.queryListByImgIds(ids); - Assert.notEmpty(list, "图片关联关系不存在"); - Collection refIds = list.stream().map(SisLibDeviceImgRefVo::getId).toList(); - Collection refLibIds = list.stream().map(SisLibDeviceImgRefVo::getLibId).toList(); - Integer[] refImgIds = list.stream().map(SisLibDeviceImgRefVo::getEqpLibImgId).map(Long::intValue).toArray(Integer[]::new); - - List ls = libDeviceRefService.queryDeviceListByLibIds(refLibIds); - Assert.notEmpty(ls, "库与设备关联关系不存在"); - - 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()); - - Boolean b; - if (item.getEqpLibType() == 1) { - b = unViewAiBoxApi.batchDeletePerson(systemInfo, refImgIds); - log.info("删除宇视图片[{}]完成,result={}", refImgIds, b); - } else { - b = unViewAiBoxApi.deleteWorkClothes(systemInfo, item.getEqpLibId(), Arrays.stream(refImgIds).toList()); - log.info("删除宇视服装[{}]完成,result={}", refImgIds, b); - } - - Assert.isTrue(b, "删除图片失败"); - }); - - Boolean refFlag = libDeviceImgRefService.deleteWithValidByIds(refIds, true); - Assert.isTrue(refFlag, "删除图片关联关系失败"); - return true; } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisPersonLibServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisPersonLibServiceImpl.java index f6d1053..ed2e26c 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisPersonLibServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisPersonLibServiceImpl.java @@ -1,36 +1,24 @@ package org.dromara.sis.service.impl; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.IdUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.CodePrefixConstants; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.sis.domain.SisLibDeviceRef; import org.dromara.sis.domain.SisPersonLib; -import org.dromara.sis.domain.bo.AccessControlLibDeviceBo; import org.dromara.sis.domain.bo.SisPersonLibBo; -import org.dromara.sis.domain.vo.SisAccessControlDeviceVo; -import org.dromara.sis.domain.vo.SisLibDeviceRefVo; import org.dromara.sis.domain.vo.SisPersonLibVo; import org.dromara.sis.mapper.SisPersonLibMapper; -import org.dromara.sis.sdk.unview.UnViewAiBoxApi; -import org.dromara.sis.sdk.unview.model.UvModel; -import org.dromara.sis.service.ISisAccessControlDeviceService; -import org.dromara.sis.service.ISisLibDeviceRefService; import org.dromara.sis.service.ISisPersonLibService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Map; @@ -46,9 +34,6 @@ import java.util.Map; public class SisPersonLibServiceImpl implements ISisPersonLibService { private final SisPersonLibMapper baseMapper; - private final UnViewAiBoxApi unViewAiBoxApi; - private final ISisLibDeviceRefService sisLibDeviceRefService; - private final ISisAccessControlDeviceService sisAccessControlDeviceService; /** * 查询人像库 @@ -58,13 +43,7 @@ public class SisPersonLibServiceImpl implements ISisPersonLibService { */ @Override public SisPersonLibVo queryById(Long id) { - SisPersonLibVo sisPersonLibVo = baseMapper.selectVoById(id); - List sisLibDeviceRefVos = sisLibDeviceRefService.queryByLibIds(Collections.singleton(id)); - if (CollUtil.isNotEmpty(sisLibDeviceRefVos)) { - List list = sisLibDeviceRefVos.stream().map(SisLibDeviceRefVo::getEqpId).toList(); - sisPersonLibVo.setEqpIds(list); - } - return sisPersonLibVo; + return baseMapper.selectVoById(id); } /** @@ -99,8 +78,6 @@ public class SisPersonLibServiceImpl implements ISisPersonLibService { lqw.orderByAsc(SisPersonLib::getId); lqw.like(StringUtils.isNotBlank(bo.getLibName()), SisPersonLib::getLibName, bo.getLibName()); lqw.eq(StringUtils.isNotBlank(bo.getLibDesc()), SisPersonLib::getLibDesc, bo.getLibDesc()); - lqw.eq(bo.getLibType() != null, SisPersonLib::getLibType, bo.getLibType()); - lqw.eq(bo.getBusiType() != null, SisPersonLib::getBusiType, bo.getBusiType()); lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), SisPersonLib::getSearchValue, bo.getSearchValue()); return lqw; } @@ -117,41 +94,7 @@ public class SisPersonLibServiceImpl implements ISisPersonLibService { SisPersonLib add = MapstructUtils.convert(bo, SisPersonLib.class); Assert.notNull(add, "数据处理失败"); boolean flag = baseMapper.insert(add) > 0; - log.info("库[{}]开始写入系统,result={}", add.getLibName(), flag); - if (flag) { - bo.setId(add.getId()); - for (Long eqpId : bo.getEqpIds()) { - // 查询设备信息 - SisAccessControlDeviceVo vo = sisAccessControlDeviceService.queryById(eqpId); - Assert.notNull(vo, "门禁控制设备不存在,id=" + eqpId); - log.info("准备写入门禁设备,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()); - // libType =1 人像库,否则工服库 - Integer outLibCode = null; - if (bo.getLibType() == 1) { - UvModel.AddLibResult addLibResult = unViewAiBoxApi.addPersonLib(systemInfo, bo.getLibName()); - outLibCode = addLibResult.getLib_id(); - } else { - UvModel.AddLibResult addLibResult = unViewAiBoxApi.addWorkClothesLib(systemInfo, bo.getLibName()); - outLibCode = addLibResult.getLib_id(); - } - log.info("宇视建库完成,libId = {}", outLibCode); - Assert.notNull(outLibCode, "写入宇视盒子失败"); - SisLibDeviceRef ref = new SisLibDeviceRef(); - ref.setLibId(add.getId()); - ref.setEqpId(vo.getId()); - ref.setEqpLibId(Long.valueOf(outLibCode)); - ref.setEqpLibState(1); - ref.setEqpLibType(bo.getLibType()); - Boolean insert = sisLibDeviceRefService.insert(ref); - Assert.isTrue(insert, "写入库关联关系表失败!"); - log.info("同步建库完成!"); - } - } + Assert.isTrue(flag, "新增失败"); return flag; } @@ -185,27 +128,6 @@ public class SisPersonLibServiceImpl implements ISisPersonLibService { @Transactional(rollbackFor = Exception.class) @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - // 查询关联的设备信息,先删除设备上的库 - List ls = sisLibDeviceRefService.queryDeviceListByLibIds(ids); - // 删除关联关系 - 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.deletePersonLib(systemInfo, item.getEqpLibId()); - log.info("删除宇试人像库[{}]完成,result={}", item.getEqpLibId(), b); - } else { - Boolean b = unViewAiBoxApi.deleteWorkClothesLib(systemInfo, item.getEqpLibId()); - log.info("删除宇试工服库[{}]完成,result={}", item.getEqpLibId(), b); - } - }); - // 查询当前库是否绑定 - sisLibDeviceRefService.deleteByLibIds(ids); - log.info("删除personLibRef关联关系完成!"); - return baseMapper.deleteByIds(ids) > 0; + return true; } }