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 = [ "患者姓名", "性别", "年龄", "身份证号", "诊断", "需支付转运费用", "行程", "开始时间", "结束时间", "家属签名", "患者签名(手印)", "签字人身份证号码", "日期", "联系电话", "本人", "签字人与患者关系" ]