UNPKG

mtl-js-sdk

Version:

ynf-fw-mtl-api

936 lines (890 loc) 27.2 kB
/* * @Author: wangyingliang@yonyou.com * @Date: 2024-10-31 09:34:14 * @LastEditors: wangyingliang wangyingliang@yonyou.com * @LastEditTime: 2025-09-02 20:40:49 * @FilePath: /mtl-api-project/src/platforms/wx/methods.js * @Description: 微信 || 企微函数文件 * Copyright (c) 2024 by Yonyou, All Rights Reserved. */ import xaxios from 'axios' import QRious from 'qrious' import home from './unique.js' import map from '../h5/map/amapLocation.js' import unique from '../../common/unique.js' const baseUrl = "ht" + "tps://bip-dai" + "ly.yonyoucloud.com/iuap-yonbuilder-mobile" const DEFAULT_STORAGE_DOMAIN = "domain.default" const SUCCESS_CODE = 200 const FAIL_CODE = 1 const axios = xaxios?.default || xaxios const unsupportFailRes = { code: FAIL_CODE, message: "The current platform doesn't support", } function unsupportMethod(object = {}) { object.fail && object.fail(unsupportFailRes) object.complete && object.complete(unsupportFailRes) } const unsupportMethods = [ "startSpeechSyn", "stopSpeechSyn", "showToast", "openShare", "closeScanQRCode", "openSchema", "setStatusBar", "registerCommonCallback", "getStatusBarHeight", "chooseVideoToServer", "execUpesnBridge", "moveFileToDisk", "smileDetect", "faceCompare", "faceVerify", "faceRegister", ] /** * 处理API成功的回调 */ function successCallBack(obj = {}) { obj.success && obj.success({}) obj.complete && obj.complete({}) } function successCallBackArray(obj = {}) { obj.success && obj.success([]) obj.complete && obj.complete({}) } const supportMethods = [ "isExclusivePreloadMDF", "getExclusiveAppH5LocationPath", "restoreScreenOrientation", "changeScreenOrientation", "isWebviewCanGoBack", "onWebviewGoBack", "closeScanQRCode", "getAppInfo", "chooseVideo", "switchLongPress", "setUserFontSize", "afterPrivacyAgreement", "webViewCustomScanQRCode", "execPluginBridge", "execPluginSyncBridge", "setCookie", "requestPermission", "chooseMap", "setGesturePassword", "verifyGesturePassword", "verifyLoginPassword", "continuousLocationStart", "mapLocationExtend", "compressLocalImage", "continuousShooting", "getVideoThumbnail", "chooseFile", "chooseFileFromLibrary", "commonReplyComponent", "searchBleClient", "bindSensor", "getBindedSensor", "connectBle", "registerConnectStatusListener", "collectVib", "collectTmp", "collectRev", "getConnectStatus", "stopCollect", "disconnectBle", "translateVoice", "encryptData", "decryptData", "viewUserInfo", "chooseDepartment", "chooseContacts", "chooseAllContacts", "chooseInsideGroup", "convertMemberIDs", "chooseUserOrGroupFromChat", "createFeedComponent", "sendImageMessages", "createNewSchedule", "viewScheduleList", "viewScheduleDetail", "getSchedulesFromMobile", "sendMiniMail", "openLibraryFiles", "chooseLibraryFiles", "getUserYHTInfo", "getUserAgent", "getUserFontSize", "openCreateSpace", "copyTextPasteboard", "operateCloudAlarm", "checkCloudAlarm", "continuousShootingLocal", "openChatByGroupId", "getXYVersion", "openXYChatView", "closeXYChatView", "mdfIsLoad", "chooseGroupContacts", "jumpSystemSettings", "configSkinAndTabbar", "getWechatBill", "isFileExist", "getAppInformation", "getMultiDataCenterConfig", "selectFiles", "getWatermarkInfo", "openLiveFlow", "relayoutCustomWebview", "writeAnnounceReply", "openAnnounceReply", "collectionData", "getGzipAppData", "configAppletMenu", "getHhtQrCodeInfo", "startMirrorScreen", "closeMirrorScreen", "checkMirrorStatus", "yonyouPay", "announceDetail", "writeLocationLog", "readLocationLog", "reloadWorkbenchPath", "openSearchAppList", "openSignViewWithParams", "shareApplet", "zebraPrinterList", "zebraPrintImage", "getOffLineOutSignPhoto", "config", "registerLifeCycle", "appletFromQzId", "openWindow", "openPluginWithParams", "openAppSetting", "openCustomSetting", "releaseBle", "vibrateLong", "openDocument", "appearanceMode", "onAppearanceModeChange", "toggleCamera", "onPullDownHandle", "stopPullDownHandle", "onPullUpHandle", "stopPullUpHandle", "deleteBase64Image", "getBase64Image", "saveBase64Image", "createShortcut", "openScheduleDetail", "executeDBOperate", "saveImageToPhotoAlbum", "h5PageClose", "configureWebView", ] function generateQRCode(object) { if (unique.isEmpty("str", object.str, object)) { return } let qr = new QRious({ value: object.str, size: object.size || 100, }) let imgSrc = qr.toDataURL("image/jpeg") let res = { imgSrc } object.success && object.success(res) object.complete && object.complete(res) } function getLocalImgSrc(object) { const { localId } = object mtl.getLocalImgData({ localId, complete: function (res) { let { code, message, data } = res if (code === SUCCESS_CODE) { message = "getLocalImgSrc:ok!" data = { imgSrc: data.localData } object.success && object.success(data) } else { object.fail && object.fail({ code, message }) } object.complete && object.complete({ code, message, data }) }, }) } function scanInvoice(object) { mtl.chooseImage({ count: 1, // 默认9 sizeType: ["original", "compressed"], sourceType: ["album", "camera"], success: (res) => { let localIds = res.localIds mtl.recognizeInvoice({ ...object, image: localIds[0] }) }, fail: object.fail, }) } function recognizeInvoice(object) { let { appCode, image, url = baseUrl } = object new Promise((resolve, reject) => { if (image.startsWith("wxLocalResource://") || image.startsWith("weixin://")) { mtl.getLocalImgData({ localId: image, success: resolve, fail: reject, }) } else { resolve({ localData: image }) } }).then((res) => { let imgBase64 = res.localData let index = imgBase64.indexOf("base64,") if (index !== -1) { imgBase64 = imgBase64.substring(index + 7, imgBase64.count) } let path = `${url}/rest/v1/api/apilink/ocr/invoice/vat/base64` let params = { image: imgBase64, apiCode: appCode, } return axios({ method: "post", url: path, params: null, data: params, headers: { "Content-Type": "application/json;charset=UTF-8", }, }) }).then((res) => { object.success && object.success(res.data) object.complete && object.complete(res) }).catch((err) => { let result = { code: FAIL_CODE, message: err.toString() } object.fail && object.fail(result) object.complete && object.complete(result) }) } function scanIDCard(object) { let sourceType = object.sourceType mtl.chooseImage({ count: 1, // 默认9 sizeType: ["original", "compressed"], sourceType: sourceType || ["album", "camera"], success: (res) => { console.log("scanIDCard success", res) let localIds = res.localIds mtl.recognizeIDCard({ ...object, image: localIds[0] }) }, fail: object.fail, }) } function recognizeIDCard(object) { let { appCode, side, image, url = baseUrl } = object new Promise((resolve, reject) => { if (image.startsWith("wxLocalResource://") || image.startsWith("weixin://")) { mtl.getLocalImgData({ localId: image, success: resolve, fail: reject, }) } else { resolve({ localData: image }) } }) .then((res) => { let imgBase64 = res.localData let index = imgBase64.indexOf("base64,") if (index !== -1) { imgBase64 = imgBase64.substring(index + 7, imgBase64.count) } let path = `${url}/rest/v1/api/apilink/ocr/card/id/base64` let params = { image: imgBase64, apiCode: appCode, isFront: side === "back" ? false : true, } return axios({ method: "post", url: path, params: null, data: params, headers: { "Content-Type": "application/json;charset=UTF-8", }, }) }) .then((res) => { object.success && object.success(res.data) object.complete && object.complete(res) }) .catch((err) => { let result = { code: FAIL_CODE, message: err.toString() } object.fail && object.fail(result) object.complete && object.complete(result) }) } function scanBankCard(object) { mtl.chooseImage({ count: 1, // 默认9 sizeType: ["original", "compressed"], sourceType: ["album", "camera"], success: (res) => { let localIds = res.localIds mtl.recognizeBankCard({ ...object, image: localIds[0] }) }, fail: object.fail, }) } function recognizeBankCard(object) { let { appCode, image, url = baseUrl } = object new Promise((resolve, reject) => { if (image.startsWith("wxLocalResource://") || image.startsWith("weixin://")) { mtl.getLocalImgData({ localId: image, success: resolve, fail: reject, }) } else { resolve({ localData: image }) } }) .then((res) => { let imgBase64 = res.localData let index = imgBase64.indexOf("base64,") if (index !== -1) { imgBase64 = imgBase64.substring(index + 7, imgBase64.count) } let path = `${url}/rest/v1/api/apilink/ocr/card/bank/base64` let params = { image: imgBase64, apiCode: appCode, } return axios({ method: "post", url: path, params: null, data: params, headers: { "Content-Type": "application/json;charset=UTF-8", }, }) }) .then((res) => { object.success && object.success(res.data) object.complete && object.complete(res) }) .catch((err) => { let result = { code: FAIL_CODE, message: err.toString() } object.fail && object.fail(result) object.complete && object.complete(result) }) } function request(object) { let { url, method = "GET", headers = { "content-type": "application/json" }, params } = object if (url && url.substring(0, 2) === "${") { const key = getBracketStr(url) const config = mtl.getStorageSync({ domain: "mtl", key: "mtlContext", }) let host = "" if (config.host) { host = config.host[key] } url = url.replace(`\${${key}}`, host) } let obj = { url, method, headers, params: method.toUpperCase() == "GET" ? params : {}, data: method.toUpperCase() == "POST" ? params : {}, timeout: object?.timeout || 0, responseType: "json", withCredentials: true, } axios(obj) .then((response) => { let { status: code, statusText: message, data } = response if (code === 200) { object.success && object.success(response) } else { object.fail && object.fail({ code, message, data }) } object.complete && object.complete({ code, message, data }) }) .catch((err) => { const result = (err.response && err.response.data) || { code: FAIL_CODE, message: err.message } object.fail && object.fail(result) object.complete && object.complete(result) }) } function getBracketStr(text) { let result = "" if (!text || text === "") return result let regex = /\{(.+?)\}/g let options = text.match(regex) if (options && options !== "") { let option = options[0] if (option && option !== "") { result = option.substring(1, option.length - 1) } } return result } function setStorage(obj) { let { domain = DEFAULT_STORAGE_DOMAIN, key, data } = obj if (unique.isEmpty("key", key, obj)) { return } if (typeof key != "string") { throw new TypeError("key is not a string") } let structs = localStorage.getItem(domain) structs = (structs && JSON.parse(structs)) || {} structs[key] = data localStorage.setItem(domain, JSON.stringify(structs)) obj.success && obj.success({ code: SUCCESS_CODE, message: "setStorage:ok" }) obj.complete && obj.complete({ code: SUCCESS_CODE, message: "setStorage:ok" }) } function getStorage(obj) { let res = null let data = null let { domain = DEFAULT_STORAGE_DOMAIN, key, callbackSuccess = false } = obj if (unique.isEmpty("key", key, obj)) { return } if (typeof key != "string") { res = { code: FAIL_CODE, message: new TypeError("key is not a string").toString(), } obj.fail && obj.fail(res) } else { let structs = localStorage.getItem(domain) structs = structs && JSON.parse(structs) data = structs && structs.hasOwnProperty(key) ? structs[key] : null if (typeof data === "boolean" || typeof data === "number" || !!data) { res = { code: SUCCESS_CODE, message: "getStorage:ok", data: data, } obj.success && obj.success(res) } else { res = { code: FAIL_CODE, message: new TypeError("data is null").toString(), } obj.fail && obj.fail(res) } } obj.complete && obj.complete(res) return data } function removeStorage(obj = {}) { let { domain = DEFAULT_STORAGE_DOMAIN, key } = obj let data = null if (unique.isEmpty("key", key, obj)) { return } if (typeof key != "string") { throw new TypeError("key is not a string") } let structs = localStorage.getItem(domain) structs = (structs && JSON.parse(structs)) || {} if (data) { structs[key] = data } else { delete structs[key] } localStorage.setItem(domain, JSON.stringify(structs)) obj.success && obj.success() obj.complete && obj.complete({ code: SUCCESS_CODE, message: "removeStorage:ok" }) } function clearStorage(obj) { const domain = (obj && obj.domain) || DEFAULT_STORAGE_DOMAIN localStorage.removeItem(domain) obj.success && obj.success() obj.complete && obj.complete({ code: SUCCESS_CODE, message: "clearStorage:ok" }) } function getAppCode(obj) { let urlSuffix = window.location.search if (urlSuffix) { let query = window.location.search.substring(1) let vars = query.split("&") let result = vars.find((element) => { return element.indexOf("appCode") != -1 }) if (result) { let data = { code: 200, message: "", data: { appCode: result.substring(result.lastIndexOf("=") + 1), }, } obj.complete && obj.complete(data) obj.success && obj.success(data.data) } else { let data = { code: -1, message: "appCode acquisition failed", } obj.fail && obj.fail(data) obj.complete && obj.complete(data) } } else { throw "appCode is null" } } function getOAuthCode(obj = {}) { let { url, tenantId } = obj if (unique.isEmpty("url", url, obj) || unique.isEmpty("tenantId", tenantId, obj)) { return } else { mtl.yht.getUCGAuthCode(obj) } } function getAuthCode(obj) { let urlSuffix = window.location.search if (urlSuffix) { let query = window.location.search.substring(1) let vars = query.split("&") let result = vars.find((element) => { return element.indexOf("authCode") != -1 }) if (result) { let data = { code: 200, message: "", data: { authCode: result.substring(result.lastIndexOf("=") + 1), }, } obj.complete && obj.complete(data) obj.success && obj.success(data.data) } else { let data = { code: -1, message: "authCode acquisition failed", } obj.fail && obj.fail(data) obj.complete && obj.complete(data) } return } else { throw "authCode is null" } } function getMac(obj) { if (obj) { const openId = localStorage.getItem("wxOpenId") if (unique.isEmpty("macAddress", openId, obj)) { return } obj.success && obj.success({ macAddress: openId }) obj.complete && obj.complete({ code: SUCCESS_CODE, data: { macAddress: openId } }) } else { console.log("obj is null in getMac API.") } } function weChatBindByPassword(obj) { let path = obj.url ? obj.url : baseUrl obj.url = `${path}/rest/v1/mobile/user/weChatBind` obj.method = "POST" const data = { username: obj.username, password: obj.password, appId: obj.appId, openId: obj.openId, validateCodeType: "username", } obj.params = data request(obj) } function weChatBindByValidateCode(obj) { let path = obj.url ? obj.url : baseUrl obj.url = `${path}/rest/v1/mobile/user/weChatBind` obj.method = "POST" const data = { username: obj.username, validateCode: obj.validateCode, appId: obj.appId, openId: obj.openId, validateCodeType: "mobile", } obj.params = data request(obj) } function weChatUnBind(obj) { let path = obj.url ? obj.url : baseUrl obj.url = `${path}/rest/v1/mobile/user/weChatUnbind` obj.method = "POST" const data = { yhtToken: obj.yhtToken, } obj.params = data request(obj) } function doShare(obj) { const urlEncode = encodeURIComponent(obj.link) const title = obj.title ? obj.title : "" const miniPageUrl = "/pages/" let url = `${miniPageUrl}home/home?title=${title}&url=${urlEncode}` if (obj.type == 9) { url = `${miniPageUrl}mtlShare/mtlShare?title=${title}&url=${urlEncode}` } mtl.navigateTo({ url: url, success: function (res) { obj.success && obj.success(res) }, fail: function (err) { obj.fail && obj.fail(err) }, }) } function openNewWebview(obj = {}) { let url = "" if (obj?.miniPageUrl) { // 包含 pages/ 走原生 const miniPageUrl = obj?.miniPageUrl || "/pages/web" + "View/webView" const urlEncode = encodeURIComponent(obj?.url) url = `${miniPageUrl}?url=${urlEncode}` } else { url = obj?.url || "" } mtl.navigateTo({ url: url, success: function (res) { obj.success && obj.success(res) }, fail: function (err) { obj.fail && obj.fail(err) }, }) } function closeCurrentWebview(obj = {}) { mtl.navigateBack(obj) } function openExclusiveApp(obj = {}) { const { appUrl } = obj if (unique.isEmpty("appUrl", appUrl, obj)) { return } const urlEncode = encodeURIComponent(appUrl) const miniPageUrl = "/pages/" let url = `${miniPageUrl}webView/webView?url=${urlEncode}` mtl.navigateTo({ url: url, success: function (res) { obj.success && obj.success(res) }, fail: function (err) { obj.fail && obj.fail(err) }, }) successCallBack(obj) } function webviewLoadUrl(obj = {}) { const { url } = obj if (unique.isEmpty("url", url, obj)) { return } window.location.href = url successCallBack(obj) } function getLocation(obj = {}) { map.amapLocation(obj) } // 获取原生导航信息 function getNavBarInfo(obj = {}) { let data = { isNativeNavBar: true, height: 44 } obj.success && obj.success(data) obj.complete && obj.complete(data) } function getUserInfo(obj = {}) { mtl.getStorage({ key: "USER_ID", success: function (res) { obj.success && obj.success({ userId: res.data }) obj.complete && obj.complete({ data: res, code: 200 }) }, fail: function (err) { obj.fail && obj.fail(err) obj.complete && obj.complete(err) }, }) } function getConfig(obj = {}) { const { envURL, resId } = getUrlParams() if (!envURL) { obj.fail && obj.fail({ code: FAIL_CODE, message: "envURL is null" }) return } const urlArray = envURL.split("rest") const url = urlArray[0] + "/rest/v2/mobile/out/getConfigJson?id=" + resId let params = { url: url, method: "GET", withCredentials: true, responseType: "json", headers: { "content-type": "application/json", }, } axios(params) .then((response) => { let res = response.data && response.status && response.headers ? response.data : response let dataObj = convertToObject(res) obj.success && obj.success(dataObj) }) .catch((err) => { obj.fail && obj.fail(err) }) } function convertToObject(res) { let dataObj = res if (typeof res === "string") { try { dataObj = JSON.parse(res) } catch (error) { dataObj = res } } return dataObj } function getUrlParams() { let res = {} let serach = window.location.search if (!serach || serach === "") { serach = window.location.href.split("?").pop() } let str = decodeURIComponent(serach) str = str.trim().replace(/^[?#&]/, "") if (!str) { return res } str.split("&").forEach((strItem) => { if (strItem) { let parts = strItem.split("=") let partKey = parts[0], partValue = parts[1] || "" res[partKey] = partValue } }) return res } function markAndNavigationDestination(obj = {}) { const { address, subAddress } = obj mtl.openLocation({ ...obj, name: address, address: subAddress }) } const backIntercept = (obj = {}) => { mtl.onHistoryBack(obj) } let exports = { upesn: home.upesn, generateQRCode, getLocalImgSrc, scanInvoice, recognizeInvoice, scanIDCard, recognizeIDCard, scanBankCard, recognizeBankCard, request, setStorage, getStorage, removeStorage, clearStorage, getAppCode, getAuthCode, getMac, getOAuthCode, weChatBindByPassword, weChatBindByValidateCode, weChatUnBind, doShare, openNewWebview, closeCurrentWebview, openExclusiveApp, webviewLoadUrl, getLocation, getNavBarInfo, getUserInfo, getConfig, markAndNavigationDestination, backIntercept, mdfCustomScanQRCode: home.upesn.mdfCustomScanQRCode, mdfChangeCustomScanMode: home.upesn.mdfChangeCustomScanMode, mdfChangeFlashLightStatus: home.upesn.mdfChangeFlashLightStatus, dail: home.upesn.dail, settingNavBar: home.upesn.settingNavBar, voiceToText: home.upesn.voiceToText, getBlueToothState: home.upesn.getBlueToothState, blueToothConnectState: home.upesn.blueToothConnectState, blueToothConnect: home.upesn.blueToothConnect, blueToothPrint: home.upesn.blueToothPrint, blueToothDisConnect: home.upesn.blueToothDisConnect, blueToothScan: home.upesn.blueToothScan, blueToothStopScan: home.upesn.blueToothStopScan, rfidConnect: home.upesn.rfidConnect, rfidDisconnect: home.upesn.rfidDisconnect, setAppletCapsuleStyle: home.upesn.setAppletCapsuleStyle, getAppletCapsuleParams: home.upesn.getAppletCapsuleParams, setStatusBarStyle: home.upesn.setStatusBarStyle, getAuthorizationStatus: home.upesn.getAuthorizationStatus, downloadFile: home.upesn.downloadFile, uploadFile: home.upesn.uploadFile, openChatWindow: home.upesn.openChatWindow, chooseDocFiles: home.upesn.chooseDocFiles, chooseLocalFileToServer: home.upesn.chooseLocalFileToServer, sendTodoReceipt: home.upesn.sendTodoReceipt, getAppInfomation: home.upesn.getAppInfomation, backToHome: home.upesn.backToHome, chooseImageToServer: home.upesn.chooseImageToServer, getUserYHTInfo: home.upesn.getUserYHTInfo, setUserYHTInfo: home.upesn.setUserYHTInfo, getToken: home.upesn.getToken, gainUserInfo: home.upesn.gainUserInfo, wpsPreview: home.upesn.wpsPreview, previewDoc: home.upesn.previewDoc, previewFile: home.upesn.previewFile, getAppData: home.upesn.getAppData, chooseLocalFiles: unique.chooseLocalFiles, onNetworkStatusChange: unique.onNetworkStatusChange, openAppWithParams: unique.openAppWithParams, getAppletShareParams: unique.getAppletShareParams, getSystemInfo: unique.getSystemInfo, getClipboardData: unique.getClipboardData, setClipboardData: unique.setClipboardData, watchShake: unique.watchShake, vibrateOnce: unique.vibrateOnce, saveExclusiveDomain: unique.saveExclusiveDomain, saveExclusiveUserInfo: unique.saveExclusiveUserInfo, saveExclusiveYhtInfo: unique.saveExclusiveYhtInfo, getExclusiveCode: unique.getExclusiveCode, setExclusiveLanguage: unique.setExclusiveLanguage, addImageWaterMark: unique.addImageWaterMark, mtlContext: unique.mtlContext, checkBridgeNameExist: unique.checkBridgeNameExist, canExecUpesnBridge: unique.canExecUpesnBridge, } unsupportMethods.forEach((pop) => { exports[pop] = unsupportMethod }) supportMethods.forEach((pop) => { if (!exports[pop]) { if (pop === "chooseLibraryFiles" || pop === "chooseContacts" || pop === "chooseDepartment") { exports[pop] = successCallBackArray } else { exports[pop] = successCallBack } } }) export default exports