Kaynağa Gözat

完成访客预约模块基本接口

codingliang 1 yıl önce
ebeveyn
işleme
f1aed16384

+ 56 - 0
src/main/java/com/template/api/WelcomeVisitorControllerAPI.java

@@ -0,0 +1,56 @@
+package com.template.api;
+
+import com.template.model.query.WelcomeVisitorQuery;
+import com.template.model.request.WelcomeVisitorRequest;
+import com.template.model.result.CommonResult;
+import com.template.model.result.PageUtils;
+import com.template.model.vo.WelcomeVisitorVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.List;
+
+/**
+ * 访客相关接口
+ * @author codingliang
+ * @date 2025-06-16
+ */
+@RequestMapping("api/visitor")
+@Api(tags = {"visitor"}, value = "访客")
+public interface WelcomeVisitorControllerAPI {
+
+    @PostMapping
+    @ApiOperation(value = "新增访客记录")
+    CommonResult addVisitor(@Validated @RequestBody WelcomeVisitorRequest visitorRequest);
+
+    @GetMapping
+    @ApiOperation(value = "获取当前用户访客记录")
+    CommonResult<WelcomeVisitorVO> getByCurUser();
+
+    @DeleteMapping
+    @ApiOperation(value = "删除当前用户的访客记录")
+    CommonResult deleteByCurUser();
+
+    @GetMapping("admin/page")
+    @ApiOperation(value = "访客记录分页")
+    CommonResult<PageUtils<WelcomeVisitorVO>> page(@Validated WelcomeVisitorQuery visitorQuery);
+
+    @PostMapping("admin/add")
+    @ApiOperation(value = "管理员新增访客记录")
+    CommonResult addVisitorByAdmin(@Validated @RequestBody WelcomeVisitorRequest visitorRequest);
+
+    @GetMapping("admin/{id}")
+    @ApiOperation(value = "根据记录id获取访客记录")
+    CommonResult<WelcomeVisitorVO> getById(@PathVariable Long id);
+
+    @DeleteMapping("admin/batch-del")
+    @ApiOperation(value = "删除当前用户的所有访客记录")
+    CommonResult deleteByIds(@RequestBody List<Long> ids);
+}

+ 1 - 0
src/main/java/com/template/common/result/ResponseStatusEnum.java

@@ -39,6 +39,7 @@ public enum ResponseStatusEnum implements Code{
     SYSTEM_LOGIN_ERROR(401,false,"无效token"),
     SYSTEM_LOGIN_ERROR(401,false,"无效token"),
     PARAM_ERROR(560, false, "参数不能为空!"),
     PARAM_ERROR(560, false, "参数不能为空!"),
     GZH_ERROR(561, false, "设置失败,请先关联公众号!"),
     GZH_ERROR(561, false, "设置失败,请先关联公众号!"),
+    DATA_NOT_FOUND(998, false, "数据不存在"),
     EXISTS(999,false,"已存在");
     EXISTS(999,false,"已存在");
 
 
     // 响应业务状态
     // 响应业务状态

+ 37 - 0
src/main/java/com/template/common/utils/BeanUtil.java

@@ -0,0 +1,37 @@
+package com.template.common.utils;
+
+import org.springframework.beans.BeanUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Supplier;
+
+public class BeanUtil {
+
+	/**
+	 * 普通对象复制
+	 *
+	 * @param source
+	 * @param target
+	 */
+	public static void copyProperties(Object source, Object target) {
+		BeanUtils.copyProperties(source, target);
+	}
+
+	/**
+	 * 集合数据的拷贝
+	 *
+	 * @param sources: 数据源类
+	 * @param target:  目标类::new(eg: UserVO::new)
+	 * @return
+	 */
+	public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target) {
+		List<T> list = new ArrayList<>(sources.size());
+		for (S source : sources) {
+			T t = target.get();
+			copyProperties(source, t);
+			list.add(t);
+		}
+		return list;
+	}
+}

+ 33 - 0
src/main/java/com/template/common/utils/IPageUtil.java

@@ -0,0 +1,33 @@
+package com.template.common.utils;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.template.model.query.PageQuery;
+
+/**
+ * Ipage工具
+ * @author codingliang
+ * @date 2025-06-17
+ */
+public class IPageUtil<T> {
+    /**
+     * 获取分页对象
+     *
+     * @param query 分页参数
+     */
+    public IPage<T> getPage(PageQuery query) {
+        Page<T> page = new Page<>(query.getPage(), query.getLimit());
+
+        // 排序
+        if (StrUtil.isNotBlank(query.getOrder())) {
+            if (query.isAsc()) {
+                return page.setAsc(query.getOrder());
+            } else {
+                return page.setDesc(query.getOrder());
+            }
+        }
+
+        return page;
+    }
+}

+ 68 - 11
src/main/java/com/template/controller/WelcomeVisitorController.java

@@ -1,20 +1,77 @@
 package com.template.controller;
 package com.template.controller;
 
 
-
-import org.springframework.web.bind.annotation.RequestMapping;
-
+import cn.hutool.core.util.StrUtil;
+import com.template.api.WelcomeVisitorControllerAPI;
+import com.template.common.exception.MyCustomException;
+import com.template.common.result.ResponseStatusEnum;
+import com.template.model.query.WelcomeVisitorQuery;
+import com.template.model.request.WelcomeVisitorRequest;
+import com.template.model.result.CommonResult;
+import com.template.model.result.PageUtils;
+import com.template.model.vo.WelcomeVisitorVO;
+import com.template.services.WelcomeVisitorService;
+import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
+import java.util.Arrays;
+import java.util.List;
+
 /**
 /**
- * <p>
- *  前端控制器
- * </p>
- *
- * @author ceshi
- * @since 2025-06-16
+ * 访客相关接口
+ * @author codingliang
+ * @date 2025-06-16
  */
  */
 @RestController
 @RestController
-public class WelcomeVisitorController {
+@RequiredArgsConstructor
+public class WelcomeVisitorController implements WelcomeVisitorControllerAPI {
 
 
-}
+    private final WelcomeVisitorService welcomeVisitorService;
+
+
+    @Override
+    public CommonResult addVisitor(WelcomeVisitorRequest visitorRequest) {
+        welcomeVisitorService.addVisitor(visitorRequest);
+        return CommonResult.ok();
+    }
+
+    @Override
+    public CommonResult<WelcomeVisitorVO> getByCurUser() {
+        WelcomeVisitorVO vo = welcomeVisitorService.getByCurUser();
+        return CommonResult.ok(vo);
+    }
 
 
+    @Override
+    public CommonResult<WelcomeVisitorVO> getById(Long id) {
+        WelcomeVisitorVO vo = welcomeVisitorService.getOneById(id);
+        return CommonResult.ok(vo);
+    }
+
+    @Override
+    public CommonResult deleteByCurUser() {
+        welcomeVisitorService.deleteByCurUser();
+        return CommonResult.ok();
+    }
+
+    @Override
+    public CommonResult<PageUtils<WelcomeVisitorVO>> page(WelcomeVisitorQuery visitorQuery) {
+        PageUtils<WelcomeVisitorVO> pages = welcomeVisitorService.page(visitorQuery);
+        return CommonResult.ok(pages);
+    }
+
+    @Override
+    public CommonResult addVisitorByAdmin(WelcomeVisitorRequest visitorRequest) {
+        if (StrUtil.isBlank(visitorRequest.getStudentCard())) {
+            throw new MyCustomException(ResponseStatusEnum.SEND_PARAMS);
+        }
+
+        welcomeVisitorService.addVisitorByAdmin(visitorRequest);
+
+        return CommonResult.ok();
+    }
+
+    @Override
+    public CommonResult deleteByIds(List<Long> ids) {
+        welcomeVisitorService.removeByIds(ids);
+        return null;
+    }
+}

+ 0 - 2
src/main/java/com/template/model/pojo/WelcomeVisitor.java

@@ -62,6 +62,4 @@ public class WelcomeVisitor implements Serializable {
 
 
     @ApiModelProperty(value = "备注")
     @ApiModelProperty(value = "备注")
     private String remark;
     private String remark;
-
-
 }
 }

+ 32 - 0
src/main/java/com/template/model/query/PageQuery.java

@@ -0,0 +1,32 @@
+package com.template.model.query;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Range;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 分页查询
+ * @author codingliang
+ * @date 2025-06-17
+ */
+@Data
+public class PageQuery {
+    @NotNull(message = "页码不能为空")
+    @Min(value = 1, message = "页码最小值为 1")
+    @ApiModelProperty(value = "当前页码", required = true)
+    Integer page;
+
+    @NotNull(message = "每页条数不能为空")
+    @Range(min = 1, max = 1000, message = "每页条数,取值范围 1-1000")
+    @ApiModelProperty(value = "每页条数", required = true)
+    Integer limit;
+
+    @ApiModelProperty(value = "排序字段")
+    String order;
+
+    @ApiModelProperty(value = "是否升序")
+    boolean asc;
+}

+ 21 - 0
src/main/java/com/template/model/query/WelcomeVisitorQuery.java

@@ -0,0 +1,21 @@
+package com.template.model.query;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 访客查询
+ * @author codingliang
+ * @date 2025-06-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WelcomeVisitorQuery extends PageQuery {
+
+    @ApiModelProperty(value = "车牌号,模糊搜索")
+    private String carNumber;
+
+    @ApiModelProperty(value = "访客姓名,模糊搜索")
+    private String name;
+}

+ 67 - 0
src/main/java/com/template/model/request/WelcomeVisitorRequest.java

@@ -0,0 +1,67 @@
+package com.template.model.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.io.Serializable;
+
+/**
+ * VisitorRequest对象
+ */
+@Data
+@ApiModel(value="VisitorRequest")
+public class WelcomeVisitorRequest implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键ID")
+    private Integer id;
+
+    @ApiModelProperty(value = "学生身份证号")
+    private String studentCard;
+
+    @ApiModelProperty(value = "访客姓名")
+    @NotBlank(message = "访客姓名不能为空")
+    private String name;
+
+    @ApiModelProperty(value = "访客手机号")
+    @NotBlank(message = "访客手机号不能为空")
+    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
+    private String phone;
+
+    @ApiModelProperty(value = "证件号")
+    @NotBlank(message = "证件号不能为空")
+    private String cardId;
+
+    @ApiModelProperty(value = "校区名称")
+    @NotBlank(message = "校区名称不能为空")
+    private String school;
+
+    @ApiModelProperty(value = "到访开始时间")
+    @NotBlank(message = "到访开始时间不能为空")
+    @Pattern(regexp = "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]) (2[0-3]|[01]\\d):[0-5]\\d:[0-5]\\d$", message = "到访开始时间格式应为 yyyy-MM-dd HH:mm:ss")
+    private String startTime;
+
+    @ApiModelProperty(value = "到访结束时间")
+    @NotBlank(message = "到访结束时间不能为空")
+    @Pattern(regexp = "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]) (2[0-3]|[01]\\d):[0-5]\\d:[0-5]\\d$", message = "到访结束时间格式应为 yyyy-MM-dd HH:mm:ss")
+    private String endTime;
+
+    @ApiModelProperty(value = "车牌号")
+    @NotBlank(message = "车牌号不能为空")
+    private String carNumber;
+
+    @ApiModelProperty(value = "同行人数")
+    @NotNull(message = "同行人数不能为空")
+    @Min(value = 1, message = "同行人数不能少于1")
+    private Integer peerNum;
+
+    @ApiModelProperty(value = "访问事由")
+    @NotBlank(message = "访问事由不能为空")
+    private String visitorReason;
+}

+ 0 - 2
src/main/java/com/template/model/result/PageUtils.java

@@ -2,7 +2,6 @@ package com.template.model.result;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import lombok.Data;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
 import java.util.List;
 import java.util.List;
@@ -60,5 +59,4 @@ public class PageUtils<T> implements Serializable {
 		this.currPage = (int)page.getCurrent();
 		this.currPage = (int)page.getCurrent();
 		this.totalPage = (int)page.getPages();
 		this.totalPage = (int)page.getPages();
 	}
 	}
-
 }
 }

+ 50 - 0
src/main/java/com/template/model/vo/WelcomeVisitorVO.java

@@ -0,0 +1,50 @@
+package com.template.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value="WelcomeVisitorVO对象")
+public class WelcomeVisitorVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键ID")
+    private Integer id;
+
+    @ApiModelProperty(value = "学生身份证号")
+    private String studentCard;
+
+    @ApiModelProperty(value = "访客姓名")
+    private String name;
+
+    @ApiModelProperty(value = "访客手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "证件号")
+    private String cardId;
+
+    @ApiModelProperty(value = "校区名称")
+    private String school;
+
+    @ApiModelProperty(value = "到访开始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "到访结束时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "车牌号")
+    private String carNumber;
+
+    @ApiModelProperty(value = "同行人数")
+    private Integer peerNum;
+
+    @ApiModelProperty(value = "访问事由")
+    private String visitorReason;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+}

+ 41 - 6
src/main/java/com/template/services/WelcomeVisitorService.java

@@ -2,15 +2,50 @@ package com.template.services;
 
 
 import com.template.model.pojo.WelcomeVisitor;
 import com.template.model.pojo.WelcomeVisitor;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.template.model.query.WelcomeVisitorQuery;
+import com.template.model.request.WelcomeVisitorRequest;
+import com.template.model.result.PageUtils;
+import com.template.model.vo.WelcomeVisitorVO;
 
 
 /**
 /**
- * <p>
- *  服务类
- * </p>
- *
- * @author ceshi
- * @since 2025-06-16
+ * 访客service
  */
  */
 public interface WelcomeVisitorService extends IService<WelcomeVisitor> {
 public interface WelcomeVisitorService extends IService<WelcomeVisitor> {
 
 
+    /**
+     * 新增访客记录
+     * @param visitorRequest 访客信息
+     */
+    void addVisitor(WelcomeVisitorRequest visitorRequest);
+
+    /**
+     * 获取当前用户访客记录
+     * @return 访客信息
+     */
+    WelcomeVisitorVO getByCurUser();
+
+    /**
+     * 根据记录id获取访客记录
+     * @param id 记录id
+     * @return 访客信息
+     */
+    WelcomeVisitorVO getOneById(Long id);
+
+    /**
+     * 删除当前用户的访客记录
+     */
+    void deleteByCurUser();
+
+    /**
+     * 管理员新增访客记录
+     * @param visitorRequest 访客信息
+     */
+    void addVisitorByAdmin(WelcomeVisitorRequest visitorRequest);
+
+    /**
+     * 访客记录分页
+     * @param visitorQuery 分页条件
+     * @return 分页结果
+     */
+    PageUtils<WelcomeVisitorVO> page(WelcomeVisitorQuery visitorQuery);
 }
 }

+ 112 - 10
src/main/java/com/template/services/impl/WelcomeVisitorServiceImpl.java

@@ -1,20 +1,122 @@
 package com.template.services.impl;
 package com.template.services.impl;
 
 
-import com.template.model.pojo.WelcomeVisitor;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.template.common.exception.MyCustomException;
+import com.template.common.result.ResponseStatusEnum;
+import com.template.common.utils.BeanUtil;
+import com.template.common.utils.IPageUtil;
 import com.template.mapper.WelcomeVisitorMapper;
 import com.template.mapper.WelcomeVisitorMapper;
+import com.template.model.pojo.WelcomeVisitor;
+import com.template.model.query.WelcomeVisitorQuery;
+import com.template.model.request.WelcomeVisitorRequest;
+import com.template.model.result.PageUtils;
+import com.template.model.vo.WelcomeVisitorVO;
 import com.template.services.WelcomeVisitorService;
 import com.template.services.WelcomeVisitorService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
-/**
- * <p>
- *  服务实现类
- * </p>
- *
- * @author ceshi
- * @since 2025-06-16
- */
+import java.util.List;
+
 @Service
 @Service
 public class WelcomeVisitorServiceImpl extends ServiceImpl<WelcomeVisitorMapper, WelcomeVisitor> implements WelcomeVisitorService {
 public class WelcomeVisitorServiceImpl extends ServiceImpl<WelcomeVisitorMapper, WelcomeVisitor> implements WelcomeVisitorService {
 
 
+    @Override
+    public void addVisitor(WelcomeVisitorRequest visitorRequest) {
+        // TODO 获取studyCard
+        String studyCard = "";
+
+        // 查询当前用户是否已有访客记录
+        LambdaQueryWrapper<WelcomeVisitor> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(WelcomeVisitor::getStudentCard, studyCard);
+        if (this.count(queryWrapper) > 0) {
+            throw new MyCustomException(ResponseStatusEnum.EXISTS);
+        }
+
+        // TODO 查询学生学费缴纳情况
+
+        // 新增访客记录
+        WelcomeVisitor visitor = new WelcomeVisitor();
+        BeanUtils.copyProperties(visitorRequest, visitor);
+        visitor.setStudentCard(studyCard);
+
+        save(visitor);
+    }
+
+    @Override
+    public WelcomeVisitorVO getByCurUser() {
+        // TODO 获取studyCard
+        String studyCard = "";
+
+        LambdaQueryWrapper<WelcomeVisitor> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(WelcomeVisitor::getStudentCard, studyCard);
+
+        WelcomeVisitor visitor = this.getOne(queryWrapper);
+        if (ObjectUtil.isNull(visitor)) {
+            throw new MyCustomException(ResponseStatusEnum.DATA_NOT_FOUND);
+        }
+
+        WelcomeVisitorVO vo = new WelcomeVisitorVO();
+        BeanUtils.copyProperties(visitor, vo);
+
+        return vo;
+    }
+
+    @Override
+    public WelcomeVisitorVO getOneById(Long id) {
+        WelcomeVisitor visitor = this.getById(id);
+
+        if (ObjectUtil.isNull(visitor)) {
+            throw new MyCustomException(ResponseStatusEnum.DATA_NOT_FOUND);
+        }
+
+        WelcomeVisitorVO vo = new WelcomeVisitorVO();
+        BeanUtils.copyProperties(visitor, vo);
+
+        return vo;
+    }
+
+    @Override
+    public void deleteByCurUser() {
+        // TODO 获取studyCard
+        String studyCard = "";
+
+        LambdaQueryWrapper<WelcomeVisitor> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(WelcomeVisitor::getStudentCard, studyCard);
+
+        remove(queryWrapper);
+    }
+
+    @Override
+    public void addVisitorByAdmin(WelcomeVisitorRequest visitorRequest) {
+        // 查询当前用户是否已有访客记录
+        LambdaQueryWrapper<WelcomeVisitor> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(WelcomeVisitor::getStudentCard, visitorRequest.getStudentCard());
+        if (this.count(queryWrapper) > 0) {
+            throw new MyCustomException(ResponseStatusEnum.EXISTS);
+        }
+
+        // TODO 查询学生学费缴纳情况
+
+        // 新增访客记录
+        WelcomeVisitor visitor = new WelcomeVisitor();
+        BeanUtils.copyProperties(visitorRequest, visitor);
+
+        save(visitor);
+    }
+
+    @Override
+    public PageUtils<WelcomeVisitorVO> page(WelcomeVisitorQuery visitorQuery) {
+        LambdaQueryWrapper<WelcomeVisitor> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(StrUtil.isNotBlank(visitorQuery.getCarNumber()), WelcomeVisitor::getCarNumber, visitorQuery.getCarNumber());
+        wrapper.like(StrUtil.isNotBlank(visitorQuery.getName()), WelcomeVisitor::getName, visitorQuery.getName());
+
+        IPage<WelcomeVisitor> page = baseMapper.selectPage(new IPageUtil<WelcomeVisitor>().getPage(visitorQuery), wrapper);
+
+        List<WelcomeVisitorVO> welcomeVisitorVOS = BeanUtil.copyListProperties(page.getRecords(), WelcomeVisitorVO::new);
+        return new PageUtils<>(welcomeVisitorVOS, (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent());
+    }
 }
 }