wlzboy
2026-04-01 c459808efab29dc1b8439fbb90556bdb16f4c88b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
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 = [
  "患者姓名", "性别", "年龄", "身份证号", "诊断", "需支付转运费用", 
  "行程", "开始时间", "结束时间", "家属签名", "患者签名(手印)", 
  "签字人身份证号码", "日期", "联系电话", "本人", "签字人与患者关系"
]