Przeglądaj źródła

fix: 消费服务
1.人脸sdk升级到4.1

luo.yibo@datuai.com 1 rok temu
rodzic
commit
fb1d6d61c5

+ 0 - 34
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/ArcFaceBusiness.java

@@ -92,41 +92,7 @@ public class ArcFaceBusiness {
      */
     public YcFaceFeatureVo getOneFeatureDataUser(Long userId) {
         PtArcFaceFeatureVo vo = arcFaceFeatureService.getOneFeatureDataUser(userId);
-        // 人脸照片
-        ImageInfo imageInfo = null;
-        String featureData = "";
-        // 获取人员照片地址
         RemoteUserAccountVo accountVo = remoteUserAccountService.getUserAccountVoById(userId);
-        String photoUrl = ObjectUtil.isEmpty(accountVo.getPhoto()) ? "" : accountVo.getPhoto();
-
-        // 如果不存在或者已更新,则重新生成特征码
-        if (ObjectUtil.isEmpty(vo) || ObjectUtil.notEqual(photoUrl, vo.getPhotoUrl())) {
-            String fileUrl = uploadPath + userPath + photoUrl;
-            File imageFile = new File(fileUrl);
-            if (!imageFile.exists()) {
-                return null;
-            }
-            imageInfo = getRGBData(imageFile);
-            if (imageInfo == null) {
-                return null;
-            }
-            featureData = faceEngineService.createFeatureData(imageInfo);
-            if (ObjectUtil.isEmpty(featureData)) {
-                return null;
-            }
-        }
-        // 生成特征码数据
-        if (ObjectUtil.isEmpty(vo)) {
-            PtArcFaceFeatureBo bo = new PtArcFaceFeatureBo();
-            bo.setUserId(userId);
-            bo.setPhotoUrl(photoUrl);
-            bo.setFeatureData(featureData);
-            arcFaceFeatureService.insertByBo(bo);
-        } else if (ObjectUtil.notEqual(photoUrl, vo.getPhotoUrl())) {
-            arcFaceFeatureService.updateFeatureDataByUserId(userId, featureData, photoUrl);
-        }
-        // 重新从数据中获取数据
-        vo = arcFaceFeatureService.getOneFeatureDataUser(userId);
         vo.setUserNo(accountVo.getUserNo().toString());
         vo.setUserNumb(accountVo.getUserNumb());
         vo.setRealName(accountVo.getRealName());

+ 5 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/business/CheckBusiness.java

@@ -23,7 +23,10 @@ import org.dromara.common.core.utils.RecordIdUtils;
 import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
 import org.dromara.server.consume.cache.TokenManager;
 import org.dromara.server.consume.domain.bo.XfCardLimitedBo;
-import org.dromara.server.consume.domain.vo.*;
+import org.dromara.server.consume.domain.vo.PtBagVo;
+import org.dromara.server.consume.domain.vo.XfCardLimitedVo;
+import org.dromara.server.consume.domain.vo.XfConsumeDetailOriginalVo;
+import org.dromara.server.consume.domain.vo.XfTermVo;
 import org.dromara.server.consume.domain.vo.yc.TermToken;
 import org.dromara.server.consume.service.IConsumeDetailOriginalService;
 import org.dromara.server.consume.service.IPtBagService;
@@ -133,7 +136,7 @@ public class CheckBusiness {
             return R.fail(errorInfo);
         }
         // 检查交易人员标识
-        if (bo.getCardNo() <= 0 && bo.getFactoryId() == 0 && bo.getUserNo() <= 0 && StrUtil.isEmpty(bo.getUserNumb())) {
+        if (bo.getCardNo() <= 0L && bo.getFactoryId() == 0L && bo.getUserNo() <= 0L && StrUtil.isEmpty(bo.getUserNumb())) {
             errorInfo = new ErrorInfo(1, ApiErrorTypeConstants.PARAM_ERROR, "交易人员标识不满足",
                                       "必须提供 [CardNo | FactoryId | userNo | userNumb] 中至少1项来标识交易用户");
             return R.fail(errorInfo);

+ 1 - 10
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/config/ArcFaceConfig.java

@@ -17,20 +17,11 @@ import org.springframework.context.annotation.Configuration;
 public class ArcFaceConfig {
     // 获取配置参数
     private String sdkLibPath = "";
-
     private String appId = "";
-
     private String sdkKey = "";
-
+    private String activeKey = "";
     private Integer detectPooSize = 5;
-
     private Integer comparePooSize = 5;
-
     private Float faceQuality = 0.6F;
-    // 离线激活文件
-    private String activeFile = "";
-
     private boolean faceMask = false;
-
-    private String activeKey = "";
 }

+ 3 - 3
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/config/FaceEngineFactory.java

@@ -10,9 +10,9 @@ import org.apache.commons.pool2.impl.DefaultPooledObject;
 import org.dromara.common.core.exception.ServiceException;
 
 /**
- * @author flysheep
- * @date 2020/7/27 0027
- * @time 15:31
+ * Factory class for creating and managing instances of {@link FaceEngine} using a pool.
+ * This factory is responsible for the creation, initialization, and destruction of {@link FaceEngine} instances,
+ * ensuring that each engine is properly activated and initialized before being used.
  */
 @Slf4j
 public class FaceEngineFactory extends BasePooledObjectFactory<FaceEngine> {

+ 11 - 11
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/ConsumeController.java

@@ -57,9 +57,9 @@ public class ConsumeController {
      * @return 请求消费结果
      */
     @PostMapping("/ConsumeOriginal/virtualCard")
-    public Object consumeOriginalVirtualCard(@RequestBody Object record, @RequestParam(name = "mac", required = false) java.lang.String mac,
-                                             @RequestParam(name = "qrcode") java.lang.String qrcode,
-                                             @RequestParam(name = "xfPwd", required = false) java.lang.String xfPwd) {
+    public Object consumeOriginalVirtualCard(@RequestBody Object record, @RequestParam(name = "mac", required = false) String mac,
+                                             @RequestParam(name = "qrcode") String qrcode,
+                                             @RequestParam(name = "xfPwd", required = false) String xfPwd) {
         log.warn("[二维码请求消费]-[{}]", JSONUtil.parseObj(record));
         JSONObject yc = JSONUtil.parseObj(record);
         long userNo = ObjectUtil.isEmpty(yc.get("employeeID")) ? 0L : Long.parseLong(yc.get("employeeID").toString());
@@ -84,8 +84,8 @@ public class ConsumeController {
      * @return 请求消费结果
      */
     @PostMapping("/ConsumeOriginal")
-    public Object consumeOriginal(@RequestBody Object record, @RequestParam(name = "mac", required = false) java.lang.String mac,
-                                  @RequestParam(name = "xfPwd", required = false) java.lang.String xfPwd) {
+    public Object consumeOriginal(@RequestBody Object record, @RequestParam(name = "mac", required = false) String mac,
+                                  @RequestParam(name = "xfPwd", required = false) String xfPwd) {
         log.warn("[刷卡请求消费]-[{}]", JSONUtil.parseObj(record));
         return doRecordData(record, "requestConsume", mac, xfPwd);
     }
@@ -98,7 +98,7 @@ public class ConsumeController {
      * @return 上传消费记录结果
      */
     @PostMapping("/Consume")
-    public Object uploadRecord(@RequestBody Object record, @RequestParam(name = "mac", required = false) java.lang.String mac) {
+    public Object uploadRecord(@RequestBody Object record, @RequestParam(name = "mac", required = false) String mac) {
         log.warn("[消费机上传消费记录]-[{}]", JSONUtil.parseObj(record));
         Object object = doRecordData(record, "uploadRecord", mac, "");
         JSONObject jsonObject = JSONUtil.parseObj(object);
@@ -117,8 +117,8 @@ public class ConsumeController {
      * @return 处理结果
      */
     @PostMapping("/Consume/all")
-    public Object consumeAll(@RequestBody Object record, @RequestParam(name = "mac", required = false) java.lang.String mac,
-                             @RequestParam(name = "xfPwd", required = false) java.lang.String xfPwd) {
+    public Object consumeAll(@RequestBody Object record, @RequestParam(name = "mac", required = false) String mac,
+                             @RequestParam(name = "xfPwd", required = false) String xfPwd) {
         return doRecordData(record, "fullRecord", "", "");
     }
 
@@ -139,7 +139,7 @@ public class ConsumeController {
      * @return 对账结果
      */
     @PostMapping("/consume/original/reconciliation/{consumeDate}")
-    public R<ErrorInfo> originalReconciliation(@PathVariable("consumeDate") java.lang.String consumeDate) {
+    public R<ErrorInfo> originalReconciliation(@PathVariable("consumeDate") String consumeDate) {
         return consumeBusiness.originalReconciliation(consumeDate);
     }
 
@@ -149,7 +149,7 @@ public class ConsumeController {
      * @return 生成结果
      */
     @PostMapping("/consume/sync/reconciliation/{consumeDate}")
-    public R<ErrorInfo> syncReconciliation(@PathVariable("consumeDate") java.lang.String consumeDate) {
+    public R<ErrorInfo> syncReconciliation(@PathVariable("consumeDate") String consumeDate) {
         return consumeBusiness.syncReconciliation(consumeDate);
     }
 
@@ -162,7 +162,7 @@ public class ConsumeController {
      * @param xfPwd  消费密码
      * @return 处理结果
      */
-    private Object doRecordData(Object record, java.lang.String type, java.lang.String mac, java.lang.String xfPwd) {
+    private Object doRecordData(Object record, String type, String mac, String xfPwd) {
         if (ObjectUtil.length(record) == 0) {
             ErrorResult result = ErrorResult.instance(HttpStatus.FORBIDDEN, "处理失败", 1, "PARAM_ERROR", "参数错误",
                                                       "json字符串无法还原为对象,可能原因是格式不正确。");

+ 2 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v2/AuthControllerV2.java → ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v2/AuthController.java

@@ -7,10 +7,10 @@ import org.dromara.server.consume.business.TermBusiness;
 import org.dromara.server.consume.domain.vo.yc.TermToken;
 import org.springframework.web.bind.annotation.*;
 
-@RestController
+@RestController("AuthControllerV2")
 @RequiredArgsConstructor
 @RequestMapping(path = { "/v2/Auth" })
-public class AuthControllerV2 {
+public class AuthController {
 
 	private final TermBusiness termBusiness;
 

+ 2 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v2/TermsControllerV2.java → ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v2/TermsController.java

@@ -10,10 +10,10 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Map;
 
-@RestController
+@RestController("TermsControllerV2")
 @RequiredArgsConstructor
 @RequestMapping(path = { "/v2/Terms" })
-public class TermsControllerV2 {
+public class TermsController {
 
 	private final TermBusiness termBusiness;
 

+ 19 - 7
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/service/impl/FaceEngineServiceImpl.java

@@ -25,7 +25,6 @@ import java.util.List;
 /**
  * @author flysheep
  * @date 2020/7/27 0027
- * @time 15:40
  */
 @Service
 @Slf4j
@@ -39,7 +38,7 @@ public class FaceEngineServiceImpl implements FaceEngineService {
     // 引擎配置
     @PostConstruct
     public void init() {
-        GenericObjectPoolConfig detectPoolConfig = new GenericObjectPoolConfig();
+        GenericObjectPoolConfig<FaceEngine> detectPoolConfig = new GenericObjectPoolConfig<>();
         detectPoolConfig.setMaxIdle(this.arcFaceConfig.getDetectPooSize());
         detectPoolConfig.setMaxTotal(this.arcFaceConfig.getDetectPooSize());
         detectPoolConfig.setMinIdle(this.arcFaceConfig.getDetectPooSize());
@@ -53,7 +52,9 @@ public class FaceEngineServiceImpl implements FaceEngineService {
         detectCfg.setFunctionConfiguration(detectFunctionCfg);
         detectCfg.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
         detectCfg.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
-        this.faceEngineGeneralPool = new GenericObjectPool(new FaceEngineFactory(this.arcFaceConfig.getSdkLibPath(), this.arcFaceConfig.getAppId(), this.arcFaceConfig.getSdkKey(), this.arcFaceConfig.getActiveKey(), detectCfg), detectPoolConfig);
+        this.faceEngineGeneralPool = new GenericObjectPool<FaceEngine>(
+            new FaceEngineFactory(this.arcFaceConfig.getSdkLibPath(), this.arcFaceConfig.getAppId(), this.arcFaceConfig.getSdkKey(),
+                                  this.arcFaceConfig.getActiveKey(), detectCfg), detectPoolConfig);
     }
 
     // 人脸检测
@@ -103,11 +104,22 @@ public class FaceEngineServiceImpl implements FaceEngineService {
             // 人脸检测返回值
             int code = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
                 imageInfo.getImageFormat(), faceInfoList);
-            if (code == 0 && !faceInfoList.isEmpty()) {
+            if (code != 0 || faceInfoList.isEmpty()) {
+                logger.error("[人脸照片人脸识别检测失败]-[无效人脸]");
+                return null;
+            }
+            ImageQuality imageQuality = new ImageQuality();
+            code = faceEngine.imageQualityDetect(imageInfo, faceInfoList.get(0), 0, imageQuality);
+            if (code == 0 && !(imageQuality.getFaceQuality() < this.arcFaceConfig.getFaceQuality())) {
                 FaceFeature faceFeature = new FaceFeature();
-                //faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
-                //                              imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
-                faceEngine.extractFaceFeature(imageInfo, faceInfoList.get(0), ExtractType.REGISTER, 0, faceFeature);
+                if (this.arcFaceConfig.isFaceMask()) {
+                    faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(),
+                                                  faceInfoList.get(0), ExtractType.REGISTER, 1, faceFeature);
+                } else {
+                    faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(),
+                                                  faceInfoList.get(0), ExtractType.RECOGNIZE, 0, faceFeature);
+                }
+
                 return Base64.encode(faceFeature.getFeatureData());
             }
         } catch (Exception e) {