diff --git a/.run/嘉兴访客.run.xml b/.run/嘉兴访客.run.xml new file mode 100644 index 000000000..5b850f900 --- /dev/null +++ b/.run/嘉兴访客.run.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.run/批量启动.run.xml b/.run/批量启动.run.xml new file mode 100644 index 000000000..4dfc1510e --- /dev/null +++ b/.run/批量启动.run.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/VisitorsServiceImpl.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/VisitorsServiceImpl.java index 59934630f..aa661980e 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/VisitorsServiceImpl.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/VisitorsServiceImpl.java @@ -39,10 +39,12 @@ import com.bsd.pjcloud.integrated.vo.visitor.app.VisitorsPeopleAppVo; import com.bsd.pjcloud.thirdparty.api.feign.RemoterVisitorService; import com.bsd.pjcloud.thirdparty.dto.visitor.AppointmentInfo; import com.bsd.pjcloud.thirdparty.dto.visitor.VisitorObjectResponse; +import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.QueryAppointmentRecordsRequest; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.RegisterAppointmentRequest; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.VisitorAppointmentRequest; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.VisitorInfo; import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.AppointmentData; +import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.QueryAppointmentRecordsResponse; import com.github.yulichang.toolkit.StrUtils; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; @@ -220,11 +222,27 @@ public class VisitorsServiceImpl extends ServiceImpl queryAppointmentRecordsResponseR = remoterVisitorService.queryAppointmentRecords(queryAppointmentRecordsRequest); + QueryAppointmentRecordsResponse queryAppointmentRecordsResponse = queryAppointmentRecordsResponseR.getData(); + QueryAppointmentRecordsResponse.QueryRecordsData queryRecordsData = queryAppointmentRecordsResponse.getData(); + List list = queryRecordsData.getList(); + if (!CollectionUtils.isEmpty(list)){ + QueryAppointmentRecordsResponse.AppointmentRecord appointmentRecord = list.get(0); + bean.setQrcode(appointmentRecord.getQRCode()); + }else { + throw new ServiceException("二维码接口获取失败"); + } // bean.setVerificationCode(null); -// } + } List visitorsCarEntities = visitorsCarMapper.selectList(new LambdaQueryWrapper().eq(VisitorsCarEntity::getVisitorsId, visitors.getId())); diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterVisitorService.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterVisitorService.java index e45392f4f..19ea47e2a 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterVisitorService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterVisitorService.java @@ -23,9 +23,11 @@ import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.thirdparty.dto.visitor.VisitorObjectResponse; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.CheckOutRequest; +import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.QueryAppointmentRecordsRequest; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.RegisterAppointmentRequest; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.VisitorAppointmentRequest; import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.AppointmentData; +import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.QueryAppointmentRecordsResponse; import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.RegisterAppointmentResponse; import com.bsd.pjcloud.thirdparty.dto.person.AddPersonRequest; import com.bsd.pjcloud.thirdparty.dto.person.AddPersonResponse; @@ -66,6 +68,14 @@ public interface RemoterVisitorService { @PostMapping("/visitors/appointment") VisitorObjectResponse createVisitorAppointment(@Valid @RequestBody VisitorAppointmentRequest request); + /** + * 查询访客预约记录v2 + * @param request 查询访客预约记录请求参数 + * @return 查询访客预约记录响应结果 + */ + @PostMapping("/visitors/appointment/records") + @Operation(summary = "查询访客预约记录v2", description = "根据查询条件查询预约记录") + R queryAppointmentRecords(@Valid @RequestBody QueryAppointmentRecordsRequest request); /** * 取消预约 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/visitor/request/make/QueryAppointmentRecordsRequest.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/visitor/request/make/QueryAppointmentRecordsRequest.java new file mode 100644 index 000000000..4a6244af7 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/visitor/request/make/QueryAppointmentRecordsRequest.java @@ -0,0 +1,130 @@ +package com.bsd.pjcloud.thirdparty.dto.visitor.request.make; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.*; +import lombok.Data; + +/** + * 查询访客预约记录v2请求参数 + * API路径:/api/visitor/v2/appointment/records + */ +@Data +@Schema(description = "查询访客预约记录v2请求参数") +public class QueryAppointmentRecordsRequest { + + /** + * 被访人唯一标识(可选) + * 查询人员列表v2接口获取返回报文中的personId字段 + */ + @Schema(description = "被访人唯一标识") + private String receptionistId; + + /** + * 访客姓名(可选) + * 长度不超过32,支持中英文字符,不能包含 ' / \ : * ? " < > + */ + @Size(max = 32, message = "访客姓名长度不超过32个字符") + @Pattern(regexp = "^[^'/\\\\:*?\"<>]*$", message = "访客姓名包含非法字符") + @Schema(description = "访客姓名") + private String visitorName; + + /** + * 联系电话(可选) + * 建议填写手机号码 + */ + @Schema(description = "联系电话") + private String phoneNo; + + /** + * 预计来访时间范围-开始(可选) + * 时间参数需满足ISO8601格式:yyyy-MM-ddTHH:mm:ss+当前时区 + * 例如北京时间:2018-07-26T15:00:00+08:00 + */ + @Schema(description = "预计来访时间范围-开始", example = "2018-07-26T15:00:00+08:00") + private String visitStartTimeBegin; + + /** + * 预计来访时间范围-结束(可选) + * 时间参数需满足ISO8601格式:yyyy-MM-ddTHH:mm:ss+当前时区 + * 例如北京时间:2018-07-26T15:00:00+08:00 + */ + @Schema(description = "预计来访时间范围-结束", example = "2018-07-26T15:00:00+08:00") + private String visitStartTimeEnd; + + /** + * 预计离开时间范围-开始(可选) + * 时间参数需满足ISO8601格式:yyyy-MM-ddTHH:mm:ss+当前时区 + * 例如北京时间:2018-07-26T15:00:00+08:00 + */ + @Schema(description = "预计离开时间范围-开始", example = "2018-07-26T15:00:00+08:00") + private String visitEndTimeBegin; + + /** + * 预计离开时间范围-结束(可选) + * 时间参数需满足ISO8601格式:yyyy-MM-ddTHH:mm:ss+当前时区 + * 例如北京时间:2018-07-26T15:00:00+08:00 + */ + @Schema(description = "预计离开时间范围-结束", example = "2018-07-26T15:00:00+08:00") + private String visitEndTimeEnd; + + /** + * 页码(必填) + * pageNo要求大于0不超过2147483647 + */ + @NotNull(message = "页码不能为空") + @Min(value = 1, message = "页码必须大于0") + @Max(value = 2147483647, message = "页码不能超过2147483647") + @Schema(description = "页码", required = true) + private Integer pageNo; + + /** + * 页大小(必填) + * pageSize要求大于0且不超过1000 + */ + @NotNull(message = "页大小不能为空") + @Min(value = 1, message = "页大小必须大于0") + @Max(value = 1000, message = "页大小不能超过1000") + @Schema(description = "页大小", required = true) + private Integer pageSize; + + /** + * 访客验证码(可选) + * 为访客管理组件提供,用于访客在访客机登记的凭证 + */ + @Schema(description = "访客验证码") + private String verificationCode; + + /** + * 访客状态(可选) + * 0:待审核(预约待审批) + * 1:正常(预约成功或预约审批成功后<未登记>:当前时间未超过预计来访时间) + * 2:迟到(预约成功或预约审批成功后<未登记>:当前时间超过预计来访时间,但未超过预计离开时间) + * 3:失效(预约成功或预约审批成功后<未登记>:当前时间已超过预计离开时间) + * 4:审核退回(预约待审批,审批人员审批退回) + * 5:超期自动签离(超期未签离记录访客,由后台任务定时处理签离) + * 6:已签离(访客签离) + * 7:超期未签离(访客登记,当前时间已超过预计离开时间,还未进行签离) + * 8:已到达(访客登记,当前时间未超过预计离开时间) + * 9:审核失效(预约待审批,一直到当前时间超过预计离开时间,还未审批通过) + * 10:邀约中(员工发起邀约,访客还未应邀) + * 11:邀约失效(员工发起邀约,一直到当前时间超过预计离开时间,访客还未应邀) + */ + @Min(value = 0, message = "访客状态值无效") + @Max(value = 11, message = "访客状态值无效") + @Schema(description = "访客状态") + private Integer visitorStatus; + + /** + * 访客二维码内容(可选) + * 支持动态二维码或者静态二维码 + */ + @Schema(description = "访客二维码内容") + private String QRCode; + + /** + * 预约记录ID(可选) + * 访客预约v2接口获取返回报文中的orderId字段 + */ + @Schema(description = "预约记录ID") + private String orderId; +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/visitor/response/make/QueryAppointmentRecordsResponse.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/visitor/response/make/QueryAppointmentRecordsResponse.java new file mode 100644 index 000000000..671a1df61 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/visitor/response/make/QueryAppointmentRecordsResponse.java @@ -0,0 +1,264 @@ +package com.bsd.pjcloud.thirdparty.dto.visitor.response.make; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * 查询访客预约记录v2响应参数 + */ +@Data +@Schema(description = "查询访客预约记录v2响应参数") +public class QueryAppointmentRecordsResponse { + + /** + * 返回码,0 – 成功,其他- 失败 + */ + @Schema(description = "返回码,0 – 成功,其他- 失败") + private String code; + + /** + * 返回描述 + */ + @Schema(description = "返回描述") + private String msg; + + /** + * 访客预约记录 + */ + @Schema(description = "访客预约记录") + private QueryRecordsData data; + + @Data + @Schema(description = "访客预约记录数据") + public static class QueryRecordsData { + + /** + * 记录总数 + */ + @Schema(description = "记录总数") + private Integer total; + + /** + * 页码 + */ + @Schema(description = "页码") + private Integer pageNo; + + /** + * 页大小 + */ + @Schema(description = "页大小") + private Integer pageSize; + + /** + * 预约记录列表 + */ + @Schema(description = "预约记录列表") + private List list; + } + + @Data + @Schema(description = "预约记录详情") + public static class AppointmentRecord { + + /** + * 预约记录ID,可作为修改预约的依据 + */ + @Schema(description = "预约记录ID") + private String appointRecordId; + + /** + * 被访人唯一标识 + */ + @Schema(description = "被访人唯一标识") + private String receptionistId; + + /** + * 被访人姓名 + */ + @Schema(description = "被访人姓名") + private String receptionistName; + + /** + * 被访人所属组织编码 + */ + @Schema(description = "被访人所属组织编码") + private String receptionistCode; + + /** + * 预计来访时间 + */ + @Schema(description = "预计来访时间", example = "2018-07-26T15:00:00+08:00") + private String visitStartTime; + + /** + * 预计离开时间 + */ + @Schema(description = "预计离开时间", example = "2018-07-26T19:00:00+08:00") + private String visitEndTime; + + /** + * 来访事由 + */ + @Schema(description = "来访事由") + private String visitPurpose; + + /** + * 访客姓名 + */ + @Schema(description = "访客姓名") + private String visitorName; + + /** + * 来访单位 + */ + @Schema(description = "来访单位") + private String visitorWorkUnit; + + /** + * 访客住址 + */ + @Schema(description = "访客住址") + private String visitorAddress; + + /** + * 访客Id + */ + @Schema(description = "访客Id") + private String visitorId; + + /** + * 访客验证码 + */ + @Schema(description = "访客验证码") + private String verificationCode; + + /** + * 动态二维码 + */ + @Schema(description = "动态二维码") + private String QRCode; + + /** + * 性别,1-男,2-女 + */ + @Schema(description = "性别,1-男,2-女") + private Integer gender; + + /** + * 联系电话 + */ + @Schema(description = "联系电话") + private String phoneNo; + + /** + * 访客车牌号 + */ + @Schema(description = "访客车牌号") + private String plateNo; + + /** + * 证件类型 + */ + @Schema(description = "证件类型") + private Integer certificateType; + + /** + * 证件号 + */ + @Schema(description = "证件号") + private String certificateNo; + + /** + * 图片的相对Uri + */ + @Schema(description = "图片的相对Uri") + private String picUri; + + /** + * 图片服务器索引码 + */ + @Schema(description = "图片服务器索引码") + private String svrIndexCode; + + /** + * 访客状态 + */ + @Schema(description = "访客状态") + private Integer visitorStatus; + + /** + * 证件地址 + */ + @Schema(description = "证件地址") + private String certAddr; + + /** + * 发证机关 + */ + @Schema(description = "发证机关") + private String certIssuer; + + /** + * 民族 + */ + @Schema(description = "民族") + private Integer nation; + + /** + * 籍贯 + */ + @Schema(description = "籍贯") + private String birthplace; + + /** + * 访客记录唯一标识 + */ + @Schema(description = "访客记录唯一标识") + private String orderId; + + /** + * 权限下发指定的资源点集合 + */ + @Schema(description = "权限下发指定的资源点集合") + private DesignatedResources designatedResources; + + /** + * 权限组名称集合 + */ + @Schema(description = "权限组名称集合") + private List privilegeGroupNames; + + /** + * 证件照相对URL + */ + @Schema(description = "证件照相对URL") + private String identityUri; + + /** + * 证件照对应图片服务器serviceNodes + */ + @Schema(description = "证件照对应图片服务器serviceNodes") + private String identitySvrCode; + } + + @Data + @Schema(description = "权限下发指定的资源点集合") + public static class DesignatedResources { + + /** + * 参数类型 + * 门禁点1,梯控楼层2,门口机3,围墙机4,停车库5 + */ + @Schema(description = "参数类型") + private String paramKey; + + /** + * 设备的indexCode集合 + */ + @Schema(description = "设备的indexCode集合") + private List paramValues; + } +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/VisitorController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/VisitorController.java index c26ad0f70..17fa1a042 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/VisitorController.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/VisitorController.java @@ -4,10 +4,12 @@ package com.bsd.pjcloud.thirdparty.controller; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.thirdparty.dto.visitor.VisitorObjectResponse; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.CheckOutRequest; +import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.QueryAppointmentRecordsRequest; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.RegisterAppointmentRequest; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.VisitorAppointmentRequest; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.VisitorInfo; import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.AppointmentData; +import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.QueryAppointmentRecordsResponse; import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.RegisterAppointmentResponse; import com.bsd.pjcloud.thirdparty.dto.person.AddPersonRequest; import com.bsd.pjcloud.thirdparty.dto.person.AddPersonResponse; @@ -78,6 +80,21 @@ public class VisitorController { */ } + /** + * 查询访客预约记录v2 + * @param request + * @return + */ + @Operation(summary = "查询访客预约记录v2", description = "根据查询条件查询预约记录") + @PostMapping("/appointment/records") + public R queryAppointmentRecords(@Valid @RequestBody QueryAppointmentRecordsRequest request) { + try { + QueryAppointmentRecordsResponse response = visitorService.queryAppointmentRecords(request); + return R.ok(response); + } catch (Exception e) { + return R.failed("查询访客预约记录失败: " + e.getMessage()); + } + } /** * 取消预约 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/VisitorService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/VisitorService.java index 33bcdad5b..977151c4a 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/VisitorService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/VisitorService.java @@ -7,11 +7,13 @@ import com.bsd.pjcloud.thirdparty.config.HikvisionProperties; import com.bsd.pjcloud.thirdparty.dto.visitor.AppointmentInfo; import com.bsd.pjcloud.thirdparty.dto.visitor.VisitorObjectResponse; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.CheckOutRequest; +import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.QueryAppointmentRecordsRequest; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.RegisterAppointmentRequest; import com.bsd.pjcloud.thirdparty.dto.visitor.request.make.VisitorAppointmentRequest; import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.AppointmentData; import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.CancelAppointmentResponse; import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.CheckOutResponse; +import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.QueryAppointmentRecordsResponse; import com.bsd.pjcloud.thirdparty.dto.visitor.response.make.RegisterAppointmentResponse; import com.bsd.pjcloud.thirdparty.exception.HikvisionException; import com.hikvision.artemis.sdk.ArtemisHttpUtil; @@ -1119,4 +1121,187 @@ public class VisitorService extends BaseHikvisionService { } } + /** + * 查询访客预约记录v2 + * @param request + * @return + */ + @Transactional(readOnly = true) + public QueryAppointmentRecordsResponse queryAppointmentRecords(QueryAppointmentRecordsRequest request) { + try { + JSONObject body = convertQueryAppointmentRecordsRequestToJSON(request); + String responseJson = sendPostRequest("visitor-appointment-records", body); + + log.info("查询访客预约记录响应: {}", responseJson); + + QueryAppointmentRecordsResponse response = parseQueryAppointmentRecordsResponse(responseJson); + + // 检查响应码 + if (!"0".equals(response.getCode())) { + log.error("查询访客预约记录失败,错误码: {}, 错误信息: {}", response.getCode(), response.getMsg()); + throw new ServiceException("查询访客预约记录失败: " + response.getMsg()); + } + + return response; + + } catch (Exception e) { + log.error("查询访客预约记录异常", e); + if (e instanceof ServiceException) { + throw e; + } + throw new ServiceException("查询访客预约记录失败: " + e.getMessage()); + } + } + + /** + * 转换查询访客预约记录请求为JSON + */ + private JSONObject convertQueryAppointmentRecordsRequestToJSON(QueryAppointmentRecordsRequest request) { + JSONObject json = new JSONObject(); + + // 添加所有可选参数,只有非空时才添加 + if (StringUtils.isNotBlank(request.getReceptionistId())) { + json.put("receptionistId", request.getReceptionistId()); + } + if (StringUtils.isNotBlank(request.getVisitorName())) { + json.put("visitorName", request.getVisitorName()); + } + if (StringUtils.isNotBlank(request.getPhoneNo())) { + json.put("phoneNo", request.getPhoneNo()); + } + if (StringUtils.isNotBlank(request.getVisitStartTimeBegin())) { + json.put("visitStartTimeBegin", request.getVisitStartTimeBegin()); + } + if (StringUtils.isNotBlank(request.getVisitStartTimeEnd())) { + json.put("visitStartTimeEnd", request.getVisitStartTimeEnd()); + } + if (StringUtils.isNotBlank(request.getVisitEndTimeBegin())) { + json.put("visitEndTimeBegin", request.getVisitEndTimeBegin()); + } + if (StringUtils.isNotBlank(request.getVisitEndTimeEnd())) { + json.put("visitEndTimeEnd", request.getVisitEndTimeEnd()); + } + if (StringUtils.isNotBlank(request.getVerificationCode())) { + json.put("verificationCode", request.getVerificationCode()); + } + if (request.getVisitorStatus() != null) { + json.put("visitorStatus", request.getVisitorStatus()); + } + if (StringUtils.isNotBlank(request.getQRCode())) { + json.put("QRCode", request.getQRCode()); + } + if (StringUtils.isNotBlank(request.getOrderId())) { + json.put("orderId", request.getOrderId()); + } + + // 必填参数 + json.put("pageNo", request.getPageNo()); + json.put("pageSize", request.getPageSize()); + + return json; + } + + /** + * 解析查询访客预约记录响应 + */ + private QueryAppointmentRecordsResponse parseQueryAppointmentRecordsResponse(String json) { + try { + JSONObject jsonObject = JSON.parseObject(json); + + QueryAppointmentRecordsResponse response = new QueryAppointmentRecordsResponse(); + response.setCode(jsonObject.getString("code")); + response.setMsg(jsonObject.getString("msg")); + + // 解析data部分 + JSONObject dataObj = jsonObject.getJSONObject("data"); + if (dataObj != null) { + QueryAppointmentRecordsResponse.QueryRecordsData data = new QueryAppointmentRecordsResponse.QueryRecordsData(); + data.setTotal(dataObj.getInteger("total")); + data.setPageNo(dataObj.getInteger("pageNo")); + data.setPageSize(dataObj.getInteger("pageSize")); + + // 解析预约记录列表 + JSONArray listArray = dataObj.getJSONArray("list"); + if (listArray != null) { + List records = new ArrayList<>(); + + for (int i = 0; i < listArray.size(); i++) { + JSONObject recordObj = listArray.getJSONObject(i); + QueryAppointmentRecordsResponse.AppointmentRecord record = new QueryAppointmentRecordsResponse.AppointmentRecord(); + + // 映射所有字段 + record.setAppointRecordId(recordObj.getString("appointRecordId")); + record.setReceptionistId(recordObj.getString("receptionistId")); + record.setReceptionistName(recordObj.getString("receptionistName")); + record.setReceptionistCode(recordObj.getString("receptionistCode")); + record.setVisitStartTime(recordObj.getString("visitStartTime")); + record.setVisitEndTime(recordObj.getString("visitEndTime")); + record.setVisitPurpose(recordObj.getString("visitPurpose")); + record.setVisitorName(recordObj.getString("visitorName")); + record.setVisitorWorkUnit(recordObj.getString("visitorWorkUnit")); + record.setVisitorAddress(recordObj.getString("visitorAddress")); + record.setVisitorId(recordObj.getString("visitorId")); + record.setVerificationCode(recordObj.getString("verificationCode")); + record.setQRCode(recordObj.getString("QRCode")); + record.setGender(recordObj.getInteger("gender")); + record.setPhoneNo(recordObj.getString("phoneNo")); + record.setPlateNo(recordObj.getString("plateNo")); + record.setCertificateType(recordObj.getInteger("certificateType")); + record.setCertificateNo(recordObj.getString("certificateNo")); + record.setPicUri(recordObj.getString("picUri")); + record.setSvrIndexCode(recordObj.getString("svrIndexCode")); + record.setVisitorStatus(recordObj.getInteger("visitorStatus")); + record.setCertAddr(recordObj.getString("certAddr")); + record.setCertIssuer(recordObj.getString("certIssuer")); + record.setNation(recordObj.getInteger("nation")); + record.setBirthplace(recordObj.getString("birthplace")); + record.setOrderId(recordObj.getString("orderId")); + record.setIdentityUri(recordObj.getString("identityUri")); + record.setIdentitySvrCode(recordObj.getString("identitySvrCode")); + + // 解析权限下发指定的资源点集合 + JSONObject designatedResourcesObj = recordObj.getJSONObject("designatedResources"); + if (designatedResourcesObj != null) { + QueryAppointmentRecordsResponse.DesignatedResources designatedResources = new QueryAppointmentRecordsResponse.DesignatedResources(); + designatedResources.setParamKey(designatedResourcesObj.getString("paramKey")); + + JSONArray paramValuesArray = designatedResourcesObj.getJSONArray("paramValues"); + if (paramValuesArray != null) { + List paramValues = new ArrayList<>(); + for (int j = 0; j < paramValuesArray.size(); j++) { + paramValues.add(paramValuesArray.getString(j)); + } + designatedResources.setParamValues(paramValues); + } + + record.setDesignatedResources(designatedResources); + } + + // 解析权限组名称集合 + JSONArray privilegeGroupNamesArray = recordObj.getJSONArray("privilegeGroupNames"); + if (privilegeGroupNamesArray != null) { + List privilegeGroupNames = new ArrayList<>(); + for (int j = 0; j < privilegeGroupNamesArray.size(); j++) { + privilegeGroupNames.add(privilegeGroupNamesArray.getString(j)); + } + record.setPrivilegeGroupNames(privilegeGroupNames); + } + + records.add(record); + } + + data.setList(records); + } + + response.setData(data); + } + + return response; + + } catch (JSONException e) { + log.error("解析查询访客预约记录响应JSON失败: {}", json, e); + throw new ServiceException("查询访客预约记录响应解析失败"); + } + } + } \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml index 589ac6244..f8f310ee6 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -132,6 +132,7 @@ hikvision: apis: person-list: /api/resource/v2/person/personList # 新增人员列表接口 visitor-appointment: /api/visitor/v2/appointment # 新增访客预约接口 + visitor-appointment-records: /api/visitor/v2/appointment/records # 查询访客预约记录v2接口 person-detail: /api/resource/v1/person/condition/personInfo # 新增人员详情接口 cancel-appointment: /api/visitor/v1/appointment/cancel # 新增取消预约接口 register-appointment: /api/visitor/v1/order/register # 新增登记接口