From d4b5bb839b67d05c1bbd01d18c6a2c7e2ef509e0 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Sun, 28 Sep 2025 19:02:53 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=AE=BF=E5=AE=A2=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/VisitorsController.java | 8 +- .../integrated/service/VisitorsService.java | 9 ++ .../service/impl/VisitorsServiceImpl.java | 109 ++++++++++++++++++ 3 files changed, 121 insertions(+), 5 deletions(-) diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/VisitorsController.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/VisitorsController.java index c3236b6be..2e8141b75 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/VisitorsController.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/VisitorsController.java @@ -17,6 +17,7 @@ import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsYYAppDTO; import com.bsd.pjcloud.integrated.entity.VisitorsEntity; import com.bsd.pjcloud.integrated.service.VisitorsService; import com.bsd.pjcloud.integrated.vo.visitor.app.VisitorsAppVo; +import com.bsd.pjcloud.integrated.vo.visitor.VisitorsPageVo; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -54,11 +55,8 @@ public class VisitorsController { @Operation(summary = "分页查询" , description = "分页查询" ) @GetMapping("/page" ) @PreAuthorize("@pms.hasPermission('integrated_visitors_view')" ) - public R getVisitorsPage(@ParameterObject Page page, @ParameterObject VisitorsEntity visitors) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.eq(StrUtil.isNotBlank(visitors.getName()),VisitorsEntity::getName,visitors.getName()); - wrapper.eq(StrUtil.isNotBlank(visitors.getMobile()),VisitorsEntity::getMobile,visitors.getMobile()); - return R.ok(visitorsService.page(page, wrapper)); + public R getVisitorsPage(@ParameterObject Page page, @ParameterObject VisitorsEntity visitors) { + return R.ok(visitorsService.getVisitorsPageWithDeptName(page, visitors)); } diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/VisitorsService.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/VisitorsService.java index 6eb23f0ad..6fa95ddce 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/VisitorsService.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/VisitorsService.java @@ -10,6 +10,7 @@ import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsYYAppDTO; import com.bsd.pjcloud.integrated.entity.VisitorsEntity; import com.bsd.pjcloud.integrated.vo.visitor.app.VisitorsAppVo; import com.bsd.pjcloud.integrated.vo.visitor.app.VisitorsAppYYDetailVo; +import com.bsd.pjcloud.integrated.vo.visitor.VisitorsPageVo; import java.util.List; @@ -88,6 +89,14 @@ public interface VisitorsService extends IService { Object receiveYY(VisitorsReceiveAppDTO visitorsReceiveAppDTO); + /** + * 分页查询访客表(包含部门名称回显) + * @param page 分页对象 + * @param visitors 访客表查询条件 + * @return 分页结果 + */ + Page getVisitorsPageWithDeptName(Page page, VisitorsEntity visitors); + /** * 获取邀约详情 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 763271a96..7d777d9b4 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 @@ -28,6 +28,8 @@ import com.bsd.pjcloud.integrated.constant.IntegratedFlowConstant; import com.bsd.pjcloud.integrated.constant.VisitorTypeEnum; import com.bsd.pjcloud.integrated.controller.AppVisitorUserController; import com.bsd.pjcloud.integrated.dto.visitor.app.*; +import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsCarAppDTO; +import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsPeopleAppDTO; import com.bsd.pjcloud.integrated.entity.VisitorUserEntity; import com.bsd.pjcloud.integrated.entity.VisitorsCarEntity; import com.bsd.pjcloud.integrated.entity.VisitorsEntity; @@ -38,6 +40,7 @@ import com.bsd.pjcloud.integrated.mapper.VisitorsPeopleMapper; import com.bsd.pjcloud.integrated.service.VisitorUserService; import com.bsd.pjcloud.integrated.service.VisitorsService; import com.bsd.pjcloud.integrated.vo.visitor.app.*; +import com.bsd.pjcloud.integrated.vo.visitor.VisitorsPageVo; import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdPartySmsService; import com.bsd.pjcloud.thirdparty.api.feign.RemoterVisitorService; import com.bsd.pjcloud.thirdparty.dto.visitor.AppointmentInfo; @@ -49,6 +52,7 @@ 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 cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.security.oauth2.jwt.Jwt; @@ -605,5 +609,110 @@ public class VisitorsServiceImpl extends ServiceImpl getVisitorsPageWithDeptName(Page page, VisitorsEntity visitors) { + // 构建查询条件 + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(StrUtil.isNotBlank(visitors.getType()), VisitorsEntity::getType, visitors.getType()); + wrapper.eq(StrUtil.isNotBlank(visitors.getName()), VisitorsEntity::getName, visitors.getName()); + wrapper.eq(StrUtil.isNotBlank(visitors.getMobile()), VisitorsEntity::getMobile, visitors.getMobile()); + + // 执行分页查询 + Page entityPage = baseMapper.selectPage(page, wrapper); + + // 批量查询部门信息,避免N+1问题 + List deptIds = entityPage.getRecords().stream() + .map(VisitorsEntity::getDeptId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + + Map deptNameMap = new HashMap<>(); + if (!deptIds.isEmpty()) { + R> deptMapR = remoteDeptService.getDeptByDeptIds(deptIds); + if (deptMapR.isOk() && deptMapR.getData() != null) { + for (Map.Entry entry : deptMapR.getData().entrySet()) { + deptNameMap.put(entry.getKey(), entry.getValue().getName()); + } + } + } + + // 批量查询车辆信息 + List visitorIds = entityPage.getRecords().stream() + .map(VisitorsEntity::getId) + .collect(Collectors.toList()); + + final Map> carMap; + final Map> peopleMap; + + if (!visitorIds.isEmpty()) { + // 查询车辆信息 + List carEntities = visitorsCarMapper.selectList( + new LambdaQueryWrapper() + .in(VisitorsCarEntity::getVisitorsId, visitorIds) + ); + if (!CollectionUtils.isEmpty(carEntities)) { + carMap = carEntities.stream() + .collect(Collectors.groupingBy( + VisitorsCarEntity::getVisitorsId, + Collectors.mapping(car -> { + VisitorsCarAppDTO dto = new VisitorsCarAppDTO(); + dto.setCarNumber(car.getCarNumber()); + return dto; + }, Collectors.toList()) + )); + } else { + carMap = new HashMap<>(); + } + + // 查询随行人员信息 + List peopleEntities = visitorsPeopleMapper.selectList( + new LambdaQueryWrapper() + .in(VisitorsPeopleEntity::getVisitorsId, visitorIds) + ); + if (!CollectionUtils.isEmpty(peopleEntities)) { + peopleMap = peopleEntities.stream() + .collect(Collectors.groupingBy( + VisitorsPeopleEntity::getVisitorsId, + Collectors.mapping(people -> { + VisitorsPeopleAppDTO dto = new VisitorsPeopleAppDTO(); + dto.setName(people.getName()); + dto.setMobile(people.getMobile()); + return dto; + }, Collectors.toList()) + )); + } else { + peopleMap = new HashMap<>(); + } + } else { + carMap = new HashMap<>(); + peopleMap = new HashMap<>(); + } + + // 转换为VO + List voList = entityPage.getRecords().stream().map(entity -> { + VisitorsPageVo vo = BeanUtils.toBean(entity, VisitorsPageVo.class); + // 设置部门名称 + if (entity.getDeptId() != null) { + vo.setDeptName(deptNameMap.get(entity.getDeptId())); + } + // 设置车辆信息 + vo.setCarList(carMap.getOrDefault(entity.getId(), new ArrayList<>())); + // 设置随行人员信息 + vo.setOtherPeople(peopleMap.getOrDefault(entity.getId(), new ArrayList<>())); + return vo; + }).collect(Collectors.toList()); + + // 构建返回结果 + Page resultPage = new Page<>(); + resultPage.setCurrent(entityPage.getCurrent()); + resultPage.setSize(entityPage.getSize()); + resultPage.setTotal(entityPage.getTotal()); + resultPage.setPages(entityPage.getPages()); + resultPage.setRecords(voList); + + return resultPage; + } + } \ No newline at end of file From c9e7e18c557dd84e3974c0bdf42d8113e2727356 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Sun, 28 Sep 2025 23:46:43 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=AE=BF=E5=AE=A2=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../integrated/vo/visitor/VisitorsPageVo.java | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/vo/visitor/VisitorsPageVo.java diff --git a/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/vo/visitor/VisitorsPageVo.java b/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/vo/visitor/VisitorsPageVo.java new file mode 100644 index 000000000..40d6612c1 --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/vo/visitor/VisitorsPageVo.java @@ -0,0 +1,205 @@ +package com.bsd.pjcloud.integrated.vo.visitor; + +import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsCarAppDTO; +import com.bsd.pjcloud.integrated.dto.visitor.app.VisitorsPeopleAppDTO; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 访客表分页查询VO + * + * @author zjf + * @date 2025-04-09 15:22:47 + */ +@Data +@Schema(description = "访客表分页查询VO") +public class VisitorsPageVo { + + @Schema(description="id") + private Long id; + + /** + * 姓名 + */ + @Schema(description="姓名") + private String name; + + /** + * 手机号 + */ + @Schema(description="手机号") + private String mobile; + + /** + * 身份证号 + */ + @Schema(description="身份证号") + private String idCard; + + /** + * 描述 + */ + @Schema(description="拜访原因") + private String reasonValue; + + /** + * 审核状态 + */ + @Schema(description="审核状态") + private String checkStatus; + + /** + * 到访单位ID + */ + @Schema(description="到访单位ID") + private Long deptId; + + /** + * 到访单位名称 + */ + @Schema(description="到访单位名称") + private String deptName; + + /** + * 接待人 + */ + @Schema(description="拜访人") + private String userName; + + /** + * 车牌号id + */ + @Schema(description="车牌号id") + private Long carId; + + /** + * 公司名称 + */ + @Schema(description="公司名称") + private String companyName; + + /** + * 随行人员数量 + */ + @Schema(description="随行人员数量") + private Integer peopleNumber; + + /** + * 到访时间 + */ + @Schema(description="到访时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime vStartDate; + + /** + * 到访时间 + */ + @Schema(description="到访时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime vEndDate; + + /** + * 是否驾驶车辆0 否 1是 + */ + @Schema(description="是否驾驶车辆0 否 1是") + private String isDrive; + + /** + * 流程id + */ + @Schema(description="流程id") + private String processInstanceId; + + /** + * 审核原因 + */ + @Schema(description="审核原因") + private String checkReason; + + /** + * 创建者 + */ + @Schema(description="创建者") + private String createBy; + + /** + * 创建时间 + */ + @Schema(description="创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime createTime; + + /** + * 更新者 + */ + @Schema(description="更新者") + private String updateBy; + + /** + * 更新时间 + */ + @Schema(description="更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime updateTime; + + /** + * 是否删除 + */ + @Schema(description="是否删除") + private String delFlag; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; + + @Schema(description="token") + private String token; + + @Schema(description="1 主动申请,2邀约,3 后台创建") + private String type; + + @Schema(description="用户id") + private Long userId; + + @Schema(description="接待人id") + private Long receiveId; + + @Schema(description="是否随行人员") + private String isOtherPeople; + + @Schema(description="访客记录唯一标识,用于已预约登记、访客签离等操作") + private String orderId; + + @Schema(description="预约记录ID,可作为修改、取消预约的依据") + private String appointRecordId; + + @Schema(description="二维码") + private String qrcode; + + @Schema(description="验证码") + private String verificationCode; + + @Schema(description="邀约id") + private Long yyId; + + @Schema(description="访客用户id") + private Long visitorUserId; + + /** + * 车牌号集合 + */ + @Schema(description="车牌号集合") + private List carList; + + /** + * 随行人员集合 + */ + @Schema(description="随行人员集合") + private List otherPeople; +}