|
|
@@ -0,0 +1,53 @@
|
|
|
+import UQRCode from 'uqrcodejs'
|
|
|
+
|
|
|
+/**
|
|
|
+ * 在组件内隐藏 canvas 上绘制二维码,导出临时文件路径供 <image> 展示。
|
|
|
+ * @param {object} opts
|
|
|
+ * @param {string} opts.text 二维码内容(出入库单 id)
|
|
|
+ * @param {string} opts.canvasId canvas-id
|
|
|
+ * @param {object} opts.componentInstance 组件实例(getCurrentInstance().proxy)
|
|
|
+ * @param {number} [opts.size=200]
|
|
|
+ * @returns {Promise<string>} tempFilePath
|
|
|
+ */
|
|
|
+export function makeQrTempFile({ text, canvasId, componentInstance, size = 200 }) {
|
|
|
+ const content = String(text || '').trim()
|
|
|
+ if (!content) {
|
|
|
+ return Promise.reject(new Error('二维码内容为空'))
|
|
|
+ }
|
|
|
+ if (!componentInstance) {
|
|
|
+ return Promise.reject(new Error('缺少组件实例'))
|
|
|
+ }
|
|
|
+
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ try {
|
|
|
+ const qr = new UQRCode()
|
|
|
+ qr.data = content
|
|
|
+ qr.size = size
|
|
|
+ qr.margin = 10
|
|
|
+ qr.make()
|
|
|
+ const ctx = uni.createCanvasContext(canvasId, componentInstance)
|
|
|
+ qr.canvasContext = ctx
|
|
|
+ qr.drawCanvas()
|
|
|
+ // drawCanvas 内部会 ctx.draw;稍延迟再导出
|
|
|
+ setTimeout(() => {
|
|
|
+ uni.canvasToTempFilePath(
|
|
|
+ {
|
|
|
+ canvasId,
|
|
|
+ width: size,
|
|
|
+ height: size,
|
|
|
+ destWidth: size,
|
|
|
+ destHeight: size,
|
|
|
+ success: (res) => {
|
|
|
+ if (res.tempFilePath) resolve(res.tempFilePath)
|
|
|
+ else reject(new Error('二维码导出失败'))
|
|
|
+ },
|
|
|
+ fail: (err) => reject(err || new Error('二维码导出失败'))
|
|
|
+ },
|
|
|
+ componentInstance
|
|
|
+ )
|
|
|
+ }, 120)
|
|
|
+ } catch (e) {
|
|
|
+ reject(e)
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|