import config from '@/config'
|
import { getToken } from '@/utils/auth'
|
|
const baseUrl = config.baseUrl
|
|
/**
|
* OCR识别API
|
*/
|
|
/**
|
* 单图OCR识别(通用接口)
|
* @param {String} filePath 图片临时路径
|
* @param {String} type 识别类型:HandWriting/IDCard/BankCard/General
|
* @param {String} provider OCR服务提供商:tencent/baidu
|
* @param {Array} itemNames 需要提取的字段名称数组(手写体识别时使用)
|
* @returns {Promise}
|
*/
|
export function recognizeImage(filePath, type = 'HandWriting', provider = 'tencent', itemNames = []) {
|
return new Promise((resolve, reject) => {
|
const token = getToken()
|
|
// 构建formData
|
const formData = {
|
type: type,
|
provider: provider
|
}
|
|
// 如果有itemNames,添加到formData
|
if (itemNames && itemNames.length > 0) {
|
itemNames.forEach((itemName, index) => {
|
formData[`itemNames[${index}]`] = itemName
|
})
|
}
|
|
uni.uploadFile({
|
url: `${baseUrl}/system/ocr/recognize`,
|
filePath: filePath,
|
name: 'file',
|
header: {
|
'Authorization': `Bearer ${token}`
|
},
|
formData: formData,
|
success: (res) => {
|
try {
|
const response = JSON.parse(res.data)
|
if (response.code === 200) {
|
resolve(response)
|
} else {
|
reject(response)
|
}
|
} catch (e) {
|
reject({ msg: '解析识别结果失败', error: e })
|
}
|
},
|
fail: (err) => {
|
reject({ msg: 'OCR请求失败', error: err })
|
}
|
})
|
})
|
}
|
|
/**
|
* 腾讯云手写体识别(单图)
|
* @param {String} filePath 图片临时路径
|
* @param {Array} itemNames 需要提取的字段名称数组
|
* @returns {Promise}
|
*/
|
export function tencentHandwritingRecognize(filePath, itemNames = []) {
|
return new Promise((resolve, reject) => {
|
const token = getToken()
|
|
// 构建formData
|
const formData = {}
|
if (itemNames && itemNames.length > 0) {
|
itemNames.forEach((itemName, index) => {
|
formData[`itemNames[${index}]`] = itemName
|
})
|
}
|
|
uni.uploadFile({
|
url: `${baseUrl}/system/ocr/tencent/handwriting`,
|
filePath: filePath,
|
name: 'file',
|
header: {
|
'Authorization': `Bearer ${token}`
|
},
|
formData: formData,
|
success: (res) => {
|
try {
|
const response = JSON.parse(res.data)
|
if (response.code === 200) {
|
resolve(response)
|
} else {
|
reject(response)
|
}
|
} catch (e) {
|
reject({ msg: '解析识别结果失败', error: e })
|
}
|
},
|
fail: (err) => {
|
reject({ msg: 'OCR请求失败', error: err })
|
}
|
})
|
})
|
}
|
|
/**
|
* 批量OCR识别(多图)
|
* @param {Array} filePaths 图片临时路径数组
|
* @param {Array} itemNames 需要提取的字段名称数组
|
* @returns {Promise} 返回合并后的字段Map
|
*/
|
export function batchRecognizeImages(filePaths, itemNames = []) {
|
if (!filePaths || filePaths.length === 0) {
|
return Promise.reject({ msg: '图片列表不能为空' })
|
}
|
|
// 创建上传任务队列
|
const uploadPromises = filePaths.map((filePath) => {
|
return tencentHandwritingRecognize(filePath, itemNames)
|
})
|
|
// 等待所有上传完成并合并结果
|
return Promise.all(uploadPromises)
|
.then(results => {
|
// 合并所有结果
|
const mergedFields = {}
|
let successCount = 0
|
let failCount = 0
|
|
results.forEach(response => {
|
if (response.code === 200 && response.data && response.data.fields) {
|
const fields = response.data.fields
|
// 合并字段(如果key已存在且不为空,不覆盖)
|
Object.keys(fields).forEach(key => {
|
if (!mergedFields[key] || mergedFields[key].trim() === '') {
|
mergedFields[key] = fields[key]
|
}
|
})
|
successCount++
|
} else {
|
failCount++
|
}
|
})
|
|
// 过滤结果:只返回itemNames中指定的字段
|
const filteredFields = {}
|
if (itemNames && itemNames.length > 0) {
|
itemNames.forEach(itemName => {
|
if (mergedFields.hasOwnProperty(itemName)) {
|
filteredFields[itemName] = mergedFields[itemName]
|
}
|
})
|
} else {
|
// 如果没有指定itemNames,返回所有字段
|
Object.assign(filteredFields, mergedFields)
|
}
|
|
return {
|
success: true,
|
successCount: successCount,
|
failCount: failCount,
|
fields: filteredFields
|
}
|
})
|
.catch(error => {
|
return Promise.reject({
|
success: false,
|
msg: '批量识别失败',
|
error: error
|
})
|
})
|
}
|
|
/**
|
* 默认的转运单字段列表
|
*/
|
export const DEFAULT_TRANSFER_ITEM_NAMES = [
|
"患者姓名", "性别", "年龄", "身份证号", "诊断", "需支付转运费用",
|
"行程", "开始时间", "结束时间", "家属签名", "患者签名(手印)",
|
"签字人身份证号码", "日期", "联系电话", "本人", "签字人与患者关系"
|
]
|