Przeglądaj źródła

Merge branch 'usky-zyj' of uskycloud/usky-modules into master

gez 6 miesięcy temu
rodzic
commit
6a0b8a121a
17 zmienionych plików z 553 dodań i 50 usunięć
  1. 12 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DmpDeviceInfoController.java
  2. 5 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/DmpDeviceInfoMapper.java
  3. 2 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/DmpDeviceInfoService.java
  4. 201 1
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpDeviceInfoServiceImpl.java
  5. 9 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/DmpDeviceInfoRequest.java
  6. 18 0
      service-iot/service-iot-biz/src/main/resources/mapper/iot/DmpDeviceInfoMapper.xml
  7. 10 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/annotation/aspect/FaceAspect.java
  8. 44 2
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingFaceController.java
  9. 12 4
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingFace.java
  10. 14 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingFaceVefLog.java
  11. 6 1
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/MeetingFaceMapper.java
  12. 20 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/repository/MeetingInfoRepository.java
  13. 88 39
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingFaceServiceImpl.java
  14. 65 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/DmpDeviceInfoVO.java
  15. 5 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingFaceRequestVO.java
  16. 25 0
      service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingFaceVO.java
  17. 17 2
      service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/MeetingFaceMapper.xml

+ 12 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DmpDeviceInfoController.java

@@ -72,6 +72,18 @@ public class DmpDeviceInfoController {
         return ApiResult.success(dmpDeviceInfoService.page(dmpDeviceInfoRequest));
     }
 
+
+    /**
+     * 分页-白名单
+     * @param dmpDeviceInfoRequest
+     * @return
+     */
+    @PostMapping("/pageWhite")
+    public ApiResult<CommonPage<DmpDeviceInfo>> pageWhite(@RequestBody DmpDeviceInfoRequest dmpDeviceInfoRequest)
+    {
+        return ApiResult.success(dmpDeviceInfoService.pageWhite(dmpDeviceInfoRequest));
+    }
+
     /**
      * 删除记录
      */

+ 5 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/mapper/DmpDeviceInfoMapper.java

@@ -25,7 +25,11 @@ public interface DmpDeviceInfoMapper extends CrudMapper<DmpDeviceInfo> {
 
     List<DmpProductInfo> getProductInfo(String productCode);
 
-    Page<DmpDeviceInfo> page(IPage<DmpDeviceInfo> page, @Param("ar")DmpDeviceInfoRequest dmpDeviceInfoRequest, @Param("tenantId") Integer tenantId);
+    Integer getMeetingFaceData(@Param("userId") Long userId);
+
+    Integer[] getMeetingFaceDeviceList(@Param("fid") Integer fid);
+
+//    Page<DmpDeviceInfo> page(IPage<DmpDeviceInfo> page, @Param("ar")DmpDeviceInfoRequest dmpDeviceInfoRequest, @Param("tenantId") Integer tenantId);
 
     List<ProductTVAttributeVO> attributeList(@Param("procutIdList") List<Integer> productIdList);
 

+ 2 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/DmpDeviceInfoService.java

@@ -35,6 +35,8 @@ public interface DmpDeviceInfoService extends CrudService<DmpDeviceInfo> {
 
     CommonPage<DmpDeviceInfo> page(DmpDeviceInfoRequest dmpDeviceInfoRequest);
 
+    CommonPage<DmpDeviceInfo> pageWhite(DmpDeviceInfoRequest dmpDeviceInfoRequest);
+
     boolean remove(Integer id);
 
     /**

+ 201 - 1
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/DmpDeviceInfoServiceImpl.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -95,6 +96,32 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
             commandUserName = SecurityUtils.getUsername();
         }
 
+        //人员设备权限校验,校验通过,可以下发命令控制设备
+        Integer fid = baseMapper.getMeetingFaceData(commandUserId);
+        if(fid == null){
+            throw new BusinessException("人脸卡号信息未注册");
+        }
+        Integer[] deviceFid = baseMapper.getMeetingFaceDeviceList(fid);
+        if(deviceFid.length == 0){
+            throw new BusinessException("人员未绑定设备,请检查");
+        }
+
+        LambdaQueryWrapper<DmpDeviceInfo> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.select(DmpDeviceInfo::getId)
+                .eq(DmpDeviceInfo::getProductCode,productCode)
+                .eq(DmpDeviceInfo::getDeviceId,deviceId)
+                .eq(DmpDeviceInfo::getDeleteFlag,0);
+        DmpDeviceInfo one = this.getOne(queryWrapper);
+        if(one != null){
+            boolean exist = Arrays.asList(deviceFid).contains(one.getId());
+            if(!exist){
+                throw new BusinessException("暂无权限");
+            }
+        }else{
+            throw new BusinessException("设备未注册,请先注册");
+        }
+
+
         Map<String,Object> map = new HashMap<>();
         map.put("method","control");
         Map<String,Object> map1 = new HashMap<>();
@@ -180,11 +207,12 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
         IPage<DmpDeviceInfo> page = new Page<>(pageCurrent,pageSize);
 
         if(diRequest.getDeviceStatus() != null){
-            if(StringUtils.isNotBlank(diRequest.getDeviceId()) || StringUtils.isNotBlank(diRequest.getDeviceName()) || diRequest.getProductId() != null || diRequest.getServiceStatus() != null){
+            if(StringUtils.isNotBlank(diRequest.getDeviceId()) || StringUtils.isNotBlank(diRequest.getDeviceName()) || diRequest.getProductId() != null || StringUtils.isNotBlank(diRequest.getProductCode()) || diRequest.getServiceStatus() != null){
                 LambdaQueryWrapper<DmpDeviceInfo> queryWrapper = Wrappers.lambdaQuery();
                 queryWrapper.eq(StringUtils.isNotBlank(diRequest.getDeviceId()),DmpDeviceInfo::getDeviceId,diRequest.getDeviceId())
                         .like(StringUtils.isNotBlank(diRequest.getDeviceName()),DmpDeviceInfo::getDeviceName,diRequest.getDeviceName())
                         .eq(diRequest.getProductId() != null,DmpDeviceInfo::getProductId,diRequest.getProductId())
+                        .like(StringUtils.isNotBlank(diRequest.getProductCode()),DmpDeviceInfo::getProductCode,diRequest.getProductCode())
                         .eq(diRequest.getServiceStatus() != null,DmpDeviceInfo::getServiceStatus,diRequest.getServiceStatus())
                         .eq(DmpDeviceInfo::getDeleteFlag,0)
                         .eq(DmpDeviceInfo::getTenantId,SecurityUtils.getTenantId())
@@ -293,6 +321,7 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
             queryWrapper.eq(StringUtils.isNotBlank(diRequest.getDeviceId()),DmpDeviceInfo::getDeviceId,diRequest.getDeviceId())
                     .like(StringUtils.isNotBlank(diRequest.getDeviceName()),DmpDeviceInfo::getDeviceName,diRequest.getDeviceName())
                     .eq(diRequest.getProductId() != null,DmpDeviceInfo::getProductId,diRequest.getProductId())
+                    .like(StringUtils.isNotBlank(diRequest.getProductCode()),DmpDeviceInfo::getProductCode,diRequest.getProductCode())
                     .eq(diRequest.getServiceStatus() != null,DmpDeviceInfo::getServiceStatus,diRequest.getServiceStatus())
                     .eq(DmpDeviceInfo::getDeleteFlag,0)
                     .eq(DmpDeviceInfo::getTenantId,SecurityUtils.getTenantId())
@@ -335,6 +364,177 @@ public class DmpDeviceInfoServiceImpl extends AbstractCrudService<DmpDeviceInfoM
         return new CommonPage<>(page.getRecords(),page.getTotal(),pageSize,pageCurrent);
     }
 
+    @Override
+    public CommonPage<DmpDeviceInfo> pageWhite(DmpDeviceInfoRequest diRequest) {
+        List<DmpDeviceInfo> list = new ArrayList<>();
+        Integer total = 0;
+        Integer pageCurrent = diRequest.getCurrent();
+        Integer pageSize = diRequest.getSize();
+        IPage<DmpDeviceInfo> page = new Page<>(pageCurrent,pageSize);
+        Integer tenantId = 0;
+        String domain = diRequest.getDomain();
+        if(StringUtils.isNotBlank(domain)){
+            tenantId = baseMapper.sysTenantId(domain);
+        }
+
+        if(diRequest.getDeviceStatus() != null){
+            if(StringUtils.isNotBlank(diRequest.getDeviceId()) || StringUtils.isNotBlank(diRequest.getDeviceName()) || diRequest.getProductId() != null || StringUtils.isNotBlank(diRequest.getProductCode()) || diRequest.getServiceStatus() != null){
+                LambdaQueryWrapper<DmpDeviceInfo> queryWrapper = Wrappers.lambdaQuery();
+                queryWrapper.eq(StringUtils.isNotBlank(diRequest.getDeviceId()),DmpDeviceInfo::getDeviceId,diRequest.getDeviceId())
+                        .like(StringUtils.isNotBlank(diRequest.getDeviceName()),DmpDeviceInfo::getDeviceName,diRequest.getDeviceName())
+                        .eq(diRequest.getProductId() != null,DmpDeviceInfo::getProductId,diRequest.getProductId())
+                        .like(StringUtils.isNotBlank(diRequest.getProductCode()),DmpDeviceInfo::getProductCode,diRequest.getProductCode())
+                        .eq(diRequest.getServiceStatus() != null,DmpDeviceInfo::getServiceStatus,diRequest.getServiceStatus())
+                        .eq(DmpDeviceInfo::getDeleteFlag,0)
+                        .eq(DmpDeviceInfo::getTenantId,tenantId)
+                        .orderByDesc(DmpDeviceInfo::getId);
+                List<DmpDeviceInfo> list1 = this.list(queryWrapper);
+
+                if(CollectionUtils.isNotEmpty(list1)){
+                    List<String> devList = new ArrayList<>();
+                    List<Integer> productIdList = new ArrayList<>();
+                    for(int i=0;i<list1.size();i++){
+                        if(!devList.contains(list1.get(i).getDeviceId())){
+                            devList.add(list1.get(i).getDeviceId());
+                        }
+                        if(!productIdList.contains(list1.get(i).getProductId())){
+                            productIdList.add(list1.get(i).getProductId());
+                        }
+                    }
+
+                    if(devList.size() > 0){
+                        LambdaQueryWrapper<DmpDeviceStatus> queryWrapper1 = Wrappers.lambdaQuery();
+                        queryWrapper1.in(DmpDeviceStatus::getDeviceId,devList)
+                                .in(DmpDeviceStatus::getProductId,productIdList)
+                                .eq(DmpDeviceStatus::getDeviceStatus,diRequest.getDeviceStatus());
+                        List<DmpDeviceStatus> statusList = dmpDeviceStatusService.list(queryWrapper1);
+                        if(statusList.size() > 0){
+                            for(int i=0;i<list1.size();i++){
+                                for(int j=0;j<statusList.size();j++){
+                                    if(list1.get(i).getProductId().equals(statusList.get(j).getProductId()) && list1.get(i).getDeviceId().equals(statusList.get(j).getDeviceId())){
+                                        list1.get(i).setDeviceStatus(statusList.get(j).getDeviceStatus());
+                                        list1.get(i).setLastOnlineTime(statusList.get(j).getLastOnlineTime());
+                                        list1.get(i).setLastOfflineTime(statusList.get(j).getLastOfflineTime());
+                                        list.add(list1.get(i));
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                }
+
+                if(list.size() > 0){
+                    total = list.size();
+                    page.setTotal(total);
+                }
+
+                Integer current = 0;
+                if(pageCurrent != null && pageSize > 0){
+                    current = (pageCurrent-1)*pageSize;
+                }
+
+                page.setRecords(list.stream().skip(current).limit(pageSize).collect(Collectors.toList()));
+            }else{
+                LambdaQueryWrapper<DmpDeviceStatus> queryWrapper = Wrappers.lambdaQuery();
+                queryWrapper.eq(DmpDeviceStatus::getDeviceStatus,diRequest.getDeviceStatus());
+                List<DmpDeviceStatus> statusList = dmpDeviceStatusService.list(queryWrapper);
+                if(statusList.size() > 0){
+                    List<String> devList = new ArrayList<>();
+                    List<Integer> productIdList = new ArrayList<>();
+                    for(int i=0;i<statusList.size();i++){
+                        if(!devList.contains(statusList.get(i).getDeviceId())){
+                            devList.add(statusList.get(i).getDeviceId());
+                        }
+                        if(!productIdList.contains(statusList.get(i).getProductId())){
+                            productIdList.add(statusList.get(i).getProductId());
+                        }
+                    }
+
+                    if(devList.size() > 0){
+                        LambdaQueryWrapper<DmpDeviceInfo> queryWrapper1 = Wrappers.lambdaQuery();
+                        queryWrapper1.in(DmpDeviceInfo::getDeviceId,devList)
+                                .in(DmpDeviceInfo::getProductId,productIdList)
+                                .eq(DmpDeviceInfo::getDeleteFlag,0)
+                                .eq(DmpDeviceInfo::getTenantId,tenantId)
+                                .orderByDesc(DmpDeviceInfo::getId);
+                        List<DmpDeviceInfo> list1 = this.list(queryWrapper1);
+                        if(list1.size() > 0){
+                            for(int i=0;i<list1.size();i++){
+                                for(int j=0;j<statusList.size();j++){
+                                    if(list1.get(i).getProductId().equals(statusList.get(j).getProductId()) && list1.get(i).getDeviceId().equals(statusList.get(j).getDeviceId())){
+                                        list1.get(i).setDeviceStatus(statusList.get(j).getDeviceStatus());
+                                        list1.get(i).setLastOnlineTime(statusList.get(j).getLastOnlineTime());
+                                        list1.get(i).setLastOfflineTime(statusList.get(j).getLastOfflineTime());
+                                        list.add(list1.get(i));
+                                        break;
+                                    }
+                                }
+                            }
+                            if(list.size() > 0){
+                                total = list.size();
+                                page.setTotal(total);
+                            }
+
+                            Integer current = 0;
+                            if(pageCurrent != null && pageSize > 0){
+                                current = (pageCurrent-1)*pageSize;
+                            }
+
+                            page.setRecords(list.stream().skip(current).limit(pageSize).collect(Collectors.toList()));
+                        }
+                    }
+                }
+            }
+        }else{
+            LambdaQueryWrapper<DmpDeviceInfo> queryWrapper = Wrappers.lambdaQuery();
+            queryWrapper.eq(StringUtils.isNotBlank(diRequest.getDeviceId()),DmpDeviceInfo::getDeviceId,diRequest.getDeviceId())
+                    .like(StringUtils.isNotBlank(diRequest.getDeviceName()),DmpDeviceInfo::getDeviceName,diRequest.getDeviceName())
+                    .eq(diRequest.getProductId() != null,DmpDeviceInfo::getProductId,diRequest.getProductId())
+                    .like(StringUtils.isNotBlank(diRequest.getProductCode()),DmpDeviceInfo::getProductCode,diRequest.getProductCode())
+                    .eq(diRequest.getServiceStatus() != null,DmpDeviceInfo::getServiceStatus,diRequest.getServiceStatus())
+                    .eq(DmpDeviceInfo::getDeleteFlag,0)
+                    .eq(DmpDeviceInfo::getTenantId,tenantId)
+                    .orderByDesc(DmpDeviceInfo::getId);
+            page = this.page(page,queryWrapper);
+            if(page.getTotal() > 0){
+                List<String> devList = new ArrayList<>();
+                List<Integer> productIdList = new ArrayList<>();
+                for(int i=0;i<page.getRecords().size();i++){
+                    if(!devList.contains(page.getRecords().get(i).getDeviceId())){
+                        devList.add(page.getRecords().get(i).getDeviceId());
+                    }
+                    if(!productIdList.contains(page.getRecords().get(i).getProductId())){
+                        productIdList.add(page.getRecords().get(i).getProductId());
+                    }
+                }
+
+                if(devList.size() > 0){
+                    LambdaQueryWrapper<DmpDeviceStatus> queryWrapper1 = Wrappers.lambdaQuery();
+                    queryWrapper1.in(DmpDeviceStatus::getDeviceId,devList)
+                            .in(DmpDeviceStatus::getProductId,productIdList);
+                    List<DmpDeviceStatus> statusList = dmpDeviceStatusService.list(queryWrapper1);
+                    if(statusList.size() > 0){
+                        for(int i=0;i<page.getRecords().size();i++){
+                            for(int j=0;j<statusList.size();j++){
+                                if(page.getRecords().get(i).getProductId().equals(statusList.get(j).getProductId()) && page.getRecords().get(i).getDeviceId().equals(statusList.get(j).getDeviceId())){
+                                    page.getRecords().get(i).setDeviceStatus(statusList.get(j).getDeviceStatus());
+                                    page.getRecords().get(i).setLastOnlineTime(statusList.get(j).getLastOnlineTime());
+                                    page.getRecords().get(i).setLastOfflineTime(statusList.get(j).getLastOfflineTime());
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+
+        return new CommonPage<>(page.getRecords(),page.getTotal(),pageSize,pageCurrent);
+    }
+
     @Override
     public boolean remove(Integer id) {
         DmpDeviceInfo dmpDeviceInfo = this.getById(id);

+ 9 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/vo/DmpDeviceInfoRequest.java

@@ -21,6 +21,11 @@ public class DmpDeviceInfoRequest {
      */
     private Integer productId;
 
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
     /**
      * 设备Id
      */
@@ -41,5 +46,9 @@ public class DmpDeviceInfoRequest {
      */
     private Integer deviceStatus;
 
+    /**
+     * 域名
+     */
+    private String domain;
 
 }

+ 18 - 0
service-iot/service-iot-biz/src/main/resources/mapper/iot/DmpDeviceInfoMapper.xml

@@ -56,6 +56,24 @@
             </if>
         </where>
     </select>
+    <select id="getMeetingFaceData" resultType="integer">
+        select mf.fid as fid
+        from meeting_face mf
+        <where>
+            <if test="userId != null">
+                and mf.user_id = #{userId}
+            </if>
+        </where>
+    </select>
+    <select id="getMeetingFaceDeviceList" resultType="integer">
+        select mfd.device_id as deviceFid
+        from meeting_face_device mfd
+        <where>
+            <if test="fid != null">
+                and mfd.face_id = #{fid}
+            </if>
+        </where>
+    </select>
 
     <select id="attributeList" resultType="com.usky.backend.domain.ProductTVAttributeVO">
         select dpa.product_id as productId,dpa.attribute_code as attributeCode,dpa.attribute_name as attributeName,dpa.attribute_unit as attributeUnit,dpa.maximum as maximum,dpa.minimum as minimum,dpt.product_code as productCode

+ 10 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/annotation/aspect/FaceAspect.java

@@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.time.LocalDateTime;
+import java.util.Objects;
 
 /**
  * @author tanyongpeng
@@ -33,6 +34,15 @@ public class FaceAspect {
         faceVefLog.setVefCode(result.getCode());
         faceVefLog.setVefMsg(result.getMsg());
         faceVefLog.setLoginName(result.getFaceName());
+        faceVefLog.setTenantId(result.getTenantId());
+        if(Objects.nonNull(result.getFaceBase())){
+            faceVefLog.setFaceBase(result.getFaceBase());
+            faceVefLog.setVefType(1);
+        }
+        if(Objects.nonNull(result.getCardNum())){
+            faceVefLog.setCardNum(result.getCardNum());
+            faceVefLog.setVefType(2);
+        }
         faceVefLogService.save(faceVefLog);
     }
 

+ 44 - 2
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/controller/web/MeetingFaceController.java

@@ -3,6 +3,7 @@ package com.usky.meeting.controller.web;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.usky.common.core.bean.ApiResult;
@@ -10,19 +11,28 @@ import com.usky.common.core.bean.CommonPage;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.meeting.annotation.FaceLog;
 import com.usky.meeting.domain.MeetingFace;
+import com.usky.meeting.mapper.MeetingFaceMapper;
+import com.usky.meeting.repository.MeetingInfoRepository;
 import com.usky.meeting.service.MeetingFaceService;
+import com.usky.meeting.service.vo.DmpDeviceInfoVO;
 import com.usky.meeting.service.vo.FaceResultVO;
 import com.usky.meeting.service.vo.MeetingFaceRequestVO;
 import com.usky.meeting.service.vo.MeetingFaceVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.models.auth.In;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 import org.springframework.web.bind.annotation.*;
 
 import org.springframework.stereotype.Controller;
 
 import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -39,6 +49,10 @@ import java.time.LocalDateTime;
 public class MeetingFaceController {
     @Autowired
     MeetingFaceService faceService;
+    @Autowired
+    MeetingInfoRepository meetingInfoRepository;
+    @Autowired
+    private MeetingFaceMapper meetingFaceMapper;
 
     @PostMapping("/vef")
     @ApiOperation(value="人脸验证", notes="根据传入的base64编码和数据的base64编码进行对比")
@@ -53,12 +67,26 @@ public class MeetingFaceController {
             @RequestParam Integer current,
             @RequestParam Integer size,
             @RequestParam(required = false) String faceName,
-            @RequestParam(required = false) String faceStatus
-    ){
+            @RequestParam(required = false) String faceStatus,
+            @RequestParam(required = false) Integer fid
+            ){
         IPage<MeetingFace> page = faceService.page(new Page(current, size), new QueryWrapper<MeetingFace>()
                 .like(StrUtil.isNotBlank(faceName),"face_name",faceName)
                 .like(StrUtil.isNotBlank(faceStatus),"face_status",faceStatus)
+                .eq(fid != null,"fid",fid)
                 .eq("tenant_id", SecurityUtils.getTenantId()));
+        if(page.getRecords().size() > 0){
+            for (int i = 0; i < page.getRecords().size(); i++) {
+                if(Objects.nonNull(page.getRecords().get(i).getBindDevice())){
+                    String[] deviceIdStr = page.getRecords().get(i).getBindDevice().split(",");
+                    Integer[] deviceIds = Arrays.stream(deviceIdStr).map(Integer::parseInt).toArray(Integer[]::new);
+                    List<DmpDeviceInfoVO> list = meetingFaceMapper.getDeviceInfo(Arrays.asList(deviceIds));
+                    page.getRecords().get(i).setDeviceInfos(list);
+
+                }
+            }
+
+        }
         return ApiResult.success(new CommonPage<>(page.getRecords(),page.getTotal(),size,current));
     }
 
@@ -67,6 +95,7 @@ public class MeetingFaceController {
     @ApiOperation(value = "删除人脸",notes = "根据id进行删除")
     public FaceResultVO faceDelete(@PathVariable Integer fid){
         faceService.removeById(fid);
+        meetingInfoRepository.delMeetingFaceDevice(fid);
         return FaceResultVO.success("删除成功");
     }
 
@@ -82,7 +111,13 @@ public class MeetingFaceController {
         face.setVefNum(0);
         face.setCreateTime(LocalDateTime.now());
         face.setTenantId(SecurityUtils.getTenantId());
+        String[] devicefids = face.getBindDevice().split(",");
         faceService.save(face);
+        if(devicefids.length > 0){
+            for (int i = 0; i < devicefids.length; i++) {
+                meetingInfoRepository.insertMeetingFaceDevice(face.getFid(),Integer.parseInt(devicefids[i]));
+            }
+        }
         return FaceResultVO.success("添加成功");
     }
 
@@ -90,6 +125,13 @@ public class MeetingFaceController {
     @ApiOperation(value = "修改")
     public FaceResultVO update(@RequestBody MeetingFace face){
         faceService.updateById(face);
+        meetingInfoRepository.delMeetingFaceDevice(face.getFid());
+        String[] devicefids = face.getBindDevice().split(",");
+        if(devicefids.length > 0){
+            for (int i = 0; i < devicefids.length; i++) {
+                meetingInfoRepository.insertMeetingFaceDevice(face.getFid(),Integer.parseInt(devicefids[i]));
+            }
+        }
         return FaceResultVO.success("修改成功");
     }
 }

+ 12 - 4
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingFace.java

@@ -1,11 +1,14 @@
 package com.usky.meeting.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import java.io.Serializable;
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.usky.meeting.service.vo.DmpDeviceInfoVO;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -60,14 +63,14 @@ public class MeetingFace implements Serializable {
     private Integer faceStatus;
 
     /**
-     * 扩展字段2
+     * 卡号
      */
-    private String updateExtend2;
+    private String cardNum;
 
     /**
-     * 扩展字段3
+     * 绑定设备
      */
-    private String updateExtend3;
+    private String bindDevice;
 
     /**
      * 组织机构ID
@@ -84,5 +87,10 @@ public class MeetingFace implements Serializable {
      */
     private Long userId;
 
+    /**
+     * 设备对象
+     */
+    @TableField(exist = false)
+    private List<DmpDeviceInfoVO> deviceInfos;
 
 }

+ 14 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/domain/MeetingFaceVefLog.java

@@ -57,5 +57,19 @@ public class MeetingFaceVefLog implements Serializable {
      */
     private Integer tenantId;
 
+    /**
+     * 图片数据 base_64编码
+     */
+    private String faceBase;
+
+    /**
+     * 卡号
+     */
+    private String cardNum;
+
+    /**
+     * 验证类型(1、人脸 2、卡号)
+     */
+    private Integer vefType;
 
 }

+ 6 - 1
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/mapper/MeetingFaceMapper.java

@@ -2,6 +2,11 @@ package com.usky.meeting.mapper;
 
 import com.usky.meeting.domain.MeetingFace;
 import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.meeting.service.vo.DmpDeviceInfoVO;
+import io.swagger.models.auth.In;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -12,5 +17,5 @@ import com.usky.common.mybatis.core.CrudMapper;
  * @since 2024-03-08
  */
 public interface MeetingFaceMapper extends CrudMapper<MeetingFace> {
-
+    List<DmpDeviceInfoVO> getDeviceInfo(@Param("deviceIdList") List<Integer> deviceIdList);
 }

+ 20 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/repository/MeetingInfoRepository.java

@@ -305,6 +305,26 @@ public interface MeetingInfoRepository extends JpaRepository<MeetingInfo, Long>,
      */
     @Query(value = "select * from meeting_info where room_id = :roomId",nativeQuery = true)
     List<MeetingInfo> queryAllMeetingByRoomId(@Param("roomId") Long roomId);
+
+    /**
+     * 新增人脸设备关联表记录
+     * @param faceId  人脸主键ID
+     * @param deviceId  设备主键ID
+     */
+    @Transactional
+    @Modifying
+    @Query(value = "insert into meeting_face_device (face_id,device_id) values (:faceId,:deviceId)",nativeQuery = true)
+    void insertMeetingFaceDevice(@Param("faceId") Integer faceId, @Param("deviceId") Integer deviceId);
+
+    /**
+     * 删除人脸设备关联表记录
+     * @param faceId
+     */
+    @Transactional
+    @Modifying
+    @Query(value = "delete from meeting_face_device where face_id = :faceId",nativeQuery = true)
+    void delMeetingFaceDevice(@Param("faceId") Integer faceId);
+
 //
 //
 //    /**

+ 88 - 39
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/impl/MeetingFaceServiceImpl.java

@@ -52,61 +52,110 @@ public class MeetingFaceServiceImpl extends AbstractCrudService<MeetingFaceMappe
         List<MeetingFace> faceList = lambdaQuery().eq(MeetingFace::getTenantId,tenantId).orderByDesc(MeetingFace::getVefNum).list();
         MeetingFaceVO faceState = new MeetingFaceVO();
         MeetingFaceVO faceState1 = new MeetingFaceVO();
+        faceState.setTenantId(tenantId);
+        faceState1.setTenantId(tenantId);
         // 如果人脸库为空,则第一次登录为录入人脸
         if (faceList.size() > 0){
-//            return initFace(imageBase);
-//        }else {
-            int faceLength = faceList.size();
-            for (MeetingFace face : faceList) {
-                FaceResultVO faceResult = faceContrastServer.faceContrast(face.getFaceBase(), requestVO.getImageBase());
-                // 是否比对成功
-                if (faceResult.getCode() == MeetingFaceVO.SUCCESS_CODE ){
-                    // 相似度是否大于80
-                    if (faceResult.getScore() > MeetingFaceVO.SATISFY_SCORE){
-                        if (face.getFaceStatus() == 0){
-                            // 成功
-                            lambdaUpdate().set(MeetingFace::getVefNum,face.getVefNum()+1).eq(MeetingFace::getFid,face.getFid()).update();
-                            faceState.setMsg(TimeUtils.timeQuantum()+"好,"+face.getFaceName());
-                            faceState.setFaceName(face.getFaceName());
-                            faceState.setUserId(face.getUserId());
-                            faceState.setCode(MeetingFaceVO.SUCCESS_CODE);
-                            return faceState;
+            //人脸校验
+            if(StringUtils.isNotBlank(requestVO.getImageBase())){
+                int faceLength = faceList.size();
+                for (MeetingFace face : faceList) {
+                    FaceResultVO faceResult = faceContrastServer.faceContrast(face.getFaceBase(), requestVO.getImageBase());
+                    // 是否比对成功
+                    if (faceResult.getCode() == MeetingFaceVO.SUCCESS_CODE ){
+                        // 相似度是否大于80
+                        if (faceResult.getScore() > MeetingFaceVO.SATISFY_SCORE){
+                            if (face.getFaceStatus() == 0){
+                                // 成功
+                                lambdaUpdate().set(MeetingFace::getVefNum,face.getVefNum()+1).eq(MeetingFace::getFid,face.getFid()).update();
+                                faceState.setMsg(TimeUtils.timeQuantum()+"好,"+face.getFaceName());
+                                faceState.setFaceName(face.getFaceName());
+                                faceState.setUserId(face.getUserId());
+                                faceState.setCode(MeetingFaceVO.SUCCESS_CODE);
+                                faceState.setFaceBase(requestVO.getImageBase());
+                                faceState.setVefType(1);
+                                return faceState;
+                            }else {
+                                // 失败 人脸被禁用
+                                lambdaUpdate().set(MeetingFace::getVefNum,face.getVefNum()+1).eq(MeetingFace::getFid,face.getFid()).update();
+                                faceState1.setMsg("当前人脸被禁用");
+                                faceState1.setFaceName(face.getFaceName());
+                                faceState1.setUserId(face.getUserId());
+                                faceState1.setCode(MeetingFaceVO.FORBIDDEN_FACE);
+                                faceState1.setFaceBase(requestVO.getImageBase());
+                                faceState1.setVefType(1);
+                                // 就算上一张人脸被禁用还得往下执行
+                                // 可能当前用户存在多张人脸,
+                                if (faceLength == 1){
+                                    return faceState1;
+                                }
+                                faceLength --;
+                            }
                         }else {
-                            // 失败 人脸被禁用
-                            lambdaUpdate().set(MeetingFace::getVefNum,face.getVefNum()+1).eq(MeetingFace::getFid,face.getFid()).update();
-                            faceState1.setMsg("当前人脸被禁用");
-                            faceState1.setFaceName(face.getFaceName());
-                            faceState1.setUserId(face.getUserId());
-                            faceState1.setCode(MeetingFaceVO.FORBIDDEN_FACE);
-                            // 就算上一张人脸被禁用还得往下执行
-                            // 可能当前用户存在多张人脸,
+                            // 人脸库没有检测到人脸
                             if (faceLength == 1){
-                                return faceState1;
+                                // 判断当前人脸是否被禁用,如被禁用,提示被禁用
+                                // 禁用优先级大于 没有检测到人脸
+                                faceState.setMsg("人脸不匹配,请联系管理员");
+                                faceState.setCode(MeetingFaceVO.NOT_FOUND_FACE);
+                                faceState.setFaceBase(requestVO.getImageBase());
+                                faceState.setVefType(1);
+                                return faceState;
                             }
                             faceLength --;
                         }
                     }else {
-                        // 人脸库没有检测到人脸
+                        // 接口返回异常
+                        faceState.setMsg("人脸验证接口返回异常");
+                        faceState.setCode(MeetingFaceVO.FACE_ERROR);
+                        return faceState;
+                    }
+                }
+            }else if(StringUtils.isNotBlank(requestVO.getCardNum())){  //卡号校验
+                int faceLength = faceList.size();
+                String cardNum = requestVO.getCardNum();
+                for (MeetingFace face : faceList) {
+                    if(cardNum.equals(face.getCardNum())){
+                        // 成功
+                        lambdaUpdate().set(MeetingFace::getVefNum,face.getVefNum()+1).eq(MeetingFace::getFid,face.getFid()).update();
+                        faceState.setMsg(TimeUtils.timeQuantum()+"好,"+face.getFaceName());
+                        faceState.setFaceName(face.getFaceName());
+                        faceState.setUserId(face.getUserId());
+                        faceState.setCode(MeetingFaceVO.SUCCESS_CODE);
+                        faceState.setCardNum(requestVO.getCardNum());
+                        faceState.setVefType(2);
+                        return faceState;
+                    }else {
+                        // 失败 卡号不存在
+                        lambdaUpdate().set(MeetingFace::getVefNum,face.getVefNum()+1).eq(MeetingFace::getFid,face.getFid()).update();
+                        faceState1.setMsg("当前卡号不存在");
+                        faceState1.setCode(MeetingFaceVO.NOT_FOUND_FACE);
+                        faceState1.setCardNum(requestVO.getCardNum());
+                        faceState1.setVefType(2);
+                        // 就算上一张卡号没有找到还得往下执行
                         if (faceLength == 1){
-                            // 判断当前人脸是否被禁用,如被禁用,提示被禁用
-                            // 禁用优先级大于 没有检测到人脸
-                            faceState.setMsg("人脸不匹配,请联系管理员");
-                            faceState.setCode(MeetingFaceVO.NOT_FOUND_FACE);
-                            return faceState;
+                            return faceState1;
                         }
                         faceLength --;
                     }
-                }else {
-                    // 接口返回异常
-                    faceState.setMsg("人脸验证接口返回异常");
-                    faceState.setCode(MeetingFaceVO.FACE_ERROR);
-                    return faceState;
                 }
             }
+
+
         }
         // 空异常
-        faceState.setMsg("人脸不存在,请联系管理员");
-        faceState.setCode(MeetingFaceVO.NULL_ERROR);
+        if(StringUtils.isNotBlank(requestVO.getImageBase())){
+            faceState.setMsg("人脸不存在,请联系管理员");
+            faceState.setCode(MeetingFaceVO.NULL_ERROR);
+            faceState.setFaceBase(requestVO.getImageBase());
+            faceState.setVefType(1);
+        }else if(StringUtils.isNotBlank(requestVO.getCardNum())){
+            faceState.setMsg("卡号不存在,请联系管理员");
+            faceState.setCode(MeetingFaceVO.NULL_ERROR);
+            faceState.setFaceBase(requestVO.getCardNum());
+            faceState.setVefType(2);
+        }
+
         return faceState;
     }
 

+ 65 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/DmpDeviceInfoVO.java

@@ -0,0 +1,65 @@
+package com.usky.meeting.service.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("dmp_device")
+public class DmpDeviceInfoVO implements Serializable {
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设备ID;设备注册时系统自动生成一个唯一编号
+     */
+    private String deviceId;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 产品ID
+     */
+    private Integer productId;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+    /**
+     * 单位编号
+     */
+    private String companyCode;
+
+    /**
+     * 安装位置
+     */
+    private String installAddress;
+
+    /**
+     * 业务状态;1:未激活,2:已激活,3:禁用
+     */
+    private Integer serviceStatus;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 设备uuid
+     */
+    private String deviceUuid;
+}

+ 5 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingFaceRequestVO.java

@@ -13,4 +13,9 @@ public class MeetingFaceRequestVO {
      * 域名
      */
     private String domain;
+
+    /**
+     * 卡号
+     */
+    private String cardNum;
 }

+ 25 - 0
service-meeting/service-meeting-biz/src/main/java/com/usky/meeting/service/vo/MeetingFaceVO.java

@@ -25,6 +25,31 @@ public class MeetingFaceVO {
      */
     private int code;
 
+    /**
+     * 图片数据 base_64编码
+     */
+    private String faceBase;
+
+    /**
+     * 卡号
+     */
+    private String cardNum;
+
+    /**
+     * 验证类型(1、人脸 2、卡号)
+     */
+    private Integer vefType;
+
+    /**
+     * 组织机构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
 
     /*成功*/
     public static final Integer SUCCESS_CODE = 200;

+ 17 - 2
service-meeting/service-meeting-biz/src/main/resources/mapper/meeting/MeetingFaceMapper.xml

@@ -11,11 +11,26 @@
         <result column="face_name" property="faceName" />
         <result column="remark" property="remark" />
         <result column="face_status" property="faceStatus" />
-        <result column="update_extend2" property="updateExtend2" />
-        <result column="update_extend3" property="updateExtend3" />
+        <result column="card_num" property="cardNum" />
+        <result column="bind_device" property="bindDevice" />
         <result column="dept_id" property="deptId" />
         <result column="tenant_id" property="tenantId" />
         <result column="user_id" property="userId" />
     </resultMap>
+    <select id="getDeviceInfo" resultType="com.usky.meeting.service.vo.DmpDeviceInfoVO">
+        SELECT dd.id,dd.device_id,dd.device_name,dd.product_id,dd.tenant_id,dd.company_code,dd.install_address,dd.service_status,dd.product_code,dd.device_uuid
+            FROM dmp_device dd
+        <where>
+            <if test="deviceIdList != null and deviceIdList.size() > 0">
+                AND dd.id in
+                <foreach item="item" collection="deviceIdList" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="1 == 1">
+                and dd.delete_flag = 0
+            </if>
+        </where>
+    </select>
 
 </mapper>