Explorar el Código

1.调试及修改生成门店二维码接口
2.增加通过胎号查询轮胎信息接口

纪新园 hace 3 semanas
padre
commit
b1f5f81b4c

+ 38 - 0
blade-common/src/main/java/org/springblade/common/dto/TeHbbTob.java

@@ -0,0 +1,38 @@
+package org.springblade.common.dto;
+
+import lombok.Data;
+
+/**
+ * TE_LHBBTOB 视图
+ *
+ * @author Rain
+ */
+@Data
+public class TeHbbTob {
+
+
+	/**
+	 * 条码
+	 */
+	private String barCode;
+
+	/**
+	 * 成品代码
+	 */
+	private String wlXxId;
+
+	/**
+	 * 轮胎名称
+	 */
+	private String wlMc;
+
+	/**
+	 * 规格
+	 */
+	private String sizeId;
+
+	/**
+	 * 花纹
+	 */
+	private String pattern;
+}

+ 2 - 2
blade-common/src/main/java/org/springblade/common/enums/BaiDuOcrEnum.java

@@ -47,8 +47,8 @@ public enum BaiDuOcrEnum {
 	BATCH_PROCESSING_ERROR(282005,"处理批量任务时发生部分或全部错误"),
 	BATCH_TASK_LIMIT_REACHED(282006,"批量任务处理数量超出限制"),
 	IMAGE_TRANSCODE_ERROR(282100,"图片压缩转码错误"),
-	TARGET_DETECT_ERROR(282102,"未检测到图片中识别目标,请确保图片中包含对应卡证票据,出现此问题的原因一般为:您上传了非卡证图片、图片不完整或模糊"),
-	RECOGNIZE_ERROR_FAILED_TO_MATCH_THE_TEMPLATE(282103,"图片目标识别错误,请确保图片中包含对应卡证票据,出现此问题的原因一般为:您上传了非卡证图片、图片不完整或模糊"),
+	TARGET_DETECT_ERROR(282102,"识别失败,请确保图片清晰且完整"),
+	RECOGNIZE_ERROR_FAILED_TO_MATCH_THE_TEMPLATE(282103,"识别失败,请确保图片清晰且完整"),
 	URLS_NOT_EXIT(282110,"URL参数不存在"),
 	URL_FORMAT_ILLEGAL(282111,"URL格式非法"),
 	URL_DOWNLOAD_TIMEOUT(282112,"url下载超时"),

+ 26 - 0
blade-common/src/main/java/org/springblade/common/utils/U9DateUtils.java

@@ -0,0 +1,26 @@
+package org.springblade.common.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baidu.aip.ocr.AipOcr;
+import org.springblade.common.dto.TeHbbTob;
+import org.springblade.common.http.HttpUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+
+/**
+ * @author Rain
+ */
+public class U9DateUtils {
+
+	public static TeHbbTob getMaterialDetail(String tireNumber) {
+		String url = "http://127.0.0.1:11010/b2b/getMaterialDetail";
+		String param = "tireNumber=" + tireNumber;
+		String result = HttpUtils.sendGet(url, param, "UTF-8");
+
+        return JSONObject.parseObject(result, TeHbbTob.class);
+	}
+
+}

+ 12 - 0
blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/IOssClient.java

@@ -3,6 +3,7 @@ package org.springblade.resource.feign;
 import org.springblade.core.launch.constant.AppConstant;
 import org.springblade.core.tool.api.R;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
@@ -13,6 +14,8 @@ public interface IOssClient {
 	String API_PREFIX = "/client";
 	String ADD_OSS = API_PREFIX + "/add-oss";
 
+	String PUT_FILE_FEIGN = API_PREFIX + "/putFileFeign";
+
 	/**
 	 * 添加存储对象
 	 *
@@ -21,4 +24,13 @@ public interface IOssClient {
 	 */
 	@PostMapping(ADD_OSS)
 	R addOss(@RequestParam("tenantId") String tenantId);
+
+	/**
+	 * 上传文件
+	 *
+	 * @param fileUrl 文件地址
+	 * @return ObjectStat
+	 */
+	@GetMapping(PUT_FILE_FEIGN)
+	R<String> putFileFeign(@RequestParam("fileUrl") String fileUrl);
 }

+ 28 - 0
blade-ops-api/blade-resource-api/src/main/java/org/springblade/resource/feign/IOssClientFallback.java

@@ -0,0 +1,28 @@
+
+package org.springblade.resource.feign;
+
+import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.tool.api.R;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 流程远程调用失败处理类
+ *
+ * @author Chill
+ */
+@Component
+public class IOssClientFallback implements IOssClient {
+
+
+	@Override
+	public R addOss(String tenantId) {
+		return null;
+	}
+
+	@Override
+	public R<String> putFileFeign(@RequestParam("fileUrl") String fileUrl) {
+		return null;
+	}
+}

+ 87 - 0
blade-ops/blade-resource/src/main/java/org/springblade/resource/feign/OssClient.java

@@ -2,11 +2,25 @@ package org.springblade.resource.feign;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
+import net.coobird.thumbnailator.Thumbnails;
+import org.springblade.common.enums.UrlEnum;
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
+import org.springblade.resource.builder.oss.OssBuilder;
 import org.springblade.resource.entity.Oss;
 import org.springblade.resource.mapper.OssMapper;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.Arrays;
+import java.util.List;
 
 @NonDS
 @RestController
@@ -15,6 +29,16 @@ public class OssClient implements IOssClient {
 
 	private final OssMapper ossMapper;
 
+	/**
+	 * 对象存储构建类
+	 */
+	private final OssBuilder ossBuilder;
+
+	private final List<String> CONTENT_TYPE = Arrays.asList("image/jpeg", "image/png", "image/jpg", "image/bmp");
+
+	private final long MAX_IMAGE_SIZE = 204800;
+
+
 	@Override
 	public R addOss(String tenantId) {
 		Oss oss = ossMapper.selectOne(Wrappers.<Oss>query().lambda()
@@ -30,4 +54,67 @@ public class OssClient implements IOssClient {
 		return R.data(oss);
 	}
 
+	@SneakyThrows
+	@Override
+	public R<String> putFileFeign(@RequestParam("fileUrl") String fileUrl) {
+		String replace;
+		File file = new File(fileUrl);
+		// 检查文件是否存在
+		if (!file.exists()) {
+			System.out.println("文件不存在: " + fileUrl);
+		}
+		// 读取临时文件并转换为MultipartFile
+		try (FileInputStream fileInputStream = new FileInputStream(file)) {
+			MultipartFile multipartFile = new MockMultipartFile(
+				file.getName(),
+				file.getName(),
+				getContentType(file),
+				fileInputStream
+			);
+			String contentType = multipartFile.getContentType();
+			BladeFile bladeFile;
+			if (this.CONTENT_TYPE.contains(contentType) && multipartFile.getSize() > this.MAX_IMAGE_SIZE) {
+				// 使用Thumbnails压缩图片
+				ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+				Thumbnails.of(multipartFile.getInputStream()).size(350, 350).outputQuality(1).toOutputStream(outputStream);
+				MultipartFile compressedImage = new MockMultipartFile(multipartFile.getName(), multipartFile.getOriginalFilename(), multipartFile.getContentType(), outputStream.toByteArray());
+				bladeFile = ossBuilder.template().putFile(compressedImage.getOriginalFilename(), compressedImage.getInputStream());
+			} else {
+				bladeFile = ossBuilder.template().putFile(multipartFile.getOriginalFilename(), multipartFile.getInputStream());
+			}
+			String link = bladeFile.getLink();
+			replace = link.replace(UrlEnum.INTERNAL_NETWORK_ADDRESS.url, UrlEnum.EXTERNAL_NETWORK_ADDRESS.url);
+		} catch (Exception e) {
+			throw new RuntimeException(e.getMessage());
+		}
+		boolean status = file.delete();
+		if (status) {
+			System.out.println("文件删除成功!");
+		} else {
+			System.out.println("文件删除失败!");
+		}
+		return R.data(replace);
+	}
+
+	/**
+	 * 根据文件扩展名获取Content-Type
+	 *
+	 * @param file 文件对象
+	 * @return 对应的Content-Type
+	 */
+	private static String getContentType(File file) {
+		String fileName = file.getName().toLowerCase();
+		if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) {
+			return "image/jpeg";
+		} else if (fileName.endsWith(".png")) {
+			return "image/png";
+		} else if (fileName.endsWith(".gif")) {
+			return "image/gif";
+		} else if (fileName.endsWith(".pdf")) {
+			return "application/pdf";
+		} else {
+			return "application/octet-stream";
+		}
+	}
+
 }

+ 6 - 0
blade-service/gubersail-dealer-app/pom.xml

@@ -40,6 +40,12 @@
             <version>2.8.2.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-mock</artifactId>
+            <version>2.0.8</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>

+ 8 - 27
blade-service/gubersail-dealer-app/src/main/java/com/gubersail/app/claim/controller/AppClaimController.java

@@ -35,8 +35,10 @@ import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import org.json.JSONObject;
 import org.springblade.common.annotation.RepeatSubmit;
+import org.springblade.common.dto.TeHbbTob;
 import org.springblade.common.enums.BaiDuOcrEnum;
 import org.springblade.common.utils.BaiduOcrUtils;
+import org.springblade.common.utils.U9DateUtils;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
@@ -214,7 +216,7 @@ public class AppClaimController extends BladeController {
 		JSONObject result = BaiduOcrUtils.recognizeLicensePlate(file);
 		if (result.has("error_code")) {
 			int errorCode = result.getInt("error_code");
-			return R.fail("识别失败,错误信息:" + BaiDuOcrEnum.getDescriptionByCode(errorCode));
+			return R.fail(BaiDuOcrEnum.getDescriptionByCode(errorCode));
 		}
 
 		// 解析车牌识别结果
@@ -228,33 +230,12 @@ public class AppClaimController extends BladeController {
 	}
 
 	/**
-	 * 识别轮胎型号
-	 *
-	 * @param file 文件
+	 * 货物轮胎信息
 	 */
-	@SneakyThrows
-	@PostMapping("/recognizeTireModel")
-	public R recognizeTireModel(@RequestParam("file") MultipartFile file) {
-		if (file.isEmpty()) {
-			throw new RuntimeException("请选择要上传的文件");
-		}
-		if (!Objects.requireNonNull(file.getContentType()).startsWith("image/")) {
-			throw new RuntimeException("请上传图片格式文件");
-		}
-		JSONObject result = BaiduOcrUtils.recognizeLicensePlate(file);
-		if (result.has("error_code")) {
-			int errorCode = result.getInt("error_code");
-			return R.fail("识别失败,错误信息:" + BaiDuOcrEnum.getDescriptionByCode(errorCode));
-		}
-
-		// 解析车牌识别结果
-		if (result.has("words_result")) {
-			JSONObject wordsResult = result.getJSONObject("words_result");
-			if (wordsResult.has("number")) {
-				return R.data(wordsResult.getString("number"), "识别成功");
-			}
-		}
-		return R.fail("未识别到轮胎型号");
+	@GetMapping("/getMaterialDetail")
+	public R getMaterialDetail(@RequestParam("tireNumber") String tireNumber) {
+		TeHbbTob teHbbTob = U9DateUtils.getMaterialDetail(tireNumber);
+		return R.data(teHbbTob);
 	}
 
 

+ 20 - 2
blade-service/gubersail-dealer-app/src/main/java/com/gubersail/app/corp/service/impl/AppCorpsDescServiceImpl.java

@@ -10,18 +10,28 @@ import com.gubersail.app.api.corps.entity.*;
 import com.gubersail.app.api.corps.vo.AppCorpsDescVO;
 import com.gubersail.app.corp.mapper.AppCorpsDescMapper;
 import com.gubersail.app.corp.service.*;
-import org.springblade.common.utils.WechatQRCodeUtil;
+import com.gubersail.app.util.WechatQRCodeUtil;
 import lombok.AllArgsConstructor;
+import org.apache.http.entity.ContentType;
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.resource.feign.IOssClient;
 import org.springblade.system.feign.ISysClient;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
+import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.net.URL;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -41,6 +51,7 @@ public class AppCorpsDescServiceImpl extends ServiceImpl<AppCorpsDescMapper, App
 	private final IAppCorpsTypeService corpsTypeService;//客户类别
 	private final ISysClient sysClient;
 	private final IUserClient userClient;
+	private final IOssClient ossClient;
 
 
 	/**
@@ -282,7 +293,14 @@ public class AppCorpsDescServiceImpl extends ServiceImpl<AppCorpsDescMapper, App
 		}
 		AppPjCorpsDesc corpsDesc = baseMapper.selectById(corpId);
 		String filePath = WechatQRCodeUtil.getQRcode(corpsDesc.getId() + "", corpsDesc.getCname());
-		corpsDesc.setFilePath(filePath);
+		String fileUrl = "";
+		if (ObjectUtils.isNotNull(filePath)){
+			R<String> res = ossClient.putFileFeign(filePath);
+			if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())){
+				fileUrl = res.getData();
+			}
+		}
+		corpsDesc.setFilePath(fileUrl);
 		corpsDesc.setUpdateTime(new Date());
 		corpsDesc.setUpdateUser(AuthUtil.getUserId());
 		baseMapper.updateById(corpsDesc);

+ 4 - 8
blade-common/src/main/java/org/springblade/common/utils/WechatQRCodeUtil.java → blade-service/gubersail-dealer-app/src/main/java/com/gubersail/app/util/WechatQRCodeUtil.java

@@ -14,10 +14,9 @@
  *  this software without specific prior written permission.
  *  Author: Chill 庄骞 (smallchill@163.com)
  */
-package org.springblade.common.utils;
+package com.gubersail.app.util;
 
 import com.alibaba.fastjson.JSONObject;
-import org.springblade.common.enums.UrlEnum;
 
 import java.io.*;
 import java.net.HttpURLConnection;
@@ -35,7 +34,7 @@ public class WechatQRCodeUtil {
 	public static String getQRcode(String corpId, String corpName) throws Exception {
 		String filePath = "";
 		String access_token = postToken("wx7a875fc287f41c3a", "f37dcb5751d16a6f7b7ed5cc5ac48875");
-		if ("".equals(access_token)) {
+		if (!"".equals(access_token)) {
 			filePath = generateQrCode("pages/login/login", corpId, access_token, corpName);
 		}
 		return filePath;
@@ -79,6 +78,7 @@ public class WechatQRCodeUtil {
 		}
 		in.close();
 		JSONObject jsonObject = JSONObject.parseObject(result.toString());
+		System.err.println("获取鉴权返回access_token数据:" + jsonObject.toString());
 		return jsonObject.getString("access_token");
 	}
 
@@ -143,11 +143,7 @@ public class WechatQRCodeUtil {
 			os.close();
 			System.out.println("Path1:" + qRCodeFile.getPath());
 			System.out.println("AbsolutePath1:" + qRCodeFile.getAbsolutePath());
-			if (qRCodeFile.getAbsolutePath().contains("\\")) {
-				filePath = qRCodeFile.getAbsolutePath();
-			} else {
-				filePath = UrlEnum.EXTERNAL_NETWORK_ADDRESS.url + qRCodeFile.getAbsolutePath();
-			}
+			filePath = qRCodeFile.getAbsolutePath();
 		} catch (Exception e) {
 			e.printStackTrace();
 		}

+ 4 - 4
blade-service/gubersail-dealer-app/src/main/resources/log/logback-prod.xml

@@ -136,16 +136,16 @@
     </if>
 
     <!-- 日志输出级别 -->
-    <root level="ERROR">
+    <root level="INFO">
         <appender-ref ref="STDOUT"/>
         <appender-ref ref="${INFO_APPENDER}"/>
         <appender-ref ref="${ERROR_APPENDER}"/>
     </root>
 
-    <logger name="net.sf.ehcache" level="ERROR"/>
-    <logger name="druid.sql" level="ERROR"/>
+    <logger name="net.sf.ehcache" level="INFO"/>
+    <logger name="druid.sql" level="INFO"/>
 
     <!-- 减少nacos日志 -->
-    <logger name="com.alibaba.nacos" level="ERROR"/>
+    <logger name="com.alibaba.nacos" level="INFO"/>
 
 </configuration>

+ 11 - 0
blade-service/gubersail-shop-app/src/main/java/com/gubersail/shop/app/insurance/controller/ShopAppTireInsuranceRegisterController.java

@@ -38,8 +38,10 @@ import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import org.json.JSONObject;
 import org.springblade.common.annotation.RepeatSubmit;
+import org.springblade.common.dto.TeHbbTob;
 import org.springblade.common.enums.BaiDuOcrEnum;
 import org.springblade.common.utils.BaiduOcrUtils;
+import org.springblade.common.utils.U9DateUtils;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
@@ -280,4 +282,13 @@ public class ShopAppTireInsuranceRegisterController extends BladeController {
 		return R.fail("未识别到车牌");
 	}
 
+	/**
+	 * 货物轮胎信息
+	 */
+	@GetMapping("/getMaterialDetail")
+	public R getMaterialDetail(@RequestParam("tireNumber") String tireNumber) {
+		TeHbbTob teHbbTob = U9DateUtils.getMaterialDetail(tireNumber);
+		return R.data(teHbbTob);
+	}
+
 }