Ver código fonte

feature: 消费系统
1.人脸消费表建立

luoyb 1 ano atrás
pai
commit
87b21539cf
28 arquivos alterados com 884 adições e 12 exclusões
  1. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/ThirdPayBusiness.java
  2. 43 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/ArcFaceBusiness.java
  3. 8 6
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/FaceCollectController.java
  4. 50 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/PtArcFaceFeature.java
  5. 52 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/PtArcFaceKey.java
  6. 45 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/PtTermFaceVersion.java
  7. 51 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/PtArcFaceFeatureBo.java
  8. 50 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/PtArcFaceKeyBo.java
  9. 45 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/PtTermFaceVersionBo.java
  10. 18 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/convert/YcFaceFeatureVoConvert.java
  11. 67 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/PtArcFaceFeatureVo.java
  12. 54 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/PtArcFaceKeyVo.java
  13. 48 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/PtTermFaceVersionVo.java
  14. 4 5
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/YcFaceFeatureVo.java
  15. 23 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/PtArcFaceFeatureMapper.java
  16. 18 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/PtArcFaceKeyMapper.java
  17. 19 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/PtTermFaceVersionMapper.java
  18. 25 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IFaceEngineService.java
  19. 27 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IPtArcFaceFeatureService.java
  20. 14 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IPtArcFaceKeyService.java
  21. 21 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IPtTermFaceVersionService.java
  22. 44 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/FaceEngineServiceImpl.java
  23. 32 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/PtArcFaceFeatureServiceImpl.java
  24. 20 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/PtArcFaceKeyServiceImpl.java
  25. 43 0
      ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/PtTermFaceVersionServiceImpl.java
  26. 25 0
      ruoyi-server/ruoyi-server-consume/src/main/resources/mapper/consume/PtArcFaceFeatureMapper.xml
  27. 19 0
      ruoyi-server/ruoyi-server-consume/src/main/resources/mapper/consume/PtArcFaceKeyMapper.xml
  28. 18 0
      ruoyi-server/ruoyi-server-consume/src/main/resources/mapper/consume/PtTermFaceVersionMapper.xml

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/ThirdPayBusiness.java

@@ -126,7 +126,7 @@ public class ThirdPayBusiness {
         if (ObjectUtil.isEmpty(userAccountVo)) {
             return R.fail(String.format("[无此充值账户信息]-[userId:%s]", userId));
         }
-        String callBackUrl = thirdPayConfig.getRechargeBackUrl() + "result/";
+        String callBackUrl = thirdPayConfig.getRechargeBackUrl();
         PayOrderBo payOrderBo = new PayOrderBo();
         payOrderBo.setStationId(stationId.longValue());
         payOrderBo.setCreditTime(DateUtil.date());

+ 43 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/ArcFaceBusiness.java

@@ -0,0 +1,43 @@
+package org.dromara.server.consume.business;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.server.consume.domain.vo.YcFaceFeatureVo;
+import org.dromara.server.consume.domain.vo.PtArcFaceFeatureVo;
+import org.dromara.server.consume.service.IPtArcFaceFeatureService;
+import org.dromara.server.consume.service.IPtTermFaceVersionService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * name: ArcFaceBusiness
+ * package: org.dromara.server.consume.business
+ * description: 人脸业务处理
+ * date: 2025-02-26 16:12:29 16:12
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service
+public class ArcFaceBusiness {
+    private final IPtTermFaceVersionService termFaceVersionService;
+    private final IPtArcFaceFeatureService arcFaceFeatureService;
+
+    public List<YcFaceFeatureVo> getIncrementFeatureDataUser(Integer termNo) {
+        Long versionTime = termFaceVersionService.getFaceVersionByTerm(termNo);
+        if(ObjectUtil.isEmpty(versionTime) || versionTime==0L){
+            // 如果没有该值或为0,那么认为是初次调用,因此返回全量数据
+            return List.of();
+        }
+
+        Date lastDown = DateUtil.date(versionTime);
+        List<PtArcFaceFeatureVo> faceFeatureVoList = arcFaceFeatureService.getIncrFeatureDataUser(lastDown);
+        return MapstructUtils.convert(faceFeatureVoList, YcFaceFeatureVo.class);
+    }
+}

+ 8 - 6
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/FaceCollectController.java

@@ -1,7 +1,10 @@
 package org.dromara.server.consume.controller.v1;
 
+import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.api.ReturnResult;
-import org.dromara.server.consume.domain.bo.FaceFeatureBo;
+import org.dromara.server.consume.business.ArcFaceBusiness;
+import org.dromara.server.consume.domain.vo.YcFaceFeatureVo;
+import org.dromara.server.consume.service.IFaceEngineService;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -21,13 +24,13 @@ import java.util.List;
  * @since JDK 1.8
  */
 @RestController
+@RequiredArgsConstructor
 @RequestMapping("/v1/faceFeature")
 public class FaceCollectController {
+    private final ArcFaceBusiness faceBusiness;
     /**
-     * 增量下载
-     *
+     * 增量下载人脸特征数据
      * 建议设备每10分钟,从后台获取一次增量数据
-     *
      * 后台会根据设备当前的人脸权限版本号,来取出有更新的人脸数据(若人脸版本号不存在,则返回全量人脸数据)
      *
      * @param termNo 设备机号
@@ -36,8 +39,7 @@ public class FaceCollectController {
      */
     @GetMapping(value = "/incrFeature/{termNo}")
     public ReturnResult getIncrementFeatureData(@PathVariable("termNo") Integer termNo) {
-        //List<FaceFeatureBo> featureData = faceEngineService.getIncrFeatureDataUser(termNo);
-        List<FaceFeatureBo> featureData = new ArrayList<>();
+        List<YcFaceFeatureVo> featureData = faceBusiness.getIncrementFeatureDataUser(termNo);
         if (featureData == null) {
             featureData = new ArrayList<>();
         }

+ 50 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/PtArcFaceFeature.java

@@ -0,0 +1,50 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * name: PtArcFaceFeature
+ * package: org.dromara.server.consume.domain
+ * description: 人脸特征对象实体
+ * date: 2025-02-26 16:01:34 16:01
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_pt_arcFaceFeature")
+public class PtArcFaceFeature extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 特征Id,主键
+     */
+    @TableId(value = "feature_id")
+    private Long featureId;
+
+    /**
+     * 人员Id
+     */
+    private Long userId;
+
+    /**
+     * 人员照片地址
+     */
+    private String photo;
+
+    /**
+     * 人脸特征数据
+     */
+    private String featureData;
+}
+

+ 52 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/PtArcFaceKey.java

@@ -0,0 +1,52 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * name: PtArcFaceKey
+ * package: org.dromara.server.consume.domain
+ * description: 消费机激活表
+ * date: 2025-02-26 14:44:35 14:44
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_pt_arcFaceKey")
+public class PtArcFaceKey extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 激活Id,主键
+     */
+    @TableId(value = "active_id")
+    private Long activeId;
+
+    /**
+     * 激活码
+     */
+    private String activeKey;
+
+    /**
+     * 注册时间
+     */
+    private Date registerTime;
+
+    /**
+     * 设备序列号
+     */
+    private String termSn;
+
+
+}

+ 45 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/PtTermFaceVersion.java

@@ -0,0 +1,45 @@
+package org.dromara.server.consume.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * name: PtTermFaceVersion
+ * package: org.dromara.server.consume.domain
+ * description:
+ * date: 2025-02-26 15:16:14 15:16
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_pt_termFaceVersion")
+public class PtTermFaceVersion extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 版本Id,主键
+     */
+    @TableId(value = "version_id")
+    private Long versionId;
+
+    /**
+     * 设备机号
+     */
+    private Long termNo;
+
+    /**
+     * 版本时间
+     */
+    private Long versionTime;
+}
+

+ 51 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/PtArcFaceFeatureBo.java

@@ -0,0 +1,51 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.PtArcFaceFeature;
+import jakarta.validation.constraints.*;
+/**
+ * name: PtArcFaceFeatureBo
+ * package: org.dromara.server.consume.domain.bo
+ * description: 人脸特征业务对象
+ * date: 2025-02-26 16:03:22 16:03
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PtArcFaceFeature.class, reverseConvertGenerate = false)
+public class PtArcFaceFeatureBo extends BaseEntity {
+
+    /**
+     * 特征Id,主键
+     */
+    @NotNull(message = "特征Id,主键不能为空", groups = { EditGroup.class })
+    private Long featureId;
+
+    /**
+     * 人员Id
+     */
+    @NotNull(message = "人员Id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long userId;
+
+    /**
+     * 人员照片地址
+     */
+    @NotBlank(message = "人员照片地址不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String photo;
+
+    /**
+     * 人脸特征数据
+     */
+    @NotBlank(message = "人脸特征数据不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String featureData;
+
+
+}

+ 50 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/PtArcFaceKeyBo.java

@@ -0,0 +1,50 @@
+package org.dromara.server.consume.domain.bo;
+
+import org.dromara.server.consume.domain.PtArcFaceKey;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+
+/**
+ * name: PtArcFaceKeyBo
+ * package: org.dromara.server.consume.domain.bo
+ * description:
+ * date: 2025-02-26 14:50:51 14:50
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PtArcFaceKey.class, reverseConvertGenerate = false)
+public class PtArcFaceKeyBo extends BaseEntity {
+    /**
+     * 激活Id,主键
+     */
+    @NotNull(message = "激活Id,主键不能为空", groups = { EditGroup.class })
+    private Long activeId;
+
+    /**
+     * 激活码
+     */
+    @NotBlank(message = "激活码不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String activeKey;
+
+    /**
+     * 注册时间
+     */
+    @NotNull(message = "注册时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date registerTime;
+
+    /**
+     * 设备序列号
+     */
+    @NotBlank(message = "设备序列号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String termSn;
+}

+ 45 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/PtTermFaceVersionBo.java

@@ -0,0 +1,45 @@
+package org.dromara.server.consume.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.server.consume.domain.PtTermFaceVersion;
+import jakarta.validation.constraints.*;
+/**
+ * name: PtTermFaceVersionBo
+ * package: org.dromara.server.consume.domain.bo
+ * description:
+ * date: 2025-02-26 15:19:01 15:19
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PtTermFaceVersion.class, reverseConvertGenerate = false)
+public class PtTermFaceVersionBo extends BaseEntity {
+
+    /**
+     * 版本Id,主键
+     */
+    @NotNull(message = "版本Id,主键不能为空", groups = { EditGroup.class })
+    private Long versionId;
+
+    /**
+     * 设备机号
+     */
+    @NotNull(message = "设备机号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long termNo;
+
+    /**
+     * 版本时间
+     */
+    @NotNull(message = "版本时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long versionTime;
+
+
+}

+ 18 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/convert/YcFaceFeatureVoConvert.java

@@ -0,0 +1,18 @@
+package org.dromara.server.consume.domain.convert;
+
+import io.github.linpeilie.BaseMapper;
+import org.dromara.server.consume.domain.vo.PtArcFaceFeatureVo;
+import org.dromara.server.consume.domain.vo.YcFaceFeatureVo;
+import org.mapstruct.*;
+
+/**
+ * 卡片视图对象转换器
+ * @author bing
+ */
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface YcFaceFeatureVoConvert extends BaseMapper<PtArcFaceFeatureVo, YcFaceFeatureVo> {
+    @Mappings({
+        @Mapping(source = "realName", target = "name")
+    })
+    PtArcFaceFeatureVo convert(YcFaceFeatureVo ycFaceFeatureVo);
+}

+ 67 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/PtArcFaceFeatureVo.java

@@ -0,0 +1,67 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.PtArcFaceFeature;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * name: PtArcFaceFeatureVo
+ * package: org.dromara.server.consume.domain.vo
+ * description: 人脸特征视图对象
+ * date: 2025-02-26 16:04:53 16:04
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PtArcFaceFeature.class)
+public class PtArcFaceFeatureVo  implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 特征Id,主键
+     */
+    @ExcelProperty(value = "特征Id,主键")
+    private Long featureId;
+
+    /**
+     * 人员Id
+     */
+    @ExcelProperty(value = "人员Id")
+    private Long userId;
+
+    /**
+     * 人员照片地址
+     */
+    @ExcelProperty(value = "人员照片地址")
+    private String photoUrl;
+
+    /**
+     * 人脸特征数据
+     */
+    @ExcelProperty(value = "人脸特征数据")
+    private String featureData;
+
+     /**
+     * 用户流水号
+     */
+    String userNo;
+    /**
+     * 用户学工号
+     */
+    String userNumb;
+    /**
+     * 用户姓名
+     */
+    String realName;
+
+}

+ 54 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/PtArcFaceKeyVo.java

@@ -0,0 +1,54 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.PtArcFaceKey;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * name: PtArcFaceKeyVo
+ * package: org.dromara.server.consume.domain.vo
+ * description:
+ * date: 2025-02-26 14:48:05 14:48
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PtArcFaceKey.class)
+public class PtArcFaceKeyVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 激活Id,主键
+     */
+    @ExcelProperty(value = "激活Id,主键")
+    private Long activeId;
+
+    /**
+     * 激活码
+     */
+    @ExcelProperty(value = "激活码")
+    private String activeKey;
+
+    /**
+     * 注册时间
+     */
+    @ExcelProperty(value = "注册时间")
+    private Date registerTime;
+
+    /**
+     * 设备序列号
+     */
+    @ExcelProperty(value = "设备序列号")
+    private String termSn;
+}

+ 48 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/PtTermFaceVersionVo.java

@@ -0,0 +1,48 @@
+package org.dromara.server.consume.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.server.consume.domain.PtTermFaceVersion;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * name: PtTermFaceVersionVo
+ * package: org.dromara.server.consume.domain.vo
+ * description:
+ * date: 2025-02-26 15:17:37 15:17
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PtTermFaceVersion.class)
+public class PtTermFaceVersionVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 版本Id,主键
+     */
+    @ExcelProperty(value = "版本Id,主键")
+    private Long versionId;
+
+    /**
+     * 设备机号
+     */
+    @ExcelProperty(value = "设备机号")
+    private Long termNo;
+
+    /**
+     * 版本时间
+     */
+    @ExcelProperty(value = "版本时间")
+    private Long versionTime;
+
+}

+ 4 - 5
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/bo/FaceFeatureBo.java → ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/domain/vo/YcFaceFeatureVo.java

@@ -1,8 +1,6 @@
-package org.dromara.server.consume.domain.bo;
+package org.dromara.server.consume.domain.vo;
 
 import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.dromara.common.mybatis.core.domain.BaseEntity;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -18,9 +16,10 @@ import java.io.Serializable;
  * @since JDK 1.8
  */
 @Data
-@EqualsAndHashCode(callSuper = true)
-public class FaceFeatureBo extends BaseEntity {
+public class YcFaceFeatureVo implements Serializable {
 
+    @Serial
+    private static final long serialVersionUID = -7788991545488485759L;
     /**
      * 用户id
      */

+ 23 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/PtArcFaceFeatureMapper.java

@@ -0,0 +1,23 @@
+package org.dromara.server.consume.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.PtArcFaceFeature;
+import org.dromara.server.consume.domain.vo.PtArcFaceFeatureVo;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * name: PtArcFaceFeatureMapper
+ * package: org.dromara.server.consume.mapper
+ * description:
+ * date: 2025-02-26 16:08:16 16:08
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface PtArcFaceFeatureMapper extends BaseMapperPlus<PtArcFaceFeature, PtArcFaceFeatureVo> {
+    List<PtArcFaceFeatureVo> getIncrementFeatureDataUser(@Param("lastTime") Date lastTime);
+}

+ 18 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/PtArcFaceKeyMapper.java

@@ -0,0 +1,18 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.PtArcFaceKey;
+import org.dromara.server.consume.domain.vo.PtArcFaceKeyVo;
+
+/**
+ * name: PtArcFaceKeyMapper
+ * package: org.dromara.server.consume.mapper
+ * description:
+ * date: 2025-02-26 14:55:10 14:55
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface PtArcFaceKeyMapper extends BaseMapperPlus<PtArcFaceKey, PtArcFaceKeyVo> {
+}

+ 19 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/mapper/PtTermFaceVersionMapper.java

@@ -0,0 +1,19 @@
+package org.dromara.server.consume.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.server.consume.domain.PtTermFaceVersion;
+import org.dromara.server.consume.domain.vo.PtTermFaceVersionVo;
+
+/**
+ * name: PtTermFaceVersionMapper
+ * package: org.dromara.server.consume.mapper
+ * description:
+ * date: 2025-02-26 15:21:03 15:21
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface PtTermFaceVersionMapper extends BaseMapperPlus<PtTermFaceVersion, PtTermFaceVersionVo> {
+
+}

+ 25 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IFaceEngineService.java

@@ -0,0 +1,25 @@
+package org.dromara.server.consume.service;
+
+import org.dromara.server.consume.domain.vo.YcFaceFeatureVo;
+
+import java.util.List;
+
+/**
+ * name: IFaceEngineService
+ * package: org.dromara.server.consume.service
+ * description: 人脸消费相关服务
+ * date: 2025-02-26 14:03:43 14:03
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface IFaceEngineService {
+
+    /**
+     * 增量获取人脸特征数据
+     * @param termNo 消费机编号
+     * @return 人脸特征数据
+     */
+    List<YcFaceFeatureVo> getIncrementFeatureDataUser(Integer termNo);
+}

+ 27 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IPtArcFaceFeatureService.java

@@ -0,0 +1,27 @@
+package org.dromara.server.consume.service;
+
+import org.dromara.server.consume.domain.bo.PtArcFaceFeatureBo;
+import org.dromara.server.consume.domain.vo.PtArcFaceFeatureVo;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * name: PtArcFaceFeatureService
+ * package: org.dromara.server.consume.service
+ * description:
+ * date: 2025-02-26 16:10:01 16:10
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface IPtArcFaceFeatureService {
+
+    /**
+     * 获取上次下载后更新的人脸特征数据
+     * @param lastTime 上次更新时间
+     * @return 人脸特征数据
+     */
+    List<PtArcFaceFeatureVo> getIncrFeatureDataUser(Date lastTime);
+}

+ 14 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IPtArcFaceKeyService.java

@@ -0,0 +1,14 @@
+package org.dromara.server.consume.service;
+
+/**
+ * name: IPtArcFaceKeyService
+ * package: org.dromara.server.consume.service
+ * description:
+ * date: 2025-02-26 14:57:00 14:57
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface IPtArcFaceKeyService {
+}

+ 21 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/IPtTermFaceVersionService.java

@@ -0,0 +1,21 @@
+package org.dromara.server.consume.service;
+
+/**
+ * name: IPtTermFaceVersionService
+ * package: org.dromara.server.consume.service
+ * description:
+ * date: 2025-02-26 15:23:21 15:23
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+public interface IPtTermFaceVersionService {
+
+    /**
+     * 查询设备最后下载人脸特征的版本时间
+     * @param termNo 设备机号
+     * @return 版本时间
+     */
+    Long getFaceVersionByTerm(Integer termNo);
+}

+ 44 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/FaceEngineServiceImpl.java

@@ -0,0 +1,44 @@
+package org.dromara.server.consume.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.RequiredArgsConstructor;
+import org.dromara.server.consume.domain.vo.YcFaceFeatureVo;
+import org.dromara.server.consume.service.IFaceEngineService;
+import org.dromara.server.consume.service.IPtTermFaceVersionService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * name: FaceEngineServiceImpl
+ * package: org.dromara.server.consume.service.impl
+ * description: 人脸消费相关服务实现
+ * date: 2025-02-26 14:08:27 14:08
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service
+public class FaceEngineServiceImpl implements IFaceEngineService {
+    private final IPtTermFaceVersionService termFaceVersionService;
+    /**
+     * 增量获取人脸特征数据
+     * @param termNo 消费机编号
+     * @return 人脸特征数据
+     */
+    @Override
+    public List<YcFaceFeatureVo> getIncrementFeatureDataUser(Integer termNo) {
+        Long versionTime = termFaceVersionService.getFaceVersionByTerm(termNo);
+        if(ObjectUtil.isEmpty(versionTime) || versionTime==0L){
+            // 如果没有该值或为0,那么认为是初次调用,因此返回全量数据
+            return List.of();
+        }
+
+        Date lastDown = DateUtil.date(versionTime);
+        return List.of();
+    }
+}

+ 32 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/PtArcFaceFeatureServiceImpl.java

@@ -0,0 +1,32 @@
+package org.dromara.server.consume.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.server.consume.domain.bo.PtArcFaceFeatureBo;
+import org.dromara.server.consume.domain.vo.PtArcFaceFeatureVo;
+import org.dromara.server.consume.mapper.PtArcFaceFeatureMapper;
+import org.dromara.server.consume.service.IPtArcFaceFeatureService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * name: PtArcFaceFeatureServiceImpl
+ * package: org.dromara.server.consume.service.impl
+ * description:
+ * date: 2025-02-26 16:10:47 16:10
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service
+public class PtArcFaceFeatureServiceImpl implements IPtArcFaceFeatureService {
+    private final PtArcFaceFeatureMapper baseMapper;
+
+    @Override
+    public List<PtArcFaceFeatureVo> getIncrFeatureDataUser(Date lastTime) {
+        return baseMapper.getIncrementFeatureDataUser(lastTime);
+    }
+}

+ 20 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/PtArcFaceKeyServiceImpl.java

@@ -0,0 +1,20 @@
+package org.dromara.server.consume.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.server.consume.service.IPtArcFaceKeyService;
+import org.springframework.stereotype.Service;
+
+/**
+ * name: PtArcFaceKeyServiceImpl
+ * package: org.dromara.server.consume.service.impl
+ * description:
+ * date: 2025-02-26 15:01:15 15:01
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service
+public class PtArcFaceKeyServiceImpl implements IPtArcFaceKeyService {
+}

+ 43 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/PtTermFaceVersionServiceImpl.java

@@ -0,0 +1,43 @@
+package org.dromara.server.consume.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.dromara.server.consume.domain.PtTermFaceVersion;
+import org.dromara.server.consume.domain.bo.PtTermFaceVersionBo;
+import org.dromara.server.consume.domain.vo.PtTermFaceVersionVo;
+import org.dromara.server.consume.mapper.PtTermFaceVersionMapper;
+import org.dromara.server.consume.mapper.XfCardLimitedMapper;
+import org.dromara.server.consume.service.IPtTermFaceVersionService;
+import org.springframework.stereotype.Service;
+
+/**
+ * name: PtTermFaceVersionServiceImpl
+ * package: org.dromara.server.consume.service.impl
+ * description:
+ * date: 2025-02-26 15:22:58 15:22
+ *
+ * @author luoyibo
+ * @version 0.1
+ * @since JDK 1.8
+ */
+@RequiredArgsConstructor
+@Service
+public class PtTermFaceVersionServiceImpl implements IPtTermFaceVersionService {
+    private final PtTermFaceVersionMapper baseMapper;
+
+    /**
+     * 查询设备最后下载人脸特征的版本时间
+     * @param termNo 设备机号
+     * @return 版本时间
+     */
+    @Override
+    public Long getFaceVersionByTerm(Integer termNo) {
+        PtTermFaceVersionVo vo = baseMapper.selectVoOne(new LambdaQueryWrapper<PtTermFaceVersion>()
+            .eq(PtTermFaceVersion::getTermNo,termNo));
+        if (ObjectUtil.isNotEmpty(vo)) {
+            return vo.getVersionTime();
+        }
+        return 0L;
+    }
+}

+ 25 - 0
ruoyi-server/ruoyi-server-consume/src/main/resources/mapper/consume/PtArcFaceFeatureMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.server.consume.mapper.PtArcFaceFeatureMapper">
+
+    <resultMap type="org.dromara.server.consume.domain.PtArcFaceFeature" id="PtArcFaceFeatureResult">
+        <result property="featureId"    column="feature_id"    />
+        <result property="tenantId"    column="tenant_id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="photo"    column="photo"    />
+        <result property="featureData"    column="feature_data"    />
+        <result property="createDept"    column="create_dept"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <select id="getIncrementFeatureDataUser" resultType="org.dromara.server.consume.domain.vo.PtArcFaceFeatureVo">
+        SELECT tpua.user_id,tpua.user_no,tpua.user_numb,tpua.real_name,tpaff.photo_url,tpaff.feature_data,tpaff.feature_id FROM t_pt_arcFaceFeature tpaff
+        INNER JOIN t_pt_userAccount tpua ON tpua.user_id=tpaff.user_id
+        WHERE tpaff.update_time>#{lastTime}
+    </select>
+</mapper>

+ 19 - 0
ruoyi-server/ruoyi-server-consume/src/main/resources/mapper/consume/PtArcFaceKeyMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.server.consume.mapper.PtArcFaceKeyMapper">
+
+    <resultMap type="org.dromara.server.consume.domain.PtArcFaceKey" id="PtArcFaceKeyResult">
+        <result property="activeId"    column="active_id"    />
+        <result property="tenantId"    column="tenant_id"    />
+        <result property="activeKey"    column="active_key"    />
+        <result property="registerTime"    column="register_time"    />
+        <result property="termSn"    column="term_sn"    />
+        <result property="createDept"    column="create_dept"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+</mapper>

+ 18 - 0
ruoyi-server/ruoyi-server-consume/src/main/resources/mapper/consume/PtTermFaceVersionMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.server.consume.mapper.PtTermFaceVersionMapper">
+
+    <resultMap type="org.dromara.server.consume.domain.PtTermFaceVersion" id="PtTermFaceVersionResult">
+        <result property="versionId"    column="version_id"    />
+        <result property="tenantId"    column="tenant_id"    />
+        <result property="termNo"    column="term_no"    />
+        <result property="versionTime"    column="version_time"    />
+        <result property="createDept"    column="create_dept"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+</mapper>