Bläddra i källkod

add:OCR新增接口,新增存储

lyx 2 veckor sedan
förälder
incheckning
21fc7ecd5e

+ 65 - 0
alien-entity/src/main/java/shop/alien/entity/store/OcrImageUpload.java

@@ -0,0 +1,65 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * OCR图片上传记录表
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@JsonInclude
+@TableName("ocr_image_uploads")
+@ApiModel(value = "OcrImageUpload对象", description = "OCR图片上传记录表")
+public class OcrImageUpload implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "用户ID(上传图片的用户唯一标识)")
+    @TableField("user_id")
+    private String userId;
+
+    @ApiModelProperty(value = "店铺ID(若图片关联具体店铺,可为NULL表示无店铺关联)")
+    @TableField("store_id")
+    private String storeId;
+
+    @ApiModelProperty(value = "店铺用户ID(店铺内上传图片的操作员ID,与store_id配套使用)")
+    @TableField("store_user_id")
+    private String storeUserId;
+
+    @ApiModelProperty(value = "图片存储路径(本地路径或云存储URL,如OSS / S3地址)")
+    @TableField("image_url")
+    private String imageUrl;
+
+    @ApiModelProperty(value = "OCR识别结果(JSON格式或纯文本,存储识别后的文字内容)")
+    @TableField("ocr_result")
+    private String ocrResult;
+
+    @ApiModelProperty(value = "OCR识别类型")
+    @TableField("ocr_type")
+    private String ocrType;
+
+    @ApiModelProperty(value = "图片上传时间")
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+    @ApiModelProperty(value = "记录更新时间(如OCR状态变更时间)")
+    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updateTime;
+}
+

+ 16 - 0
alien-entity/src/main/java/shop/alien/mapper/OcrImageUploadMapper.java

@@ -0,0 +1,16 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import shop.alien.entity.store.OcrImageUpload;
+
+/**
+ * OCR图片上传记录 Mapper 接口
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Mapper
+public interface OcrImageUploadMapper extends BaseMapper<OcrImageUpload> {
+}
+

+ 20 - 0
alien-store/src/main/java/shop/alien/store/controller/AliController.java

@@ -333,4 +333,24 @@ public class AliController {
             return R.fail(e.getMessage());
         }
     }
+    /**
+     * 调用OCR识别接口
+     */
+    @ApiOperation("调用OCR识别接口")
+    @ApiOperationSupport(order = 17)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "imageUrl", value = "图片文件", dataType = "File", paramType = "query", required = true),
+            @ApiImplicitParam(name = "ocrType", value = "OCR识别类型", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "storeId", value = "店铺ID", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "String", paramType = "query", required = false),
+            @ApiImplicitParam(name = "storeUserId", value = "店铺用户ID", dataType = "String", paramType = "query", required = false)
+    })
+    @PostMapping("/ocrRequestUrl")
+    public R ocrRequestUrl(Map<String, String> params) {
+        try {
+            return aliApi.ocrRequestParams(params);
+        } catch (Exception e) {
+            return R.fail(e.getMessage());
+        }
+    }
 }

+ 96 - 0
alien-store/src/main/java/shop/alien/store/service/OcrImageUploadService.java

@@ -0,0 +1,96 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.store.OcrImageUpload;
+
+import java.util.List;
+
+/**
+ * OCR图片上传记录服务接口
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+public interface OcrImageUploadService extends IService<OcrImageUpload> {
+
+    /**
+     * 保存OCR图片上传记录
+     *
+     * @param ocrImageUpload OCR图片上传记录
+     * @return 是否保存成功
+     */
+    boolean saveOcrImageUpload(OcrImageUpload ocrImageUpload);
+
+    /**
+     * 根据ID查询OCR图片上传记录
+     *
+     * @param id 主键ID
+     * @return OCR图片上传记录
+     */
+    OcrImageUpload getById(Integer id);
+
+    /**
+     * 根据用户ID查询OCR图片上传记录列表
+     *
+     * @param userId 用户ID
+     * @return OCR图片上传记录列表
+     */
+    List<OcrImageUpload> getByUserId(String userId);
+
+    /**
+     * 根据店铺ID查询OCR图片上传记录列表
+     *
+     * @param storeId 店铺ID
+     * @return OCR图片上传记录列表
+     */
+    List<OcrImageUpload> getByStoreId(String storeId);
+
+    /**
+     * 根据用户ID和店铺ID查询OCR图片上传记录列表
+     *
+     * @param userId  用户ID
+     * @param storeId 店铺ID
+     * @return OCR图片上传记录列表
+     */
+    List<OcrImageUpload> getByUserIdAndStoreId(String userId, String storeId);
+
+    /**
+     * 根据OCR类型查询OCR图片上传记录列表
+     *
+     * @param ocrType OCR识别类型
+     * @return OCR图片上传记录列表
+     */
+    List<OcrImageUpload> getByOcrType(String ocrType);
+
+    /**
+     * 分页查询OCR图片上传记录
+     *
+     * @param page     分页参数
+     * @param userId   用户ID(可选)
+     * @param storeId  店铺ID(可选)
+     * @param ocrType  OCR类型(可选)
+     * @return 分页结果
+     */
+    IPage<OcrImageUpload> getPage(Page<OcrImageUpload> page, String userId, String storeId, String ocrType);
+
+    /**
+     * 更新OCR识别结果
+     *
+     * @param id         主键ID
+     * @param ocrResult  OCR识别结果
+     * @param ocrType    OCR识别类型
+     * @return 是否更新成功
+     */
+    boolean updateOcrResult(Integer id, String ocrResult, String ocrType);
+
+    /**
+     * 根据ID删除OCR图片上传记录
+     *
+     * @param id 主键ID
+     * @return 是否删除成功
+     */
+    boolean deleteById(Integer id);
+}
+

+ 98 - 0
alien-store/src/main/java/shop/alien/store/service/impl/OcrImageUploadServiceImpl.java

@@ -0,0 +1,98 @@
+package shop.alien.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.store.OcrImageUpload;
+import shop.alien.mapper.OcrImageUploadMapper;
+import shop.alien.store.service.OcrImageUploadService;
+
+import java.util.List;
+
+/**
+ * OCR图片上传记录服务实现类
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Service
+@RequiredArgsConstructor
+public class OcrImageUploadServiceImpl extends ServiceImpl<OcrImageUploadMapper, OcrImageUpload> implements OcrImageUploadService {
+
+    private final OcrImageUploadMapper ocrImageUploadMapper;
+
+    @Override
+    public boolean saveOcrImageUpload(OcrImageUpload ocrImageUpload) {
+        return ocrImageUploadMapper.insert(ocrImageUpload) > 0;
+    }
+
+    @Override
+    public OcrImageUpload getById(Integer id) {
+        return ocrImageUploadMapper.selectById(id);
+    }
+
+    @Override
+    public List<OcrImageUpload> getByUserId(String userId) {
+        LambdaQueryWrapper<OcrImageUpload> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(OcrImageUpload::getUserId, userId);
+        queryWrapper.orderByDesc(OcrImageUpload::getCreateTime);
+        return ocrImageUploadMapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public List<OcrImageUpload> getByStoreId(String storeId) {
+        LambdaQueryWrapper<OcrImageUpload> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(OcrImageUpload::getStoreId, storeId);
+        queryWrapper.orderByDesc(OcrImageUpload::getCreateTime);
+        return ocrImageUploadMapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public List<OcrImageUpload> getByUserIdAndStoreId(String userId, String storeId) {
+        LambdaQueryWrapper<OcrImageUpload> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotEmpty(userId), OcrImageUpload::getUserId, userId);
+        queryWrapper.eq(StringUtils.isNotEmpty(storeId), OcrImageUpload::getStoreId, storeId);
+        queryWrapper.orderByDesc(OcrImageUpload::getCreateTime);
+        return ocrImageUploadMapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public List<OcrImageUpload> getByOcrType(String ocrType) {
+        LambdaQueryWrapper<OcrImageUpload> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(OcrImageUpload::getOcrType, ocrType);
+        queryWrapper.orderByDesc(OcrImageUpload::getCreateTime);
+        return ocrImageUploadMapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public IPage<OcrImageUpload> getPage(Page<OcrImageUpload> page, String userId, String storeId, String ocrType) {
+        LambdaQueryWrapper<OcrImageUpload> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotEmpty(userId), OcrImageUpload::getUserId, userId);
+        queryWrapper.eq(StringUtils.isNotEmpty(storeId), OcrImageUpload::getStoreId, storeId);
+        queryWrapper.eq(StringUtils.isNotEmpty(ocrType), OcrImageUpload::getOcrType, ocrType);
+        queryWrapper.orderByDesc(OcrImageUpload::getCreateTime);
+        return ocrImageUploadMapper.selectPage(page, queryWrapper);
+    }
+
+    @Override
+    public boolean updateOcrResult(Integer id, String ocrResult, String ocrType) {
+        LambdaUpdateWrapper<OcrImageUpload> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(OcrImageUpload::getId, id);
+        updateWrapper.set(OcrImageUpload::getOcrResult, ocrResult);
+        if (StringUtils.isNotEmpty(ocrType)) {
+            updateWrapper.set(OcrImageUpload::getOcrType, ocrType);
+        }
+        return ocrImageUploadMapper.update(null, updateWrapper) > 0;
+    }
+
+    @Override
+    public boolean deleteById(Integer id) {
+        return ocrImageUploadMapper.deleteById(id) > 0;
+    }
+}
+

+ 15 - 10
alien-store/src/main/java/shop/alien/store/util/ali/AliApi.java

@@ -18,16 +18,8 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
 import shop.alien.entity.result.R;
-import shop.alien.entity.store.LifeUser;
-import shop.alien.entity.store.StoreAliPayErrorLog;
-import shop.alien.entity.store.StoreAliPayLog;
-import shop.alien.entity.store.StoreAliPayRefundLog;
-import shop.alien.entity.store.StoreUser;
-import shop.alien.store.service.LifeUserService;
-import shop.alien.store.service.StoreAliPayErrorLogService;
-import shop.alien.store.service.StoreAliPayLogService;
-import shop.alien.store.service.StoreAliPayRefundLogService;
-import shop.alien.store.service.StoreUserService;
+import shop.alien.entity.store.*;
+import shop.alien.store.service.*;
 import shop.alien.store.util.ali.ocr.OcrStrategy;
 import shop.alien.store.util.ali.ocr.OcrStrategyFactory;
 import shop.alien.util.common.RandomCreateUtil;
@@ -39,6 +31,7 @@ import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Base64;
 import java.util.Date;
+import java.util.Map;
 
 /**
  * 支付宝相关组件
@@ -778,6 +771,18 @@ public class AliApi {
     }
 
     /**
+     * 支付宝OCR识别
+     *
+     * @return OCR识别结果
+     * @throws Exception 识别异常
+     */
+    public R ocrRequestParams(Map<String, String> params) throws Exception {
+        OcrStrategy strategy = ocrStrategyFactory.getStrategy(params.get("ocrType"));
+        return strategy.recognizeParams(params);
+    }
+
+
+    /**
      * 支付宝OCR识别(Base64方式,使用策略工厂模式)
      * 目前没用w
      * @param imageFile 图片文件

+ 15 - 1
alien-store/src/main/java/shop/alien/store/util/ali/ocr/AbstractOcrStrategy.java

@@ -3,7 +3,10 @@ package shop.alien.store.util.ali.ocr;
 import com.aliyun.ocr_api20210707.Client;
 import com.aliyun.tea.TeaException;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import shop.alien.entity.store.OcrImageUpload;
+import shop.alien.store.service.OcrImageUploadService;
 
 /**
  * OCR策略抽象基类
@@ -23,7 +26,10 @@ public abstract class AbstractOcrStrategy implements OcrStrategy {
     
     @Value("${ali.ocr.endpoint:ocr-api.cn-hangzhou.aliyuncs.com}")
     protected String endpoint;
-    
+
+    @Autowired
+    protected OcrImageUploadService ocrImageUploadService;
+
     /**
      * 创建OCR客户端
      * 
@@ -91,5 +97,13 @@ public abstract class AbstractOcrStrategy implements OcrStrategy {
             handleOcrException(teaException, errorMessage);
         }
     }
+
+    public void saveOcrImage(OcrImageUpload ocrImageUpload) {
+        // 保存OCR识别结果到数据库
+        boolean save = ocrImageUploadService.save(ocrImageUpload);
+        if (!save) {
+            log.error("保存OCR识别结果失败: {}", ocrImageUpload);
+        }
+    }
 }
 

+ 19 - 0
alien-store/src/main/java/shop/alien/store/util/ali/ocr/OcrStrategy.java

@@ -1,6 +1,9 @@
 package shop.alien.store.util.ali.ocr;
 
 import shop.alien.entity.result.R;
+import shop.alien.entity.store.OcrImageUpload;
+
+import java.util.Map;
 
 /**
  * OCR识别策略接口
@@ -29,6 +32,15 @@ public interface OcrStrategy {
     R recognizeUrl(String imageUrl) throws Exception;
 
     /**
+     * 执行OCR识别(参数方式)
+     *
+     * @param params 识别参数
+     * @return OCR识别结果(JSON格式)
+     * @throws Exception 识别异常
+     */
+    R recognizeParams(Map<String, String> params) throws Exception;
+
+    /**
      * 执行OCR识别(Base64方式)
      *
      * @param imageBase64 图片Base64编码
@@ -37,6 +49,13 @@ public interface OcrStrategy {
      */
     R recognizeByBase64(String imageBase64) throws Exception;
 
+     /**
+     * 保存OCR识别结果
+     *
+     * @param ocrImageUpload OCR识别结果上传实体
+     */
+    void saveOcrImage(OcrImageUpload ocrImageUpload);
+
     /**
      * 获取策略类型字符串
      *

+ 44 - 3
alien-store/src/main/java/shop/alien/store/util/ali/ocr/strategy/BusinessLicenseOcrStrategy.java

@@ -1,21 +1,23 @@
 package shop.alien.store.util.ali.ocr.strategy;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyun.ocr_api20210707.Client;
-import com.aliyun.ocr_api20210707.models.RecognizeBusinessLicenseRequest;
-import com.aliyun.ocr_api20210707.models.RecognizeBusinessLicenseResponse;
-import com.aliyun.ocr_api20210707.models.RecognizeBusinessLicenseResponseBody;
+import com.aliyun.ocr_api20210707.models.*;
 import com.aliyun.tea.TeaException;
 import com.aliyun.teautil.models.RuntimeOptions;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import shop.alien.entity.result.R;
+import shop.alien.entity.store.OcrImageUpload;
 import shop.alien.entity.store.StoreImg;
 import shop.alien.store.service.StoreImgService;
 import shop.alien.store.util.ali.ocr.AbstractOcrStrategy;
 import shop.alien.util.common.constant.OcrTypeEnum;
 
+import java.util.Map;
+
 /**
  * 营业执照OCR识别策略
  *
@@ -67,6 +69,45 @@ public class BusinessLicenseOcrStrategy extends AbstractOcrStrategy {
     }
 
     @Override
+    public R recognizeParams(Map<String, String> params) throws Exception {
+        String[] imageUrls = params.get("imageUrls").split(",");
+        JSONArray resultArray = new JSONArray();
+        for (String imageUrl : imageUrls) {
+            Client client = createOcrClient();
+            RecognizeBusinessLicenseRequest request = new RecognizeBusinessLicenseRequest()
+                    .setUrl(imageUrl); // 默认识别正面,可根据需要修改为 "back" 识别反面
+            try {
+                RecognizeBusinessLicenseResponse response = client.recognizeBusinessLicenseWithOptions(
+                        request, new RuntimeOptions());
+                RecognizeBusinessLicenseResponseBody body = response.getBody();
+
+                if (body == null || body.getData() == null) {
+                    throw new Exception("OCR识别返回结果为空");
+                }
+                JSONObject jsonObject = JSONObject.parseObject(body.getData());
+                log.info("营业执照OCR识别成功: {}", jsonObject.getJSONObject("data"));
+                // 保存OCR图片上传记录
+                OcrImageUpload ocrImageUpload = new OcrImageUpload();
+                ocrImageUpload.setUserId(params.get("userId"));
+                ocrImageUpload.setStoreId(params.get("storeId"));
+                ocrImageUpload.setStoreUserId(params.get("storeUserId"));
+                ocrImageUpload.setImageUrl(imageUrl);
+                ocrImageUpload.setOcrResult(jsonObject.getJSONObject("data").toJSONString());
+                ocrImageUpload.setOcrType(OcrTypeEnum.ID_CARD.getCode());
+                super.saveOcrImage(ocrImageUpload);
+                resultArray.add(jsonObject.getJSONObject("data"));
+            } catch (TeaException error) {
+                handleOcrException(error, "营业执照识别失败");
+                return R.fail("营业执照识别失败");
+            } catch (Exception error) {
+                handleOcrException(error, "营业执照识别异常");
+                return R.fail("营业执照识别异常");
+            }
+        }
+        return R.data(resultArray);
+    }
+
+    @Override
     public R recognizeByBase64(String imageBase64) throws Exception {
         Client client = createOcrClient();
         // 将Base64字符串转换为字节数组,然后创建InputStream

+ 43 - 0
alien-store/src/main/java/shop/alien/store/util/ali/ocr/strategy/FoodManageLicenseOcrStrategy.java

@@ -1,5 +1,6 @@
 package shop.alien.store.util.ali.ocr.strategy;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyun.ocr_api20210707.Client;
 import com.aliyun.ocr_api20210707.models.*;
@@ -9,11 +10,14 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import shop.alien.entity.result.R;
+import shop.alien.entity.store.OcrImageUpload;
 import shop.alien.entity.store.StoreImg;
 import shop.alien.store.service.StoreImgService;
 import shop.alien.store.util.ali.ocr.AbstractOcrStrategy;
 import shop.alien.util.common.constant.OcrTypeEnum;
 
+import java.util.Map;
+
 /**
  * 食品经营许可证OCR识别策略
  *
@@ -65,6 +69,45 @@ public class FoodManageLicenseOcrStrategy extends AbstractOcrStrategy {
     }
 
     @Override
+    public R recognizeParams(Map<String, String> params) throws Exception {
+        String[] imageUrls = params.get("imageUrls").split(",");
+        JSONArray resultArray = new JSONArray();
+        for (String imageUrl : imageUrls) {
+            Client client = createOcrClient();
+            RecognizeFoodManageLicenseRequest request = new RecognizeFoodManageLicenseRequest()
+                    .setUrl(imageUrl); // 默认识别正面,可根据需要修改为 "back" 识别反面
+            try {
+                RecognizeFoodManageLicenseResponse response = client.recognizeFoodManageLicenseWithOptions(
+                        request, new RuntimeOptions());
+                RecognizeFoodManageLicenseResponseBody body = response.getBody();
+
+                if (body == null || body.getData() == null) {
+                    throw new Exception("OCR识别返回结果为空");
+                }
+                JSONObject jsonObject = JSONObject.parseObject(body.getData());
+                log.info("食品经营许可证OCR识别成功: {}", jsonObject.getJSONObject("data"));
+                // 保存OCR图片上传记录
+                OcrImageUpload ocrImageUpload = new OcrImageUpload();
+                ocrImageUpload.setUserId(params.get("userId"));
+                ocrImageUpload.setStoreId(params.get("storeId"));
+                ocrImageUpload.setStoreUserId(params.get("storeUserId"));
+                ocrImageUpload.setImageUrl(imageUrl);
+                ocrImageUpload.setOcrResult(jsonObject.getJSONObject("data").toJSONString());
+                ocrImageUpload.setOcrType(OcrTypeEnum.ID_CARD.getCode());
+                super.saveOcrImage(ocrImageUpload);
+                resultArray.add(jsonObject.getJSONObject("data"));
+            } catch (TeaException error) {
+                handleOcrException(error, "食品经营许可证识别失败");
+                return R.fail("食品经营许可证识别失败");
+            } catch (Exception error) {
+                handleOcrException(error, "食品经营许可证识别异常");
+                return R.fail("食品经营许可证识别异常");
+            }
+        }
+        return R.data(resultArray);
+    }
+
+    @Override
     public R recognizeByBase64(String imageBase64) throws Exception {
         Client client = createOcrClient();
         // 将Base64字符串转换为字节数组,然后创建InputStream

+ 46 - 1
alien-store/src/main/java/shop/alien/store/util/ali/ocr/strategy/IdCardOcrStrategy.java

@@ -1,19 +1,25 @@
 package shop.alien.store.util.ali.ocr.strategy;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyun.ocr_api20210707.Client;
-import com.aliyun.ocr_api20210707.models.*;
+import com.aliyun.ocr_api20210707.models.RecognizeIdcardRequest;
+import com.aliyun.ocr_api20210707.models.RecognizeIdcardResponse;
+import com.aliyun.ocr_api20210707.models.RecognizeIdcardResponseBody;
 import com.aliyun.tea.TeaException;
 import com.aliyun.teautil.models.RuntimeOptions;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import shop.alien.entity.result.R;
+import shop.alien.entity.store.OcrImageUpload;
 import shop.alien.entity.store.StoreImg;
 import shop.alien.store.service.StoreImgService;
 import shop.alien.store.util.ali.ocr.AbstractOcrStrategy;
 import shop.alien.util.common.constant.OcrTypeEnum;
 
+import java.util.Map;
+
 /**
  * 身份证OCR识别策略
  *
@@ -65,6 +71,45 @@ public class IdCardOcrStrategy extends AbstractOcrStrategy {
     }
 
     @Override
+    public R recognizeParams(Map<String, String> params) throws Exception {
+        String[] imageUrls = params.get("imageUrls").split(",");
+        JSONArray resultArray = new JSONArray();
+        for (String imageUrl : imageUrls) {
+            Client client = createOcrClient();
+            RecognizeIdcardRequest request = new RecognizeIdcardRequest()
+                    .setUrl(imageUrl); // 默认识别正面,可根据需要修改为 "back" 识别反面
+            try {
+                RecognizeIdcardResponse response = client.recognizeIdcardWithOptions(
+                        request, new RuntimeOptions());
+                RecognizeIdcardResponseBody body = response.getBody();
+
+                if (body == null || body.getData() == null) {
+                    throw new Exception("OCR识别返回结果为空");
+                }
+                JSONObject jsonObject = JSONObject.parseObject(body.getData());
+                log.info("身份证OCR识别成功: {}", jsonObject.getJSONObject("data"));
+                // 保存OCR图片上传记录
+                OcrImageUpload ocrImageUpload = new OcrImageUpload();
+                ocrImageUpload.setUserId(params.get("userId"));
+                ocrImageUpload.setStoreId(params.get("storeId"));
+                ocrImageUpload.setStoreUserId(params.get("storeUserId"));
+                ocrImageUpload.setImageUrl(imageUrl);
+                ocrImageUpload.setOcrResult(jsonObject.getJSONObject("data").toJSONString());
+                ocrImageUpload.setOcrType(OcrTypeEnum.ID_CARD.getCode());
+                super.saveOcrImage(ocrImageUpload);
+                resultArray.add(jsonObject.getJSONObject("data"));
+            } catch (TeaException error) {
+                handleOcrException(error, "身份证识别失败");
+                return R.fail("身份证识别失败");
+            } catch (Exception error) {
+                handleOcrException(error, "身份证识别异常");
+                return R.fail("身份证识别异常");
+            }
+        }
+        return R.data(resultArray);
+    }
+
+    @Override
     public R recognizeByBase64(String imageBase64) throws Exception {
         Client client = createOcrClient();
         // 将Base64字符串转换为字节数组,然后创建InputStream