Преглед изворни кода

Merge branch 'feature-2022.06.27' of https://git.flowbb.cn/RK-Dev/fqgz-server into feature-2022.06.27

humuyu пре 3 година
родитељ
комит
4f9a5a1557
16 измењених фајлова са 399 додато и 11 уклоњено
  1. 3 0
      eladmin-common/src/main/java/me/zhengjie/base/ResultCode.java
  2. 12 0
      eladmin-system/src/main/java/me/zhengjie/appapi/controller/ApiBankController.java
  3. 4 0
      eladmin-system/src/main/java/me/zhengjie/appapi/service/OrderService.java
  4. 22 0
      eladmin-system/src/main/java/me/zhengjie/appapi/service/impl/OrderServiceImpl.java
  5. 23 0
      eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/BorrowerDomain.java
  6. 24 0
      eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/GuaranteeDomain.java
  7. 15 0
      eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/MortgageDomain.java
  8. 31 0
      eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/parser/OrderOCRParser.java
  9. 19 0
      eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/parser/OrderOCRParserFactory.java
  10. 30 0
      eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/parser/impl/OrderOCRParserFactoryImpl.java
  11. 168 0
      eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/parser/impl/YZBankOrderOCRParserImpl.java
  12. 0 4
      eladmin-system/src/main/java/me/zhengjie/modules/system/domain/user/UserDomain.java
  13. 3 0
      eladmin-system/src/main/java/me/zhengjie/modules/system/entity/BankEntity.java
  14. 1 1
      eladmin-system/src/main/java/me/zhengjie/modules/system/entity/request/bank/BankCreateReq.java
  15. 38 2
      eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/BankServiceImpl.java
  16. 6 4
      eladmin-system/src/main/java/me/zhengjie/util/TencentServiceUtil.java

+ 3 - 0
eladmin-common/src/main/java/me/zhengjie/base/ResultCode.java

@@ -104,6 +104,9 @@ public enum ResultCode {
     MODEL_ALREADY_EXISGT(30047,"该类模板已经创建!"),
     MODEL_SORT_EXISTED(30048,"模板排序值重复!"),
     NO_NOTARIZARION_NO(30049,"没有可用的公证书编号!"),
+    SUCC_ALREADY_EXISTED(30050,"社会统一信用代码已存在,请确认输入是否正确!"),
+    SUCC_NEED_INPUT(30051,"请输入社会统一信用代码!"),
+    ORDER_OCR_SERVICE_UNAVAILABLE(30052,"订单扫描录入功能尚未开通,请联系平台开通后使用!"),
     
     /* 系统错误:40001-49999 */
     SYSTEM_INNER_ERROR(40001, "系统繁忙,请稍后重试"),

+ 12 - 0
eladmin-system/src/main/java/me/zhengjie/appapi/controller/ApiBankController.java

@@ -291,4 +291,16 @@ public class ApiBankController extends BaseController {
 		OrderDocEntity orderDoc = orderDocService.getOrderDocByContractId(orderId);
 		return ResponseDTO.success(orderDoc.getAuthNotarizaiton());
 	}
+
+	@RequestMapping("/orderOCRParser")
+	public ResponseDTO<?> orderOCRParser(@RequestBody String json) {
+		JSONObject jsonObj = JSONObject.parseObject(json);
+		String orderType = jsonObj.getString("orderType");
+		String uscc = jsonObj.getString("uscc");
+		String content = jsonObj.getString("content");
+		if (!orderService.canBeParse(uscc)) {
+			return ResponseDTO.error(ResultCode.ORDER_OCR_SERVICE_UNAVAILABLE);
+		}
+		return ResponseDTO.success(orderService.parseOrder(orderType, uscc, content));
+	}
 }

+ 4 - 0
eladmin-system/src/main/java/me/zhengjie/appapi/service/OrderService.java

@@ -41,4 +41,8 @@ public interface OrderService extends IService<NotaryOrderEntity> {
 	public OrderDetailDto getOrderDetail(OrderDetailDto orderDetail);
 
 	public void updateOrderStatus(String orderId) ;
+
+	public boolean canBeParse(String uscc);
+
+	public Object parseOrder(String orderType, String uscc, String content);
 }

+ 22 - 0
eladmin-system/src/main/java/me/zhengjie/appapi/service/impl/OrderServiceImpl.java

@@ -17,6 +17,7 @@ import me.zhengjie.appapi.util.StatusEnum;
 import me.zhengjie.appapi.util.StatusEnum.NotaryStatusEnum;
 import me.zhengjie.base.ResultCode;
 import me.zhengjie.modules.mq.RedisCacheConfig;
+import me.zhengjie.modules.system.domain.order.parser.OrderOCRParserFactory;
 import me.zhengjie.modules.system.entity.BankEntity;
 import me.zhengjie.modules.system.entity.NotaryOfficeEntity;
 import me.zhengjie.modules.system.entity.NotaryOrderEntity;
@@ -26,6 +27,7 @@ import me.zhengjie.modules.system.repository.NotaryOrderMapper;
 import me.zhengjie.modules.system.repository.OfficeXbankMapper;
 import me.zhengjie.modules.system.service.BankService;
 import me.zhengjie.modules.system.service.NotaryOrderService;
+import me.zhengjie.util.TencentServiceUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -70,6 +72,8 @@ public class OrderServiceImpl extends ServiceImpl<NotaryOrderMapper, NotaryOrder
 	OfficeXbankMapper officeXbankMapper;
 	@Autowired
 	NotaryOfficeMapper notaryOfficeMapper;
+	@Autowired
+	OrderOCRParserFactory orderOCRParserFactory;
 
 	@Override
 	public int checkOrder(Sms sms) {
@@ -541,6 +545,24 @@ public class OrderServiceImpl extends ServiceImpl<NotaryOrderMapper, NotaryOrder
 		return Arrays.asList(intArray);
 	}
 
+	@Override
+	public boolean canBeParse(String uscc){
+		return orderOCRParserFactory.canBeParse(uscc);
+	}
+
+	@Override
+	public Object parseOrder(String orderType, String uscc, String content) {
+		String result = TencentServiceUtil.readInfoWithOCR(content);
+		if ("borrower".equals(orderType)) {
+			return orderOCRParserFactory.generateOrderOCRParser(uscc).parseBorrower(result);
+		} else if ("mortgage".equals(orderType)) {
+			return orderOCRParserFactory.generateOrderOCRParser(uscc).parseMortgage(result);
+		} else if ("guarantee".equals(orderType)) {
+			return orderOCRParserFactory.generateOrderOCRParser(uscc).parseGuarantee(result);
+		}
+		return null;
+	}
+
 	public static void main(String[] args) {
 		String orgId = "bank_7";
 		System.out.println(orgId.split("_")[1]);

+ 23 - 0
eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/BorrowerDomain.java

@@ -0,0 +1,23 @@
+package me.zhengjie.modules.system.domain.order;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@Scope("prototype")
+@Component
+public class BorrowerDomain {
+    private String contractNo;
+    private String sumMoney;
+    private String username;
+    private String sex;
+    private String birth;
+    private String idCard;
+    private String residence;
+    private String phone;
+}

+ 24 - 0
eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/GuaranteeDomain.java

@@ -0,0 +1,24 @@
+package me.zhengjie.modules.system.domain.order;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@Scope("prototype")
+@Component
+public class GuaranteeDomain {
+    private String contractNo;
+    private String username;
+    private String idCard;
+    private String sex;
+    private String birth;
+    private String residence;
+    private String phone;
+    private String startDate;
+    private String endDate;
+}

+ 15 - 0
eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/MortgageDomain.java

@@ -0,0 +1,15 @@
+package me.zhengjie.modules.system.domain.order;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@Scope("prototype")
+@Component
+public class MortgageDomain {
+}

+ 31 - 0
eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/parser/OrderOCRParser.java

@@ -0,0 +1,31 @@
+package me.zhengjie.modules.system.domain.order.parser;
+
+import me.zhengjie.modules.system.domain.order.BorrowerDomain;
+import me.zhengjie.modules.system.domain.order.GuaranteeDomain;
+import me.zhengjie.modules.system.domain.order.MortgageDomain;
+
+public interface OrderOCRParser {
+    /**
+     * 解析借款人信息
+     *
+     * @param content
+     * @return
+     */
+    public BorrowerDomain parseBorrower(String content);
+
+    /**
+     * 解析抵押人信息
+     *
+     * @param content
+     * @return
+     */
+    public MortgageDomain parseMortgage(String content);
+
+    /**
+     * 解析担保人信息
+     *
+     * @param content
+     * @return
+     */
+    public GuaranteeDomain parseGuarantee(String content);
+}

+ 19 - 0
eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/parser/OrderOCRParserFactory.java

@@ -0,0 +1,19 @@
+package me.zhengjie.modules.system.domain.order.parser;
+
+public interface OrderOCRParserFactory {
+    /**
+     * 依据银行社会统一信用代码生成对应的解析器
+     *
+     * @param bankUscc
+     * @return
+     */
+    public OrderOCRParser generateOrderOCRParser(String bankUscc);
+
+    /**
+     * 是否支持解析
+     *
+     * @param bankUscc
+     * @return
+     */
+    public boolean canBeParse(String bankUscc);
+}

+ 30 - 0
eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/parser/impl/OrderOCRParserFactoryImpl.java

@@ -0,0 +1,30 @@
+package me.zhengjie.modules.system.domain.order.parser.impl;
+
+import me.zhengjie.modules.system.domain.order.parser.OrderOCRParser;
+import me.zhengjie.modules.system.domain.order.parser.OrderOCRParserFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+
+@Component
+public class OrderOCRParserFactoryImpl implements OrderOCRParserFactory {
+
+    // 邮政储蓄银行南通分行社会统一信用代码
+    private static final String BANK_USCC_YZCX_NANTONG = "913200007205838064";
+    // 已配置的银行统一社会信用代码集合
+    private static final List<String> BANK_USCC_LIST = Arrays.asList(BANK_USCC_YZCX_NANTONG);
+
+    @Override
+    public OrderOCRParser generateOrderOCRParser(String bankUscc) {
+        if (BANK_USCC_YZCX_NANTONG.equals(bankUscc)) {
+            return new YZBankOrderOCRParserImpl();
+        }
+        return null;
+    }
+
+    @Override
+    public boolean canBeParse(String bankUscc) {
+        return BANK_USCC_LIST.contains(bankUscc);
+    }
+}

+ 168 - 0
eladmin-system/src/main/java/me/zhengjie/modules/system/domain/order/parser/impl/YZBankOrderOCRParserImpl.java

@@ -0,0 +1,168 @@
+package me.zhengjie.modules.system.domain.order.parser.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.NoArgsConstructor;
+import me.zhengjie.modules.system.domain.order.BorrowerDomain;
+import me.zhengjie.modules.system.domain.order.GuaranteeDomain;
+import me.zhengjie.modules.system.domain.order.MortgageDomain;
+import me.zhengjie.modules.system.domain.order.parser.OrderOCRParser;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 邮政储蓄银行订单OCR解析器
+ */
+@NoArgsConstructor
+@Component
+public class YZBankOrderOCRParserImpl implements OrderOCRParser {
+
+    @Override
+    public BorrowerDomain parseBorrower(String content) {
+        Map<String, String> map = toBorrowerMap(content);
+        BorrowerDomain borrower = new BorrowerDomain();
+        borrower.setContractNo(map.get("contractNo"));
+        borrower.setBirth(map.get("birth"));
+        borrower.setIdCard(map.get("idCard"));
+        borrower.setPhone(map.get("phone"));
+        borrower.setResidence(map.get("residence"));
+        borrower.setSex(map.get("sex"));
+        borrower.setSumMoney(map.get("sumMoney"));
+        borrower.setUsername(map.get("username"));
+        return borrower;
+    }
+
+    @Override
+    public MortgageDomain parseMortgage(String content) {
+        return null;
+    }
+
+    @Override
+    public GuaranteeDomain parseGuarantee(String content) {
+        Map<String, String> map = toGuaranteeMap(content);
+        GuaranteeDomain guarantee = new GuaranteeDomain();
+        guarantee.setContractNo(map.get("contractNo"));
+        guarantee.setBirth(map.get("birth"));
+        guarantee.setIdCard(map.get("idCard"));
+        guarantee.setPhone(map.get("phone"));
+        guarantee.setResidence(map.get("residence"));
+        guarantee.setSex(map.get("sex"));
+        guarantee.setUsername(map.get("username"));
+        guarantee.setStartDate(map.get("startDate"));
+        guarantee.setEndDate(map.get("endDate"));
+        return guarantee;
+    }
+
+    /**
+     * 解析借款人合同字段
+     * @param content
+     * @return
+     */
+    private Map<String, String> toBorrowerMap(String content) {
+        Map<String, String> map = new HashMap<>();
+        JSONObject jsonObj = JSONObject.parseObject(content);
+        JSONArray structuralItems = jsonObj.getJSONArray("StructuralItems");
+        // 获取借款人信息起始定位
+        int borrowerStartIndex = 0;
+        for (Object obj : structuralItems) {
+            JSONObject json = (JSONObject) obj;
+            String key = json.getString("name");
+            if ("借款人(乙方)".equals(key)) {
+                JSONObject itemCoord = json.getJSONObject("itemCoord");
+                borrowerStartIndex = itemCoord.getInteger("Y");
+            }
+        }
+        // 解析对应的值
+        try {
+            for (Object obj : structuralItems) {
+                JSONObject json = (JSONObject) obj;
+                String key = json.getString("name");
+                int currentIndex = json.getJSONObject("itemCoord").getInteger("Y");
+                if ("借款人(乙方)".equals(key)) {
+                    map.put("username", json.getString("value"));
+                } else if ("证件号码".equals(key) && currentIndex > borrowerStartIndex) {
+                    SimpleDateFormat daySrcFormatter = new SimpleDateFormat("yyyyMMdd");
+                    SimpleDateFormat dayDestFormatter = new SimpleDateFormat("yyyy/MM/dd");
+                    String idCard = json.getString("value");
+                    String birth = dayDestFormatter.format(daySrcFormatter.parse(idCard.substring(6, 8)));
+                    map.put("sex", String.valueOf(Integer.parseInt(idCard.substring(16, 1)) / 2));
+                    map.put("birth", birth);
+                    map.put("idCard", idCard);
+                } else if ("住所(地址)".equals(key) && currentIndex > borrowerStartIndex) {
+                    map.put("residence", json.getString("value"));
+                } else if ("电话".equals("key") && currentIndex > borrowerStartIndex) {
+                    map.put("phone", json.getString("value"));
+                } else if ("本合同为甲乙双方签订的编号为".equals(key)) {
+                    map.put("contractNo", json.getString("value"));
+                } else if ("小写)".equals(key)) {
+                    map.put("sumMoney", json.getString("value"));
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        //
+        return map;
+    }
+
+    /**
+     * 解析担保人合同字段
+     * @param content
+     * @return
+     */
+    private Map<String, String> toGuaranteeMap(String content) {
+        Map<String, String> map = new HashMap<>();
+        JSONObject jsonObj = JSONObject.parseObject(content);
+        JSONArray structuralItems = jsonObj.getJSONArray("StructuralItems");
+        // 获取借款人信息起始定位
+        int guaranteeStartIndex = 0;
+        for (Object obj : structuralItems) {
+            JSONObject json = (JSONObject) obj;
+            String key = json.getString("name");
+            if ("保证人(乙方)".equals(key)) {
+                JSONObject itemCoord = json.getJSONObject("itemCoord");
+                guaranteeStartIndex = itemCoord.getInteger("Y");
+            }
+        }
+        // 解析对应的值
+        try {
+            for (Object obj : structuralItems) {
+                JSONObject json = (JSONObject) obj;
+                String key = json.getString("name");
+                int currentIndex = json.getJSONObject("itemCoord").getInteger("Y");
+                if ("保证人(乙方)".equals(key)) {
+                    map.put("username", json.getString("value"));
+                } else if ("证件号码".equals(key) && currentIndex > guaranteeStartIndex) {
+                    SimpleDateFormat daySrcFormatter = new SimpleDateFormat("yyyyMMdd");
+                    SimpleDateFormat dayDestFormatter = new SimpleDateFormat("yyyy/MM/dd");
+                    String idCard = json.getString("value");
+                    String birth = dayDestFormatter.format(daySrcFormatter.parse(idCard.substring(6, 8)));
+                    map.put("sex", String.valueOf(Integer.parseInt(idCard.substring(16, 1)) / 2));
+                    map.put("birth", birth);
+                    map.put("idCard", idCard);
+                } else if ("住所(地址)".equals(key) && currentIndex > guaranteeStartIndex) {
+                    map.put("residence", json.getString("value"));
+                } else if ("电话".equals("key") && currentIndex > guaranteeStartIndex) {
+                    map.put("phone", json.getString("value"));
+                } else if (key.indexOf("签订的编号为") > -1) {
+                    map.put("contractNo", json.getString("value"));
+                } else if (key.indexOf("担保债权确定的期间为") > -1) {
+                    SimpleDateFormat daySrcFormatter = new SimpleDateFormat("yyyy年MM月dd日");
+                    SimpleDateFormat dayDestFormatter = new SimpleDateFormat("yyyy/MM/dd");
+                    String duration[] = json.getString("value").replace("_", "").split("至");
+                    String startDate = dayDestFormatter.format(daySrcFormatter.parse(duration[0]));
+                    String endDate = dayDestFormatter.format(daySrcFormatter.parse(duration[1]));
+                    map.put("startDate", startDate);
+                    map.put("endDate", endDate);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        //
+        return map;
+    }
+}

+ 0 - 4
eladmin-system/src/main/java/me/zhengjie/modules/system/domain/user/UserDomain.java

@@ -1,9 +1,5 @@
 package me.zhengjie.modules.system.domain.user;
 
-import me.zhengjie.modules.system.service.dto.RoleSmallDto;
-
-import java.util.Set;
-
 public interface UserDomain {
     public String getUserMaxRole();
 }

+ 3 - 0
eladmin-system/src/main/java/me/zhengjie/modules/system/entity/BankEntity.java

@@ -107,6 +107,9 @@ public class BankEntity implements Serializable {
 	@TableField("del_flag")
 	@TableLogic
 	private Integer delFlag;
+
+	@TableField("uscc")
+	private String uscc;
 	
 	@TableField(exist = false)
 	private LocalDateTime startDate;

+ 1 - 1
eladmin-system/src/main/java/me/zhengjie/modules/system/entity/request/bank/BankCreateReq.java

@@ -58,5 +58,5 @@ public class BankCreateReq extends BaseRequest {
     // 编辑使用
     private Integer id;
 
-
+    private String uscc;
 }

+ 38 - 2
eladmin-system/src/main/java/me/zhengjie/modules/system/service/impl/BankServiceImpl.java

@@ -110,10 +110,18 @@ public class BankServiceImpl extends AbstractServiceImpl<BankMapper, BankEntity>
 	@Override
 	public BaseResponse createBank(BankCreateReq req) {
 		BaseResponse response = new BaseResponse();
+		if (StringUtils.isEmpty(req.getUscc())) {
+			response.fail(ResultCode.SUCC_NEED_INPUT);
+			return response;
+		}
+		if (isBankExist(req.getUscc(), "")) {
+			response.fail(ResultCode.SUCC_ALREADY_EXISTED);
+			return response;
+		}
 		BankEntity entity = BankEntity.builder().areaCodesStr(req.getAreaCodesStr()).areaCode(req.getAreaCode())
 				.areaCodeStr(req.getAreaCodeStr()).bankName(req.getBankName()).subjectColor(req.getSubjectColor())
 				.imageId(req.getImageId()).address(req.getAddress()).principal(req.getPrincipal()).phone(req.getPhone())
-				.build();
+				.uscc(req.getUscc()).build();
 		int insert = bankMapper.insert(entity);
 		if (insert == 0) {
 			response.fail(ResultCode.DATA_INSERT_ERROR);
@@ -124,10 +132,18 @@ public class BankServiceImpl extends AbstractServiceImpl<BankMapper, BankEntity>
 	@Override
 	public BaseResponse updateBank(BankCreateReq req) {
 		BaseResponse response = new BaseResponse();
+		if (StringUtils.isEmpty(req.getUscc())) {
+			response.fail(ResultCode.SUCC_NEED_INPUT);
+			return response;
+		}
+		if (isBankExist(req.getUscc(), req.getId().toString())) {
+			response.fail(ResultCode.SUCC_ALREADY_EXISTED);
+			return response;
+		}
 		BankEntity entity = BankEntity.builder().id(req.getId()).areaCodesStr(req.getAreaCodesStr())
 				.areaCode(req.getAreaCode()).areaCodeStr(req.getAreaCodeStr()).bankName(req.getBankName())
 				.subjectColor(req.getSubjectColor()).imageId(req.getImageId()).address(req.getAddress())
-				.principal(req.getPrincipal()).phone(req.getPhone()).build();
+				.principal(req.getPrincipal()).phone(req.getPhone()).uscc(req.getUscc()).build();
 		int update = bankMapper.updateById(entity);
 		if (update == 0) {
 			response.fail(ResultCode.DATA_UPDATE_ERROR);
@@ -163,4 +179,24 @@ public class BankServiceImpl extends AbstractServiceImpl<BankMapper, BankEntity>
 		return response;
 	}
 
+	/**
+	 * 是否存在同一社会信用代码的银行
+	 * @param uscc
+	 * @param bankId
+	 * @return
+	 */
+	private boolean isBankExist(String uscc, String bankId) {
+		QueryWrapper<BankEntity> qw = new QueryWrapper<>();
+		if (!StringUtils.isEmpty(bankId)) {
+			qw.ne("id", bankId);
+		}
+		qw.eq("uscc", uscc);
+		qw.eq("del_flag", 1);
+		BankEntity bankEntity = bankMapper.selectOne(qw);
+		if (bankEntity != null) {
+			return true;
+		} else {
+			return false;
+		}
+	}
 }

+ 6 - 4
eladmin-system/src/main/java/me/zhengjie/util/TencentServiceUtil.java

@@ -119,7 +119,8 @@ public class TencentServiceUtil {
      * 读取图片文本信息
      * @param content
      */
-    public static void readInfo(String content) {
+    public static String readInfoWithOCR(String content) {
+        String result = "";
         try {
             // 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey,此处还需注意密钥对的保密
             // 密钥可前往https://console.cloud.tencent.com/cam/capi网站进行获取
@@ -139,14 +140,15 @@ public class TencentServiceUtil {
             // 返回的resp是一个SmartStructuralOCRResponse的实例,与请求对象对应
             SmartStructuralOCRResponse resp = client.SmartStructuralOCR(req);
             // 输出json格式的字符串回包
-            System.out.println(SmartStructuralOCRResponse.toJsonString(resp));
+            result = SmartStructuralOCRResponse.toJsonString(resp);
         } catch (TencentCloudSDKException e) {
             System.out.println(e.toString());
         }
+        return result;
     }
 
     public static void main(String[] args) {
-        File file = new File("/Users/sakuya/Downloads/WechatIMG1.jpeg");
+        File file = new File("/Users/sakuya/Downloads/1656403417693.jpg");
         byte[] fileBytes = null;
         FileInputStream fis = null;
         try {
@@ -158,6 +160,6 @@ public class TencentServiceUtil {
             e.printStackTrace();
         }
         String content = "data:image/png;base64," + Base64.encodeBase64String(fileBytes);
-        readInfo(content);
+        readInfoWithOCR(content);
     }
 }