diff --git a/miniprogram/package-lock.json b/miniprogram/package-lock.json index b3a5e9dc0..df2496a0f 100644 --- a/miniprogram/package-lock.json +++ b/miniprogram/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@vant/weapp": "^1.11.7", "jsencrypt": "^3.5.4", + "uqrcodejs": "^4.0.7", "vant": "^4.9.0" }, "engines": { @@ -313,6 +314,12 @@ "node": ">=0.10.0" } }, + "node_modules/uqrcodejs": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/uqrcodejs/-/uqrcodejs-4.0.7.tgz", + "integrity": "sha512-84+aZmD2godCVI+93lxE3YUAPNY8zAJvNA7xRS7R7U+q57KzMDepBSfNCwoRUhWOfR6eHFoAOcHRPwsP6ka1cA==", + "license": "Apache-2.0" + }, "node_modules/vant": { "version": "4.9.24", "resolved": "https://registry.npmmirror.com/vant/-/vant-4.9.24.tgz", diff --git a/miniprogram/package.json b/miniprogram/package.json index 832ca4c30..50ad657da 100644 --- a/miniprogram/package.json +++ b/miniprogram/package.json @@ -15,6 +15,7 @@ "dependencies": { "@vant/weapp": "^1.11.7", "jsencrypt": "^3.5.4", + "uqrcodejs": "^4.0.7", "vant": "^4.9.0" }, "engines": { diff --git a/miniprogram/utils/makeQrTempFile.js b/miniprogram/utils/makeQrTempFile.js new file mode 100644 index 000000000..1d88213a8 --- /dev/null +++ b/miniprogram/utils/makeQrTempFile.js @@ -0,0 +1,53 @@ +import UQRCode from 'uqrcodejs' + +/** + * 在组件内隐藏 canvas 上绘制二维码,导出临时文件路径供 展示。 + * @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} 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) + } + }) +}