人脸识别与大模型问答

This commit is contained in:
jiang 2024-08-24 08:55:05 +08:00
parent a8b9bde316
commit 8a78b494fb
16 changed files with 1216 additions and 1 deletions

View File

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.bonus</groupId> <groupId>com.bonus</groupId>
<artifactId>bonus-modules</artifactId> <artifactId>bonus-modules</artifactId>
<version>24.7.1-SNAPSHOT</version> <version>24.7.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -55,6 +55,11 @@
<artifactId>bonus-common-datasource</artifactId> <artifactId>bonus-common-datasource</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.bonus</groupId>
<artifactId>bonus-common-core</artifactId>
</dependency>
<!-- bonus Common DataScope --> <!-- bonus Common DataScope -->
<dependency> <dependency>
<groupId>com.bonus</groupId> <groupId>com.bonus</groupId>

View File

@ -0,0 +1,65 @@
package com.bonus.ai.controller;
import com.bonus.ai.domain.vo.FaceVo;
import com.bonus.ai.service.FaceService;
import com.bonus.common.core.web.domain.AjaxResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
/**
* @author bonus
* 人脸识别控制层
*/
@RestController
@RequestMapping("/face")
@Slf4j
public class FaceController {
@Resource
private FaceService faceService;
@PostMapping("/getList")
public AjaxResult getList() {
return faceService.getList();
}
/**
* 人脸上传
*
* @param file 人脸图片
* @param faceVo 人脸信息
* @return 插入是否成功
*/
@PostMapping("/upload")
public AjaxResult upload(MultipartFile file, FaceVo faceVo) {
return faceService.insertFace(file, faceVo);
}
/**
* 人脸识别
*
* @param file 人脸图片
* @return 人脸信息
*/
@PostMapping("/recognition")
public AjaxResult recognition(MultipartFile file) {
return faceService.recognition(file);
}
/**
* 识别结果统计
*
* @return 结果
*/
@PostMapping("/resultStatistics")
public AjaxResult resultStatistics() {
return faceService.resultStatistics();
}
}

View File

@ -0,0 +1,89 @@
package com.bonus.ai.controller;
import com.bonus.ai.domain.KnowledgeChatWindowVo;
import com.bonus.ai.domain.vo.AiQuestionAnswer;
import com.bonus.ai.service.KnowledgeService;
import com.bonus.common.core.web.domain.AjaxResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author bonus
*/
@RestController
@RequestMapping("/knowledge")
@Slf4j
public class KnowledgeController {
@Resource
private KnowledgeService knowledgeService;
/**
* 获取窗口列表
*
* @return 集合
*/
@PostMapping("/getList")
public AjaxResult getList() {
return knowledgeService.getList();
}
/**
* 新增窗口
*
* @return 集合
*/
@PostMapping("/insertChatWindow")
public AjaxResult insertChatWindow(@RequestBody KnowledgeChatWindowVo knowledgeChatWindowVo) {
return knowledgeService.insertChatWindow(knowledgeChatWindowVo);
}
/**
* 更新聊天窗口信息
*
* @param knowledgeChatWindowVo 聊天窗口信息
* @return 受影响的行数
*/
@PostMapping("/updateChatWindow")
public AjaxResult updateChatWindow(KnowledgeChatWindowVo knowledgeChatWindowVo) {
return knowledgeService.updateChatWindow(knowledgeChatWindowVo);
}
/**
* 逻辑删除聊天窗口
*
* @param windowId 窗口ID
* @return 受影响的行数
*/
@PostMapping("/deleteChatWindow/{windowId}")
public AjaxResult deleteChatWindow(@PathVariable Long windowId) {
return knowledgeService.deleteChatWindow(windowId);
}
/**
* 更新聊天窗口信息
*
* @param windowId 聊天窗口信息
* @return 受影响的行数
*/
@PostMapping("/getAllByWindowId/{windowId}")
public AjaxResult getAllByWindowId(@PathVariable Long windowId) {
return knowledgeService.getAllByWindowId(windowId);
}
/**
* 逻辑删除聊天窗口
*
* @param aiQuestionAnswer 问答记录
* @return 受影响的行数
*/
@PostMapping("/insertQuestionAnswer")
public AjaxResult insertQuestionAnswer(AiQuestionAnswer aiQuestionAnswer) {
return knowledgeService.insertQuestionAnswer(aiQuestionAnswer);
}
}

View File

@ -0,0 +1,51 @@
package com.bonus.ai.domain;
import lombok.Data;
import java.util.Date;
/**
* @author bonus
* 问答窗口实体类
*/
@Data
public class KnowledgeChatWindowVo {
/**
* 窗口id
*/
private Long windowId;
/**
* 知识库id
*/
private String knowledgeId;
/**
* 窗口名称
*/
private String windowName;
/**
* 聊天类型
*/
private String chatType;
/**
* 客户
*/
private Long customerId;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 是否删除
*/
private String delFlag;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,48 @@
package com.bonus.ai.domain.vo;
import lombok.Data;
import java.util.Date;
/**
* @author bonus
*/
@Data
public class AiQuestionAnswer {
/**
* 问答记录ID主键自增
*/
private Long recordId;
/**
* 窗口ID可为空
*/
private Long windowId;
/**
* 问题内容使用长文本
*/
private String question;
/**
* 回答内容使用长文本
*/
private String answer;
/**
* 知识库溯源文档使用长文本
*/
private String knowledge;
/**
* 删除标志0代表存在2代表删除
*/
private String delFlag;
/**
* 客户ID不可为空
*/
private String customerId;
/**
* 更新时间
*/
private Date updateTime;
/**
* 备注最大长度500
*/
private String remark;
}

View File

@ -0,0 +1,71 @@
package com.bonus.ai.domain.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author bonus
* 人脸识别调用实体类
*/
@Data
public class FaceResultVo implements Serializable {
/**
* 结果主键id
*/
private String resultId;
/**
* 人脸库表id
*/
private String faceId;
/**
* 服务id
*/
private String serviceId;
/**
* 识别结果
*/
private String resultIt;
/**
* 人脸路径
*/
private String faceAddress;
/**
* 识别时间
*/
private String recognizeTime;
/**
* 响应时长
*/
private String responseLong;
/**
* 调用服务IP
*/
private String invokeIp;
/**
* 更新者
*/
private String updateBy;
/**
* 更新时间
*/
private String updateTime;
/**
* 是否删除
*/
private String delFlag;
/**
* 结果类型(0用户登录1服务注册)
*/
private String resultType;
/**
* 识别状态(0成功1失败)
*/
private String resultStatus;
/**
* 识别失败原因
*/
private String failureReason;
}

View File

@ -0,0 +1,62 @@
package com.bonus.ai.domain.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author bonus
* 人脸识别实体类
*/
@Data
public class FaceVo implements Serializable {
/**
* 人脸id
*/
private Long faceId;
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private String sex;
/**
* 电话号码
*/
private String phone;
/**
* 身份证号
*/
private String idCardNumber;
/**
* 人脸图片路径
*/
private String faceAddress;
/**
* 人脸特征
*/
private byte[] feature;
/**
* 创建者
*/
private String createBy;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新者
*/
private String updateBy;
/**
* 更新时间
*/
private Date updateTime;
/**
* 是否删除
*/
private String delFlag;
}

View File

@ -0,0 +1,60 @@
package com.bonus.ai.mapper;
import com.bonus.ai.domain.vo.FaceResultVo;
import com.bonus.ai.domain.vo.FaceVo;
import feign.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author bonus
* 人脸识别mapper层
*/
@Repository
public interface FaceMapper {
/**
* 查询全部人脸信息
*/
List<FaceVo> getList();
/**
* 根据 faceId 判断人脸是否存在
*
* @param faceId 人脸唯一标识
* @return 返回 1 表示存在0 表示不存在
*/
int existsByFaceId(@Param("faceId") String faceId);
/**
* 插入人脸信息
*
* @param face 人脸信息对象
* @return 受影响的行数
*/
int insertFace(FaceVo face);
/**
* 通过身份证id查询人员
*
* @param idCardNumber 身份证id
* @return 人员信息
*/
List<FaceVo> getFaceByIdCardNumber(String idCardNumber);
/**
* 插入人脸识别记录
*
* @param faceResultVo 人脸信息对象
* @return 受影响的行数
*/
int insertFaceResult(FaceResultVo faceResultVo);
/**
* 识别结果统计
*
* @return 结果
*/
List<FaceResultVo> resultStatistics();
}

View File

@ -0,0 +1,66 @@
package com.bonus.ai.mapper;
import com.bonus.ai.domain.KnowledgeChatWindowVo;
import com.bonus.ai.domain.vo.AiQuestionAnswer;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* Mapper接口用于操作聊天窗口数据
* 提供获取窗口列表新增更新删除窗口的方法
*
* @author bonus
*/
@Repository
public interface KnowledgeMapper {
/**
* 获取窗口列表
*
* @param userId 用户ID
* @return 包含聊天窗口信息的集合
*/
List<KnowledgeChatWindowVo> getList(Long userId);
/**
* 新增窗口
*
* @param knowledgeChatWindowVo 聊天窗口信息
* @return 受影响的行数
*/
int insertChatWindow(KnowledgeChatWindowVo knowledgeChatWindowVo);
/**
* 更新聊天窗口信息
*
* @param knowledgeChatWindowVo 聊天窗口信息
* @return 受影响的行数
*/
int updateChatWindow(KnowledgeChatWindowVo knowledgeChatWindowVo);
/**
* 逻辑删除聊天窗口
*
* @param windowId 窗口ID
* @return 受影响的行数
*/
int deleteChatWindow(Long windowId);
/**
* 根据窗口id获取问答记录
*
* @return 所有问答记录的列表
*/
List<AiQuestionAnswer> getAllByWindowId(Long windowId);
/**
* 插入问答信息
*
* @param aiQuestionAnswer 问答信息
* @return 生成的窗口ID
*/
Long insertQuestionAnswer(AiQuestionAnswer aiQuestionAnswer);
}

View File

@ -0,0 +1,41 @@
package com.bonus.ai.service;
import com.bonus.ai.domain.vo.FaceVo;
import com.bonus.common.core.web.domain.AjaxResult;
import feign.Param;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* @author bonus
*/
public interface FaceService {
/**
* 查询全部人脸信息
*/
AjaxResult getList();
/**
* 插入人脸信息
*
* @param face 人脸信息对象
* @return 受影响的行数
*/
AjaxResult insertFace(MultipartFile file, FaceVo face);
/**
* 人脸识别
*
* @param file 人脸图片
* @return 返回人脸信息
*/
AjaxResult recognition(MultipartFile file);
/**
* 识别结果统计
* @return 结果
*/
AjaxResult resultStatistics();
}

View File

@ -0,0 +1,60 @@
package com.bonus.ai.service;
import com.bonus.ai.domain.KnowledgeChatWindowVo;
import com.bonus.ai.domain.vo.AiQuestionAnswer;
import com.bonus.common.core.web.domain.AjaxResult;
import java.util.List;
/**
* @author bonus
*/
public interface KnowledgeService {
/**
* 获取窗口列表
*
* @return 集合
*/
AjaxResult getList();
/**
* 新增窗口
*
* @return 集合
*/
AjaxResult insertChatWindow(KnowledgeChatWindowVo knowledgeChatWindowVo);
/**
* 更新聊天窗口信息
*
* @param knowledgeChatWindowVo 聊天窗口信息
* @return 受影响的行数
*/
AjaxResult updateChatWindow(KnowledgeChatWindowVo knowledgeChatWindowVo);
/**
* 逻辑删除聊天窗口
*
* @param windowId 窗口ID
* @return 受影响的行数
*/
AjaxResult deleteChatWindow(Long windowId);
/**
* 根据窗口id获取问答记录
*
* @return 所有问答记录的列表
*/
AjaxResult getAllByWindowId(Long windowId);
/**
* 插入问答信息
*
* @param aiQuestionAnswer 问答信息
* @return 生成的窗口ID
*/
AjaxResult insertQuestionAnswer(AiQuestionAnswer aiQuestionAnswer);
}

View File

@ -0,0 +1,213 @@
package com.bonus.ai.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.bonus.ai.domain.vo.FaceVo;
import com.bonus.ai.mapper.FaceMapper;
import com.bonus.ai.service.FaceService;
import com.bonus.ai.utils.FaceUtils;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.security.utils.SecurityUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
/**
* @author bonus
* 人脸识别服务层
*/
@Service
public class FaceServiceImpl implements FaceService {
@Resource
private FaceMapper faceMapper;
/**
* 查询全部人脸信息
*/
@Override
public AjaxResult getList() {
return AjaxResult.success(faceMapper.getList());
}
/**
* 插入人脸信息
*
* @param face 人脸信息对象
* @return 受影响的行数
*/
@Override
public AjaxResult insertFace(MultipartFile file, FaceVo face) {
if (isFileOrFaceInvalid(file, face)) {
return AjaxResult.error("文件或人员信息不能为空, 请检查输入");
}
try {
String base64WithMimeType = getBase64WithMimeType(file);
String response = FaceUtils.updateDb(base64WithMimeType, "add", face.getIdCardNumber());
return handleInsertResponse(file, response, face, base64WithMimeType);
} catch (Exception e) {
return AjaxResult.error("插入人脸信息失败");
}
}
/**
* 人脸识别
*
* @param file
* @return
*/
@Override
public AjaxResult recognition(MultipartFile file) {
if (ObjectUtils.isEmpty(file)) {
return AjaxResult.error("文件不能为空, 请选择文件");
}
try {
String base64WithMimeType = getBase64WithMimeType(file);
String response = FaceUtils.faceRecognition(base64WithMimeType);
return handleRecognitionResponse(response);
} catch (Exception e) {
return AjaxResult.error("人脸识别失败");
}
}
/**
* 识别结果统计
*
* @return 结果
*/
@Override
public AjaxResult resultStatistics() {
return AjaxResult.success(faceMapper.resultStatistics());
}
/**
* 判断文件的 MIME 类型是否为图片类型
*/
private boolean isImageMimeType(String mimeType) {
Set<String> validMimeTypes = new HashSet<>();
validMimeTypes.add("image/jpeg");
validMimeTypes.add("image/png");
return mimeType != null && validMimeTypes.contains(mimeType);
}
/**
* 检查文件和人员信息是否为空
*/
private boolean isFileOrFaceInvalid(MultipartFile file, FaceVo face) {
return ObjectUtils.isEmpty(file) ||
ObjectUtils.isEmpty(face.getName()) ||
ObjectUtils.isEmpty(face.getIdCardNumber());
}
/**
* 获取Base64编码的文件内容并添加MIME类型
*/
private String getBase64WithMimeType(MultipartFile file) throws Exception {
String mimeType = file.getContentType();
if (!isImageMimeType(mimeType)) {
throw new IllegalArgumentException("文件类型不支持,请上传图片文件");
}
byte[] fileBytes = file.getBytes();
String base64String = Base64.getEncoder().encodeToString(fileBytes);
return "data:" + mimeType + ";base64," + base64String;
}
/**
* 处理插入人脸信息的响应
*/
private AjaxResult handleInsertResponse(MultipartFile file, String response, FaceVo face, String base64WithMimeType) {
if (response == null) return AjaxResult.error();
JSONObject jsonObject = JSON.parseObject(response);
String code = jsonObject.getString("code");
switch (code) {
case "30002":
face.setCreateTime(new Date());
face.setCreateBy(SecurityUtils.getUsername());
face.setUpdateBy(SecurityUtils.getUsername());
face.setUpdateTime(new Date());
try {
// 设置保存文件的目录这里假设是在应用程序的根目录下的uploads文件夹
String uploadDir = "uploads";
Path uploadPath = Paths.get(uploadDir);
// 如果目录不存在则创建
if (!Files.exists(uploadPath)) {
Files.createDirectories(uploadPath);
}
byte[] bytes = file.getBytes();
String fileName = UUID.randomUUID() + file.getOriginalFilename();
String filePath = Paths.get("uploads").toAbsolutePath().normalize().toString() + File.separator + fileName;
java.nio.file.Files.write(java.nio.file.Paths.get(filePath), bytes);
face.setFaceAddress(filePath);
} catch (Exception e) {
return AjaxResult.error();
}
return faceMapper.insertFace(face) > 0 ? AjaxResult.success() : AjaxResult.error();
case "30006":
return AjaxResult.error("文件类型不支持");
case "30007":
return AjaxResult.error("不支持的操作类型");
case "30008":
return AjaxResult.error("存在多张人脸");
case "30009":
return AjaxResult.error("光照条件差");
case "30010":
case "30011":
return AjaxResult.error("人脸不全");
case "30019":
return AjaxResult.error("人员信息已存在");
case "30018":
return AjaxResult.error("未检测到人脸");
default:
return AjaxResult.error();
}
}
/**
* 处理人脸识别的响应
*/
private AjaxResult handleRecognitionResponse(String response) {
if (response == null) {
return AjaxResult.error();
}
JSONObject jsonObject = JSON.parseObject(response);
String code = jsonObject.getString("code");
switch (code) {
case "30000":
JSONArray dataArray = jsonObject.getJSONArray("data");
String idCardNumber = dataArray.getString(0);
List<FaceVo> faceByIdCardNumber = faceMapper.getFaceByIdCardNumber(idCardNumber);
return faceByIdCardNumber != null && !faceByIdCardNumber.isEmpty()
? AjaxResult.success(faceByIdCardNumber.get(0))
: AjaxResult.error("人员不存在");
case "30001":
return AjaxResult.error("人员不存在");
case "30006":
return AjaxResult.error("文件类型不支持");
case "30007":
return AjaxResult.error("不支持的操作类型");
case "30008":
return AjaxResult.error("存在多张人脸");
case "30009":
return AjaxResult.error("光照条件差");
case "30010":
case "30011":
return AjaxResult.error("人脸不全");
case "30019":
return AjaxResult.error("人员信息已存在");
case "30018":
return AjaxResult.error("未检测到人脸");
default:
return AjaxResult.error();
}
}
}

View File

@ -0,0 +1,141 @@
package com.bonus.ai.service.impl;
import com.bonus.ai.domain.KnowledgeChatWindowVo;
import com.bonus.ai.domain.vo.AiQuestionAnswer;
import com.bonus.ai.mapper.KnowledgeMapper;
import com.bonus.ai.service.KnowledgeService;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.security.utils.SecurityUtils;
import io.swagger.models.auth.In;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
* @author bonus
*/
@Service
public class KnowledgeServiceImpl implements KnowledgeService {
@Resource
private KnowledgeMapper knowledgeMapper;
/**
* 获取窗口列表
*
* @return 集合
*/
@Override
public AjaxResult getList() {
Long userId = SecurityUtils.getUserId();
try {
return AjaxResult.success(knowledgeMapper.getList(userId));
} catch (Exception e) {
return AjaxResult.error();
}
}
/**
* 新增窗口
*
* @param knowledgeChatWindowVo 实体
* @return 集合
*/
@Override
public AjaxResult insertChatWindow(KnowledgeChatWindowVo knowledgeChatWindowVo) {
try {
knowledgeChatWindowVo.setWindowName(knowledgeChatWindowVo.getWindowName());
knowledgeChatWindowVo.setCustomerId(SecurityUtils.getUserId());
knowledgeChatWindowVo.setCreateTime(new Date());
knowledgeChatWindowVo.setUpdateTime(new Date());
int l = knowledgeMapper.insertChatWindow(knowledgeChatWindowVo);
if (l > 0) {
return AjaxResult.success();
} else {
return AjaxResult.error();
}
} catch (Exception e) {
return AjaxResult.error();
}
}
/**
* 更新聊天窗口信息
*
* @param knowledgeChatWindowVo 聊天窗口信息
* @return 受影响的行数
*/
@Override
public AjaxResult updateChatWindow(KnowledgeChatWindowVo knowledgeChatWindowVo) {
try {
int i = knowledgeMapper.updateChatWindow(knowledgeChatWindowVo);
if (i > 0) {
return AjaxResult.success();
} else {
return AjaxResult.error();
}
} catch (Exception e) {
return AjaxResult.error();
}
}
/**
* 逻辑删除聊天窗口
*
* @param windowId 窗口ID
* @return 受影响的行数
*/
@Override
public AjaxResult deleteChatWindow(Long windowId) {
try {
int i = knowledgeMapper.deleteChatWindow(windowId);
if (i > 0) {
return AjaxResult.success();
} else {
return AjaxResult.error();
}
} catch (Exception e) {
return AjaxResult.error();
}
}
/**
* 根据窗口id获取问答记录
*
* @param windowId 窗口id
* @return 所有问答记录的列表
*/
@Override
public AjaxResult getAllByWindowId(Long windowId) {
try {
List<AiQuestionAnswer> allByWindowId = knowledgeMapper.getAllByWindowId(windowId);
return AjaxResult.success(allByWindowId);
} catch (Exception e) {
return AjaxResult.error();
}
}
/**
* 插入问答信息
*
* @param aiQuestionAnswer 问答信息
* @return 生成的窗口ID
*/
@Override
public AjaxResult insertQuestionAnswer(AiQuestionAnswer aiQuestionAnswer) {
try {
Long l = knowledgeMapper.insertQuestionAnswer(aiQuestionAnswer);
if (ObjectUtils.isEmpty(l)) {
return AjaxResult.error();
} else {
return AjaxResult.success(l);
}
} catch (Exception e) {
return AjaxResult.error();
}
}
}

View File

@ -0,0 +1,101 @@
package com.bonus.ai.utils;
import com.alibaba.fastjson2.JSON;
import com.bonus.common.core.utils.http.HttpRequestHelper;
import java.util.HashMap;
import java.util.Map;
/**
* 人脸识别工具类
*
* @author bonus
*/
public class FaceUtils {
/**
* ip
*/
private static final String IP = "192.168.0.14";
/**
* 端口
*/
private static final String PORT = "18017";
// 接口路径常量
private static final String UPDATE_DB = "/updatedb";
private static final String REFRESH_DB = "/refreshdb";
private static final String FACE_RECOGNITION = "/facerecognition";
private static final String FEATURE_DETECT = "/featuredetect";
/**
* 获取完整的接口 URL
*
* @return 完整的 URL
*/
private static String getFullUrl() {
return new StringBuilder()
.append("http://")
.append(IP)
.append(":")
.append(PORT)
.toString();
}
/**
* @param img 图片的本地路径 or base64编码 or url
* @param optMode add:添加人脸图片delete:删除人脸图片replace:替换已有人脸图片
* @param uniqueKey 指定要操作的这个人脸的名字
* @return 字符串
*/
public static String updateDb(String img, String optMode, String uniqueKey) {
Map<String, String> headers = new HashMap<>();
Map<String, Object> params = new HashMap<String, Object>();
params.put("img", img);
params.put("optMode", optMode);
params.put("uniqueKey", uniqueKey);
String json = JSON.toJSONString(params);
return HttpRequestHelper.postJson(getFullUrl(), UPDATE_DB, json, headers);
}
/**
* 刷新人脸库
*
* @return 返回请求体
*/
public static String refreshDb() {
Map<String, String> headers = new HashMap<>();
return HttpRequestHelper.postJson(getFullUrl(), REFRESH_DB, "", headers);
}
/**
* 对输入人脸进行识别
*
* @param img 图片的本地路径 or base64编码 or url
* @return 人脸信息
*/
public static String faceRecognition(String img) {
Map<String, String> headers = new HashMap<>();
Map<String, Object> params = new HashMap<String, Object>();
params.put("img", img);
String json = JSON.toJSONString(params);
return HttpRequestHelper.postJson(getFullUrl(), FACE_RECOGNITION, json, headers);
}
/**
* 对输入人脸进行特征提取
*
* @param img 图片的本地路径 or base64编码 or url
* @return 人脸信息
*/
public static String featureDetect(String img) {
Map<String, Object> params = new HashMap<String, Object>();
Map<String, String> headers = new HashMap<>();
params.put("img", img);
String json = JSON.toJSONString(params);
return HttpRequestHelper.postJson(getFullUrl(), FEATURE_DETECT, json, headers);
}
}

View File

@ -0,0 +1,82 @@
<?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="com.bonus.ai.mapper.FaceMapper">
<!-- 插入人脸信息 -->
<insert id="insertFace">
INSERT INTO ai_face_databse (name, sex, phone, idcard_number,
face_address, create_by, create_time,
update_by, update_time)
VALUES ( #{name}, #{sex}, #{phone}, #{idCardNumber},
#{faceAddress}, #{createBy}, #{createTime},
#{updateBy}, #{updateTime})
</insert>
<insert id="insertFaceResult">
insert into ai_facerecognize_result (face_id, service_id, result_it, face_address, recognize_time,
response_long, invoke_ip, update_by, update_time, result_type,
result_status, failure_reason)
values (#{faceId}, #{serviceId}, #{resultIt}, #{faceAddress}, #{recognizeTime}, #{responseLong}, #{invokeIp},
#{updateBy}, #{updateTime}, #{resultType}, #{resultStatus}, #{failureReason});
</insert>
<!-- 查询全部人脸信息 -->
<select id="getList" resultType="com.bonus.ai.domain.vo.FaceVo">
select face_id AS faceId,
name AS name,
sex AS sex,
phone AS phone,
idcard_number AS idCardNumber,
face_address AS faceAddress,
create_by AS createBy,
create_time AS createTime,
update_by AS updateBy,
update_time AS updateTime
from ai_face_databse
where del_flag = '0'
</select>
<!-- 根据 faceId 判断人脸是否存在 -->
<select id="existsByFaceId" resultType="java.lang.Integer">
SELECT COUNT(1)
FROM ai_face_databse
WHERE face_id = #{faceId}
AND del_flag = '0'
</select>
<select id="getFaceByIdCardNumber" resultType="com.bonus.ai.domain.vo.FaceVo">
select face_id AS faceId,
name AS name,
sex AS sex,
phone AS phone,
idcard_number AS idCardNumber,
face_address AS faceAddress,
create_by AS createBy,
create_time AS createTime,
update_by AS updateBy,
update_time AS updateTime
from ai_face_databse
where del_flag = '0'
and idcard_number = #{idCardNumber}
</select>
<select id="resultStatistics" resultType="com.bonus.ai.domain.vo.FaceResultVo">
select result_id AS resultId,
face_id AS faceId,
service_id AS serviceId,
result_it AS resultIt,
face_address AS faceAddress,
recognize_time AS recognizeTime,
response_long AS responseLong,
invoke_ip AS invokeIp,
update_by AS updateBy,
update_time AS updateTime,
result_type AS resultType,
failure_reason AS failureReason
from ai_facerecognize_result
where del_flag = '0'
</select>
</mapper>

View File

@ -0,0 +1,60 @@
<?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="com.bonus.ai.mapper.KnowledgeMapper">
<insert id="insertChatWindow">
insert into ai_chat_window (knowledge_id, window_name, chat_type, customer_id, create_time,
update_time, remark)
values (#{knowledgeId}, #{windowName}, #{chatType}, #{customerId}, now(), now(), #{remark});
</insert>
<insert id="insertQuestionAnswer" useGeneratedKeys="true" keyProperty="recordId">
INSERT INTO ai_question_answer
(window_id, question, answer, knowledge, del_flag, customer_id, update_time, remark)
VALUES (#{windowId}, #{question}, #{answer}, #{knowledge}, #{delFlag}, #{customerId}, #{updateTime}, #{remark});
</insert>
<select id="getList" resultType="com.bonus.ai.domain.KnowledgeChatWindowVo">
select window_id AS windowId,
knowledge_id AS knowledgeId,
window_name AS windowName,
chat_type AS chatType,
customer_id AS customerId,
create_time AS createTime,
update_time AS updateTime,
remark AS remark
from ai_chat_window
where del_flag = '0'
AND customer_id = #{userId}
ORDER BY create_time DESC
</select>
<select id="getAllByWindowId" resultType="com.bonus.ai.domain.vo.AiQuestionAnswer">
SELECT record_id AS recordId,
window_id AS windowId,
question AS question,
answer AS answer,
knowledge AS knowledge,
customer_id AS customerId,
update_time AS updateTime,
remark AS remark
FROM ai_question_answer
where window_id = #{windowId}
AND del_flag = '0'
</select>
<update id="updateChatWindow">
update ai_chat_window
set window_name = #{windowName},
chat_type = #{chatType},
update_time = now(),
remark = #{remark}
where window_id = #{windowId};
</update>
<update id="deleteChatWindow">
update ai_chat_window
set del_flag = '1',
update_time = now()
where window_id = #{windowId};
</update>
</mapper>