UNPKG

logwire-wms-ui-test

Version:

运匠科技wms-PDA基础组件库

166 lines (159 loc) 5.67 kB
import lwAxios from "../../utils/Axios"; import { DateTime } from 'luxon' // 条码工具 const barcodeUtils = { /** * * @param {string} barcode 条码 * @param {string} seperator 分隔符 * @param {string} fields 属性列表 * @returns 根据分隔符和属性解析的对象,解析失败返回null */ split (barcode, seperator, fields) { if (!barcode || !fields) { return null } const values = typeof seperator === 'string' ? barcode.split(seperator) : [ barcode ] const fs = Array.isArray(fields) ? fields : (typeof seperator === 'string' ? fields.split(seperator) : [ fields ]) if (fs.length === 0 || values.length !== fs.length) { return null } const data = {} for (let i in fs) { data[fs[i]] = values[i] } return data } } /** * 内部方法:属性操作符验证 * @param {*} value 验证值 * @param {*} validType 验证类型 * @param {*} content 验证参数内容 * @returns 验证是否通过 */ const operatorValid = (value, validType, content) => { if (!value) { return true } switch (validType) { case 'EQ': return value == content case 'NEQ': return value != content case 'GT': return parseFloat(value) > parseFloat(content) case 'GE': return parseFloat(value) >= parseFloat(content) case 'LT': return parseFloat(value) < parseFloat(content) case 'LE': return parseFloat(value) <= parseFloat(content) case 'IN': return content && content.split(',').includes(value) case 'NOTIN': return !content || !content.split(',').includes(value) case 'LENGTH': return (value.length || (!value ? 0 : 1)) === parseInt(content) case 'MATCH': return !!content && !!value && new RegExp(content).test(value) } return false } const dataTypeValid = (value, dataType, format) => { if (!value) { return true } switch(dataType) { case 'int': return Number.isInteger(Number(value)) case 'decimal': return !Number.isNaN(Number(value)) case 'string': return typeof value === 'string' case 'date': case 'datetime': case 'time': return (format ? DateTime.fromFormat(value, format) : DateTime.fromISO(value)).toISO() !== null } return false } /** * 内部方法:根据验证规则对对象属性进行验证 * @author dhc * @param {*} data 验证对象 * @param {*} rules 验证规则列表 * @returns 验证是否通过 */ const ruleValidation = (data, rules) => { if (!rules || !Array.isArray(rules) || rules.length === 0) { return true; } const rs = rules.filter(i => i.field) for (let r of rs) { const value = data[r.field] if (r.required && !value) { return false } if (value !== null && value !== undefined) { if (r.dataType && !dataTypeValid(value, r.dataType, r.format)) { return false } if (r.validType && !operatorValid(value, r.validType, r.content)) { return false } } } return true } /** * 内部方法:验证条码解析结果 * @author dhc * @param {*} param 请求参数 * @param {*} results 请求结果 * @returns {*} 验证结果,成功返回结果对象,失败返回null */ const resolveActionResult = (param, results) => { if (!Array.isArray(results) || results.length === 0) { return null } for (let t of results) { if (Array.isArray(t.resolvers) && t.resolvers.length > 0) { for (let r of t.resolvers) { if (r.clientHandle && r.clientScript && typeof r.clientScript === 'string') { try { const data = (new Function('$param', '$utils', r.clientScript))(param, barcodeUtils) if (data && ruleValidation(data, t.valids) && (!(r.validScript && typeof r.validScript === 'string') || (new Function('$param', '$utils', '$data', r.validScript))(param, barcodeUtils, data))) { return { code: t.code, name: t.name, type: t.bizType, data } } } catch (e) { console.log('客户端处理条码解析错误:' + r.handler, e) } } } } if (t.data) { return { code: t.code, name: t.name, type: t.bizType, data: t.data } } } return null } export default { /** * 条码解析 * @author dhc * @param data {{ * componentId: String, * barcode: String, * warehouseId: Number | null | undefined, * ownerId: Number | null | undefined, * args: Record<String, any> | null | undefined, * }} 请求参数 * * @returns {Promise<{ * code: String, * name: String, * type: String, * data: any, * }>} */ resolver(data) { return new Promise((resolve, reject) => { return lwAxios.action({ url: "commonWmsBarcodeResolver", data }).then(actionResult => { const result = resolveActionResult(data, actionResult) if (result) { resolve(result) } else { reject('解析失败') } }).catch(e => reject(e)) }) } }