提交 7bf585c5 作者: 谭志磊

feat : 访客基本增删改查 收发卡导出功能

上级 ef2b8aeb
......@@ -26,7 +26,7 @@ import org.hibernate.snowflake.SnowflakeId;
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
@Table(name = "BS_VISITOR")
@Comment("监控视频")
@Comment("访客信息")
public class Visitor implements Serializable {
private static final long serialVersionUID = -7367226565168197562L;
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.excel.visitor;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.github.liaochong.myexcel.core.annotation.ExcelModel;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* @author tzl
* 2022/4/21 9:37
*/
@ExcelModel
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class VisitorExportExcel implements Serializable {
@Serial
private static final long serialVersionUID = -5732379257900745806L;
@ExcelColumn(title = "到访人姓名")
String visitorName;
@ExcelColumn(title = "到访人姓名")
String visitorMobile;
@ExcelColumn(title = "到访人身份证")
String visitorCarNum;
@ExcelColumn(title = "是否特殊作业")
boolean taskType;
@ExcelColumn(title = "邀请人数")
Integer numOfVisitor;
@ExcelColumn(title = "访客来源")
String visitorSource;
@ExcelColumn(title = "标签卡")
String labelCard;
@ExcelColumn(title = "标签卡状态")
String labelCardStatus;
@ExcelColumn(title = "所属单位")
String orgId;
@ExcelColumn(title = "被访人")
String intervieweeId;
@ExcelColumn(title = "来访原因")
String reason;
@ExcelColumn(title = "收卡时间")
LocalDateTime cardRecTime;
@ExcelColumn(title = "预约到访时间")
LocalDateTime appOfVisitTime;
@ExcelColumn(title = "发卡时间")
LocalDateTime cardSendTime;
}
......@@ -61,6 +61,9 @@ public class CarQueryParam implements Serializable {
@ApiModelProperty(value = "收卡时间(结束)", example = "2022-04-11 17:26:33")
LocalDateTime cardRecTimeEnd;
/**
* 来访时间参数字段名用错 应该时 cardSendTimeStart
*/
@ApiModelProperty(value = "来访时间(开始)", example = "2022-04-11 17:25:33")
LocalDateTime createTimeStart;
......
......@@ -36,7 +36,7 @@ public class VisitorParam implements Serializable {
@NotEmpty(message = "到访人身份证不能为空")
String visitorCarNum;
@ApiModelProperty(value = "到访人身份证", example = "fasle", required = true)
@ApiModelProperty(value = "是否特殊作业", example = "fasle", required = true)
boolean taskType;
// @Comment("邀请人数")
......@@ -64,7 +64,7 @@ public class VisitorParam implements Serializable {
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// LocalDateTime cardRecTime;
@ApiModelProperty(value = "来访原因", example = "2022-04-19 14:28:00", required = true)
@ApiModelProperty(value = "来访原因", example = "2022-04-19 14:28:00")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime appOfVisitTime;
// @Comment("创建时间")
......
......@@ -2,7 +2,9 @@
package com.yiring.app.param.visitor;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.*;
import lombok.experimental.FieldDefaults;
......@@ -20,5 +22,54 @@ public class VisitorQueryParam implements Serializable {
private static final long serialVersionUID = -4314254785949101573L;
String id;
@ApiModelProperty(value = "访客姓名", example = "张三")
String visitorName;
@ApiModelProperty(value = "访客电话", example = "17688888888")
String visitorMobile;
@ApiModelProperty(value = "访客身份证", example = "430441190001255417")
String visitorCarNum;
@ApiModelProperty(value = "是否特殊作业", example = "fasle")
String taskType;
@ApiModelProperty(value = "所属公司", example = "壹润科技")
String orgId;
@ApiModelProperty(value = "访客来源", example = "外部邀请")
String visitorSource;
@ApiModelProperty(value = "被访人id", example = "1")
String intervieweeId;
@ApiModelProperty(value = "标签卡", example = "DS41234231")
String labelCard;
@ApiModelProperty(value = "标签卡状态", example = "1")
String labelCardStatus;
@ApiModelProperty(value = "预约到访时间(开始)", example = "2022-04-19 14:28:00")
LocalDateTime appOfVisitTimeStart;
@ApiModelProperty(value = "预约到访时间(结束)", example = "2022-04-19 14:28:00")
LocalDateTime appOfVisitTimeEnd;
@ApiModelProperty(value = "实际到访时间(开始)", example = "2022-04-19 14:28:00")
LocalDateTime cardSendTimeStart;
@ApiModelProperty(value = "实际到访时间(结束)", example = "2022-04-19 14:28:00")
LocalDateTime cardSendTimeEnd;
@ApiModelProperty(value = "收卡时间(开始)", example = "2022-04-11 17:25:33")
LocalDateTime cardRecTimeStart;
@ApiModelProperty(value = "收卡时间(结束)", example = "2022-04-11 17:26:33")
LocalDateTime cardRecTimeEnd;
@ApiModelProperty(value = "分页条数", example = "10")
Integer pageSize;
@ApiModelProperty(value = "当前页数", example = "1")
Integer pageNo;
}
......@@ -298,7 +298,7 @@ public class CarServiceImpl implements CarService {
//来访时间区间段查询
list.add(
criteriaBuilder.between(
root.get(Car.Fields.createTime),
root.get(Car.Fields.cardSendTime),
carParam.getCreateTimeStart(),
carParam.getCreateTimeEnd()
)
......@@ -320,7 +320,7 @@ public class CarServiceImpl implements CarService {
}
if (Objects.nonNull(carParam.getCardRecTimeStart()) && Objects.nonNull(carParam.getCardRecTimeEnd())) {
//来访时间区间段查询
//收卡时间区间段查询
list.add(
criteriaBuilder.between(
root.get(Car.Fields.cardRecTime),
......
......@@ -2,9 +2,12 @@
package com.yiring.app.service.visitor;
import com.yiring.app.param.visitor.VisitorParam;
import com.yiring.app.param.visitor.VisitorQueryParam;
import com.yiring.app.vo.visitor.VisitorVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.vo.PageVo;
import javax.servlet.http.HttpServletResponse;
/**
* @author tzl
......@@ -33,5 +36,24 @@ public interface VisitorService {
*/
Result<String> updateVisitor(VisitorParam visitorParam, IdParam idParam);
/**
* 查询访客详情
* @param idParam 主键id
* @return 访客信息
*/
Result<VisitorVo> selectVisitor(IdParam idParam);
/**
* 分页查询
* @param visitorQueryParam 访客查询参数
* @return 访客分页信息
*/
Result<PageVo<VisitorVo>> pageVisitor(VisitorQueryParam visitorQueryParam);
/**
* 导出访客信息
* @param visitorQueryParam 访客筛选条件
* @param response HttpServletResponse
*/
void exportVisitor(VisitorQueryParam visitorQueryParam, HttpServletResponse response);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.visitor.impl;
import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
import com.yiring.app.domain.visitor.Visitor;
import com.yiring.app.domain.visitor.VisitorRepository;
import com.yiring.app.excel.visitor.VisitorExportExcel;
import com.yiring.app.param.visitor.VisitorParam;
import com.yiring.app.param.visitor.VisitorQueryParam;
import com.yiring.app.service.visitor.VisitorService;
import com.yiring.app.vo.visitor.VisitorVo;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam;
import com.yiring.common.vo.PageVo;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.*;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author tzl
* 2022/4/19 14:12
*/
@Slf4j
@Transactional(rollbackFor = RuntimeException.class)
@Service
public class VisitorServiceImpl implements VisitorService {
......@@ -88,6 +109,82 @@ public class VisitorServiceImpl implements VisitorService {
return Result.ok(vo);
}
@Override
public Result<PageVo<VisitorVo>> pageVisitor(VisitorQueryParam visitorQueryParam) {
PageVo<VisitorVo> resultVo;
//排序
Sort sort = Sort.by(Sort.Order.desc(Visitor.Fields.createTime));
if (Objects.nonNull(visitorQueryParam.getPageNo()) && Objects.nonNull(visitorQueryParam.getPageSize())) {
//分页
Pageable pageable = PageRequest.of(visitorQueryParam.getPageNo() - 1, visitorQueryParam.getPageSize());
Page<Visitor> all = visitorRepository.findAll(condition(visitorQueryParam), pageable);
List<VisitorVo> data = all
.get()
.map(visitor -> {
VisitorVo vo = new VisitorVo();
BeanUtils.copyProperties(visitor, vo);
return vo;
})
.collect(Collectors.toList());
resultVo = PageVo.build(data, all.getTotalElements());
} else {
List<Visitor> all = visitorRepository.findAll(condition(visitorQueryParam), sort);
List<VisitorVo> data = all
.stream()
.map(visitor -> {
VisitorVo vo = new VisitorVo();
BeanUtils.copyProperties(visitor, vo);
return vo;
})
.collect(Collectors.toList());
resultVo = PageVo.build(data, data.size());
}
return Result.ok(resultVo);
}
@Override
public void exportVisitor(VisitorQueryParam visitorQueryParam, HttpServletResponse response) {
List<Visitor> visitors = visitorRepository.findAll(condition(visitorQueryParam));
List<VisitorExportExcel> visitorExportExcels = visitors
.stream()
.map(visitor -> {
VisitorExportExcel visitorExportExcel = new VisitorExportExcel();
BeanUtils.copyProperties(visitor, visitorExportExcel);
return visitorExportExcel;
})
.toList();
try (
DefaultStreamExcelBuilder<VisitorExportExcel> defaultStreamExcelBuilder = DefaultStreamExcelBuilder
.of(VisitorExportExcel.class)
.threadPool(Executors.newFixedThreadPool(2))
.rowHeight(14)
.titleRowHeight(14)
.widths(8)
.style(
"cell->vertical-align:center;text-align:center",
"title->vertical-align:center;text-align:center;font-weight:bold;font-family:等线"
)
.start()
) {
defaultStreamExcelBuilder.append(visitorExportExcels);
String fileName = URLEncoder.encode("访客信息.xlsx", StandardCharsets.UTF_8);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream out = response.getOutputStream();
Workbook workbook = defaultStreamExcelBuilder.fixedTitles().build();
workbook.write(out);
workbook.close();
out.flush();
out.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException("导出访客信息失败: " + e.getMessage());
}
}
public boolean hasCarNum(String carNum) {
Visitor visitor = Visitor.builder().visitorCarNum(carNum).build();
return visitorRepository.count(Example.of(visitor)) > 0;
......@@ -97,4 +194,137 @@ public class VisitorServiceImpl implements VisitorService {
Visitor visitor = Visitor.builder().visitorMobile(mobile).build();
return visitorRepository.count(Example.of(visitor)) > 0;
}
public Specification<Visitor> condition(VisitorQueryParam visitorQueryParam) {
return (root, query, criteriaBuilder) -> {
List<Predicate> list = new ArrayList<>();
//查询条件
if (StrUtil.isNotBlank(visitorQueryParam.getVisitorName())) {
//访客姓名
list.add(
criteriaBuilder.like(
root.get(Visitor.Fields.visitorName),
"%" + visitorQueryParam.getVisitorName() + "%"
)
);
}
if (StrUtil.isNotBlank(visitorQueryParam.getVisitorMobile())) {
//访客电话
list.add(
criteriaBuilder.like(
root.get(Visitor.Fields.visitorMobile),
"%" + visitorQueryParam.getVisitorMobile() + "%"
)
);
}
if (StrUtil.isNotBlank(visitorQueryParam.getVisitorCarNum())) {
//访客身份证
list.add(
criteriaBuilder.like(
root.get(Visitor.Fields.visitorCarNum),
"%" + visitorQueryParam.getVisitorCarNum() + "%"
)
);
}
if (StrUtil.isNotBlank(visitorQueryParam.getTaskType())) {
//是否特殊作业
list.add(
criteriaBuilder.like(root.get(Visitor.Fields.taskType), "%" + visitorQueryParam.getTaskType() + "%")
);
}
if (StrUtil.isNotBlank(visitorQueryParam.getOrgId())) {
//所属单位查询
list.add(
criteriaBuilder.like(root.get(Visitor.Fields.orgId), "%" + visitorQueryParam.getOrgId() + "%")
);
}
if (StrUtil.isNotBlank(visitorQueryParam.getVisitorSource())) {
//访客来源
list.add(
criteriaBuilder.like(
root.get(Visitor.Fields.visitorSource),
"%" + visitorQueryParam.getVisitorSource() + "%"
)
);
}
if (StrUtil.isNotBlank(visitorQueryParam.getIntervieweeId())) {
//被访人
list.add(
criteriaBuilder.equal(root.get(Visitor.Fields.intervieweeId), visitorQueryParam.getIntervieweeId())
);
}
if (StrUtil.isNotBlank(visitorQueryParam.getLabelCard())) {
//标签卡号查询
list.add(
criteriaBuilder.like(
root.get(Visitor.Fields.labelCard),
"%" + visitorQueryParam.getLabelCard() + "%"
)
);
}
if (StrUtil.isNotBlank(visitorQueryParam.getLabelCardStatus())) {
//标签卡状态
list.add(
criteriaBuilder.like(
root.get(Visitor.Fields.labelCardStatus),
"%" + visitorQueryParam.getLabelCardStatus() + "%"
)
);
}
if (
Objects.nonNull(visitorQueryParam.getAppOfVisitTimeStart()) &&
Objects.nonNull(visitorQueryParam.getAppOfVisitTimeEnd())
) {
//预约到访时间区间段查询
list.add(
criteriaBuilder.between(
root.get(Visitor.Fields.appOfVisitTime),
visitorQueryParam.getAppOfVisitTimeStart(),
visitorQueryParam.getAppOfVisitTimeEnd()
)
);
}
if (
Objects.nonNull(visitorQueryParam.getCardSendTimeStart()) &&
Objects.nonNull(visitorQueryParam.getCardSendTimeEnd())
) {
//实际到访时间区间段查询
list.add(
criteriaBuilder.between(
root.get(Visitor.Fields.cardSendTime),
visitorQueryParam.getCardSendTimeStart(),
visitorQueryParam.getCardSendTimeEnd()
)
);
}
if (
Objects.nonNull(visitorQueryParam.getCardRecTimeStart()) &&
Objects.nonNull(visitorQueryParam.getCardRecTimeEnd())
) {
//收卡时间区间段查询
list.add(
criteriaBuilder.between(
root.get(Visitor.Fields.cardRecTime),
visitorQueryParam.getCardRecTimeStart(),
visitorQueryParam.getCardRecTimeEnd()
)
);
}
Predicate[] predicates = new Predicate[list.size()];
query.where(list.toArray(predicates));
return criteriaBuilder.and(list.toArray(predicates));
};
}
}
......@@ -28,7 +28,7 @@ public class VideoVo implements Serializable {
@ApiModelProperty(value = "id", example = "1548548545755")
Long id;
@ApiModelProperty(value = "坐标点", example = "坐标点", required = true)
@ApiModelProperty(value = "坐标点", example = "坐标点")
Point point;
@ApiModelProperty(value = "编号", example = "88888888")
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.visitor;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* @author tzl
* 2022/4/19 14:16
*/
@ApiModel("VisitorVo")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class VisitorVo implements Serializable {
private static final long serialVersionUID = 9004209982164273860L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "id", example = "1548548545755")
Long id;
@ApiModelProperty(value = "到访人姓名", example = "张三")
String visitorName;
@ApiModelProperty(value = "到访人电话", example = "17688888888")
String visitorMobile;
@ApiModelProperty(value = "到访人身份证", example = "430441190001255417")
String visitorCarNum;
@ApiModelProperty(value = "是否特殊作业", example = "true")
boolean taskType;
@ApiModelProperty(value = "邀请人数", example = "1")
Integer numOfVisitor;
@ApiModelProperty(value = "访客来源", example = "内部邀请")
String visitorSource;
@ApiModelProperty(value = "标签卡", example = "WE34421231")
String labelCard;
@ApiModelProperty(value = "标签卡状态", example = "使用中")
String labelCardStatus;
@ApiModelProperty(value = "所属单位id", example = "壹润科技")
String orgId;
@ApiModelProperty(value = "被访人id", example = "1")
String intervieweeId;
@ApiModelProperty(value = "来访原因", example = "来访原因")
String reason;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "收卡时间", example = "2022-04-19 14:28:00")
LocalDateTime cardRecTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "预约到访时间", example = "2022-04-19 14:28:00")
LocalDateTime appOfVisitTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "创建时间", example = "2022-04-19 14:28:00")
LocalDateTime createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "发卡时间", example = "2022-04-19 14:28:00")
LocalDateTime cardSendTime;
}
......@@ -29,7 +29,7 @@ import org.springframework.web.bind.annotation.RestController;
* 2022/4/11 17:02
*/
@Slf4j
@Api(tags = "Car")
@Api(tags = "Car(车辆)")
@Validated
@RestController
@RequestMapping("/Car/")
......
......@@ -33,7 +33,7 @@ import org.springframework.web.multipart.MultipartFile;
*/
@Slf4j
@Validated
@Api(tags = "Video")
@Api(tags = "Video(监控设备)")
@RestController
@RequestMapping("/video/")
public class VideoController {
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.visitor;
import com.yiring.app.param.visitor.VisitorParam;
import com.yiring.app.param.visitor.VisitorQueryParam;
import com.yiring.app.service.visitor.VisitorService;
import com.yiring.app.vo.visitor.VisitorVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author tzl
* 2022/4/21 9:50
*/
@Slf4j
@Validated
@Api(tags = "Visitor(访客)")
@RestController
@RequestMapping("/visitor/")
public class VisitorController {
@Resource
VisitorService visitorService;
@ApiOperation(value = "新增访客信息")
@PostMapping("saveVisitor")
public Result<String> saveVisitor(@Valid VisitorParam visitorParam) {
return visitorService.saveVisitor(visitorParam);
}
@ApiOperation(value = "修改访客信息")
@PostMapping("updateVisitor")
public Result<String> updateVisitor(@Valid VisitorParam visitorParam, @Valid IdParam idParam) {
return visitorService.updateVisitor(visitorParam, idParam);
}
// @ApiOperation(value = "收卡")
// @PostMapping("cardRec")
// public Result<Long> cardRec(@Valid IdParam idParam) {
// return carService.cardRec(idParam);
// }
//
// @ApiOperation(value = "发卡")
// @ApiImplicitParam(value = "标签卡", example = "DW8544568", required = true, name = "labelCard")
// @PostMapping("cardSend")
// public Result<Long> cardSend(@Valid IdParam idParam, String labelCard) {
// return carService.cardSend(idParam, labelCard);
// }
@ApiOperation(value = "删除访客信息")
@PostMapping("deleteVisitor")
public Result<String> deleteVisitor(@Valid IdParam idParam) {
return visitorService.deleteVisitor(idParam);
}
@ApiOperation(value = "查看访客信息详情")
@GetMapping("selectVisitor")
public Result<VisitorVo> selectVisitor(@Valid IdParam idParam) {
return visitorService.selectVisitor(idParam);
}
@ApiOperation(value = "查看访客信息(分页)")
@GetMapping("pageVisitor")
public Result<PageVo<VisitorVo>> pageVisitor(@Valid VisitorQueryParam visitorQueryParam) {
return visitorService.pageVisitor(visitorQueryParam);
}
@ApiOperation(value = "导出访客信息", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@PostMapping("exportVisitor")
public void exportVisitor(HttpServletResponse response, @Valid VisitorQueryParam visitorQueryParam) {
visitorService.exportVisitor(visitorQueryParam, response);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论