下载地址:https://www.pan38.com/share.php?code=pvvmX 提取码:8888 【仅供学习参考】
当前众包平台抢单存在以下技术痛点:
public class OrderGrabSystem {
// 三级缓存架构
private ConcurrentHashMap<Long, Order> memoryCache;
private RedisTemplate<String, Order> redisCache;
private MongoDBRepository mongoDBRepository;
// 高精度定位服务
@Autowired
private GPSLocationService locationService;
// 智能过滤模块
public List<Order> filterOrders(List<Order> orders) {
return orders.parallelStream()
.filter(this::distanceFilter)
.filter(this::priceFilter)
.filter(this::timeFilter)
.sorted(Comparator.comparingDouble(Order::getPriorityScore))
.collect(Collectors.toList());
}
}
public class Http2Client {
private static final ConnectionPool connectionPool = new ConnectionPool(
5, // 最大连接数
300 // 保持时间(秒)
);
public String pushOrder(Order order) throws IOException {
OkHttpClient client = new OkHttpClient.Builder()
.connectionPool(connectionPool)
.pingInterval(10, TimeUnit.SECONDS)
.build();
Request request = new Request.Builder()
.url("https://api.meituan.com/order/push")
.post(RequestBody.create(order.toJson(), JSON))
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
}
@EnableAsync
@Configuration
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(20);
executor.setMaxPoolSize(100);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("OrderGrabber-");
executor.initialize();
return executor;
}
}
@Service
public class OrderService {
@Async
public CompletableFuture<Boolean> grabOrder(Order order) {
// 抢单核心逻辑
return CompletableFuture.completedFuture(
orderLockManager.tryLock(order.getId())
);
}
}
public class DecisionEngine {
private static final double BASE_SCORE = 100.0;
public double calculatePriority(Order order, Rider rider) {
double distanceScore = Math.exp(-0.05 * calculateDistance(
rider.getLocation(),
order.getPickupLocation()
));
double timeScore = 1.0 / (1.0 + order.getWaitingMinutes()/30.0);
double priceScore = order.getFee() / 50.0;
return BASE_SCORE * distanceScore * timeScore * priceScore;
}
}
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.awt.image.BufferedImage;
public class OcrEngine {
private final Tesseract tesseract;
public OcrEngine(String tessDataPath) {
this.tesseract = new Tesseract();
tesseract.setDatapath(tessDataPath);
tesseract.setLanguage("chi_sim+eng");
tesseract.setPageSegMode(1);
tesseract.setOcrEngineMode(3);
}
public String recognize(BufferedImage image) throws TesseractException {
return tesseract.doOCR(image);
}
public String recognizeWithConfig(BufferedImage image,
String language,
int pageSegMode) throws TesseractException {
tesseract.setLanguage(language);
tesseract.setPageSegMode(pageSegMode);
return tesseract.doOCR(image);
}
}
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.awt.image.BufferedImage;
public class OcrEngine {
private final Tesseract tesseract;
public OcrEngine(String tessDataPath) {
this.tesseract = new Tesseract();
tesseract.setDatapath(tessDataPath);
tesseract.setLanguage("chi_sim+eng");
tesseract.setPageSegMode(1);
tesseract.setOcrEngineMode(3);
}
public String recognize(BufferedImage image) throws TesseractException {
return tesseract.doOCR(image);
}
public String recognizeWithConfig(BufferedImage image,
String language,
int pageSegMode) throws TesseractException {
tesseract.setLanguage(language);
tesseract.setPageSegMode(pageSegMode);
return tesseract.doOCR(image);
}
}
java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
public class ImagePreprocessor {
public static BufferedImage convertToGrayscale(BufferedImage src) {
BufferedImage dest = new BufferedImage(
src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
dest.getGraphics().drawImage(src, 0, 0, null);
return dest;
}
public static BufferedImage sharpenImage(BufferedImage src) {
float[] sharpenMatrix = {
0.0f, -1.0f, 0.0f,
-1.0f, 5.0f, -1.0f,
0.0f, -1.0f, 0.0f
};
Kernel kernel = new Kernel(3, 3, sharpenMatrix);
ConvolveOp op = new ConvolveOp(kernel);
return op.filter(src, null);
}
public static BufferedImage binarize(BufferedImage src, int threshold) {
BufferedImage dest = new BufferedImage(
src.getWidth(), src.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
for (int y = 0; y < src.getHeight(); y++) {
for (int x = 0; x < src.getWidth(); x++) {
int rgb = src.getRGB(x, y);
int r = (rgb >> 16) & 0xff;
int g = (rgb >> 8) & 0xff;
int b = rgb & 0xff;
int luminance = (int)(0.299 * r + 0.587 * g + 0.114 * b);
dest.setRGB(x, y, luminance > threshold ? 0xFFFFFF : 0x000000);
}
}
return dest;
}
}
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
@Service
public class OcrService {
private final OcrEngine ocrEngine;
public OcrService() {
this.ocrEngine = new OcrEngine("/usr/share/tesseract-ocr/4.00/tessdata");
}
public String processImage(MultipartFile file) throws IOException, TesseractException {
BufferedImage image = ImageIO.read(file.getInputStream());
BufferedImage processed = ImagePreprocessor.sharpenImage(
ImagePreprocessor.convertToGrayscale(image)
);
return ocrEngine.recognize(processed);
}
public String processImageWithLang(MultipartFile file, String lang)
throws IOException, TesseractException {
BufferedImage image = ImageIO.read(file.getInputStream());
return ocrEngine.recognizeWithConfig(image, lang, 3);
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。