UNPKG

foreasydata

Version:

EasyData for Web Utils.

402 lines (400 loc) 10.9 kB
import { Tree } from 'fordata' const getStorage = (key) => { let destr = `&#${(localStorage[key] || '').split('x0x').map((item, index) => { return ((+`0x${item}`) - 2 ** (index % 10)) }).join(';&#')};` return destr.replace(/&#(\d+);/g, function(match, decode) { return String.fromCharCode(decode); }) } export class EasyData { /** * * @param {String} code 模型编码 * @param {Object} headers 请求头 */ constructor(code, headers = {}) { this.code = code this.headers = { 'Authorization': localStorage.easy_token, 'Content-Type': 'application/json;charset=UTF-8', ...headers } } /** * 通用请求 * @param {Object} options * @returns */ async fetch(options = {}) { let { url = '/', method = 'get', data = {}, headers } = options if (method == 'get') { if (url.includes('?')) { url += `&${new URLSearchParams(data).toString()}` } else { url += `?${new URLSearchParams(data).toString()}` } data = null } try { let resp = await fetch(`${window.EASY_ROOT || ''}${url}`, { method, body: data, headers: new Headers(headers || this.headers) }) let res = null try { res = await resp.json() } catch { res = { success: false, msg: resp } } return new Promise((resolve) => { if (res.success) { resolve({ isSuccess: res.success, data: res.data, msg: res.msg }) } else { resolve({ isSuccess: false, data: [], msg: res.msg || res.error }) } }) } catch (err) { return new Promise((resolve) => { resolve({ isSuccess: false, data: [], msg: err }) }) } } /** * 初始化 * @returns {Promise} */ init() { return new Promise(async (resolve) => { let columns = {} let rules = {} let form = {} let listColumn = [] let res = await this.fetch({ url: '/api/easydata/md/api/getModule', data: { code: this.code } }) this.isSuccess = res.isSuccess this.msg = res.msg if (res.isSuccess) { res.data.forEach(item => { item.value = '' if (item.unionKeyType === 'CATEGORY') { item.category = JSON.parse(localStorage.DIC_TREE || `{}`)[item.unionTableId] || [] } if (item.unionKeyType === 'DICT') { item.dics = JSON.parse(getStorage('D'))[item.unionTableId] || [] } columns[item.frontName] = item rules[item.frontName] = [ { required: item.isRequired, trigger: "blur", validator(rule, value, callback) { if ( item.isRequired && (value === "" || value === undefined || value === null) ) { callback( new Error( item.category || item.dics ? `选择${item.frontComment}` : `输入${item.frontComment}` ) ); } else { if (item.regular) { let regx = new RegExp(item.regular); if (regx.test(value)) { callback(); } else { callback(new Error(`${item.frontComment}格式不正确`)); } } else { callback(); } } }, }, ]; form[item.frontName] = item.value }) this.columns = columns this.rules = rules this.form = form this.listColumns = Object.values(columns) } resolve(this) }) } /** * 获取列表数据 * @param {Object} data 参数 * @param {Object} page 分页参数或者注入参数 * @param {Boolean} isParse 是否转化列表字典 * @returns {Promise} */ list(data = {}, page = {}, isParse = true) { let conditions = {} for (let column in this.columns) { if (data[column]) { let { tableName, opType } = this.columns[column] if (!conditions[tableName]) { conditions[tableName] = { data: [ { ...this.columns[column], value: data[column], opType: opType || 'eq', } ], tableName } } else { conditions[tableName].data.push({ ...this.columns[column], opType: opType || 'eq', value: data[column], }) } } } return new Promise(async (resolve) => { let res = await this.fetch({ url: '/api/easydata/md/api/page', data: JSON.stringify({ code: this.code, conditions: Object.values(conditions), ...page }), method: 'post' }) let results = res.data.list || [] if (isParse) { results = this.parseList(results) } resolve(results) }) } /** * 翻译列表字典 * @param {Array} list 列表数据 * @returns {Array} */ parseList(list) { list.forEach(item => { for (let c in this.columns) { let column = this.columns[c] if (column.dics) { item[column.frontName] = column.dics.find(i => i.value == item[column.frontName])?.label ?? '' } if (column.category) { new Tree({ id: 'value' }) item[column.frontName] = column.category.findPath(item[column.frontName]).map(i => i.label) } } }) return list } /** * 新增 * @param {Object} data 新增参数 * @returns {Promise} */ add(data = {}) { let conditions = {} for (let column in this.columns) { if (data[column]) { let { tableName } = this.columns[column] if (!conditions[tableName]) { conditions[tableName] = { data: [ { ...this.columns[column], value: data[column] } ], tableName } } else { conditions[tableName].data.push({ ...this.columns[column], value: data[column] }) } } } return this.fetch({ url: '/api/easydata/md/api/add', data: JSON.stringify({ code: this.code, conditions: Object.values(conditions), }), method: 'post' }) } /** * 更新 * @param {Object} data 更新参数 * @returns {Promise} */ update(data = {}) { let conditions = [] for (let column in this.columns) { if (data[column]) { let { isPrimaryKey, opType } = this.columns[column] if (isPrimaryKey) { conditions.push({ ...this.columns[column], value: data[column], opType: opType || 'eq' }) } else { this.columns[column].value = data[column] } } } if (!conditions.length) { return new Promise(resolve => { resolve({ isSuccess: false, msg: '条件必传' }) }) } return this.fetch({ url: '/api/easydata/md/api/update', data: JSON.stringify({ code: this.code, conditions: conditions, columns: Object.values(this.columns) }), method: 'post' }) } /** * 删除 * @param {String} id 主键ID * @returns {Promise} */ del(id = '') { let conditions = [] let table = '' for (let column in this.columns) { let { isPrimaryKey, tableName, opType } = this.columns[column] if (isPrimaryKey && id) { table = tableName conditions.push({ ...this.columns[column], value: id, opType: opType || 'eq' }) } } if (!conditions.length) { return new Promise(resolve => { resolve({ isSuccess: false, msg: '条件必传' }) }) } return this.fetch({ url: '/api/easydata/md/api/delete', data: JSON.stringify({ code: this.code, condition: conditions, tableName: table }), method: 'post' }) } /** * 获取详情 * @param {String} 主键ID * @param {Boolean} isParse 是否转换字典为汉字名称 * @returns {Promise} */ detail(id, isParse = true) { let conditions = [] let table = '' for (let column in this.columns) { let { isPrimaryKey, tableName } = this.columns[column] if (isPrimaryKey && id) { conditions = [{ ...this.columns[column], opType: 'eq', value: id }] table = tableName } } return new Promise(async (resolve) => { if (!conditions.length) { return new Promise(resolve => { resolve({ isSuccess: false, msg: '条件必传' }) }) } let res = await this.fetch( { url: '/api/easydata/md/api/get', data: JSON.stringify({ code: this.code, conditions: [ { data: Object.values(conditions), tableName: table } ] }), method: 'post' } ) let results = [] res.data.forEach(item => { results = [...results, ...item.columns] }) if (isParse) { results = this.parseDetail(results) } let detail = {} results.forEach(item => { detail[item.frontName] = item.value || item.columnValue }) this.listColumns.forEach((item) => { item.value = detail[item.frontName]; }); resolve(detail) }) } parseDetail(data) { data.forEach(item => { let column = this.columns[item.frontName] if (column.dics) { item.value = column.dics.find(i => i.value == item.columnValue)?.label ?? '' } if (column.category) { new Tree({ id: 'value' }) item.value = column.category.findPath(item.columnValue).map(i => i.label) } }) return data } }