import style from '../ReportsManage.less'; import { downloadFileUrl } from '../../api/service/workflow'; const isObject = (obj) => { return Object.prototype.toString.call(obj) === '[object Object]'; }; const isString = (obj) => { return Object.prototype.toString.call(obj) === '[object String]'; }; const isNumber = (num) => { return Object.prototype.toString.call(num) === '[object Number]'; }; const isArray = (arr) => { return Object.prototype.toString.call(arr) === '[object Array]'; }; const hasMoney = (configItems) => { if (!configItems) return false; let _items = configItems.split('|'); return !!_items.find(item => item === '金额'); }; const isSelect = (configItems) => { if (!configItems) return false; let _items = configItems.split('|'); return !!_items.find(item => item === 'renderAsSelect'); }; // options=name1[.value1],name2[.value2],name3[.value3]; const returnOptions = (configItems) => { if (!configItems) return false; let _items = configItems.split('|'); let _options = _items.find(item => item.includes('options=')); if (!_options) return false; return _options.replace('options=', '').split(','); }; const returnRows = (configItems) => { if (!configItems) return 3; let _items = configItems.split('|'); let _options = _items.find(item => item.includes('rows=')); if (!_options) return 3; let _rows = Number(_options.replace('rows=', '')); return !isNaN(_rows) && _rows >= 1 ? _rows : 3; }; const returnCols = (configItems) => { if (!configItems) return 1; let _items = configItems.split('|'); let _options = _items.find(item => item.includes('cols=')); if (!_options) return 1; let _cols = Number(_options.replace('cols=', '')); return !isNaN(_cols) && _cols <= 3 && _cols >= 0 ? _cols : 1; }; /** * @Description: 用来在summary中处理数值的配置 * @Params: 参数描述 * @Date: 2022/8/10 * @Author: ChenLong * */ const returnHandledNumber = (configItems, num) => { // 精度、前缀、后缀、倍率 // $_d|_d%|_d*0.0001|金额|0.00|$_d_sum*0.01*百万 if (isNaN(Number(num))) return '-'; if (!configItems) return num; num = Number(num); let _items = configItems.split('|'); /* let prefix = ''; let suffix = '';*/ let template = '_d'; let precision = 0; let rate = 1; _items.forEach(item => { if (item.match(/_d[^(\*|_sum)]/)) { // 后缀 template = item; } else if (item.match(/^_d\*/)) { // 倍率 // let _rate = item.replace(/_d\*/, ''); // rate = (_rate && isSummary) ? Number(_rate) : 1; // 总结栏计算需要计算倍率,其他不用 // edit by chenlong 2023年2月22日 需求变更,总结栏精度转换导致某些累加不够的情况,数据单位发生了变化,废弃当前做法,新增总结栏的倍率判断 } else if (item.match(/^0\./)) { // 精度 precision = item.replace('0.', '').length; } }); // 可能存在NaN的问题 return _items.includes('金额') ? Number((num * rate).toFixed(precision)).toLocaleString() : (num * rate).toFixed(precision); // 最后用_d%这个带了后缀的模板,将_d用计算后的数字替换掉,就得出带了后缀、单位的数值字符串 }; const returnSummaryNumber = (configItems, num, isSummary) => { // 总结栏配置规则 // $_d_sum*0.01*百万 if (isNaN(Number(num))) return '-'; if (!configItems) return num; num = Number(num); let _items = configItems.split('|'); /* let prefix = ''; let suffix = '';*/ let template = '_d'; let precision = 0; let rate = 1; let combine = '_combine_'; // 连接符 let _prefix = ''; _items.forEach(item => { if (item.match(/_d_sum\*/)) { // 总结栏的倍率 let hasPrefix = item.match(/(\s+)?_d_sum/); _prefix = hasPrefix ? item.split('_d_sum')?.[0] : ''; let _rateStr = item.replace(/_d_sum\*/, ''); let _temp = _rateStr.split('*'); // ['0.01','百万'] let _rate = _temp?.[0]; rate = (_rate && !isNaN(Number(_rate)) && isSummary) ? Number(_rate) : 1; if (isSummary && _temp?.[1]) { template = `_d${combine}${_temp[1]}`; } } }); // 可能存在NaN的问题 let final = _items.includes('金额') ? Number((num * rate).toFixed(precision)).toLocaleString() : (num * rate).toFixed(precision); let _template = template.split(combine); return <> <span className={style.prefixOrSuffix}>{_prefix || ''}</span> {template.replace(/_d(.+)?/, isString(final) ? final : '-')} <span className={style.prefixOrSuffix}>{_template[1] || ''}</span> </>; }; /** * @Description: 返回configItems内配置的默认值、默认模式等等 * @Params: 参数描述 * @Date: 2022/8/12 * @Author: ChenLong * @params: * configItems 报表字段的配置 例如 defaultValue=智慧水务 defaultDateModel=customer|defaultDateValue=2022-01-01,2022-12-31; * keysArray 所需要返回的值的key的集合,比如你需要获取configItems中的’defaultValue‘,那么keysArray=['defaultValue']; * @Returns: * defaultValue 通用参数 默认值 * defaultDateModel 时间参数 默认模式 * defaultDateValue 时间参数 默认时间 * */ const returnDefaultValueOrConfigs = (configItems = '', keysArray = []) => { let _map = {}; let _configItemsArray = configItems.split('|'); keysArray.forEach(key => { _map[key] = _configItemsArray.find(item => item.includes(`${key}=`))?.replace(`${key}=`, ''); }); return _map; }; function downloadFunc(url, name, target = '_self') { const a = document.createElement('a'); a.href = url; a.target = target; a.download = name; a.click(); a.remove(); } /** * @Description: 校验文件的名称是否包含特殊字符 * @Params: {Object: File} file file对象 { special:Boolean } 是否去除/的匹配 * @Date: 2021/12/8 * @Author: ChenLong * @Return {Object} {type: error | success ,content: 提示...} * */ function filenameVerification(file, special) { // 文件名含有特殊字符 提示不能上传 {+,:/?#[]@!$&\\*+;=} // 规则对象(flag) var flag = !special ? new RegExp('[`~!@#$^&*=|{}\':;\',\\[\\]/?~!@#¥&*——|{}【】‘;:”“\'。,、?]') : new RegExp('[`~!@#$^&*=|{}\':;\',[\\]?~!@#¥&*——|{}【】‘;:”“\'。,、?]'); if (flag.test(file.name)) { return { type: 'error', content: `文件名格式错误,请检查文件名是否含有特殊字符${'~!@#$^&*=|{}\':;\',\\[\\]/?~!@#¥&*——|{}【】‘;:”“\'。,、?'}`, }; } return { type: 'success', content: `上传成功!`, }; } function handleFiles(file) { let _filesArr = !file ? [] : file.split(',').filter(item => item); let fileList = []; _filesArr.forEach((item, index) => { if (item && filenameVerification({ name: item }, true).type !== 'error') { // @Tips: 直接过滤掉名字中有异常字符的文件 let _obj = { uid: index + '_' + Math.random(), value: item, name: item.includes('\\') ? item.split('\\').reverse()[0] : item.split('/').reverse()[0], type: 'file', status: 'done', url: `${downloadFileUrl}?filePath=${item}`, sourcePath: item, }; fileList.push(_obj); } }); return fileList } export { isObject, isString, isNumber, hasMoney, isArray, returnHandledNumber, returnSummaryNumber, returnDefaultValueOrConfigs, downloadFunc, filenameVerification, isSelect, returnOptions, returnRows, returnCols, handleFiles, };