Commit 7fe649b7 authored by 赵啸非's avatar 赵啸非

Merge remote-tracking branch 'origin/master'

parents 11c3249f 903ac93f
......@@ -32,7 +32,7 @@
<profiles.rabbitmq.port>5672</profiles.rabbitmq.port>
<profiles.nacos.server-addr>192.168.0.252:8848</profiles.nacos.server-addr>
<profiles.nacos.group>DEFAULT_GROUP</profiles.nacos.group>
<profiles.nacos.namespace>smart-gov</profiles.nacos.namespace>
<profiles.nacos.namespace>smart-gov-dev</profiles.nacos.namespace>
<profiles.log.path>/mortals/app/logs</profiles.log.path>
</properties>
</profile>
......@@ -73,6 +73,12 @@
<dependency>
<groupId>com.mortals.xhx</groupId>
<artifactId>common-lib</artifactId>
<exclusions>
<exclusion>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入 SpringMVC 相关依赖,并实现对其的自动配置 -->
......@@ -118,6 +124,23 @@
<artifactId>jjwt</artifactId>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.64</version>
</dependency>
<!-- 虹软人脸解析 -->
<dependency>
<groupId>com.arcsoft.face</groupId>
<artifactId>arcsoft-sdk-face</artifactId>
<version>3.0.0.0</version>
</dependency>
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
......
......@@ -68,6 +68,9 @@ public final class Constant {
*/
public final static String PARAM_SERVER_HTTP_IMAGE_URL = "server_http_image_url";
/**
* 身份证加密key
*/
public static final String MYSQL_KEY = "xhx-85435158";
}
package com.mortals.xhx.common.utils;
import com.arcsoft.face.*;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
import com.arcsoft.face.toolkit.ImageInfo;
import com.mortals.framework.exception.AppException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
@Slf4j
@Component
public class FaceUtil {
public FaceEngine initFace(String appId, String sdkKey) {
FaceEngine faceEngine = new FaceEngine(getClass().getResource(getOsName()).getPath());
//激活引擎
int errorCode = faceEngine.activeOnline(appId, sdkKey);
isTrue(!(errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()), "引擎激活失败");
ActiveFileInfo activeFileInfo = new ActiveFileInfo();
errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
isTrue(!(errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()), "获取激活文件信息失败");
//引擎配置
EngineConfiguration engineConfiguration = new EngineConfiguration();
engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
engineConfiguration.setDetectFaceMaxNum(10);
engineConfiguration.setDetectFaceScaleVal(16);
//功能配置
FunctionConfiguration functionConfiguration = new FunctionConfiguration();
functionConfiguration.setSupportAge(true);
functionConfiguration.setSupportFace3dAngle(true);
functionConfiguration.setSupportFaceDetect(true);
functionConfiguration.setSupportFaceRecognition(true);
functionConfiguration.setSupportGender(true);
functionConfiguration.setSupportLiveness(true);
functionConfiguration.setSupportIRLiveness(true);
engineConfiguration.setFunctionConfiguration(functionConfiguration);
//初始化引擎
errorCode = faceEngine.init(engineConfiguration);
isTrue(errorCode == ErrorInfo.MOK.getValue(), "初始化引擎失败");
return faceEngine;
}
/**
* 人脸检测、特征提取
*
* @param faceEngine
* @param bytes
* @return
*/
public byte[] featureData(FaceEngine faceEngine, byte[] bytes) {
//人脸检测
ImageInfo imageInfo = getRGBData(bytes);
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
//特征提取
FaceFeature faceFeature = new FaceFeature();
faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
return faceFeature.getFeatureData();
}
/**
* 特征比对
*
* @param targeFace
* @param sourceFace
* @return
*/
public boolean featureComparison(FaceEngine faceEngine, byte[] targeFace, byte[] sourceFace) {
//特征比对
FaceFeature targetFaceFeature = new FaceFeature();
targetFaceFeature.setFeatureData(targeFace);
FaceFeature sourceFaceFeature = new FaceFeature();
sourceFaceFeature.setFeatureData(sourceFace);
FaceSimilar faceSimilar = new FaceSimilar();
faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
float score = faceSimilar.getScore();
if (score > 0.8) {
return true;
}
return false;
}
public void unInit(FaceEngine faceEngine) {
faceEngine.unInit();
}
public String getOsName() {
String os = System.getProperty("os.name");
String osName = os.toLowerCase().startsWith("win") ? "/face_lib/win64" : "/face_lib/linux";
return osName;
}
private void isTrue(boolean b, String errorMsg) {
if (!b) {
throw new AppException(errorMsg);
}
}
}
package com.mortals.xhx.common.utils;
import cn.hutool.core.util.HexUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.Charset;
import java.security.Security;
/**
* @Description 平台请求天府健康通接口demo
* demo 依赖于 hutool-all 5.5.7 以及 bcprov-jdk15to18 1.64
* @ClassName RioDemo
* @Author ScarletDrop
* @Version 1.0
**/
public class RioUtil {
static {
Security.addProvider(new BouncyCastleProvider());
}
/**
* 加密
*
* @param content 内容
* @param sm4 sm4密钥
* @return 加密字符串
*/
public static String encryptHex(String content, String sm4) {
String inputHex = HexUtil.encodeHexStr(content.getBytes());
byte[] encryptRet = new byte[0];
try {
SecretKeySpec sm4Key = new SecretKeySpec(HexUtil.decodeHex(sm4.toCharArray()), "SM4");
Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS7Padding", BouncyCastleProvider.PROVIDER_NAME);
cipher.init(Cipher.ENCRYPT_MODE, sm4Key);
encryptRet = cipher.doFinal(HexUtil.decodeHex(inputHex.toCharArray()));
} catch (Exception e) {
e.printStackTrace();
}
return Base64.toBase64String(encryptRet);
}
/**
* 解密
*
* @param content 内容
* @param sm4 sm4密钥
* @return 解密字符串
*/
public static String decrypt(String content, String sm4) {
byte[] decoded = Base64.decode(content);
byte[] encryptRet = new byte[0];
try {
SecretKeySpec sm4Key = new SecretKeySpec(HexUtil.decodeHex(sm4.toCharArray()), "SM4");
Cipher cipher = Cipher.getInstance("SM4/ECB/PKCS7Padding", BouncyCastleProvider.PROVIDER_NAME);
cipher.init(Cipher.DECRYPT_MODE, sm4Key);
encryptRet = cipher.doFinal(decoded);
} catch (Exception e) {
e.printStackTrace();
}
return new String(encryptRet, Charset.forName("UTF-8"));
}
// public static void main(String[] args) {
// String a = encryptHex("scdsjzx","b4a8af568f71136a6b1f8e8a4c9ebc2d");
// log.info("a===={}",a);
// String B = decrypt(a,"b4a8af568f71136a6b1f8e8a4c9ebc2d");
// log.info("B===={}",B);
// }
}
package com.mortals.xhx.module.identity.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.identity.model.SysFaceEntity;
import java.util.List;
/**
* 人脸识别信息Dao
* 人脸识别信息 DAO接口
*
* @author zxfei
* @date 2022-08-03
*/
public interface SysFaceDao extends ICRUDDao<SysFaceEntity,String>{
}
package com.mortals.xhx.module.identity.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.identity.model.SysIdentityEntity;
import java.util.List;
/**
* 人员身份信息Dao
* 人员身份信息 DAO接口
*
* @author zxfei
* @date 2022-08-03
*/
public interface SysIdentityDao extends ICRUDDao<SysIdentityEntity,String>{
/**
* 身份证号查询
* @param region
* @param birthday
* @param ase
* @param name
* @param id
* @return
*/
SysIdentityEntity findIdentity(Long region,Long birthday,String ase, String name, String id);
}
package com.mortals.xhx.module.identity.dao.ibatis;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.identity.dao.SysFaceDao;
import com.mortals.xhx.module.identity.model.SysFaceEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List;
/**
* 人脸识别信息DaoImpl DAO接口
*
* @author zxfei
* @date 2022-08-03
*/
@Repository("sysFaceDao")
public class SysFaceDaoImpl extends BaseCRUDDaoMybatis<SysFaceEntity,String> implements SysFaceDao {
}
package com.mortals.xhx.module.identity.dao.ibatis;
import com.mortals.framework.model.BaseEntity;
import com.mortals.framework.model.ParamDto;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.identity.dao.SysIdentityDao;
import com.mortals.xhx.module.identity.model.SysIdentityEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 人员身份信息DaoImpl DAO接口
*
* @author zxfei
* @date 2022-08-03
*/
@Repository("sysIdentityDao")
public class SysIdentityDaoImpl extends BaseCRUDDaoMybatis<SysIdentityEntity,String> implements SysIdentityDao {
@Override
public SysIdentityEntity findIdentity(Long region, Long birthday, String ase, String name, String id) {
Map<String,Object> condition = new HashMap<>();
condition.put("region",region);
condition.put("birthday",birthday);
condition.put("ase",ase);
condition.put("name",name);
condition.put("id",id);
return (SysIdentityEntity)this.getSqlSession().selectOne(this.getSqlId("findIdentity"), condition);
}
}
package com.mortals.xhx.module.identity.model;
import java.util.List;
import java.util.ArrayList;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityStr;
import com.mortals.xhx.module.identity.model.vo.SysFaceVo;
/**
* 人脸识别信息实体对象
*
* @author zxfei
* @date 2022-08-03
*/
public class SysFaceEntity extends SysFaceVo {
private static final long serialVersionUID = 1L;
/**
* 场所名称
*/
private String placeName;
/**
* 场所ID
*/
private String placeId;
/**
* 人脸缩略图
*/
private byte[] face;
/**
* 人脸特征
*/
private byte[] faceFeature;
/**
* 身份ID
*/
private String idCard;
/**
* 删除标识
*/
private Integer deleted;
public SysFaceEntity(){}
/**
* 获取 场所名称
* @return String
*/
public String getPlaceName(){
return placeName;
}
/**
* 设置 场所名称
* @param placeName
*/
public void setPlaceName(String placeName){
this.placeName = placeName;
}
/**
* 获取 场所ID
* @return String
*/
public String getPlaceId(){
return placeId;
}
/**
* 设置 场所ID
* @param placeId
*/
public void setPlaceId(String placeId){
this.placeId = placeId;
}
/**
* 获取 人脸缩略图
* @return String
*/
public byte[] getFace(){
return face;
}
/**
* 设置 人脸缩略图
* @param face
*/
public void setFace(byte[] face){
this.face = face;
}
/**
* 获取 人脸特征
* @return String
*/
public byte[] getFaceFeature(){
return faceFeature;
}
/**
* 设置 人脸特征
* @param faceFeature
*/
public void setFaceFeature(byte[] faceFeature){
this.faceFeature = faceFeature;
}
/**
* 获取 身份ID
* @return String
*/
public String getIdCard(){
return idCard;
}
/**
* 设置 身份ID
* @param idCard
*/
public void setIdCard(String idCard){
this.idCard = idCard;
}
/**
* 获取 删除标识
* @return Integer
*/
public Integer getDeleted(){
return deleted;
}
/**
* 设置 删除标识
* @param deleted
*/
public void setDeleted(Integer deleted){
this.deleted = deleted;
}
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof SysFaceEntity) {
SysFaceEntity tmp = (SysFaceEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",placeName:").append(getPlaceName());
sb.append(",placeId:").append(getPlaceId());
sb.append(",face:").append(getFace());
sb.append(",faceFeature:").append(getFaceFeature());
sb.append(",idCard:").append(getIdCard());
sb.append(",deleted:").append(getDeleted());
return sb.toString();
}
public void initAttrValue(){
this.placeName = "";
this.placeId = "";
this.face = null;
this.faceFeature = null;
this.idCard = "0";
this.deleted = 0;
}
}
\ No newline at end of file
package com.mortals.xhx.module.identity.model;
import com.mortals.xhx.module.identity.model.vo.SysIdentityVo;
/**
* 人员身份信息实体对象
*
* @author zxfei
* @date 2022-08-03
*/
public class SysIdentityEntity extends SysIdentityVo {
private static final long serialVersionUID = 1L;
/**
* 区域
*/
private Long region;
/**
* 生日
*/
private Long birthday;
/**
* 序列号
*/
private String ase;
/**
* 姓名
*/
private String name;
/**
* 电话
*/
private String phone;
/**
* 删除标识
*/
private Integer deleted;
public SysIdentityEntity(){}
/**
* 获取 区域
* @return Long
*/
public Long getRegion(){
return region;
}
/**
* 设置 区域
* @param region
*/
public void setRegion(Long region){
this.region = region;
}
/**
* 获取 生日
* @return Long
*/
public Long getBirthday(){
return birthday;
}
/**
* 设置 生日
* @param birthday
*/
public void setBirthday(Long birthday){
this.birthday = birthday;
}
/**
* 获取 序列号
* @return String
*/
public String getAse(){
return ase;
}
/**
* 设置 序列号
* @param ase
*/
public void setAse(String ase){
this.ase = ase;
}
/**
* 获取 姓名
* @return String
*/
public String getName(){
return name;
}
/**
* 设置 姓名
* @param name
*/
public void setName(String name){
this.name = name;
}
/**
* 获取 电话
* @return String
*/
public String getPhone(){
return phone;
}
/**
* 设置 电话
* @param phone
*/
public void setPhone(String phone){
this.phone = phone;
}
/**
* 获取 删除标识
* @return Integer
*/
public Integer getDeleted(){
return deleted;
}
/**
* 设置 删除标识
* @param deleted
*/
public void setDeleted(Integer deleted){
this.deleted = deleted;
}
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof SysIdentityEntity) {
SysIdentityEntity tmp = (SysIdentityEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",region:").append(getRegion());
sb.append(",birthday:").append(getBirthday());
sb.append(",ase:").append(getAse());
sb.append(",name:").append(getName());
sb.append(",phone:").append(getPhone());
sb.append(",deleted:").append(getDeleted());
return sb.toString();
}
public void initAttrValue(){
this.region = null;
this.birthday = null;
this.ase = "";
this.name = "0";
this.phone = "";
this.deleted = 0;
}
}
\ No newline at end of file
package com.mortals.xhx.module.identity.model.vo;
import lombok.Data;
@Data
public class FaceInfoResVO {
/** id */
private String id;
/** 场所ID */
private String placeId;
/** 场所名称 */
private String placeName;
/** 人脸缩略图 */
private String face;
/** 人脸特征 */
private String faceFeature;
/** 身份信息ID */
private String cardId;
/** 身份证ID */
private String idCard;
/** 身份证名称 */
private String name;
/** 手机号 */
private String phone;
}
package com.mortals.xhx.module.identity.model.vo;
import com.mortals.framework.model.BaseEntityStr;
import com.mortals.xhx.module.identity.model.SysFaceEntity;
import java.util.ArrayList;
import java.util.List;
/**
* 人脸识别信息视图对象
*
* @author zxfei
* @date 2022-08-03
*/
public class SysFaceVo extends BaseEntityStr {
}
\ No newline at end of file
package com.mortals.xhx.module.identity.model.vo;
import com.mortals.framework.model.BaseEntityStr;
import com.mortals.xhx.module.identity.model.SysIdentityEntity;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 人员身份信息视图对象
*
* @author zxfei
* @date 2022-08-03
*/
@Data
public class SysIdentityVo extends BaseEntityStr {
/**
* 身份证编码
*/
private String idCard;
}
\ No newline at end of file
package com.mortals.xhx.module.identity.service;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.identity.model.SysFaceEntity;
import com.mortals.xhx.module.identity.model.vo.FaceInfoResVO;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* SysFaceService
*
* 人脸识别信息 service接口
*
* @author zxfei
* @date 2022-08-03
*/
public interface SysFaceService extends ICRUDService<SysFaceEntity,String>{
/**
* 注册人脸
*/
FaceInfoResVO uploadImage(MultipartFile multipartFile, String name, String idCard, String placeId, String placeName) throws AppException;
/**
* 下发人脸列表
*
* @param placeId
* @return
*/
List<FaceInfoResVO> findFaceList(String placeId) throws AppException;
/**
* 批量录入人脸
*
* @param
* @return
*/
void batchAddFace( List<MultipartFile> files,String placeId,String placeName);
}
\ No newline at end of file
package com.mortals.xhx.module.identity.service;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.identity.model.SysIdentityEntity;
/**
* SysIdentityService
*
* 人员身份信息 service接口
*
* @author zxfei
* @date 2022-08-03
*/
public interface SysIdentityService extends ICRUDService<SysIdentityEntity,String>{
/**
* 添加身份数据
*
* @param reqVO
* @return
*/
SysIdentityEntity saveIdEntity(SysIdentityEntity reqVO) throws AppException;
/**
* 获取身份ID
*
* @param reqVO
* @return
*/
String findIdEntity(SysIdentityEntity reqVO) throws AppException;
/**
* 获取身份详细数据
*
* @param id
* @param type 系统内部使用 1
* @return
*/
SysIdentityEntity findIdEntityDetail(String id,int type) throws AppException;
}
\ No newline at end of file
package com.mortals.xhx.module.identity.service.impl;
import cn.hutool.core.img.Img;
import cn.hutool.core.util.IdUtil;
import com.arcsoft.face.FaceEngine;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.common.utils.FaceUtil;
import com.mortals.xhx.module.identity.dao.SysFaceDao;
import com.mortals.xhx.module.identity.model.SysFaceEntity;
import com.mortals.xhx.module.identity.model.SysIdentityEntity;
import com.mortals.xhx.module.identity.model.vo.FaceInfoResVO;
import com.mortals.xhx.module.identity.service.SysFaceService;
import com.mortals.xhx.module.identity.service.SysIdentityService;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* SysFaceService
* 人脸识别信息 service实现
*
* @author zxfei
* @date 2022-08-03
*/
@Service("sysFaceService")
public class SysFaceServiceImpl extends AbstractCRUDServiceImpl<SysFaceDao, SysFaceEntity, String> implements SysFaceService {
public static final int WIDTH = 100;
public static final int HEIGHT = 100;
@Value(value = "${faceAppId}")
private String appId;
@Value(value = "${winSdkKey}")
private String winSdkKey;
@Value(value = "${linuxSdkkey}")
private String linuxSdkKey;
@Autowired
private FaceUtil faceUtil;
@Autowired
private SysIdentityService sysIdentityService;
@Override
protected void saveBefore(SysFaceEntity entity, Context context) throws AppException {
//非系统自增,需这里设置主键
entity.setId(IdUtil.fastSimpleUUID());
super.saveBefore(entity, context);
}
@Override
public FaceInfoResVO uploadImage(MultipartFile multipartFile, String name, String idCard, String placeId, String placeName) throws AppException {
String clientName = multipartFile.getOriginalFilename();
if(!(clientName.endsWith(".png") || clientName.endsWith(".jpg") || clientName.endsWith(".jpeg"))){
throw new AppException("请上传图片格式(" + clientName + ")");
}
FaceInfoResVO resVO = new FaceInfoResVO();
SysIdentityEntity idEntityReqVO = new SysIdentityEntity();
idEntityReqVO.setName(name);
idEntityReqVO.setIdCard(idCard);
String entityId = sysIdentityService.saveIdEntity(idEntityReqVO).getId();
SysFaceEntity query = new SysFaceEntity();
query.setIdCard(entityId);
List<SysFaceEntity> sysFaceList = dao.getList(query);
if(CollectionUtils.isNotEmpty(sysFaceList)){
throw new AppException("该用户(" + idEntityReqVO.getName() + "_" + idEntityReqVO.getIdCard() + ")人脸数据已存在");
}
try {
byte[] file = multipartFile.getBytes();
//激活引擎
FaceEngine faceEngine = faceUtil.initFace(appId, getSdkKey());
byte[] featureData = faceUtil.featureData(faceEngine, file);
//创建缩略图
BufferedImage image = Thumbnails.of(multipartFile.getInputStream()).size(WIDTH, HEIGHT).asBufferedImage();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//此方法会造成png图片有阴影
// ImageIO.write(image, "jpg", byteArrayOutputStream);
Img.from(image).write(byteArrayOutputStream);
byteArrayOutputStream.flush();
SysFaceEntity sysFace = new SysFaceEntity();
sysFace.setId(IdUtil.fastSimpleUUID());
sysFace.setFace(byteArrayOutputStream.toByteArray());
sysFace.setFaceFeature(featureData);
sysFace.setIdCard(entityId);
sysFace.setPlaceId(placeId);
sysFace.setPlaceName(placeName);
sysFace.setCreateTime(new Date());
sysFace.setUpdateTime(sysFace.getCreateTime());
sysFace.setDeleted(0);
dao.insert(sysFace);
resVO.setFace(Base64.getEncoder().encodeToString(file));
resVO.setFaceFeature(Base64.getEncoder().encodeToString(featureData));
resVO.setIdCard(idCard);
resVO.setName(name);
resVO.setPhone("");
resVO.setId(sysFace.getId());
} catch (IOException e) {
log.error("提取特征失败:", e);
}
return resVO;
}
@Override
public List<FaceInfoResVO> findFaceList(String placeId) throws AppException {
SysFaceEntity query = new SysFaceEntity();
query.setPlaceId(placeId);
List<SysFaceEntity> sysFaceList = dao.getList(query);
if(CollectionUtils.isEmpty(sysFaceList)){
throw new AppException("该场所无人脸数据");
}
return sysFaceList.stream().map(o -> {
FaceInfoResVO resVO = new FaceInfoResVO();
SysIdentityEntity resVO1 = sysIdentityService.findIdEntityDetail(o.getIdCard(), 1);
resVO.setId(o.getId());
resVO.setPlaceId(o.getPlaceId());
resVO.setPlaceName(o.getPlaceName());
resVO.setCardId(resVO1.getId());
resVO.setName(resVO1.getName());
resVO.setPhone(resVO1.getPhone());
resVO.setFace(Base64.getEncoder().encodeToString(o.getFace()));
resVO.setFaceFeature(Base64.getEncoder().encodeToString(o.getFaceFeature()));
return resVO;
}).collect(Collectors.toList());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void batchAddFace(List<MultipartFile> files, String placeId, String placeName) {
for (int j = 0; j < files.size(); j++) {
String fileName = files.get(j).getOriginalFilename();
if(StringUtils.isEmpty(fileName)){
throw new AppException("文件名称(" + fileName + ")不能为空!");
}
String[] info = fileName.split("/");
if(info.length != 2){
throw new AppException("(" + fileName + ")文件命名错误,请按照规定文件模版上传!");
}
String[] infos = info[1].split("\\.");
if(infos.length != 2){
throw new AppException("(" + fileName + ")文件命名错误,请按照规定文件模版上传!");
}
String[] strings = infos[0].split("_");
if(strings.length != 2){
throw new AppException("(" + fileName + ")文件命名错误,请按照规定文件模版上传!");
}
uploadImage(files.get(j), strings[0], strings[1], placeId, placeName);
}
}
private String getSdkKey() {
return faceUtil.getOsName().equals("/win") ? winSdkKey : linuxSdkKey;
}
}
\ No newline at end of file
package com.mortals.xhx.module.identity.service.impl;
import cn.hutool.core.util.IdcardUtil;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.common.utils.RioUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.xhx.module.identity.dao.SysIdentityDao;
import com.mortals.xhx.module.identity.model.SysIdentityEntity;
import com.mortals.xhx.module.identity.service.SysIdentityService;
import cn.hutool.core.util.IdUtil;
import java.util.Date;
/**
* SysIdentityService
* 人员身份信息 service实现
*
* @author zxfei
* @date 2022-08-03
*/
@Service("sysIdentityService")
public class SysIdentityServiceImpl extends AbstractCRUDServiceImpl<SysIdentityDao, SysIdentityEntity, String> implements SysIdentityService {
@Value(value = "${sm4key}")
private String sm4key;
@Override
protected void saveBefore(SysIdentityEntity entity, Context context) throws AppException {
//非系统自增,需这里设置主键
entity.setId(IdUtil.fastSimpleUUID());
super.saveBefore(entity, context);
}
@Override
public SysIdentityEntity saveIdEntity(SysIdentityEntity entity) throws AppException {
if(StringUtils.isEmpty(entity.getIdCard())){
throw new AppException("身份证号不能为空");
}
if(StringUtils.isEmpty(entity.getName())){
throw new AppException("身份证姓名不能为空");
}
if(!IdcardUtil.isValidCard18(entity.getIdCard())){
throw new AppException("身份证号码格式不正确");
}
//获取区域
String region = StringUtils.substring(entity.getIdCard(), 0, 6);
//获取生日
String birthday = StringUtils.substring(entity.getIdCard(), 6, 14);
//获取序列号
String serial = StringUtils.substring(entity.getIdCard(), 14, 18);
SysIdentityEntity sysIdentity = dao.findIdentity(Long.parseLong(region), Long.parseLong(birthday), serial, entity.getName(), "");
if (sysIdentity == null) {
sysIdentity = new SysIdentityEntity();
sysIdentity.setId(IdUtil.fastSimpleUUID());
sysIdentity.setPhone(entity.getPhone());
sysIdentity.setName(entity.getName());
sysIdentity.setRegion(Long.parseLong(region));
sysIdentity.setBirthday(Long.parseLong(birthday));
sysIdentity.setAse(serial);
sysIdentity.setCreateTime(new Date());
sysIdentity.setDeleted(0);
dao.insert(sysIdentity);
}else {
if(StringUtils.isNotEmpty(entity.getPhone())){
SysIdentityEntity update = new SysIdentityEntity();
update.setId(sysIdentity.getId());
update.setPhone(entity.getPhone());
dao.update(update);
sysIdentity.setPhone(entity.getPhone());
}
}
return sysIdentity;
}
@Override
public String findIdEntity(SysIdentityEntity reqVO) throws AppException {
if(StringUtils.isEmpty(reqVO.getIdCard())){
throw new AppException("身份证号不能为空");
}
if(!IdcardUtil.isValidCard18(reqVO.getIdCard())){
throw new AppException("身份证号码格式不正确");
}
//获取区域
String region = StringUtils.substring(reqVO.getIdCard(), 0, 6);
//获取生日
String birthday = StringUtils.substring(reqVO.getIdCard(), 6, 14);
//获取序列号
String serial = StringUtils.substring(reqVO.getIdCard(), 14, 18);
SysIdentityEntity sysIdentity = dao.findIdentity(Long.parseLong(region), Long.parseLong(birthday), serial, reqVO.getName(), "");
if (sysIdentity == null) {
throw new AppException("无身份数据");
}
return sysIdentity.getId();
}
@Override
public SysIdentityEntity findIdEntityDetail(String id, int type) throws AppException {
SysIdentityEntity sysIdentity = dao.findIdentity(null, null, "", "", id);
if (sysIdentity == null) {
throw new AppException("无身份数据");
}
String idCard = sysIdentity.getRegion() + sysIdentity.getBirthday() + sysIdentity.getAse();
SysIdentityEntity resVO = new SysIdentityEntity();
if (type == 0) {
resVO.setIdCard(RioUtil.encryptHex(idCard, sm4key));
resVO.setName(RioUtil.encryptHex(sysIdentity.getName(), sm4key));
resVO.setPhone(RioUtil.encryptHex(sysIdentity.getPhone(), sm4key));
} else {
resVO.setIdCard(idCard);
resVO.setName(sysIdentity.getName());
resVO.setPhone(sysIdentity.getPhone());
}
return resVO;
}
}
\ No newline at end of file
package com.mortals.xhx.module.identity.web;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.model.Context;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.module.identity.model.SysFaceEntity;
import com.mortals.xhx.module.identity.model.vo.FaceInfoResVO;
import com.mortals.xhx.module.identity.service.SysFaceService;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* 人脸识别信息
*
* @author zxfei
* @date 2022-08-03
*/
@RestController
@RequestMapping("face")
public class SysFaceController extends BaseCRUDJsonBodyMappingController<SysFaceService,SysFaceEntity,String> {
public SysFaceController(){
super.setModuleDesc( "人脸识别信息");
}
@Override
protected void init(Map<String, Object> model, Context context) {
super.init(model, context);
}
@PostMapping({"uploadImage"})
@UnAuth
public String uploadImage(@RequestPart("file") MultipartFile file,
@RequestParam("name") String name,
@RequestParam("idCard") String idCard,
@RequestParam(value = "placeId") String placeId,
@RequestParam(value = "placeName") String placeName) {
Map<String, Object> model = new HashMap();
JSONObject ret = new JSONObject();
String busiDesc = "人脸特征解析";
Context context = this.getContext();
try {
FaceInfoResVO resVO = service.uploadImage(file, name, idCard, placeId, placeName);
model.put("data",resVO);
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var8) {
this.doException(this.request, busiDesc, model, var8);
Object msg = model.get("message_info");
return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
}
this.init(model, context);
ret.put("data", model.get("data"));
ret.put("code", 1);
ret.put("msg", model.remove("message_info"));
return ret.toJSONString();
}
@GetMapping({"findFaceList"})
@UnAuth
public String findFaceList(@RequestParam("placeId") String placeId) {
Map<String, Object> model = new HashMap();
JSONObject ret = new JSONObject();
String busiDesc = "下发人脸列表";
Context context = this.getContext();
try {
List<FaceInfoResVO> list = service.findFaceList(placeId);
model.put("data",list);
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var8) {
this.doException(this.request, busiDesc, model, var8);
Object msg = model.get("message_info");
return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
}
this.init(model, context);
ret.put("data", model.get("data"));
ret.put("code", 1);
ret.put("msg", model.remove("message_info"));
return ret.toJSONString();
}
@PostMapping({"batchAddFace"})
@UnAuth
public String batchAddFace(@RequestPart("files") List<MultipartFile> files,
@RequestParam("placeId") String placeId,
@RequestParam("placeName") String placeName) {
Map<String, Object> model = new HashMap();
JSONObject ret = new JSONObject();
String busiDesc = "批量上传人脸";
Context context = this.getContext();
try {
service.batchAddFace(files, placeId, placeName);
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var8) {
this.doException(this.request, busiDesc, model, var8);
Object msg = model.get("message_info");
return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
}
this.init(model, context);
ret.put("data", null);
ret.put("code", 1);
ret.put("msg", model.remove("message_info"));
return ret.toJSONString();
}
}
\ No newline at end of file
package com.mortals.xhx.module.identity.web;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.annotation.RepeatSubmit;
import com.mortals.framework.annotation.UnAuth;
import com.mortals.framework.model.Context;
import com.mortals.framework.util.StringUtils;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.module.identity.model.SysIdentityEntity;
import com.mortals.xhx.module.identity.service.SysIdentityService;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
/**
*
* 人员身份信息
*
* @author zxfei
* @date 2022-08-03
*/
@RestController
@RequestMapping("identity")
public class SysIdentityController extends BaseCRUDJsonBodyMappingController<SysIdentityService,SysIdentityEntity,String> {
public SysIdentityController(){
super.setModuleDesc( "人员身份信息");
}
@Override
protected void init(Map<String, Object> model, Context context) {
super.init(model, context);
}
@PostMapping({"saveIdEntity"})
@RepeatSubmit
@UnAuth
public String save(@RequestBody SysIdentityEntity entity) {
Map<String, Object> model = new HashMap();
Context context = this.getContext();
int code = 1;
String busiDesc = "保存人员身份信息";
try {
entity = this.service.saveIdEntity(entity);
model.put("id", entity.getId());
code = this.saveAfter(entity, model, context);
model.put("entity", entity);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】 [id:" + entity.getId() + "]");
} catch (Exception var7) {
this.doException(this.request, busiDesc, model, var7);
model.put("entity", entity);
this.init(model, context);
code = this.saveException(entity, model, context, var7);
}
this.init(model, context);
JSONObject ret = new JSONObject();
ret.put("code", code);
ret.put("msg", model.remove("message_info"));
ret.put("data", model);
return ret.toJSONString();
}
@PostMapping({"findIdEntity"})
@UnAuth
public String findIdEntity(@RequestBody SysIdentityEntity entity) {
Map<String, Object> model = new HashMap();
JSONObject ret = new JSONObject();
String busiDesc = "获取基础信息唯一ID";
Context context = this.getContext();
try {
String id = service.findIdEntity(entity);
model.put("data",id);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var8) {
this.doException(this.request, busiDesc, model, var8);
Object msg = model.get("message_info");
return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
}
this.init(model, context);
ret.put("data", model.get("data"));
ret.put("code", 1);
ret.put("msg", model.remove("message_info"));
return ret.toJSONString();
}
@RequestMapping(value = {"findIdEntityDetail"},method = {RequestMethod.POST, RequestMethod.GET})
@UnAuth
public String findIdEntityDetail(@RequestParam("id") String id) {
Map<String, Object> model = new HashMap();
if (StringUtils.isEmpty(id)) {
return this.createFailJsonResp("请选择待查看人员身份信息");
} else {
JSONObject ret = new JSONObject();
String busiDesc = "获取身份证详细信息";
Context context = this.getContext();
try {
SysIdentityEntity entity = this.service.findIdEntityDetail(id, 1);
if (entity == null) {
throw new Exception(busiDesc + ",不存在或已被删除");
}
model.putAll(model);
model.put("entity", entity);
model.put("message_info", busiDesc + "成功");
this.recordSysLog(this.request, busiDesc + " 【成功】");
} catch (Exception var8) {
this.doException(this.request, busiDesc, model, var8);
Object msg = model.get("message_info");
return this.createFailJsonResp(msg == null ? "系统异常" : msg.toString());
}
this.init(model, context);
ret.put("data", model);
ret.put("code", 1);
ret.put("msg", model.remove("message_info"));
return ret.toJSONString();
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"mybatis-3-mapper.dtd">
<mapper namespace="com.mortals.xhx.module.identity.dao.ibatis.SysIdentityDaoImpl">
<select id="findIdentity" resultMap="SysIdentityEntity-Map">
SELECT
id,region,birthday,
AES_DECRYPT(UNHEX(ase),'${@com.mortals.xhx.common.key.Constant@MYSQL_KEY}') as ase,
name,phone,create_time,update_time
FROM mortals_sys_identity
<where>
deleted = 0
<if test="region != null">
and region = #{region}
</if>
<if test="birthday != null">
and birthday = #{birthday}
</if>
<if test="ase != null and ase != ''">
and ase = HEX(AES_ENCRYPT(#{ase},'${@com.mortals.xhx.common.key.Constant@MYSQL_KEY}'))
</if>
<if test="name != null and name != ''">
and name = #{name}
</if>
<if test="id != null and id != ''">
and id = #{id}
</if>
</where>
</select>
</mapper>
\ No newline at end of file
......@@ -83,9 +83,12 @@ public class RoleModelServiceImpl extends AbstractCRUDServiceImpl<RoleModelDao,
query.setUserId(userId);
List<RoleUserEntity> roleUserEntityList = roleUserService.find(query);
List<Long> roleIds = new ArrayList<>();
roleUserEntityList.stream().forEach(item->{
roleUserEntityList.forEach(item->{
roleIds.add(item.getRoleId());
});
if(roleIds.isEmpty()){
return Collections.emptyList();
}
RoleModelQuery condition = new RoleModelQuery();
condition.setRoleIdList(roleIds);
List<RoleModelEntity> roleModelEntities = this.find(condition);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment