车车 пре 8 месеци
родитељ
комит
035b558f10

+ 14 - 33
ktg-admin/src/main/java/com/ktg/web/controller/system/SysLoginController.java

@@ -1,21 +1,17 @@
 package com.ktg.web.controller.system;
 
-import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ktg.common.annotation.Log;
 import com.ktg.common.constant.Constants;
 import com.ktg.common.core.domain.AjaxResult;
 import com.ktg.common.core.domain.entity.SysMenu;
 import com.ktg.common.core.domain.entity.SysUser;
-import com.ktg.common.core.domain.model.FingerprintLoginBody;
 import com.ktg.common.core.domain.model.LoginBody;
-import com.ktg.common.utils.FingerprintComparisonByImg;
+import com.ktg.common.enums.BusinessType;
 import com.ktg.common.utils.SecurityUtils;
-import com.ktg.common.vo.VerificationVO;
 import com.ktg.framework.web.service.SysLoginService;
 import com.ktg.framework.web.service.SysPermissionService;
-import com.ktg.system.domain.SysUserCharacteristic;
 import com.ktg.system.service.ISysMenuService;
-import com.ktg.system.service.ISysUserCharacteristicService;
 import com.ktg.system.service.ISysUserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -24,11 +20,10 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.stream.Collectors;
 
 /**
  * 登录验证
@@ -40,17 +35,13 @@ import java.util.stream.Collectors;
 public class SysLoginController {
     @Autowired
     private SysLoginService loginService;
-
     @Autowired
     private ISysMenuService menuService;
-
     @Autowired
     private SysPermissionService permissionService;
-
     @Autowired
     private ISysUserService iSysUserService;
-    @Autowired
-    private ISysUserCharacteristicService iSysUserCharacteristicService;
+
 
     /**
      * 登录方法
@@ -119,27 +110,17 @@ public class SysLoginController {
         return AjaxResult.success(menuService.buildMenus(menus));
     }
 
-    @ApiOperation("系统用户登录-指纹验证登录")
+    /*@ApiOperation("系统用户登录-指纹验证登录")
     @PostMapping("/loginByFingerprint")
     public AjaxResult loginByFingerprint(@RequestBody FingerprintLoginBody loginBody) {
-        Assert.notBlank(loginBody.getInputImg(), "输入的指纹不能为空!");
-        // 获取所有的用户指纹
-        List<SysUserCharacteristic> list = iSysUserCharacteristicService.list(Wrappers.<SysUserCharacteristic>lambdaQuery()
-                .eq(SysUserCharacteristic::getType, "0"));
-        Assert.isFalse(list.isEmpty(), "指纹库中暂无您的指纹信息!");
-        List<String> collect = list.stream().map(SysUserCharacteristic::getContent).collect(Collectors.toList());
-        // 通过指纹获取最相似的用户
-        VerificationVO verificationVO = FingerprintComparisonByImg.completableFutureComparison(loginBody.getInputImg(), new HashSet<>(collect));
-        Assert.notNull(verificationVO, "无法根据指纹确定您的身份,请通过其它方式登录!");
-        String fingerprintImg = verificationVO.getFingerprintImg();
-        SysUserCharacteristic one = iSysUserCharacteristicService.getOne(Wrappers.<SysUserCharacteristic>lambdaQuery()
-                .eq(SysUserCharacteristic::getContent, fingerprintImg));
-        SysUser sysUser = iSysUserService.getById(one.getUserId());
-        // 生成令牌
-        AjaxResult ajax = AjaxResult.success();
-        String token = loginService.loginWithoutPassword(sysUser);
-        ajax.put(Constants.TOKEN, token);
-        ajax.put("nickName", sysUser.getNickName());
-        return ajax;
+        AjaxResult ajaxResult = loginService.loginByFingerprint(loginBody);
+        return ajaxResult;
+    }*/
+
+    @ApiOperation("系统用户登录-指纹验证登录dat")
+    @Log(title = "导入-物资", businessType = BusinessType.IMPORT)
+    @PostMapping("/loginByFingerprintDat")
+    public AjaxResult loginByFingerprintDat(MultipartFile file) {
+        return loginService.loginByFingerprintDat(file);
     }
 }

+ 57 - 5
ktg-admin/src/main/java/com/ktg/web/controller/system/SysUserCharacteristicController.java

@@ -5,19 +5,31 @@ import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ktg.common.annotation.Log;
+import com.ktg.common.config.RuoYiConfig;
 import com.ktg.common.core.controller.BaseController;
+import com.ktg.common.core.domain.AjaxResult;
 import com.ktg.common.enums.BusinessType;
 import com.ktg.common.pojo.CommonResult;
+import com.ktg.common.utils.StringUtils;
+import com.ktg.common.utils.file.FileUploadUtils;
+import com.ktg.common.utils.file.FileUtils;
 import com.ktg.common.utils.poi.ExcelUtil;
+import com.ktg.framework.config.ServerConfig;
+import com.ktg.system.domain.SysUploadFile;
 import com.ktg.system.domain.SysUserCharacteristic;
+import com.ktg.system.service.ISysUploadFileService;
 import com.ktg.system.service.ISysUserCharacteristicService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameters;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.Arrays;
@@ -30,12 +42,19 @@ import java.util.List;
  * @date 2025-03-10
  */
 @Api(tags = "用户特征(指纹、面部)")
+@Slf4j
 @RestController
 @RequestMapping("/system/user/characteristic")
 public class SysUserCharacteristicController extends BaseController
 {
     @Autowired
     private ISysUserCharacteristicService sysUserCharacteristicService;
+    @Autowired
+    private ServerConfig serverConfig;
+    @Autowired
+    private ISysUploadFileService iSysUploadFileService;
+    @Value("${ktg-mes.prod}")
+    private String prodApi;
 
     @ApiOperation("查询用户特征(指纹、面部)-分页")
     @Parameters({
@@ -75,13 +94,46 @@ public class SysUserCharacteristicController extends BaseController
         return CommonResult.success(sysUserCharacteristicService.getById(recordId));
     }
 
-    @ApiOperation("新增用户特征(指纹、面部)")
+    @Transactional
+    @ApiOperation("新增指纹录入-指纹图片转成dat存储")
     @PreAuthorize("@ss.hasPermi('iscs:characteristic:add')")
-    @Log(title = "用户特征(指纹、面部)", businessType = BusinessType.INSERT)
-    @PostMapping("/insertSysUserCharacteristic")
-    public CommonResult<Boolean> insertSysUserCharacteristic(@RequestBody @Parameter(name = "sysUserCharacteristic", description = "新增数据类,放到body") SysUserCharacteristic sysUserCharacteristic)
+    @Log(title = "新增指纹录入-指纹图片转成dat存储", businessType = BusinessType.INSERT)
+    @PostMapping("/insertUserFingerprintDat")
+    public CommonResult<Boolean> insertUserFingerprintDat(MultipartFile file, Long userId)
     {
-        return CommonResult.success(sysUserCharacteristicService.save(sysUserCharacteristic));
+        try {
+            // 上传文件路径
+            String filePath = RuoYiConfig.getUploadPath();
+            // 上传并返回新文件名称
+            String fileName = FileUploadUtils.upload(filePath, file);
+            String url;
+            String absolutePath;
+            if (StringUtils.isNotBlank(prodApi)) {
+                url = serverConfig.getUrl() + prodApi + fileName;
+                absolutePath = fileName.replace("/profile/upload", filePath);
+            } else {
+                url = serverConfig.getUrl() + fileName;
+                absolutePath = "C:" + fileName.replace("/profile/upload", filePath);
+            }
+
+            AjaxResult ajax = AjaxResult.success();
+            ajax.put("url", url);
+            ajax.put("fileName", fileName);
+            ajax.put("newFileName", FileUtils.getName(fileName));
+            ajax.put("originalFilename", file.getOriginalFilename());
+
+            // 2.开始新增文件上传信息
+            SysUploadFile sysFile = new SysUploadFile();
+            sysFile.setName(file.getOriginalFilename());
+            sysFile.setPath(absolutePath);
+            sysFile.setUrl(url);
+            sysFile.setType(file.getContentType());
+            sysFile.setSize(file.getSize());
+            iSysUploadFileService.insertSysUploadFile(sysFile);
+        } catch (Exception e) {
+            log.error("上传指纹失败:" + e);
+        }
+        return CommonResult.success(sysUserCharacteristicService.insertUserFingerprintDat(file, userId));
     }
 
     @ApiOperation("修改用户特征(指纹、面部)")

+ 167 - 0
ktg-common/src/main/java/com/ktg/common/utils/FingerprintComparisonByDat.java

@@ -0,0 +1,167 @@
+package com.ktg.common.utils;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import com.google.common.collect.Lists;
+import com.ktg.common.vo.VerificationVO;
+import com.machinezoo.sourceafis.FingerprintImage;
+import com.machinezoo.sourceafis.FingerprintMatcher;
+import com.machinezoo.sourceafis.FingerprintTemplate;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * <p>
+ * FingerprintComparison<br>
+ * 指纹比对算法(图片)
+ * </p>
+ *
+ * @author CGJ
+ * @version 1.0
+ * @since 2025年03月07日 11:51
+ */
+@Slf4j
+public class FingerprintComparisonByDat {
+
+    // 相似度门槛
+    private static final double THRESHOLD = 40; // 相当于错误率是0.01%,THRESHOLD越高,错误率越低
+    private static final ExecutorService THREAD_POOL_EXECUTOR = Executors.newFixedThreadPool(4); // 线程池
+
+    public static VerificationVO completableFutureComparison(final MultipartFile file, final Set<String> matcherDat) {
+        // 转成list
+        List<String> matcherImgList = new ArrayList<>(matcherDat);
+        // 切分四等份
+        int denominator = 1;
+        if (matcherImgList.size() >= 4) {
+            denominator = 4;
+        }
+        List<List<String>> averageMatcherImgList = Lists.partition(matcherImgList, matcherImgList.size() / denominator);
+        // 构建四个线程进行处理,防止人员过多对比速度太慢
+        CompletableFuture<VerificationVO>[] completableFutureArray = averageMatcherImgList.stream().map(
+                partitionFingerprint -> CompletableFuture.supplyAsync(
+                        () -> comparison(file, new ArrayList<>(partitionFingerprint)), THREAD_POOL_EXECUTOR)
+        ).toArray(CompletableFuture[]::new);
+        // 等待所有任务执行完
+        CompletableFuture.allOf(completableFutureArray).join();
+        List<VerificationVO> verificationList = new ArrayList<>();
+        for (CompletableFuture<VerificationVO> completableFuture : completableFutureArray) {
+            try {
+                VerificationVO verification = completableFuture.get();
+                if (ObjectUtil.isNotEmpty(verification)) {
+                    verificationList.add(verification);
+                }
+            } catch (InterruptedException | ExecutionException e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+        // 找出最匹配的指纹(匹配度最高)
+        if (ObjectUtil.isNotEmpty(verificationList)) {
+            VerificationVO max = verificationList.stream().max(Comparator.comparing(VerificationVO::getScore)).get();
+            log.info("相似值最佳的的指纹:{},分数{}", max.getFingerprint(), max.getScore());
+            return max;
+        }
+        return null;
+    }
+
+    public static VerificationVO comparison(final MultipartFile file, final List<String> matcherDatList) {
+        try {
+            // 开始解析输入的指纹到指纹模板
+            byte[] bytes = file.getBytes();
+            // 创建FingerprintImage对象
+            FingerprintImage fingerprintImage = new FingerprintImage()
+                    .dpi(500) // 设置DPI,具体值取决于你的图像分辨率
+                    .decode(bytes);
+            // 提取指纹特征值
+            FingerprintTemplate fingerprintTemplate = new FingerprintTemplate(fingerprintImage);
+            if (!matcherDatList.isEmpty()) {
+                // 输入的被验证指纹
+                FingerprintMatcher matcher = new FingerprintMatcher(fingerprintTemplate);
+                // 最匹配的指纹
+                String match = null;
+                // 峰值
+                double high = 0;
+                for (String matcherDat : matcherDatList) {
+                    // 输入的指纹和指纹库中的指纹进行对比,找到当前线程中的分数最高的指纹
+                    FingerprintTemplate matcherTemp = new FingerprintTemplate().deserialize(new String(Files.readAllBytes(Paths.get(matcherDat))));
+                    double score = matcher.match(matcherTemp);
+                    if (score > high) {
+                        high = score;
+                        match = matcherDat;
+                    }
+                }
+                return high >= THRESHOLD ? new VerificationVO().setFingerprint(match).setScore(high) : null;
+            }
+        } catch (Exception e) {
+            log.error("指纹比对异常:{}", e.getMessage());
+        }
+        return null;
+    }
+
+
+
+    public static void main(String[] args) throws IOException {
+        /*try {
+            String imagePath = "C:\\Users\\车车\\Desktop\\指纹\\finger(1)\\finger\\2\\image_2.bmp"; // 替换为你的指纹图片路径
+            byte[] fingerprintData = extractFingerprintTemplate(imagePath);
+
+            // 保存到文件
+            Files.write(Paths.get("C:\\Users\\车车\\Desktop\\指纹\\finger(1)\\finger\\2\\fingerprint_2.dat"), fingerprintData);
+            System.out.println("指纹特征值已保存!");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }*/
+
+        String aa = "C:/Users/车车/Desktop/指纹/finger(1)/finger/2/fingerprint_0.dat";
+        String bb = "C:/Users/车车/Desktop/指纹/finger(1)/finger/2/fingerprint_0.dat";
+        // 加载模板1(数据库或文件中加载)
+        byte[] templateData1 = Files.readAllBytes(Paths.get(aa));
+        String jsonString = new String(templateData1);
+        FingerprintTemplate template1 = new FingerprintTemplate().deserialize(jsonString);
+
+        // 加载模板2(待比对指纹)
+        byte[] templateData2 = Files.readAllBytes(Paths.get(bb));
+        String jsonString2 = new String(templateData2);
+        FingerprintTemplate template2 = new FingerprintTemplate().deserialize(jsonString2);
+
+        // 匹配
+        double score = new FingerprintMatcher().index(template1).match(template2);
+
+        System.out.println("匹配得分: " + score);
+        if (score >= 40) { // 经验阈值,一般为 40 分
+            System.out.println("指纹匹配!");
+        } else {
+            System.out.println("指纹不匹配!");
+        }
+
+
+
+    }
+
+    public static byte[] extractFingerprintTemplate(String imagePath) throws IOException {
+        // 读取图像文件(灰度图像 PNG, BMP, JPEG 等)
+        byte[] imageBytes = Files.readAllBytes(Paths.get(imagePath));
+
+        // 提取特征值
+        FingerprintTemplate template = new FingerprintTemplate()
+                .dpi(500) // 指定 DPI (重要,通常为 500)
+                .create(imageBytes);
+
+        // 导出为 byte[] 保存特征值
+        return template.serialize().getBytes();
+    }
+
+}
+
+

+ 2 - 1
ktg-framework/src/main/java/com/ktg/framework/config/SecurityConfig.java

@@ -97,7 +97,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 // 过滤请求
                 .authorizeRequests()
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
-                .antMatchers("/login", "/register", "/captchaImage", "/cabinetLogin", "/loginByFingerprint").anonymous()
+                .antMatchers("/login", "/register", "/captchaImage", "/cabinetLogin").anonymous()
+                .antMatchers("/loginByFingerprint", "/loginByFingerprintDat").permitAll()
                 .antMatchers("/mobile/login/**").permitAll()
                 .antMatchers("/iscs/card/login").permitAll()
                 .antMatchers("/iscs/key/selectIsKeyByNfcWithoutAuth").permitAll()

+ 62 - 4
ktg-framework/src/main/java/com/ktg/framework/web/service/SysLoginService.java

@@ -1,7 +1,11 @@
 package com.ktg.framework.web.service;
 
+import cn.hutool.core.lang.Assert;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ktg.common.constant.Constants;
+import com.ktg.common.core.domain.AjaxResult;
 import com.ktg.common.core.domain.entity.SysUser;
+import com.ktg.common.core.domain.model.FingerprintLoginBody;
 import com.ktg.common.core.domain.model.LoginBody;
 import com.ktg.common.core.domain.model.LoginUser;
 import com.ktg.common.core.redis.RedisCache;
@@ -9,14 +13,14 @@ import com.ktg.common.exception.ServiceException;
 import com.ktg.common.exception.user.CaptchaException;
 import com.ktg.common.exception.user.CaptchaExpireException;
 import com.ktg.common.exception.user.UserPasswordNotMatchException;
-import com.ktg.common.utils.DateUtils;
-import com.ktg.common.utils.MessageUtils;
-import com.ktg.common.utils.ServletUtils;
-import com.ktg.common.utils.StringUtils;
+import com.ktg.common.utils.*;
 import com.ktg.common.utils.ip.IpUtils;
+import com.ktg.common.vo.VerificationVO;
 import com.ktg.framework.manager.AsyncManager;
 import com.ktg.framework.manager.factory.AsyncFactory;
+import com.ktg.system.domain.SysUserCharacteristic;
 import com.ktg.system.service.ISysConfigService;
+import com.ktg.system.service.ISysUserCharacteristicService;
 import com.ktg.system.service.ISysUserOnlineService;
 import com.ktg.system.service.ISysUserService;
 import io.jsonwebtoken.Claims;
@@ -31,8 +35,12 @@ import org.springframework.security.core.authority.AuthorityUtils;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.util.HashSet;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 登录校验方法
@@ -58,6 +66,10 @@ public class SysLoginService {
     // 令牌秘钥
     @Value("${token.secret}")
     private String secret;
+    @Autowired
+    private ISysUserService iSysUserService;
+    @Autowired
+    private ISysUserCharacteristicService iSysUserCharacteristicService;
 
 
     /**
@@ -186,4 +198,50 @@ public class SysLoginService {
         redisCache.setCacheObject(Constants.CABINET_LOGIN_TOKEN_KEY + loginBody.getUsername(), token);
         return token;
     }
+
+    public AjaxResult loginByFingerprint(FingerprintLoginBody loginBody) {
+        Assert.notBlank(loginBody.getInputImg(), "输入的指纹不能为空!");
+        // 获取所有的用户指纹
+        List<SysUserCharacteristic> list = iSysUserCharacteristicService.list(Wrappers.<SysUserCharacteristic>lambdaQuery()
+                .eq(SysUserCharacteristic::getType, "0"));
+        Assert.isFalse(list.isEmpty(), "指纹库中暂无您的指纹信息!");
+        List<String> collect = list.stream().map(SysUserCharacteristic::getContent).collect(Collectors.toList());
+        // 通过指纹获取最相似的用户
+        VerificationVO verificationVO = FingerprintComparisonByImg.completableFutureComparison(loginBody.getInputImg(), new HashSet<>(collect));
+        Assert.notNull(verificationVO, "无法根据指纹确定您的身份,请通过其它方式登录!");
+        String fingerprintImg = verificationVO.getFingerprintImg();
+        SysUserCharacteristic one = iSysUserCharacteristicService.getOne(Wrappers.<SysUserCharacteristic>lambdaQuery()
+                .eq(SysUserCharacteristic::getContent, fingerprintImg));
+        SysUser sysUser = iSysUserService.getById(one.getUserId());
+        // 生成令牌
+        AjaxResult ajax = AjaxResult.success();
+        String token = loginWithoutPassword(sysUser);
+        ajax.put(Constants.TOKEN, token);
+        ajax.put("nickName", sysUser.getNickName());
+        return ajax;
+    }
+
+    public AjaxResult loginByFingerprintDat(MultipartFile file) {
+        Assert.isTrue(file.getSize() > 0, "输入的指纹不能为空!");
+        // 获取所有的用户指纹
+        List<SysUserCharacteristic> list = iSysUserCharacteristicService.list(Wrappers.<SysUserCharacteristic>lambdaQuery()
+                .eq(SysUserCharacteristic::getType, "1"));
+        Assert.isFalse(list.isEmpty(), "指纹库中暂无您的指纹信息!");
+        List<String> collect = list.stream().map(SysUserCharacteristic::getContent).collect(Collectors.toList());
+        // 通过指纹获取最相似的用户
+        VerificationVO verificationVO = FingerprintComparisonByDat.completableFutureComparison(file, new HashSet<>(collect));
+        Assert.notNull(verificationVO, "无法根据指纹确定您的身份,请通过其它方式登录!");
+        String fingerprint = verificationVO.getFingerprint();
+        SysUserCharacteristic one = iSysUserCharacteristicService.getOne(Wrappers.<SysUserCharacteristic>lambdaQuery()
+                .eq(SysUserCharacteristic::getContent, fingerprint));
+        SysUser sysUser = iSysUserService.getById(one.getUserId());
+        // 生成令牌
+        AjaxResult ajax = AjaxResult.success();
+        String token = loginWithoutPassword(sysUser);
+        ajax.put(Constants.TOKEN, token);
+        ajax.put("nickName", sysUser.getNickName());
+        return ajax;
+    }
+
+
 }

+ 12 - 0
ktg-iscs/src/main/java/com/ktg/iscs/domain/IsMapPoint.java

@@ -56,4 +56,16 @@ public class IsMapPoint extends BaseBean
     @ApiModelProperty(value = "删除标志(0代表存在 2代表删除)")
     private String delFlag;
 
+    @ApiModelProperty(value = "隔离点图标")
+    @TableField(exist = false)
+    private String pointIcon;
+
+    @ApiModelProperty(value = "隔离点图片")
+    @TableField(exist = false)
+    private String pointPicture;
+
+    @ApiModelProperty(value = "隔离点nfc")
+    @TableField(exist = false)
+    private String pointNfc;
+
 }

+ 4 - 0
ktg-iscs/src/main/java/com/ktg/iscs/mapper/IsMapPointMapper.java

@@ -6,6 +6,8 @@ import com.ktg.iscs.domain.IsMapPoint;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 地图点位数据Mapper接口
  *
@@ -17,4 +19,6 @@ public interface IsMapPointMapper extends BaseMapperX<IsMapPoint> {
 
     Page<IsMapPoint> getIsMapPointPage(Page<IsMapPoint> page, @Param(value = "isMapPoint") IsMapPoint isMapPoint);
 
+    List<IsMapPoint> getIsMapPointList(@Param(value = "isMapPoint") IsMapPoint isMapPoint);
+
 }

+ 5 - 2
ktg-iscs/src/main/java/com/ktg/iscs/service/IIsMapPointService.java

@@ -1,10 +1,11 @@
 package com.ktg.iscs.service;
 
-import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.ktg.iscs.domain.IsMapPoint;
 
+import java.util.List;
+
 /**
  * 地图点位数据Service接口
  *
@@ -15,4 +16,6 @@ public interface IIsMapPointService extends IService<IsMapPoint> {
 
     Page<IsMapPoint> getIsMapPointPage(Page<IsMapPoint> page, IsMapPoint isMapPoint);
 
+    List<IsMapPoint> getIsMapPointList(IsMapPoint isMapPoint);
+
 }

+ 7 - 0
ktg-iscs/src/main/java/com/ktg/iscs/service/impl/IsMapPointServiceImpl.java

@@ -8,6 +8,8 @@ import com.ktg.iscs.service.IIsMapPointService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * 地图点位数据Service业务层处理
  *
@@ -26,4 +28,9 @@ public class IsMapPointServiceImpl extends ServiceImpl<IsMapPointMapper, IsMapPo
         return isMapPointPage;
     }
 
+    @Override
+    public List<IsMapPoint> getIsMapPointList(IsMapPoint isMapPoint) {
+        return isMapPointMapper.getIsMapPointList(isMapPoint);
+    }
+
 }

+ 3 - 2
ktg-iscs/src/main/java/com/ktg/iscs/service/impl/IsMapServiceImpl.java

@@ -39,8 +39,9 @@ public class IsMapServiceImpl extends ServiceImpl<IsMapMapper, IsMap> implements
     @Override
     public IsMap selectIsMapById(Long id) {
         IsMap map = getById(id);
-        List<IsMapPoint> list = iIsMapPointService.list(Wrappers.<IsMapPoint>lambdaQuery()
-                .eq(IsMapPoint::getMapId, id));
+        IsMapPoint point = new IsMapPoint();
+        point.setMapId(id);
+        List<IsMapPoint> list = iIsMapPointService.getIsMapPointList(point);
         map.setPointList(list);
         return map;
     }

+ 35 - 0
ktg-iscs/src/main/resources/mapper/IsMapPointMapper.xml

@@ -29,4 +29,39 @@
         </where>
         order by p.id desc
     </select>
+    <select id="getIsMapPointList" resultType="com.ktg.iscs.domain.IsMapPoint">
+        SELECT
+        p.*,
+        m.name as map_name,
+        CASE
+        WHEN p.map_type = "1" THEN
+        w.workstation_name
+        WHEN p.map_type = "2" THEN
+        ip.point_name
+        END AS entity_name,
+
+        CASE
+        WHEN p.map_type = "2" THEN
+        ip.point_icon
+        END AS point_icon,
+        CASE
+        WHEN p.map_type = "2" THEN
+        ip.point_picture
+        END AS point_picture,
+        CASE
+        WHEN p.map_type = "2" THEN
+        ip.point_nfc
+        END AS point_nfc
+        FROM
+        is_map_point p
+        LEFT JOIN is_map m ON m.id = p.map_id
+        LEFT JOIN is_workstation w ON w.workstation_id = p.entity_id
+        LEFT JOIN is_isolation_point ip ON ip.point_id = p.entity_id
+        <where>
+            <if test="isMapPoint.mapId != null">
+                and p.map_id = #{isMapPoint.mapId}
+            </if>
+        </where>
+        order by p.id desc
+    </select>
 </mapper>

+ 1 - 1
ktg-system/src/main/java/com/ktg/system/domain/SysUserCharacteristic.java

@@ -28,7 +28,7 @@ public class SysUserCharacteristic extends BaseBean
     @Excel(name = "用户id")
     private Long userId;
 
-    @ApiModelProperty(value = "类型(0-指纹图片 1-指纹特征值 2-面部图片 3-面部特征值 4-面部视频)")
+    @ApiModelProperty(value = "类型(0-指纹图片 1-指纹特征值dat 2-面部图片 3-面部特征值 4-面部视频)")
     @Excel(name = "类型(0-指纹图片 1-指纹特征值 2-面部图片 3-面部特征值 4-面部视频)")
     private String type;
 

+ 3 - 0
ktg-system/src/main/java/com/ktg/system/service/ISysUserCharacteristicService.java

@@ -4,6 +4,7 @@ package com.ktg.system.service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ktg.system.domain.SysUserCharacteristic;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 用户特征(指纹、面部)Service接口
@@ -15,4 +16,6 @@ public interface ISysUserCharacteristicService extends IService<SysUserCharacter
 
     Page<SysUserCharacteristic> getSysUserCharacteristicPage(Page<SysUserCharacteristic> page, SysUserCharacteristic sysUserCharacteristic);
 
+    Boolean insertUserFingerprintDat(MultipartFile file, Long userId);
+
 }

+ 10 - 0
ktg-system/src/main/java/com/ktg/system/service/impl/SysUserCharacteristicServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ktg.system.service.impl;
 
+import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -8,6 +9,7 @@ import com.ktg.system.mapper.SysUserCharacteristicMapper;
 import com.ktg.system.service.ISysUserCharacteristicService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 用户特征(指纹、面部)Service业务层处理
@@ -28,4 +30,12 @@ public class SysUserCharacteristicServiceImpl extends ServiceImpl<SysUserCharact
         return result;
     }
 
+    @Override
+    public Boolean insertUserFingerprintDat(MultipartFile file, Long userId) {
+        Assert.notNull(userId, "请告知我这是哪个用户的指纹!");
+        Assert.isTrue(file.getSize() > 0, "指纹信息不能为空!");
+
+        return null;
+    }
+
 }