const app = () => getApp() const BASE_URL = function () { try { const a = getApp() if (a && a.globalData && a.globalData.apiBase) return a.globalData.apiBase } catch (e) {} return 'https://traesite.umersoft.com:8975' } const request = (options) => { return new Promise((resolve, reject) => { const { url, method = 'GET', data = {}, header = {}, timeout = 30000 } = options const fullUrl = url.indexOf('http') === 0 ? url : BASE_URL() + url const h = Object.assign({ 'content-type': 'application/json; charset=utf-8', Accept: 'application/json; charset=utf-8', 'X-Mp-Timeassistant': 'mp_time_assistant_v1_' + Math.random().toString(36).slice(2, 10), }, header) wx.request({ url: fullUrl, method, data, header: h, timeout, success: (res) => { const body = res.data || {} if (res.statusCode >= 200 && res.statusCode < 300 && body && body.ok) { resolve(body) } else { const msg = body && body.error ? body.error : `请求失败 (HTTP ${res.statusCode})` const err = new Error(msg) err.statusCode = res.statusCode if (body && typeof body === 'object') { try { Object.assign(err, body) } catch (_) {} } reject(err) } }, fail: (err) => { reject(new Error(err && err.errMsg ? err.errMsg : '网络错误')) }, }) }) } const uploadFile = (options) => { return new Promise((resolve, reject) => { const { url, filePath, name = 'file', formData = {}, timeout = 120000 } = options const fullUrl = url.indexOf('http') === 0 ? url : BASE_URL() + url wx.uploadFile({ url: fullUrl, filePath, name, formData, header: { 'X-Mp-Timeassistant': 'mp_time_assistant_v1_' + Math.random().toString(36).slice(2, 10), }, timeout, success: (res) => { try { const body = typeof res.data === 'string' ? JSON.parse(res.data) : (res.data || {}) if (res.statusCode >= 200 && res.statusCode < 300 && body && body.ok) { resolve(body) } else { const msg = body && body.error ? body.error : `上传失败 (HTTP ${res.statusCode})` reject(new Error(msg)) } } catch (e) { reject(new Error('上传响应解析失败')) } }, fail: (err) => { reject(new Error(err && err.errMsg ? err.errMsg : '上传网络错误')) }, }) }) } const core = { getMeta: () => request({ url: '/api/mp_time_assistant/meta', method: 'GET' }), getState: () => request({ url: '/api/mp_time_assistant/state', method: 'GET' }), setActiveKit: (kitId) => request({ url: '/api/mp_time_assistant/state/active-kit', method: 'PUT', data: { kitId }, }), } const personalCollect = { list: (keyword = '') => request({ url: '/api/mp_personal_collect/kits/personal_collect/items', method: 'GET', data: { keyword: keyword || '' }, }), get: (id) => request({ url: `/api/mp_personal_collect/kits/personal_collect/items/${encodeURIComponent(id)}`, method: 'GET', }), create: (payload) => request({ url: '/api/mp_personal_collect/kits/personal_collect/items', method: 'POST', data: payload, }), update: (payload) => request({ url: '/api/mp_personal_collect/kits/personal_collect/items', method: 'PUT', data: payload, }), remove: (id) => request({ url: '/api/mp_personal_collect/kits/personal_collect/items', method: 'DELETE', data: { id }, }), upload: (filePath, groupId = '') => uploadFile({ url: '/api/mp_personal_collect/kits/personal_collect/upload', filePath, name: 'file', formData: groupId ? { groupId } : {}, }), } const repClock = { meta: () => request({ url: '/api/mp_rep_clock/meta', method: 'GET' }), state: () => request({ url: '/api/mp_rep_clock/state', method: 'GET' }), resetRunning: (sessionId) => request({ url: '/api/mp_rep_clock/kits/rep_clock/state/reset-running', method: 'POST', data: { sessionId }, }), listCards: () => request({ url: '/api/mp_rep_clock/kits/rep_clock/cards', method: 'GET' }), getCard: (id) => request({ url: `/api/mp_rep_clock/kits/rep_clock/cards/${encodeURIComponent(id)}`, method: 'GET' }), createCard: (payload) => request({ url: '/api/mp_rep_clock/kits/rep_clock/cards', method: 'POST', data: payload, }), updateCard: (payload) => request({ url: '/api/mp_rep_clock/kits/rep_clock/cards', method: 'PUT', data: payload, }), removeCard: (id) => request({ url: '/api/mp_rep_clock/kits/rep_clock/cards', method: 'DELETE', data: { id }, }), history: (limit = 200) => request({ url: '/api/mp_rep_clock/kits/rep_clock/history', method: 'GET', data: { limit }, }), sessionStart: (payload) => request({ url: '/api/mp_rep_clock/kits/rep_clock/sessions/start', method: 'POST', data: payload, }), sessionSync: (payload) => request({ url: '/api/mp_rep_clock/kits/rep_clock/sessions/sync', method: 'POST', data: payload, }), sessionFinish: (payload) => request({ url: '/api/mp_rep_clock/kits/rep_clock/sessions/finish', method: 'POST', data: payload, }), ttsPreview: (text, voice = 'female_01') => request({ url: '/api/mp_rep_clock/kits/rep_clock/tts/preview', method: 'GET', data: { text, voice }, }), ttsBatch: (cardId, card, voice = 'female_01') => request({ url: '/api/mp_rep_clock/kits/rep_clock/tts/batch', method: 'POST', data: { cardId, card, voice }, }), } const chooseChatAttachments = (count = 9) => { return new Promise((resolve, reject) => { try { if (!wx.chooseMessageFile) { reject(new Error('当前微信版本不支持从聊天选择文件,请升级微信')) return } wx.chooseMessageFile({ count: Math.max(1, Math.min(9, Number(count) || 9)), type: 'all', success: (res) => resolve(res.tempFiles || []), fail: (err) => { const msg = err && err.errMsg ? String(err.errMsg) : '用户取消或授权失败' if (msg.indexOf('cancel') !== -1 || msg.indexOf('取消') !== -1) { resolve([]) } else { reject(new Error(msg)) } }, }) } catch (e) { reject(e) } }) } module.exports = { BASE_URL, request, uploadFile, core, personalCollect, repClock, chooseChatAttachments, }