yangdamao 11 月之前
父節點
當前提交
33e7638397
共有 18 個文件被更改,包括 332 次插入2 次删除
  1. 5 0
      zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java
  2. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/OffGradeOrder.java
  3. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeService.java
  4. 44 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java
  5. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/tencentcloud/bo/FaceQueryBo.java
  6. 88 2
      zhongzheng-system/src/main/java/com/zhongzheng/modules/tencentcloud/service/impl/FaceOcrServiceImpl.java
  7. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserStudyRecordAddBo.java
  8. 3 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserStudyRecordPhotoAddBo.java
  9. 34 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserDeviceWhite.java
  10. 44 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserPhotoDevice.java
  11. 2 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserStudyRecordPhoto.java
  12. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserDeviceWhiteMapper.java
  13. 13 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserPhotoDeviceMapper.java
  14. 15 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserDeviceWhiteService.java
  15. 14 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserPhotoDeviceService.java
  16. 17 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserDeviceWhiteServiceImpl.java
  17. 17 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserPhotoDeviceServiceImpl.java
  18. 1 0
      zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java

+ 5 - 0
zhongzheng-admin/src/main/java/com/zhongzheng/controller/grade/ClassGradeController.java

@@ -903,5 +903,10 @@ public class ClassGradeController extends BaseController {
     }
 
 
+     @ApiOperation("关闭班级订单")
+    @PostMapping("/off/order")
+    public AjaxResult<Integer> offGradeOrder(OffGradeOrder bo) {
+        return AjaxResult.success(iClassGradeService.offGradeOrder(bo));
+    }
 
 }

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/bo/OffGradeOrder.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.grade.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class OffGradeOrder implements Serializable {
+
+    private Long gradeId;
+
+    private Long userId;
+
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/IClassGradeService.java

@@ -121,4 +121,6 @@ public interface IClassGradeService extends IService<ClassGrade> {
 	void openOfficialSaveGrade(ClassGradeOpenBo bo);
 
     List<ClassBusinessVo> getBusinessClassList(ClassBusinessQuery query);
+
+	Integer offGradeOrder(OffGradeOrder bo);
 }

+ 44 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/service/impl/ClassGradeServiceImpl.java

@@ -44,6 +44,8 @@ import com.zhongzheng.modules.inform.service.IInformRemindService;
 import com.zhongzheng.modules.inform.service.IInformUserService;
 import com.zhongzheng.modules.inform.vo.InformRemindBusinessVo;
 import com.zhongzheng.modules.inform.vo.InformRemindVo;
+import com.zhongzheng.modules.order.bo.OrderGoodsEditBo;
+import com.zhongzheng.modules.order.domain.Order;
 import com.zhongzheng.modules.order.domain.OrderGoods;
 import com.zhongzheng.modules.order.mapper.OrderMapper;
 import com.zhongzheng.modules.order.service.IOrderGoodsService;
@@ -2002,6 +2004,48 @@ public class ClassGradeServiceImpl extends ServiceImpl<ClassGradeMapper, ClassGr
         return result;
     }
 
+    @Override
+    public Integer offGradeOrder(OffGradeOrder bo) {
+        ClassGrade classGrade = getById(bo.getGradeId());
+        if (ObjectUtils.isNull(classGrade)){
+            throw new CustomException("班级信息获取有误");
+        }
+
+        List<ClassGradeUser> list = iClassGradeUserService.list(new LambdaQueryWrapper<ClassGradeUser>()
+                .eq(ClassGradeUser::getGradeId, bo.getGradeId())
+                .eq(ObjectUtils.isNotNull(bo.getUserId()), ClassGradeUser::getUserId, bo.getUserId())
+                .eq(ClassGradeUser::getStatus, 1));
+        if (CollectionUtils.isEmpty(list)){
+            return 0;
+        }
+
+        list.forEach(x -> {
+            OrderGoods orderGoods = iOrderGoodsService.getById(x.getOrderGoodsId());
+            Order order = orderMapper.selectOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderSn, orderGoods.getOrderSn()));
+            if (ObjectUtils.isNull(order)){
+                return;
+            }
+            if (ObjectUtils.isNotNull(order.getInputOrderSn())){
+                //线下
+                OrderGoodsEditBo editBo = new OrderGoodsEditBo();
+                editBo.setOrderGoodsId(x.getOrderGoodsId());
+                editBo.setStatus(0);
+                editBo.setCloseReason("班级更换新课程");
+                iOrderGoodsService.closeOrderGoods(editBo);
+            }else {
+                //线上
+                orderGoods.setStatus(0);
+                orderGoods.setCloseReason("班级更换新课程");
+                orderGoods.setUpdateTime(DateUtils.getNowTime());
+                iOrderGoodsService.updateById(orderGoods);
+                x.setStatus(0);
+                x.setUpdateTime(DateUtils.getNowTime());
+                iClassGradeUserService.updateById(x);
+            }
+        });
+        return 0;
+    }
+
     //创建预开班班级
     private void creatClass(List<Long> goodsIds, Long tenantId, String code) {
         goodsIds.forEach(goodsId -> {

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/tencentcloud/bo/FaceQueryBo.java

@@ -56,4 +56,7 @@ public class FaceQueryBo extends BaseEntity {
 
 	@ApiModelProperty("一寸照图片base64")
 	private String oneInchPhotos;
+
+	@ApiModelProperty("设备名称")
+	private String deviceName;
 }

+ 88 - 2
zhongzheng-system/src/main/java/com/zhongzheng/modules/tencentcloud/service/impl/FaceOcrServiceImpl.java

@@ -3,7 +3,9 @@ package com.zhongzheng.modules.tencentcloud.service.impl;
 
 import cn.hutool.core.lang.Validator;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.tencentcloudapi.bda.v20200324.models.SegmentPortraitPicRequest;
 import com.tencentcloudapi.common.Credential;
 import com.tencentcloudapi.common.exception.TencentCloudSDKException;
@@ -16,6 +18,7 @@ import com.tencentcloudapi.iai.v20200303.models.*;
 import com.tencentcloudapi.ocr.v20181119.OcrClient;
 import com.tencentcloudapi.ocr.v20181119.models.*;
 import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
 import com.zhongzheng.modules.alioss.bo.OssRequest;
 import com.zhongzheng.modules.alioss.service.OssService;
 import com.zhongzheng.modules.base.bo.UserProfileFit;
@@ -25,6 +28,10 @@ import com.zhongzheng.modules.base.vo.UserProfileVo;
 import com.zhongzheng.modules.tencentcloud.bo.FaceQueryBo;
 import com.zhongzheng.modules.tencentcloud.bo.InvoiceQueryBo;
 import com.zhongzheng.modules.tencentcloud.service.IFaceOcrService;
+import com.zhongzheng.modules.user.domain.UserDeviceWhite;
+import com.zhongzheng.modules.user.domain.UserPhotoDevice;
+import com.zhongzheng.modules.user.service.IUserDeviceWhiteService;
+import com.zhongzheng.modules.user.service.IUserPhotoDeviceService;
 import com.zhongzheng.modules.user.service.IUserService;
 import com.zhongzheng.modules.user.vo.UserVo;
 import org.slf4j.Logger;
@@ -35,6 +42,8 @@ import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 @Service
 public class FaceOcrServiceImpl implements IFaceOcrService {
@@ -54,6 +63,12 @@ public class FaceOcrServiceImpl implements IFaceOcrService {
     @Autowired
     private IUserService iUserService;
 
+    @Autowired
+    private IUserPhotoDeviceService iUserPhotoDeviceService;
+
+    @Autowired
+    private IUserDeviceWhiteService iUserDeviceWhiteService;
+
     @Autowired
     private IUserProfileService iUserProfileService;
 
@@ -73,6 +88,10 @@ public class FaceOcrServiceImpl implements IFaceOcrService {
             if(Validator.isEmpty(userVo)){
                 return 0;
             }
+            //照相设备校验
+            if (StringUtils.isNotBlank(bo.getDeviceName())){
+                deviceCheck(bo);
+            }
            /* UserProfileQueryBo userProfileQueryBo = new UserProfileQueryBo();
             userProfileQueryBo.setUserId(bo.getUserId());
             userProfileQueryBo.setOrderGoodsId(bo.getOrderGoodsId());
@@ -86,8 +105,9 @@ public class FaceOcrServiceImpl implements IFaceOcrService {
     //        Map<String, String> maps = JSONObject.parseObject(info.getKeyValue(),Map.class);
 
     //        String oneInchPhotos = JSONObject.parseObject(String.valueOf(maps.get("recent_photos")), UserProfileFit.class).getValue(); //审核资料一寸照片
-
             if(DetectFace(bo)){
+                //活体检测
+                detectLiveFaceCheck(bo);
                 String oneInchPhotos =ossHost+"/"+userVo.getOneInchPhotos();
                 Credential cred = new Credential(SecretId, SecretKey);
                 ClientProfile clientProfile = new ClientProfile();
@@ -103,6 +123,7 @@ public class FaceOcrServiceImpl implements IFaceOcrService {
                 faceRequest.setQualityControl(2L);
                 CompareFaceResponse response = iaiClient.CompareFace(faceRequest);
                 if (response.getScore().intValue() < 65){
+                    addUserPhotoRecord(bo.getUserId(),bo.getUrlA(),bo.getOrderGoodsId(),4,bo.getDeviceName());
                     throw new CustomException("人脸识别不通过,请重新拍照!",606);
                 }
                 return response.getScore().intValue();
@@ -114,6 +135,70 @@ public class FaceOcrServiceImpl implements IFaceOcrService {
         }
     }
 
+    private void detectLiveFaceCheck(FaceQueryBo bo) {
+        Credential cred = new Credential(SecretId, SecretKey);
+        ClientProfile clientProfile = new ClientProfile();
+        clientProfile.setSignMethod(clientProfile.SIGN_TC3_256);
+        IaiClient iaiClient = new IaiClient(cred,"ap-guangzhou");
+        DetectLiveFaceRequest faceRequest = new DetectLiveFaceRequest();
+        if(Validator.isNotEmpty(bo.getUrlA())){
+            faceRequest.setUrl(ossHost+"/"+bo.getUrlA());
+        }else{
+            faceRequest.setImage(bo.getImageA()); //学习拍照
+        }
+        try {
+            DetectLiveFaceResponse response = iaiClient.DetectLiveFace(faceRequest);
+            if (response.getScore().intValue() < 87){
+                addUserPhotoRecord(bo.getUserId(),bo.getUrlA(),bo.getOrderGoodsId(),3,bo.getDeviceName());
+                throw new CustomException("活体检测不通过,请重新拍照!",606);
+            }
+        }catch (TencentCloudSDKException e){
+            throw new CustomException(e.getMessage(),606);
+        }
+
+    }
+
+    //保存学员拍照错误记录
+    private void addUserPhotoRecord(Long userId,String photo,Long orderGoodsId,Integer type,String deviceName){
+        UserPhotoDevice add = new UserPhotoDevice();
+        add.setUserId(userId);
+        add.setPhoto(photo);
+        add.setOrderGoodsId(orderGoodsId);
+        add.setType(type);
+        add.setDeviceName(deviceName);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        iUserPhotoDeviceService.save(add);
+    }
+
+
+    private void deviceCheck(FaceQueryBo bo) {
+        //校验白黑名单
+        UserDeviceWhite deviceWhite = iUserDeviceWhiteService.getOne(new LambdaQueryWrapper<UserDeviceWhite>()
+                .eq(UserDeviceWhite::getUserId, bo.getUserId())
+                .eq(UserDeviceWhite::getDeviceName, bo.getDeviceName()));
+        if (ObjectUtils.isNotNull(deviceWhite)){
+            if (deviceWhite.getStatus() == 1){
+                //白名单
+                return;
+            }
+            if (deviceWhite.getStatus() == 2){
+                //黑名单
+                addUserPhotoRecord(bo.getUserId(),bo.getUrlA(),bo.getOrderGoodsId(),1, bo.getDeviceName());
+                throw new CustomException("您有疑是使用虚拟摄像头学习,请更换高清摄像头设备或手机学习!",606);
+            }
+        }
+
+        //正则校验设备名称
+        String reg_select = "([a-zA-Z0-9_ ]+)\\(([a-zA-Z0-9]+)[:]+([a-zA-Z0-9]+)\\)";
+        Pattern pattern = Pattern.compile(reg_select);
+        Matcher matcher = pattern.matcher(bo.getDeviceName());
+        if (!matcher.matches()){
+            addUserPhotoRecord(bo.getUserId(),bo.getUrlA(),bo.getOrderGoodsId(),1, bo.getDeviceName());
+            throw new CustomException("您有疑是使用虚拟摄像头学习,请更换高清摄像头设备或手机学习!",606);
+        }
+    }
+
     @Override
     public Boolean DetectFace(FaceQueryBo bo) {
         try{
@@ -187,7 +272,8 @@ public class FaceOcrServiceImpl implements IFaceOcrService {
                     throw new CustomException("请保证人脸全部在照片范围内!");
                 }
             }
-        }catch (TencentCloudSDKException e){
+        }catch (Exception e){
+            addUserPhotoRecord(bo.getUserId(),bo.getUrlA(),bo.getOrderGoodsId(),2, bo.getDeviceName());
             throw new CustomException("人脸检测错误:"+e.getMessage());
         }
         return true;

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserStudyRecordAddBo.java

@@ -92,5 +92,7 @@ public class UserStudyRecordAddBo {
     /** 相似度 */
     @ApiModelProperty("相似度")
     private Integer similarity;
+    @ApiModelProperty("设备名称")
+    private String deviceName;
     private Boolean erJianErZao;
 }

+ 3 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/bo/UserStudyRecordPhotoAddBo.java

@@ -47,4 +47,7 @@ public class UserStudyRecordPhotoAddBo {
     @ApiModelProperty("相似度")
     private Integer similarity;
 
+    @ApiModelProperty("设备名称")
+    private String deviceName;
+
 }

+ 34 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserDeviceWhite.java

@@ -0,0 +1,34 @@
+package com.zhongzheng.modules.user.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 用户学习记录对象 user_photo_device
+ *
+ * @author ruoyi
+ * @date 2021-12-16
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("user_device_white")
+public class UserDeviceWhite implements Serializable {
+
+    @TableId(value = "id")
+    private Long id;
+    /** 用户ID */
+    private Long userId;
+    /**  设备名称 */
+    private String deviceName;
+    /**  状态:1白名单 2黑名单 */
+    private Integer status;
+    /**  商户ID */
+    private Long tenantId;
+
+}

+ 44 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserPhotoDevice.java

@@ -0,0 +1,44 @@
+package com.zhongzheng.modules.user.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * 用户学习记录对象 user_photo_device
+ *
+ * @author ruoyi
+ * @date 2021-12-16
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("user_photo_device")
+public class UserPhotoDevice implements Serializable {
+
+    @TableId(value = "id")
+    private Long id;
+    /** 用户ID */
+    private Long userId;
+    /** 订单商品ID */
+    private Long orderGoodsId;
+    /**  拍摄照片 */
+    private String photo;
+    /**  设备名称 */
+    private String deviceName;
+    /** 创建时间 */
+    private Long createTime;
+    /** 修改时间 */
+    private Long updateTime;
+    /** 类型 1拍照设备不过关 2人脸属性检测不过关 3人脸活体检测不过关 4人脸对比不过关 */
+    private Integer type;
+    /** 状态:1正常 0废弃 */
+    private Integer status;
+    /** 修改时间 */
+    private Long tenantId;
+
+}

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/domain/UserStudyRecordPhoto.java

@@ -46,4 +46,6 @@ private static final long serialVersionUID=1L;
 
     /** 相似度 */
     private Integer similarity;
+    /** 设备名称 */
+    private String deviceName;
 }

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserDeviceWhiteMapper.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.user.domain.UserDeviceWhite;
+import com.zhongzheng.modules.user.domain.UserPhotoDevice;
+
+/**
+ * 学习计划Mapper接口
+ *
+ * @author ruoyi
+ * @date 2021-12-08
+ */
+public interface UserDeviceWhiteMapper extends BaseMapper<UserDeviceWhite> {
+}

+ 13 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/mapper/UserPhotoDeviceMapper.java

@@ -0,0 +1,13 @@
+package com.zhongzheng.modules.user.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhongzheng.modules.user.domain.UserPhotoDevice;
+
+/**
+ * 学习计划Mapper接口
+ *
+ * @author ruoyi
+ * @date 2021-12-08
+ */
+public interface UserPhotoDeviceMapper extends BaseMapper<UserPhotoDevice> {
+}

+ 15 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserDeviceWhiteService.java

@@ -0,0 +1,15 @@
+package com.zhongzheng.modules.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.user.domain.UserDeviceWhite;
+import com.zhongzheng.modules.user.domain.UserPhotoDevice;
+
+/**
+ * 高校Service接口
+ *
+ * @author ruoyi
+ * @date 2021-10-09
+ */
+public interface IUserDeviceWhiteService extends IService<UserDeviceWhite> {
+
+}

+ 14 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/IUserPhotoDeviceService.java

@@ -0,0 +1,14 @@
+package com.zhongzheng.modules.user.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zhongzheng.modules.user.domain.UserPhotoDevice;
+
+/**
+ * 高校Service接口
+ *
+ * @author ruoyi
+ * @date 2021-10-09
+ */
+public interface IUserPhotoDeviceService extends IService<UserPhotoDevice> {
+
+}

+ 17 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserDeviceWhiteServiceImpl.java

@@ -0,0 +1,17 @@
+package com.zhongzheng.modules.user.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.user.domain.UserDeviceWhite;
+import com.zhongzheng.modules.user.mapper.UserDeviceWhiteMapper;
+import com.zhongzheng.modules.user.service.IUserDeviceWhiteService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 用户笔记记录Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2021-12-14
+ */
+@Service
+public class UserDeviceWhiteServiceImpl extends ServiceImpl<UserDeviceWhiteMapper, UserDeviceWhite> implements IUserDeviceWhiteService {
+}

+ 17 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserPhotoDeviceServiceImpl.java

@@ -0,0 +1,17 @@
+package com.zhongzheng.modules.user.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zhongzheng.modules.user.domain.UserPhotoDevice;
+import com.zhongzheng.modules.user.mapper.UserPhotoDeviceMapper;
+import com.zhongzheng.modules.user.service.IUserPhotoDeviceService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 用户笔记记录Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2021-12-14
+ */
+@Service
+public class UserPhotoDeviceServiceImpl extends ServiceImpl<UserPhotoDeviceMapper, UserPhotoDevice> implements IUserPhotoDeviceService {
+}

+ 1 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/user/service/impl/UserStudyRecordServiceImpl.java

@@ -1877,6 +1877,7 @@ public class UserStudyRecordServiceImpl extends ServiceImpl<UserStudyRecordMappe
             userStudyRecordPhotoAddBo.setPeriodId(periodId);
             userStudyRecordPhotoAddBo.setStatus(1);
             userStudyRecordPhotoAddBo.setUserId(entity.getUserId());
+            userStudyRecordPhotoAddBo.setDeviceName(bo.getDeviceName());
             if(Validator.isEmpty(bo.getSimilarity())){
                 throw new CustomException("相似度缺失");
             }