logwire-wms-ui-test
Version:
运匠科技wms-PDA基础组件库
166 lines (159 loc) • 5.67 kB
JavaScript
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))
})
}
}