提交 856966b6 作者: Administrator

feat : 邀请,访客,车辆,访客小程序,功能添加

上级 3510b233
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.car;
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
/**
* @author tzl
* 2022/4/11 13:42
*/
@Repository
public interface CarRepository extends JpaRepository<Car, Serializable>, JpaSpecificationExecutor<Car> {
// /**
// * 检查是否存在相同车牌号登记
// *
// * @param param String 车牌号码
// * @return 是否存在
// */
// @Query("SELECT COUNT(c.id) FROM bs_car c where car_num=?1 and label_card_status <>'已收卡'")
// boolean hasCarInfoByCarNum(String param);
//
// /**
// * 检查是否存在相同手机号码登记
// *
// * @param param String 手机号码
// * @return 是否存在
// */
// @Query("SELECT COUNT(c.id) FROM bs_car c where driver_mobile=?1 and label_card_status <>'已收卡'")
// boolean hasCarInfoByMobile(String param);
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.car; package com.yiring.app.domain.visitor;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial; import java.io.Serial;
...@@ -48,24 +48,6 @@ public class Car implements Serializable { ...@@ -48,24 +48,6 @@ public class Car implements Serializable {
@Comment("车辆类型") @Comment("车辆类型")
String carType; String carType;
@Comment("司机名称")
String driverName;
@Comment("司机电话")
String driverMobile;
@Comment("标签卡")
String labelCard;
@Comment("所属单位id")
String orgId;
@Comment("被访人id")
String intervieweeId;
@Comment("来访原因")
String reason;
@Comment("收卡时间") @Comment("收卡时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime cardRecTime; LocalDateTime cardRecTime;
...@@ -77,6 +59,6 @@ public class Car implements Serializable { ...@@ -77,6 +59,6 @@ public class Car implements Serializable {
@Comment("发卡时间") @Comment("发卡时间")
LocalDateTime cardSendTime; LocalDateTime cardSendTime;
@Comment("备用字段") @Comment("标签卡")
String reserve4; String labelCard;
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.visitor;
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
/**
* @author tzl
* 2022/4/11 13:42
*/
@Repository
public interface CarRepository extends JpaRepository<Car, Serializable>, JpaSpecificationExecutor<Car> {
/**
* 检查车牌号车辆是否已经在园内
*
* @param param String 车牌号码
* @return 是否存在
*/
@Query("SELECT COUNT(c.id) FROM Car c where carNum=?1 and cardRecTime is null")
int hasCarInfoByCarNum(String param);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.visitor;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.snowflake.SnowflakeId;
/**
* 邀请管理
*
* @author Administrator
* @version 1.0
* @description: 邀请信息实体
* @date 2022/4/24 16:43
*/
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
@Table(name = "BS_INVITATION")
@Comment("邀请信息")
public class Invitation implements Serializable {
@Serial
private static final long serialVersionUID = -1330887992216252468L;
@Id
@Comment("主键id")
@GeneratedValue(generator = SnowflakeId.GENERATOR)
@GenericGenerator(name = SnowflakeId.GENERATOR, strategy = SnowflakeId.Strategy.LONG)
Long id;
@Comment("邀请方式")
String InvitationMethod;
@Comment("状态")
String status;
@Comment("邀请人id")
Long inviterId;
@Comment("邀请人数")
Integer numOfVisitor;
@Comment("创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime createTime;
// @Comment("访客id")
// Long visitorId;
@Comment("被邀请访客")
@JsonIgnore
@OneToOne
@JoinColumn(name = "visitor_id", referencedColumnName = "id")
Visitor visitor;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.visitor;
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
/**
* @author tzl
* 2022/4/24 16:53
*/
@Repository
public interface InvitationRepository
extends JpaRepository<Invitation, Serializable>, JpaSpecificationExecutor<Invitation> {}
...@@ -6,11 +6,13 @@ import java.io.Serial; ...@@ -6,11 +6,13 @@ import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import javax.persistence.*; import javax.persistence.*;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Table;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants; import lombok.experimental.FieldNameConstants;
import org.hibernate.annotations.Comment; import org.hibernate.annotations.*;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.snowflake.SnowflakeId; import org.hibernate.snowflake.SnowflakeId;
/** /**
...@@ -26,6 +28,8 @@ import org.hibernate.snowflake.SnowflakeId; ...@@ -26,6 +28,8 @@ import org.hibernate.snowflake.SnowflakeId;
@FieldNameConstants @FieldNameConstants
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
@Entity @Entity
@DynamicInsert
@DynamicUpdate
@Table(name = "BS_VISITOR") @Table(name = "BS_VISITOR")
@Comment("访客信息") @Comment("访客信息")
public class Visitor implements Serializable { public class Visitor implements Serializable {
...@@ -49,10 +53,10 @@ public class Visitor implements Serializable { ...@@ -49,10 +53,10 @@ public class Visitor implements Serializable {
String visitorCarNum; String visitorCarNum;
@Comment("是否特殊作业") @Comment("是否特殊作业")
boolean taskType; String taskType;
@Comment("邀请人数") // @Comment("邀请人数")
Integer numOfVisitor; // Integer numOfVisitor;
@Comment("访客来源") @Comment("访客来源")
String visitorSource; String visitorSource;
...@@ -69,7 +73,7 @@ public class Visitor implements Serializable { ...@@ -69,7 +73,7 @@ public class Visitor implements Serializable {
@Comment("被访人id") @Comment("被访人id")
String intervieweeId; String intervieweeId;
@Comment("来访原因") @Comment("来访原因/邀请原因")
String reason; String reason;
@Comment("收卡时间") @Comment("收卡时间")
...@@ -89,11 +93,19 @@ public class Visitor implements Serializable { ...@@ -89,11 +93,19 @@ public class Visitor implements Serializable {
LocalDateTime cardSendTime; LocalDateTime cardSendTime;
@Comment("备用字段") @Comment("备用字段")
String reserve1; Long reserve1;
@Comment("备用字段") @Comment("是否已删除:Y是 N否")
String reserve2; @Column(columnDefinition = "VARCHAR DEFAULT 'N'")
String deleted;
@Comment("主访人员id")
Long mainVisitorId;
@Comment("备用字段") @Comment("备用字段")
String reserve3; String reserve3;
@Comment("访客车辆")
@OneToOne(cascade = { CascadeType.ALL })
Car car;
} }
...@@ -11,4 +11,6 @@ import org.springframework.stereotype.Repository; ...@@ -11,4 +11,6 @@ import org.springframework.stereotype.Repository;
* 2022/4/19 14:06 * 2022/4/19 14:06
*/ */
@Repository @Repository
public interface VisitorRepository extends JpaRepository<Visitor, Serializable>, JpaSpecificationExecutor<Visitor> {} public interface VisitorRepository extends JpaRepository<Visitor, Serializable>, JpaSpecificationExecutor<Visitor> {
Visitor findByIdAndDeleted(Long id, String deleted);
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.excel.car; package com.yiring.app.excel.visitor;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn; import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.github.liaochong.myexcel.core.annotation.ExcelModel; import com.github.liaochong.myexcel.core.annotation.ExcelModel;
......
/* (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
* @version 1.0
* @description: TODO
* @date 2022/4/25 11:53
*/
@ExcelModel
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class InvitationExportExcel implements Serializable {
@Serial
private static final long serialVersionUID = -8861639917182472169L;
@ExcelColumn(title = "邀请原因")
String reason;
@ExcelColumn(title = "邀请方式")
String InvitationMethod;
@ExcelColumn(title = "邀请人数")
Integer numOfVisitor;
@ExcelColumn(title = "所属单位")
String orgId;
@ExcelColumn(title = "到访人姓名")
String visitorName;
@ExcelColumn(title = "到访人电话")
String visitorMobile;
@ExcelColumn(title = "是否特殊任务")
String taskType;
// Long inviterId;
@ExcelColumn(title = "邀请人姓名")
String inviterName;
@ExcelColumn(title = "邀请人部门")
String inviterDept;
@ExcelColumn(title = "预约到访时间", format = "yyyy-MM-dd HH:mm:ss", width = 15)
LocalDateTime appOfVisitTime;
@ExcelColumn(title = "状态")
String status;
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.car; package com.yiring.app.param.visitor;
import com.yiring.common.constant.RegEx; import com.yiring.common.constant.RegEx;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
...@@ -8,7 +8,6 @@ import java.io.Serial; ...@@ -8,7 +8,6 @@ import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern; import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
...@@ -35,25 +34,8 @@ public class CarParam implements Serializable { ...@@ -35,25 +34,8 @@ public class CarParam implements Serializable {
@ApiModelProperty(value = "车辆类型", example = "1") @ApiModelProperty(value = "车辆类型", example = "1")
String carType; String carType;
@ApiModelProperty(value = "司机名称", example = "张三", required = true) @ApiModelProperty(value = "车辆类型", example = "1")
@NotEmpty(message = "司机名称不能为空") String labelCard;
String driverName; // @ApiModelProperty(value = "对应访客id", example = "1", required = true)
// Long visitorId;
@ApiModelProperty(value = "司机电话", example = "17688888888", required = true)
@NotEmpty(message = "司机电话不能为空")
@Pattern(regexp = RegEx.MOBILE, message = "手机号码格式不正确")
String driverMobile;
@ApiModelProperty(value = "所属单位id", example = "1", required = true)
@NotEmpty(message = "所属单位id不能为空")
String orgId;
@ApiModelProperty(value = "被访人id", example = "1", required = true)
@NotEmpty(message = "被访人id不能为空")
String intervieweeId;
@ApiModelProperty(value = "来访原因", example = "视察", required = true)
@NotEmpty(message = "来访原因不能为空")
@Size(min = 1, max = 20, message = "来访原因超出范围")
String reason;
} }
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.car; package com.yiring.app.param.visitor;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.visitor; package com.yiring.app.param.visitor;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yiring.common.constant.RegEx;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
/** /**
* 邀请信息入参
*
* @author tzl * @author tzl
* 2022/4/21 14:04 * @version 1.0
* @description: 邀请信息入参
* @date 2022/4/24 17:30
*/ */
@ApiModel("VisitorInfo") @ApiModel("VisitorInfo")
@Data @Data
...@@ -19,23 +28,47 @@ import lombok.experimental.FieldDefaults; ...@@ -19,23 +28,47 @@ import lombok.experimental.FieldDefaults;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class VisitorInfoParam implements Serializable { public class InvitationParam implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 3419577080791245488L; private static final long serialVersionUID = 3394438557179083143L;
@ApiModelProperty(value = "邀请方式:个人 公司", example = "个人", required = true)
@NotEmpty(message = "邀请方式不能为空")
String InvitationMethod;
@ApiModelProperty(value = "邀请原因/来访原因", example = "随便看看", required = true)
@Size(min = 1, max = 20, message = "邀请原因")
String reason;
@ApiModelProperty(value = "到访人姓名", example = "张三", required = true) @ApiModelProperty(value = "到访人姓名", example = "张三", required = true)
@NotEmpty(message = "到访人姓名不能为空") @NotEmpty(message = "到访人姓名")
String visitorName; String visitorName;
@ApiModelProperty(value = "到访人电话", example = "17688888888", required = true) @ApiModelProperty(value = "到访人电话", example = "17688888888", required = true)
@Pattern(regexp = RegEx.MOBILE, message = "手机号码格式不正确")
@NotEmpty(message = "到访人电话不能为空") @NotEmpty(message = "到访人电话不能为空")
String visitorMobile; String visitorMobile;
@ApiModelProperty(value = "到访人身份证", example = "430441190001255417", required = true) @ApiModelProperty(value = "到访人身份证", example = "430441190001255417")
@NotEmpty(message = "到访人身份证不能为空")
String visitorCarNum; String visitorCarNum;
@ApiModelProperty(value = "是否特殊作业", example = "fasle", required = true) @ApiModelProperty(value = "是否特殊作业", example = "否", required = true)
boolean taskType; String taskType;
// @ApiModelProperty(value = "访客来源", example = "外部邀请", required = true)
// String visitorSource;
@ApiModelProperty(value = "访客公司", example = "壹润科技")
String orgId;
@ApiModelProperty(value = "预约时间", example = "2022-04-19 14:28:00", required = true)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime appOfVisitTime;
@ApiModelProperty(value = "邀请人id", example = "1", required = true)
Long inviterId;
@ApiModelProperty(value = "邀请人数", example = "1")
Integer numOfVisitor;
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.visitor;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* @author tzl
* @version 1.0
* @description: TODO
* @date 2022/4/25 9:36
*/
@ApiModel("InvitationQueryParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class InvitationQueryParam implements Serializable {
@Serial
private static final long serialVersionUID = -8217270866091799814L;
@ApiModelProperty(value = "到访人姓名", example = "张三")
String visitorName;
@ApiModelProperty(value = "到访人电话", example = "17688888888")
String visitorMobile;
@ApiModelProperty(value = "访客公司", example = "壹润科技")
String orgId;
@ApiModelProperty(value = "是否特殊作业", example = "fasle")
String taskType;
@ApiModelProperty(value = "邀请人id", example = "1")
Long inviterId;
// @ApiModelProperty(value = "邀请人部门id", example = "1")
// Long deptId;
@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 = "10")
Integer pageSize;
@ApiModelProperty(value = "当前页数", example = "1")
Integer pageNo;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.visitor;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* @author tzl
* 2022/4/21 13:51
*/
@ApiModel("VisitorParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class VisitorListParam implements Serializable {
@Serial
private static final long serialVersionUID = 6356324790945367160L;
@ApiModelProperty(value = "访客来源", example = "内部邀请", required = true)
String visitorSource;
@ApiModelProperty(value = "来访原因", example = "2022-04-19 14:28:00")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime appOfVisitTime;
@ApiModelProperty(value = "被访人id", example = "1", required = true)
String intervieweeId;
@ApiModelProperty(value = "来访原因", example = "看看", required = true)
String reason;
@ApiModelProperty(value = "访客所属公司", example = "壹润科技", required = true)
String orgId;
@ApiModelProperty(value = "邀请人数", example = "1", required = true)
Integer numOfVisitor;
List<VisitorInfoParam> visitorInfos;
}
...@@ -2,11 +2,14 @@ ...@@ -2,11 +2,14 @@
package com.yiring.app.param.visitor; package com.yiring.app.param.visitor;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.yiring.common.constant.RegEx;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
...@@ -22,6 +25,7 @@ import lombok.experimental.FieldDefaults; ...@@ -22,6 +25,7 @@ import lombok.experimental.FieldDefaults;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class VisitorParam implements Serializable { public class VisitorParam implements Serializable {
@Serial
private static final long serialVersionUID = 1444009404727514785L; private static final long serialVersionUID = 1444009404727514785L;
@ApiModelProperty(value = "到访人姓名", example = "张三", required = true) @ApiModelProperty(value = "到访人姓名", example = "张三", required = true)
...@@ -37,20 +41,11 @@ public class VisitorParam implements Serializable { ...@@ -37,20 +41,11 @@ public class VisitorParam implements Serializable {
String visitorCarNum; String visitorCarNum;
@ApiModelProperty(value = "是否特殊作业", example = "fasle", required = true) @ApiModelProperty(value = "是否特殊作业", example = "fasle", required = true)
boolean taskType; String taskType;
// @Comment("邀请人数")
// Integer numOfVisitor;
@ApiModelProperty(value = "访客来源", example = "外部邀请", required = true) @ApiModelProperty(value = "访客来源", example = "外部邀请", required = true)
String visitorSource; String visitorSource;
// @Comment("标签卡")
// String labelCard;
//
// @Comment("标签卡状态")
// String labelCardStatus;
@ApiModelProperty(value = "访客所属公司", example = "壹润科技") @ApiModelProperty(value = "访客所属公司", example = "壹润科技")
String orgId; String orgId;
...@@ -60,19 +55,23 @@ public class VisitorParam implements Serializable { ...@@ -60,19 +55,23 @@ public class VisitorParam implements Serializable {
@ApiModelProperty(value = "来访原因", example = "看看", required = true) @ApiModelProperty(value = "来访原因", example = "看看", required = true)
String reason; String reason;
// @ApiModelProperty(value = "发卡时间", example = "看看", required = true) @ApiModelProperty(value = "来访时间", example = "2022-04-19 14:28:00")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// LocalDateTime cardRecTime;
@ApiModelProperty(value = "来访原因", example = "2022-04-19 14:28:00")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime appOfVisitTime; LocalDateTime appOfVisitTime;
// @Comment("创建时间")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// LocalDateTime createTime;
//
// @Comment("发卡时间")
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// LocalDateTime cardSendTime;
@ApiModelProperty(value = "是否有车(是 1 ,否 2)", example = "2")
Integer hasCar;
@ApiModelProperty(value = "车牌号码", example = "湘A99999")
@Pattern(regexp = RegEx.CARNUM, message = "车牌号码格式不正确")
String carNum;
@ApiModelProperty(value = "车辆类型", example = "货车")
String carType;
@ApiModelProperty(value = "车辆标签卡", example = "1")
String labelCard;
@ApiModelProperty(value = "主访人员id", example = "1")
Long mainVisitorId;
} }
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.car; package com.yiring.app.service.visitor;
import com.yiring.app.domain.car.Car; import com.yiring.app.domain.visitor.Car;
import com.yiring.app.param.car.CarParam; import com.yiring.app.param.visitor.CarQueryParam;
import com.yiring.app.param.car.CarQueryParam; import com.yiring.app.vo.visitor.CarVo;
import com.yiring.app.vo.car.CarVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
...@@ -19,19 +18,18 @@ public interface CarService { ...@@ -19,19 +18,18 @@ public interface CarService {
/** /**
* 添加车辆来访信息 * 添加车辆来访信息
* *
* @param carParam CarParam * @param car Car
* @return 车辆来访信息id * @return 车辆来访信息id
*/ */
Result<Long> saveCarInfo(CarParam carParam); Result<Long> saveCarInfo(Car car);
/** /**
* 修改车辆来访信息 * 修改车辆来访信息
* *
* @param carParam CarParam * @param car Car
* @param idParam IdParam
* @return 修改的车辆来访信息id * @return 修改的车辆来访信息id
*/ */
Result<Long> updateCarInfo(CarParam carParam, IdParam idParam); Result<Long> updateCarInfo(Car car);
/** /**
* 收卡 * 收卡
...@@ -81,21 +79,21 @@ public interface CarService { ...@@ -81,21 +79,21 @@ public interface CarService {
*/ */
void export(CarQueryParam carParam, HttpServletResponse response); void export(CarQueryParam carParam, HttpServletResponse response);
/** // /**
* 检查是否存在相同车牌号登记 // * 检查是否存在相同车牌号登记
* // *
* @param param String 车牌号码 // * @param param String 车牌号码
* @return 是否存在 // * @return 是否存在
*/ // */
boolean hasCarInfoByCarNum(String param); // boolean hasCarInfoByCarNum(String param);
//
/** // /**
* 检查是否存在相同手机号码登记 // * 检查是否存在相同手机号码登记
* // *
* @param param String 手机号码 // * @param param String 手机号码
* @return 是否存在 // * @return 是否存在
*/ // */
boolean hasCarInfoByMobile(String param); // boolean hasCarInfoByMobile(String param);
/** /**
* 筛选条件 * 筛选条件
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.visitor;
import com.yiring.app.param.visitor.InvitationParam;
import com.yiring.app.param.visitor.InvitationQueryParam;
import com.yiring.app.vo.visitor.InvitationVo;
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
* @date 2022/4/24 16:57
*/
public interface InvitationService {
/**
* 发起邀请
* @param invitationParam 新增邀请入参
* @return 是否成功
*/
Result<String> saveInv(InvitationParam invitationParam);
/**
* 修改邀请
* @date 2022/4/24 17:50
* @return com.yiring.common.core.Result<java.lang.String>
*/
Result<String> updateInv(InvitationParam invitationParam, IdParam idParam);
/**
* 删除邀请
* @date 2022/4/24 17:52
* @return com.yiring.common.core.Result<java.lang.String>
*/
Result<String> deleteInv(IdParam idParam);
/**
* 分页
* @date 2022/4/24 17:56
* @return com.yiring.common.core.Result<com.yiring.common.vo.PageVo<java.lang.String>>
*/
Result<PageVo<InvitationVo>> pageInv(InvitationQueryParam invitationQueryParam);
/**
* 撤回邀请
* @author tzl
* @date 2022/4/25 11:30
* @param idParam 主键id
* @return com.yiring.common.core.Result<java.lang.String>
*/
Result<String> recallInv(IdParam idParam);
/**
* 发送邀请
* @author tzl
* @date 2022/4/25 11:31
* @param idParam 主键id
* @return com.yiring.common.core.Result<java.lang.String>
*/
Result<String> sendInv(IdParam idParam);
/**
* 导出邀请信息
* @author tzl
* @date 2022/4/25 11:34
* @param invitationQueryParam 筛选条件
*/
void exportInv(InvitationQueryParam invitationQueryParam, HttpServletResponse response);
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.visitor; package com.yiring.app.service.visitor;
import com.yiring.app.param.visitor.VisitorListParam;
import com.yiring.app.param.visitor.VisitorParam; import com.yiring.app.param.visitor.VisitorParam;
import com.yiring.app.param.visitor.VisitorQueryParam; import com.yiring.app.param.visitor.VisitorQueryParam;
import com.yiring.app.vo.visitor.VisitorVo; import com.yiring.app.vo.visitor.VisitorVo;
...@@ -22,19 +21,12 @@ public interface VisitorService { ...@@ -22,19 +21,12 @@ public interface VisitorService {
*/ */
Result<String> saveVisitor(VisitorParam visitorParam); Result<String> saveVisitor(VisitorParam visitorParam);
/** // /**
* 访客批量新增 // * 访客删除
* @param visitorListParam 批量访客新增入参 // * @param idParam 主键id
* @return 是否成功 // * @return 是否成功
*/ // */
Result<String> saveVisitor(VisitorListParam visitorListParam); // Result<String> deleteVisitor(IdParam idParam);
/**
* 访客删除
* @param idParam 主键id
* @return 是否成功
*/
Result<String> deleteVisitor(IdParam idParam);
/** /**
* 修改访客信息 * 修改访客信息
...@@ -79,4 +71,13 @@ public interface VisitorService { ...@@ -79,4 +71,13 @@ public interface VisitorService {
* @return 是否成功 * @return 是否成功
*/ */
Result<String> cardRec(IdParam idParam); Result<String> cardRec(IdParam idParam);
/**
* 查看详情,并且带出该访客的随访人信息
* @author tzl
* @date 2022/4/25 16:48
* @param idParam 主键id
* @return com.yiring.common.core.Result<com.yiring.app.vo.visitor.VisitorVo>
*/
Result<VisitorVo> selectInfo(IdParam idParam);
} }
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.car.impl; package com.yiring.app.service.visitor.impl;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder; import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
import com.yiring.app.domain.car.Car; import com.yiring.app.domain.visitor.Car;
import com.yiring.app.domain.car.CarRepository; import com.yiring.app.domain.visitor.CarRepository;
import com.yiring.app.excel.car.CarExportExcel; import com.yiring.app.excel.visitor.CarExportExcel;
import com.yiring.app.param.car.CarParam; import com.yiring.app.param.visitor.CarQueryParam;
import com.yiring.app.param.car.CarQueryParam; import com.yiring.app.service.visitor.CarService;
import com.yiring.app.service.car.CarService; import com.yiring.app.vo.visitor.CarVo;
import com.yiring.app.vo.car.CarVo;
import com.yiring.auth.domain.role.Role; import com.yiring.auth.domain.role.Role;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
...@@ -49,50 +48,37 @@ public class CarServiceImpl implements CarService { ...@@ -49,50 +48,37 @@ public class CarServiceImpl implements CarService {
CarRepository carRepository; CarRepository carRepository;
@Override @Override
public Result<Long> saveCarInfo(CarParam carParam) { public Result<Long> saveCarInfo(Car car) {
// 检查车牌号是否已存在 // 检查车牌号车辆是否已经在园内
if (hasCarInfoByCarNum(carParam.getCarNum())) { if (carRepository.hasCarInfoByCarNum(car.getCarNum()) > 0) {
return Result.no(Status.BAD_REQUEST, "您的车牌号已存在"); return Result.no(Status.BAD_REQUEST, "您的车牌号已存在");
} }
// 检查司机手机号码号是否已存在 // Car car = Car
if (hasCarInfoByMobile(carParam.getDriverMobile())) { // .builder()
return Result.no(Status.BAD_REQUEST, "您的联系方式已存在"); // .carNum(carParam.getCarNum())
} // .carType(carParam.getCarType())
Car car = Car // .labelCard(carParam.getLabelCard())
.builder() // .createTime(LocalDateTime.now())
.carNum(carParam.getCarNum()) // // .visitorId(carParam.getVisitorId())
.carType(carParam.getCarType()) // .build();
.driverMobile(carParam.getDriverMobile())
.driverName(carParam.getDriverName())
.intervieweeId(carParam.getIntervieweeId())
.orgId(carParam.getOrgId())
.reason(carParam.getReason())
.createTime(LocalDateTime.now())
.build();
Car carReuslt = carRepository.saveAndFlush(car); Car carReuslt = carRepository.saveAndFlush(car);
return Result.ok(carReuslt.getId()); return Result.ok(carReuslt.getId());
} }
@Override @Override
public Result<Long> updateCarInfo(CarParam carParam, IdParam idParam) { public Result<Long> updateCarInfo(Car car) {
Optional<Car> optional = carRepository.findById(idParam.getId()); Optional<Car> optional = carRepository.findById(car.getId());
if (optional.isEmpty()) { if (optional.isEmpty()) {
return Result.no(Status.NOT_FOUND); return Result.no(Status.NOT_FOUND);
} }
Car car = optional.get(); Car carOptional = optional.get();
if (!car.getCarNum().equals(carParam.getCarNum())) { if (!car.getCarNum().equals(carOptional.getCarNum())) {
// 当修改车牌号时才检查重复 // 当修改车牌号时才检查重复
if (hasCarInfoByCarNum(carParam.getCarNum())) { if (carRepository.hasCarInfoByCarNum(carOptional.getCarNum()) > 0) {
return Result.no(Status.BAD_REQUEST, "您的车牌号信息已存在"); return Result.no(Status.BAD_REQUEST, "您的车牌号已在园区内");
} }
} }
if (!car.getDriverMobile().equals(carParam.getDriverMobile())) { BeanUtils.copyProperties(car, car);
// 当修改联系方式时才检查重复
if (hasCarInfoByMobile(carParam.getDriverMobile())) {
return Result.no(Status.BAD_REQUEST, "您的联系方式已存在");
}
}
BeanUtils.copyProperties(carParam, car);
Car carReuslt = carRepository.saveAndFlush(car); Car carReuslt = carRepository.saveAndFlush(car);
return Result.ok(carReuslt.getId()); return Result.ok(carReuslt.getId());
} }
...@@ -224,20 +210,6 @@ public class CarServiceImpl implements CarService { ...@@ -224,20 +210,6 @@ public class CarServiceImpl implements CarService {
} }
@Override @Override
public boolean hasCarInfoByCarNum(String param) {
Car entity = Car.builder().carNum(param).build();
long count = carRepository.count(Example.of(entity));
return count > 0;
}
@Override
public boolean hasCarInfoByMobile(String param) {
Car entity = Car.builder().driverMobile(param).build();
long count = carRepository.count(Example.of(entity));
return count > 0;
}
@Override
public Specification<Car> condition(CarQueryParam carParam) { public Specification<Car> condition(CarQueryParam carParam) {
return (root, query, criteriaBuilder) -> { return (root, query, criteriaBuilder) -> {
List<Predicate> list = new ArrayList<>(); List<Predicate> list = new ArrayList<>();
......
/* (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.Invitation;
import com.yiring.app.domain.visitor.InvitationRepository;
import com.yiring.app.domain.visitor.Visitor;
import com.yiring.app.domain.visitor.VisitorRepository;
import com.yiring.app.excel.visitor.InvitationExportExcel;
import com.yiring.app.param.visitor.InvitationParam;
import com.yiring.app.param.visitor.InvitationQueryParam;
import com.yiring.app.service.visitor.InvitationService;
import com.yiring.app.vo.visitor.InvitationVo;
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.Join;
import javax.persistence.criteria.JoinType;
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.*;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author tzl
* @version 1.0
* @description:
* @date 2022/4/24 17:05
*/
@Slf4j
@Transactional(rollbackFor = RuntimeException.class)
@Service
public class InvitationServiceImpl implements InvitationService {
@Resource
InvitationRepository invitationRepository;
@Resource
VisitorRepository visitorRepository;
@Override
public Result<String> saveInv(InvitationParam invitationParam) {
Visitor visitor = new Visitor();
BeanUtils.copyProperties(invitationParam, visitor);
visitor.setCreateTime(LocalDateTime.now());
//设置创建时间和默认状态
Invitation invitation = Invitation
.builder()
.createTime(LocalDateTime.now())
.status("已发送")
.visitor(visitor)
.InvitationMethod(invitationParam.getInvitationMethod())
.numOfVisitor(invitationParam.getNumOfVisitor())
.inviterId(invitationParam.getInviterId())
.build();
//添加一条访客未到访信息
if (invitationParam.getInvitationMethod().equals("个人")) {
visitor.setVisitorSource("邀请个人");
} else {
visitor.setVisitorSource("邀请公司");
}
visitorRepository.saveAndFlush(visitor);
invitationRepository.saveAndFlush(invitation);
//短信通知该手机用户
return Result.ok();
}
@Override
public Result<String> updateInv(InvitationParam invitationParam, IdParam idParam) {
Optional<Invitation> optional = invitationRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.NOT_FOUND);
}
Invitation invitation = optional.get();
Visitor visitor2 = invitation.getVisitor();
BeanUtils.copyProperties(invitationParam, invitation);
invitationRepository.saveAndFlush(invitation);
//修改访客未到访信息
if (visitor2 == null) {
// 为空添加
visitor2 = new Visitor();
}
BeanUtils.copyProperties(invitationParam, visitor2);
visitorRepository.saveAndFlush(visitor2);
//短信通知该手机用户
//
//
return Result.ok();
}
@Override
public Result<String> deleteInv(IdParam idParam) {
Optional<Invitation> optional = invitationRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.NOT_FOUND);
}
Invitation invitation = optional.get();
invitationRepository.delete(invitation);
visitorRepository.delete(invitation.getVisitor());
//短信通知该手机用户邀请取消
//
//
return Result.ok();
}
@Override
public Result<PageVo<InvitationVo>> pageInv(InvitationQueryParam invitationQueryParam) {
PageVo<InvitationVo> resultVo;
//排序
Sort sort = Sort.by(Sort.Order.desc(Visitor.Fields.createTime));
if (Objects.nonNull(invitationQueryParam.getPageNo()) && Objects.nonNull(invitationQueryParam.getPageSize())) {
//分页
Pageable pageable = PageRequest.of(
invitationQueryParam.getPageNo() - 1,
invitationQueryParam.getPageSize()
);
Page<Invitation> all = invitationRepository.findAll(condition(invitationQueryParam), pageable);
List<InvitationVo> data = all
.get()
.map(invitation -> {
InvitationVo vo = new InvitationVo();
BeanUtils.copyProperties(invitation, vo);
return vo;
})
.collect(Collectors.toList());
resultVo = PageVo.build(data, all.getTotalElements());
} else {
List<Invitation> all = invitationRepository.findAll(condition(invitationQueryParam), sort);
List<InvitationVo> data = all
.stream()
.map(invitation -> {
InvitationVo vo = new InvitationVo();
BeanUtils.copyProperties(invitation, vo);
return vo;
})
.collect(Collectors.toList());
resultVo = PageVo.build(data, data.size());
}
return Result.ok(resultVo);
}
@Override
public Result<String> recallInv(IdParam idParam) {
Optional<Invitation> optional = invitationRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.NOT_FOUND);
}
Invitation invitation = optional.get();
if (invitation.getVisitor().getAppOfVisitTime().isBefore(LocalDateTime.now())) {
return Result.no(Status.BAD_REQUEST, "预约时间已过");
}
invitation.setStatus("已撤回");
Visitor visitor = invitation.getVisitor();
// 逻辑删除对应访客信息
if (visitor != null) {
visitor.setDeleted("Y");
visitorRepository.saveAndFlush(visitor);
}
invitationRepository.saveAndFlush(invitation);
return Result.ok();
}
@Override
public Result<String> sendInv(IdParam idParam) {
Optional<Invitation> optional = invitationRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.NOT_FOUND);
}
Invitation invitation = optional.get();
if (invitation.getVisitor().getAppOfVisitTime().isBefore(LocalDateTime.now())) {
return Result.no(Status.BAD_REQUEST, "预约时间已过");
}
invitation.setStatus("已发送");
//添加访客信息
Visitor visitor = invitation.getVisitor();
// 逻辑删除对应访客信息
if (visitor != null) {
visitor.setDeleted("N");
visitorRepository.saveAndFlush(visitor);
}
invitationRepository.saveAndFlush(invitation);
return Result.ok();
}
@Override
public void exportInv(InvitationQueryParam invitationQueryParam, HttpServletResponse response) {
List<Invitation> invitations = invitationRepository.findAll(condition(invitationQueryParam));
List<InvitationExportExcel> invitationExportExcels = invitations
.stream()
.map(invitation -> {
InvitationExportExcel invitationExportExcel = new InvitationExportExcel();
BeanUtils.copyProperties(invitation, invitationExportExcel);
BeanUtils.copyProperties(invitation.getVisitor(), invitationExportExcel);
return invitationExportExcel;
})
.toList();
try (
DefaultStreamExcelBuilder<InvitationExportExcel> defaultStreamExcelBuilder = DefaultStreamExcelBuilder
.of(InvitationExportExcel.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(invitationExportExcels);
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 Specification<Invitation> condition(InvitationQueryParam invitationQueryParam) {
return (root, query, criteriaBuilder) -> {
Join<Invitation, Visitor> join = root.join("visitor", JoinType.LEFT);
List<Predicate> list = new ArrayList<>();
if (StrUtil.isNotBlank(invitationQueryParam.getVisitorName())) {
list.add(
criteriaBuilder.like(
join.get(Visitor.Fields.visitorName).as(String.class),
"%" + invitationQueryParam.getVisitorName() + "%"
)
);
}
if (StrUtil.isNotBlank(invitationQueryParam.getVisitorMobile())) {
list.add(
criteriaBuilder.like(
join.get(Visitor.Fields.visitorMobile).as(String.class),
"%" + invitationQueryParam.getVisitorMobile() + "%"
)
);
}
if (StrUtil.isNotBlank(invitationQueryParam.getOrgId())) {
list.add(
criteriaBuilder.like(
join.get(Visitor.Fields.orgId).as(String.class),
"%" + invitationQueryParam.getOrgId() + "%"
)
);
}
if (StrUtil.isNotBlank(invitationQueryParam.getTaskType())) {
list.add(
criteriaBuilder.equal(
join.get(Visitor.Fields.taskType).as(String.class),
invitationQueryParam.getTaskType()
)
);
}
if (invitationQueryParam.getInviterId() != null) {
list.add(
criteriaBuilder.equal(
root.get(Invitation.Fields.inviterId).as(String.class),
invitationQueryParam.getInviterId()
)
);
}
if (
Objects.nonNull(invitationQueryParam.getAppOfVisitTimeStart()) &&
Objects.nonNull(invitationQueryParam.getAppOfVisitTimeEnd())
) {
//预约到访时间区间段查询
list.add(
criteriaBuilder.between(
join.get(Visitor.Fields.appOfVisitTime),
invitationQueryParam.getAppOfVisitTimeStart(),
invitationQueryParam.getAppOfVisitTimeEnd()
)
);
}
Predicate[] predicates = new Predicate[list.size()];
query.where(list.toArray(predicates));
return criteriaBuilder.and(list.toArray(predicates));
};
}
// /**
// * 查看被邀人手机号码是否已经发出邀请
// *
// * @param mobile 手机号码
// * @return boolean
// * @author tzl
// * @date 2022/4/24 17:27
// */
// public boolean hasVisitorMobile(String mobile) {
// Invitation invitation = Invitation.builder().visitorMobile(mobile).status("已发送").build();
// long count = invitationRepository.count(Example.of(invitation));
// return count > 0;
// }
}
...@@ -4,15 +4,16 @@ package com.yiring.app.service.visitor.impl; ...@@ -4,15 +4,16 @@ package com.yiring.app.service.visitor.impl;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder; import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
import com.yiring.app.domain.appletUser.AppletUserRepository; import com.yiring.app.domain.appletUser.AppletUserRepository;
import com.yiring.app.domain.visitor.Car;
import com.yiring.app.domain.visitor.Visitor; import com.yiring.app.domain.visitor.Visitor;
import com.yiring.app.domain.visitor.VisitorRepository; import com.yiring.app.domain.visitor.VisitorRepository;
import com.yiring.app.excel.visitor.VisitorExportExcel; import com.yiring.app.excel.visitor.VisitorExportExcel;
import com.yiring.app.param.visitor.VisitorInfoParam;
import com.yiring.app.param.visitor.VisitorListParam;
import com.yiring.app.param.visitor.VisitorParam; import com.yiring.app.param.visitor.VisitorParam;
import com.yiring.app.param.visitor.VisitorQueryParam; import com.yiring.app.param.visitor.VisitorQueryParam;
import com.yiring.app.service.visitor.CarService;
import com.yiring.app.service.visitor.VisitorService; import com.yiring.app.service.visitor.VisitorService;
import com.yiring.app.vo.visitor.VisitorVo; import com.yiring.app.vo.visitor.VisitorVo;
import com.yiring.common.constant.RegEx;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
...@@ -51,97 +52,82 @@ public class VisitorServiceImpl implements VisitorService { ...@@ -51,97 +52,82 @@ public class VisitorServiceImpl implements VisitorService {
VisitorRepository visitorRepository; VisitorRepository visitorRepository;
@Resource @Resource
CarService carService;
@Resource
AppletUserRepository appletUserRepository; AppletUserRepository appletUserRepository;
@Override @Override
public Result<String> saveVisitor(VisitorParam visitorParam) { public Result<String> saveVisitor(VisitorParam visitorParam) {
if (hasVisitorMobile(visitorParam.getVisitorMobile())) { if (visitorParam.getMainVisitorId() != null) {
return Result.no(Status.BAD_REQUEST, "您输入的手机号码已经预约"); //如果主访人员id不为空,
} Visitor optional = visitorRepository.findByIdAndDeleted(visitorParam.getMainVisitorId(), "N");
if (hasCarNum(visitorParam.getVisitorCarNum())) { if (optional == null) {
return Result.no(Status.BAD_REQUEST, "您输入的身份证号码已经预约"); return Result.no(Status.NOT_FOUND, "信息失效,请联系管理员");
}
} }
//设置创建时间和默认状态 //设置创建时间和默认状态
Visitor visitor = Visitor.builder().createTime(LocalDateTime.now()).build(); Visitor visitor = Visitor.builder().createTime(LocalDateTime.now()).build();
BeanUtils.copyProperties(visitorParam, visitor); BeanUtils.copyProperties(visitorParam, visitor);
visitorRepository.saveAndFlush(visitor); //如果有车, 填车辆信息,
return Result.ok(); if (visitorParam.getHasCar() == 1) {
} //校验车辆必填信息
if (StrUtil.isBlank(visitorParam.getCarNum())) {
@Override return Result.no(Status.BAD_REQUEST, "请输入车牌号码");
public Result<String> saveVisitor(VisitorListParam visitorListParam) {
List<VisitorInfoParam> visitorInfos = visitorListParam.getVisitorInfos();
List<String> mobileList = new ArrayList<>();
List<String> carList = new ArrayList<>();
//如果存在重复身份证,电话号码,将其信息装入集合
visitorInfos.forEach(visitorInfoParam -> {
if (hasVisitorMobile(visitorInfoParam.getVisitorMobile())) {
mobileList.add(visitorInfoParam.getVisitorMobile());
} }
if (hasCarNum(visitorInfoParam.getVisitorCarNum())) { if (visitorParam.getCarNum().matches(RegEx.CARNUM)) {
carList.add(visitorInfoParam.getVisitorCarNum()); return Result.no(Status.BAD_REQUEST, "请输入正确的车牌号码");
} }
}); if (StrUtil.isBlank(visitorParam.getCarType())) {
if (mobileList.size() > 0) { return Result.no(Status.BAD_REQUEST, "请输入车辆类型");
return Result.no(Status.BAD_REQUEST, mobileList + "手机号已经预约,请勿重复预约"); }
} if (StrUtil.isBlank(visitorParam.getLabelCard())) {
if (carList.size() > 0) { return Result.no(Status.BAD_REQUEST, "请输入车辆标签卡");
return Result.no(Status.BAD_REQUEST, carList + "身份证已经预约,请勿重复预约"); }
} //需要判断标签卡是否有效
List<Visitor> visitorList = new ArrayList<>(); Car car = Car
//补全访客其他信息 .builder()
visitorInfos.forEach(visitorInfoParam -> { .carNum(visitorParam.getCarNum())
Visitor visitor = new Visitor(); .carType(visitorParam.getCarType())
BeanUtils.copyProperties(visitorInfoParam, visitor); .labelCard(visitorParam.getLabelCard())
visitor.setOrgId(visitorListParam.getOrgId()); .createTime(LocalDateTime.now())
visitor.setNumOfVisitor(visitorListParam.getNumOfVisitor()); .build();
visitor.setReason(visitorListParam.getReason()); carService.saveCarInfo(car);
visitor.setIntervieweeId(visitorListParam.getIntervieweeId()); visitor.setCar(car);
visitorList.add(visitor);
});
visitorRepository.saveAll(visitorList);
//通知用户登录微信小程序查看
//查看该手机是否已注册小程序
// visitorInfos.forEach(visitorInfoParam -> {
// if(appletUserRepository.countMobile(visitorInfoParam.getVisitorMobile())<1){
// 没有的情况下为qi
// }
// });
return Result.ok();
}
@Override
public Result<String> deleteVisitor(IdParam idParam) {
Optional<Visitor> optional = visitorRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.NOT_FOUND);
} }
visitorRepository.delete(optional.get()); visitorRepository.saveAndFlush(visitor);
return Result.ok(); return Result.ok();
} }
@Override @Override
public Result<String> updateVisitor(VisitorParam visitorParam, IdParam idParam) { public Result<String> updateVisitor(VisitorParam visitorParam, IdParam idParam) {
Optional<Visitor> optional = visitorRepository.findById(idParam.getId()); Visitor optional = visitorRepository.findByIdAndDeleted(idParam.getId(), "N");
if (optional.isEmpty()) { if (optional == null) {
return Result.no(Status.NOT_FOUND); return Result.no(Status.NOT_FOUND);
} }
Visitor visitor = optional.get(); //判断标签卡是否正确 生效
if (!visitor.getVisitorCarNum().equals(visitorParam.getVisitorCarNum())) { Car car = optional.getCar();
//当修改身份证时 if (car != null) {
if (hasCarNum(visitorParam.getVisitorCarNum())) { BeanUtils.copyProperties(visitorParam, car);
return Result.no(Status.BAD_REQUEST, "您输入的身份证号码已经预约"); carService.updateCarInfo(car);
} } else {
} if (StrUtil.isNotBlank(visitorParam.getCarNum())) {
if (!visitor.getVisitorMobile().equals(visitorParam.getVisitorMobile())) { car =
//当修改手机号码时 Car
if (hasVisitorMobile(visitorParam.getVisitorMobile())) { .builder()
return Result.no(Status.BAD_REQUEST, "您输入的手机号码已经预约"); .carNum(visitorParam.getCarNum())
.carType(visitorParam.getCarType())
.labelCard(visitorParam.getLabelCard())
.createTime(LocalDateTime.now())
.build();
optional.setCar(car);
carService.saveCarInfo(car);
} else {
optional.setCar(null);
} }
} }
BeanUtils.copyProperties(visitorParam, visitor); BeanUtils.copyProperties(visitorParam, optional);
visitorRepository.saveAndFlush(visitor); visitorRepository.saveAndFlush(optional);
return Result.ok(); return Result.ok();
} }
...@@ -262,21 +248,26 @@ public class VisitorServiceImpl implements VisitorService { ...@@ -262,21 +248,26 @@ public class VisitorServiceImpl implements VisitorService {
return Result.ok(); return Result.ok();
} }
public boolean hasCarNum(String carNum) { @Override
Visitor visitor = Visitor.builder().visitorCarNum(carNum).labelCardStatus("1").build(); public Result<VisitorVo> selectInfo(IdParam idParam) {
long count = visitorRepository.count(Example.of(visitor)); return null;
Visitor visitor1 = Visitor.builder().visitorCarNum(carNum).labelCardStatus("2").build();
long count1 = visitorRepository.count(Example.of(visitor1));
return count + count1 > 0;
} }
public boolean hasVisitorMobile(String mobile) { // public boolean hasCarNum(String carNum) {
Visitor visitor = Visitor.builder().visitorMobile(mobile).labelCardStatus("1").build(); // Visitor visitor = Visitor.builder().visitorCarNum(carNum).labelCardStatus("1").build();
long count = visitorRepository.count(Example.of(visitor)); // long count = visitorRepository.count(Example.of(visitor));
Visitor visitor1 = Visitor.builder().visitorMobile(mobile).labelCardStatus("1").build(); // Visitor visitor1 = Visitor.builder().visitorCarNum(carNum).labelCardStatus("2").build();
long count1 = visitorRepository.count(Example.of(visitor1)); // long count1 = visitorRepository.count(Example.of(visitor1));
return count + count1 > 0; // return count + count1 > 0;
} // }
//
// public boolean hasVisitorMobile(String mobile) {
// Visitor visitor = Visitor.builder().visitorMobile(mobile).labelCardStatus("1").build();
// long count = visitorRepository.count(Example.of(visitor));
// Visitor visitor1 = Visitor.builder().visitorMobile(mobile).labelCardStatus("1").build();
// long count1 = visitorRepository.count(Example.of(visitor1));
// return count + count1 > 0;
// }
public Specification<Visitor> condition(VisitorQueryParam visitorQueryParam) { public Specification<Visitor> condition(VisitorQueryParam visitorQueryParam) {
return (root, query, criteriaBuilder) -> { return (root, query, criteriaBuilder) -> {
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.video;
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.Serial;
import java.io.Serializable;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 监控名称模糊查询反参Vo
* @author tzl
* 2022/4/15 10:48
*/
@ApiModel("VideoNameVo")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class VideoNameVo implements Serializable {
@Serial
private static final long serialVersionUID = 3968078657827350557L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "id", example = "1548548545755")
Long id;
// @ApiModelProperty(value = "坐标点", example = "坐标点")
// Point point;
// @ApiModelProperty(value = "编号", example = "88888888")
// String uuid;
// @ApiModelProperty(value = "m3u8地址", example = "m3u8地址")
// String m3u8;
// @ApiModelProperty(value = "备注", example = "备注")
// String remark;
@ApiModelProperty(value = "摄像头名称", example = "摄像头1")
String videoName;
// @ApiModelProperty(value = "状态", example = "正常")
// String status;
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.car; package com.yiring.app.vo.visitor;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
...@@ -40,8 +38,8 @@ public class CarVo implements Serializable { ...@@ -40,8 +38,8 @@ public class CarVo implements Serializable {
/** /**
* 车辆类型翻译 * 车辆类型翻译
*/ */
@ApiModelProperty(value = "车辆类型(字典翻译)", example = "货车") // @ApiModelProperty(value = "车辆类型(字典翻译)", example = "货车")
String carTypeName; // String carTypeName;
// public String getCarTypeName() { // public String getCarTypeName() {
// if (StrUtil.isNotBlank(carType)) { // if (StrUtil.isNotBlank(carType)) {
...@@ -50,23 +48,13 @@ public class CarVo implements Serializable { ...@@ -50,23 +48,13 @@ public class CarVo implements Serializable {
// return null; // return null;
// } // }
@ApiModelProperty(value = "司机名称", example = "张三")
String driverName;
@ApiModelProperty(value = "司机电话", example = "17688888888")
String driverMobile;
@ApiModelProperty(value = "标签卡", example = "DT8875666") @ApiModelProperty(value = "标签卡", example = "DT8875666")
String labelCard; String labelCard;
// /**
@ApiModelProperty(value = "标签卡状态", example = "1") // * 车辆类型翻译
String labelCardStatus; // */
// @ApiModelProperty(value = "标签卡状态", example = "未发卡")
/** // String labelCardStatusName;
* 车辆类型翻译
*/
@ApiModelProperty(value = "标签卡状态", example = "未发卡")
String labelCardStatusName;
// public String getLabelCardStatusName() { // public String getLabelCardStatusName() {
// if (StrUtil.isNotBlank(carType)) { // if (StrUtil.isNotBlank(carType)) {
...@@ -75,24 +63,24 @@ public class CarVo implements Serializable { ...@@ -75,24 +63,24 @@ public class CarVo implements Serializable {
// return null; // return null;
// } // }
@ApiModelProperty(value = "单位id", example = "湖南壹润科技") // @ApiModelProperty(value = "单位id", example = "湖南壹润科技")
String orgId; // String orgId;
//
@ApiModelProperty(value = "被访人id", example = "1") // @ApiModelProperty(value = "被访人id", example = "1")
String intervieweeId; // String intervieweeId;
//
@ApiModelProperty(value = "来访原因", example = "装货") // @ApiModelProperty(value = "来访原因", example = "装货")
String reason; // String reason;
//
@ApiModelProperty(value = "收卡时间", example = "2022-04-11 17:25:33") // @ApiModelProperty(value = "收卡时间", example = "2022-04-11 17:25:33")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime cardRecTime; // LocalDateTime cardRecTime;
@ApiModelProperty(value = "创建时间", example = "2022-04-11 17:25:33") // @ApiModelProperty(value = "创建时间", example = "2022-04-11 17:25:33")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime createTime; // LocalDateTime createTime;
//
@ApiModelProperty(value = "发卡时间", example = "2022-04-11 17:25:33") // @ApiModelProperty(value = "发卡时间", example = "2022-04-11 17:25:33")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime cardSendTime; // LocalDateTime cardSendTime;
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.visitor;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.visitor.Visitor;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 邀请反参
* @author tzl
* @version 1.0
* @description:
* @date 2022/4/25 11:14
*/
@ApiModel("InvitationVo")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class InvitationVo implements Serializable {
@Serial
private static final long serialVersionUID = 5496232471863298479L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "id", example = "1548548545755")
Long id;
@ApiModelProperty(value = "邀请原因/来访原因", example = "随便看看")
String reason;
@ApiModelProperty(value = "邀请方式:个人 公司", example = "个人")
String InvitationMethod;
@ApiModelProperty(value = "邀请人数", example = "1")
Integer numOfVisitor;
@ApiModelProperty(value = "邀请人id", example = "1")
Long inviterId;
@ApiModelProperty(value = "邀请人姓名", example = "李四")
String inviterName;
@ApiModelProperty(value = "邀请人所属部门", example = "开发部")
String inviterDept;
@ApiModelProperty(value = "状态", example = "撤回")
String status;
@ApiModelProperty(value = "被邀请访客")
Visitor visitor;
}
...@@ -4,6 +4,7 @@ package com.yiring.app.vo.visitor; ...@@ -4,6 +4,7 @@ package com.yiring.app.vo.visitor;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.visitor.Car;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
...@@ -77,4 +78,7 @@ public class VisitorVo implements Serializable { ...@@ -77,4 +78,7 @@ public class VisitorVo implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "发卡时间", example = "2022-04-19 14:28:00") @ApiModelProperty(value = "发卡时间", example = "2022-04-19 14:28:00")
LocalDateTime cardSendTime; LocalDateTime cardSendTime;
@ApiModelProperty(value = "车辆反参")
Car car;
} }
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.car; package com.yiring.app.web.visitor;
import com.yiring.app.param.car.CarParam; import com.yiring.app.param.visitor.CarQueryParam;
import com.yiring.app.param.car.CarQueryParam; import com.yiring.app.service.visitor.CarService;
import com.yiring.app.service.car.CarService; import com.yiring.app.vo.visitor.CarVo;
import com.yiring.app.vo.car.CarVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
...@@ -38,17 +37,17 @@ public class CarController { ...@@ -38,17 +37,17 @@ public class CarController {
@Resource @Resource
CarService carService; CarService carService;
@ApiOperation(value = "新增车辆来访信息") // @ApiOperation(value = "新增车辆来访信息")
@PostMapping("saveCarInfo") // @PostMapping("saveCarInfo")
public Result<Long> saveCarInfo(@Valid CarParam carParam) { // public Result<Long> saveCarInfo(@Valid CarParam carParam) {
return carService.saveCarInfo(carParam); // return carService.saveCarInfo(carParam);
} // }
@ApiOperation(value = "修改车辆来访信息") // @ApiOperation(value = "修改车辆来访信息")
@PostMapping("updateCarInfo") // @PostMapping("updateCarInfo")
public Result<Long> updateCarInfo(@Valid CarParam carParam, @Valid IdParam idParam) { // public Result<Long> updateCarInfo(@Valid CarParam carParam, @Valid IdParam idParam) {
return carService.updateCarInfo(carParam, idParam); // return carService.updateCarInfo(carParam, idParam);
} // }
@ApiOperation(value = "收卡") @ApiOperation(value = "收卡")
@PostMapping("cardRec") @PostMapping("cardRec")
...@@ -63,17 +62,17 @@ public class CarController { ...@@ -63,17 +62,17 @@ public class CarController {
return carService.cardSend(idParam, labelCard); return carService.cardSend(idParam, labelCard);
} }
@ApiOperation(value = "删除车辆来访信息") // @ApiOperation(value = "删除车辆来访信息")
@PostMapping("deleteCarInfo") // @PostMapping("deleteCarInfo")
public Result<String> deleteCarInfo(@Valid IdParam idParam) { // public Result<String> deleteCarInfo(@Valid IdParam idParam) {
return carService.deleteCarInfo(idParam); // return carService.deleteCarInfo(idParam);
} // }
@ApiOperation(value = "查看车辆来访信息详情") // @ApiOperation(value = "查看车辆来访信息详情")
@GetMapping("getCarInfo") // @GetMapping("getCarInfo")
public Result<CarVo> getCarInfo(@Valid IdParam idParam) { // public Result<CarVo> getCarInfo(@Valid IdParam idParam) {
return carService.getCarInfo(idParam); // return carService.getCarInfo(idParam);
} // }
@ApiOperation(value = "查看车辆来访信息(分页)") @ApiOperation(value = "查看车辆来访信息(分页)")
@GetMapping("pageCarInfo") @GetMapping("pageCarInfo")
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.visitor;
import com.yiring.app.param.visitor.InvitationParam;
import com.yiring.app.param.visitor.InvitationQueryParam;
import com.yiring.app.service.visitor.InvitationService;
import com.yiring.app.vo.visitor.InvitationVo;
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
* @version 1.0
* @description:
* @date 2022/4/25 11:35
*/
@Slf4j
@Validated
@Api(tags = "Invitation(邀请)")
@RestController
@RequestMapping("/invitation/")
public class InvitationController {
@Resource
InvitationService invitationService;
@ApiOperation(value = "新增邀请信息")
@PostMapping("saveInv")
public Result<String> saveInv(@Valid InvitationParam invitationParam) {
return invitationService.saveInv(invitationParam);
}
@ApiOperation(value = "修改邀请信息")
@PostMapping("updateInv")
public Result<String> updateInv(@Valid InvitationParam invitationParam, @Valid IdParam idParam) {
return invitationService.updateInv(invitationParam, idParam);
}
@ApiOperation(value = "撤回")
@PostMapping("recallInv")
public Result<String> recallInv(@Valid IdParam idParam) {
return invitationService.recallInv(idParam);
}
@ApiOperation(value = "发起邀请")
@PostMapping("sendInv")
public Result<String> sendInv(@Valid IdParam idParam) {
return invitationService.sendInv(idParam);
}
@ApiOperation(value = "删除邀请")
@PostMapping("deleteInv")
public Result<String> deleteInv(@Valid IdParam idParam) {
return invitationService.deleteInv(idParam);
}
@ApiOperation(value = "查看邀请信息(分页)")
@GetMapping("pageInv")
public Result<PageVo<InvitationVo>> pageInv(@Valid InvitationQueryParam invitationQueryParam) {
return invitationService.pageInv(invitationQueryParam);
}
@ApiOperation(value = "导出邀请信息", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@PostMapping("exportInv")
public void exportInv(HttpServletResponse response, @Valid InvitationQueryParam invitationQueryParam) {
invitationService.exportInv(invitationQueryParam, response);
}
}
...@@ -61,11 +61,11 @@ public class VisitorController { ...@@ -61,11 +61,11 @@ public class VisitorController {
return visitorService.cardSend(labelCard, idParam); return visitorService.cardSend(labelCard, idParam);
} }
@ApiOperation(value = "删除访客信息") // @ApiOperation(value = "删除访客信息")
@PostMapping("deleteVisitor") // @PostMapping("deleteVisitor")
public Result<String> deleteVisitor(@Valid IdParam idParam) { // public Result<String> deleteVisitor(@Valid IdParam idParam) {
return visitorService.deleteVisitor(idParam); // return visitorService.deleteVisitor(idParam);
} // }
@ApiOperation(value = "查看访客信息详情") @ApiOperation(value = "查看访客信息详情")
@GetMapping("selectVisitor") @GetMapping("selectVisitor")
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论