logwire-wms-ui-test
Version:
运匠科技wms-PDA基础组件库
323 lines (274 loc) • 9.08 kB
JavaScript
/*
* 条码解析解析
* @author: 张文
* @date 2022-07-02
* */
import {common} from "../api/common/common";
import {lwErrMsg} from "../components/ui/ErrorMsg";
import {DateTime} from "luxon";
import {Language} from "./Language";
// 条码工具
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
}
}
/**
* 内部方法:根据验证规则对对象属性进行验证
* @author dhc
* @param {*} data 验证对象
* @param {*} rules 验证规则列表
* @returns {Boolean}
*/
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.importd && !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
}
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
}
/**
* 内部方法:属性操作符验证
* @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
}
export const BarcodeResolve = {
/**
* 设置条码规则到全局变量中
* @author 张文
* @param {Object|Array} data 设置的值
* @param {String} key 需要设置值的key,默认设置顶级,传入值后设置顶级的下级
* @return -
* */
setRule(data, key=''){
let index = 'barcodeResolveRule'
if (key) index+=('.'+key)
window.lwWindowGlobalData.set(index, data)
},
/**
* 获取全局变量中的条码规则
* @author 张文
* @param {String} key 需要获取值的key,默认获取全部,传入值后获取指定key的数据
* @return {Object} 返回获取到的值
* */
getRule(key){
let index = 'barcodeResolveRule'
if (key) index+=('.'+key)
return window.lwWindowGlobalData.get(index) || {}
},
/**
* 初始化规则
* @author 张文
* @param {Array} appCodeList 获取指定app的解析规则
* @return -
* */
asyncInitRule(appCodeList=[]){
return new Promise((PR,PE)=>{
common.commonWmsLoadAllComponentConfig({
appCodeList
}).then(res=>{
let obj = {}
// 判断返回数据是否是数组且有值
if (!Array.isArray(res) || !res.length){
console.error(
'条码解析规则获取失败!接口返回数据不是数组类型或为空。将会导致条码解析无效或异常!!!返回值为:',
res
)
}else {
res.forEach(item => obj[item.componentId] = item)
}
this.setRule(obj)
PR()
}).catch((e)=>PE(e))
})
},
/**
* 使用条码解析规则并解析条码
* @author 张文
* @param {Object} param {componentId-输入框id, barcode-需要解析的内容, ownerId-货主id}
* @return {Object} {success-解析是否成功,barcode-解析前的原始字符,bizType-成功解析的规则,data-解析后的数据对象}
* */
async resolve(param){
const {componentId, barcode, ownerId, createRule} = param
if (!componentId){
lwErrMsg.show(
Language.get('wms_project.pda.utils.BarcodeResolve.qemvmsdn','获取条码解析规则失败,未指定输入框解析ID')
)
return {
success: false,
barcode,
data: {}
}
}
let data = this.getRule(componentId)
if (!data || !Object.keys(data).length){
if (
createRule &&
typeof createRule === 'object' &&
Object.keys(createRule).length
){
try {
data = await common.commonWmsLoadAndInitComponentConfig({
...createRule,
code: componentId
})
this.setRule(data, componentId)
}catch (e){
return {
success: false,
barcode,
data: {}
}
}
}else {
lwErrMsg.show(
Language.get('wms_project.pda.utils.BarcodeResolve.bmkxoyxk','获取条码解析规则失败,未获取到解析规则。输入框解析ID:')+ componentId
)
return {
success: false,
barcode,
data: {}
}
}
}
data.barcodeConfig.typeResolvers.forEach(item=>{
item.resolvers = item.resolvers.filter(inItem=>{
return !inItem.ownerId || (ownerId && inItem.ownerId === ownerId)
})
})
for (let typeResolvers of data.barcodeConfig.typeResolvers) {
// 判断是否存在解析器
if (
!typeResolvers.resolvers ||
!Array.isArray(typeResolvers.resolvers) ||
!typeResolvers.resolvers.length
) continue
for (let resolvers of typeResolvers.resolvers) {
// 判断解析脚本是否合法
if (
!resolvers.clientHandle ||
!resolvers.clientScript ||
typeof resolvers.clientScript !== 'string'
) continue
// 执行解析脚本
const resolveData = (new Function('$param', '$utils', resolvers.clientScript))(param, barcodeUtils)
// 校验是否解析成功,且复核验证要求
if (
resolveData &&
ruleValidation(resolveData, typeResolvers.valids) &&
(
!(resolvers.validScript && typeof resolvers.validScript === 'string') ||
(new Function('$param', '$utils', '$data', resolvers.validScript))(param, barcodeUtils, resolveData)
)
) {
if (!typeResolvers.primaryValid || !typeResolvers.primaryValid.field){
lwErrMsg.show(
Language.get('wms_project.pda.utils.BarcodeResolve.stpryqma','主字段配置有误,请联系管理员重新配置')
)
return {
success: false,
barcode,
data: {}
}
}
const successData = {
...resolveData,
key: resolveData[typeResolvers.primaryValid.field]
}
return {
success: true,
barcode,
bizType: typeResolvers.bizType,
data: successData
}
}
}
}
// 判断是否使用了默认解析
if (data.barcodeConfig.defaultResolve){
return {
success: true,
barcode,
bizType: data.barcodeConfig.defaultBizType,
data: {key: barcode}
}
}
// 走到这就是所有解析规则都没过了且没有使用默认规则
lwErrMsg.show(
Language.get('wms_project.pda.utils.BarcodeResolve.agyiotes','条码解析失败!输入框ID:') + componentId
)
return {
success: false,
barcode,
data: {}
}
}
}