tk2312-web/src/so/mrckqklr/mrckqklrmaster/main/Utils.js

273 lines
8.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {toast} from 'nc-lightapp-front';
const EMPTY_FN = function () {
};
/**
* 对象合并 类似Object.assign();
* @returns 第一个参数对象
*/
const apply = function(){
if(!arguments){
throw new ReferenceError("该方法执行时至少传递一个参数对象!");
}
//参数的长度
let length = arguments.length;
//长度是1 直接返回
if(length == 1){
return arguments[0];
}
//源
let target = arguments[0];
//从第二个元素开始 到 最后一个组成sources
let sources = [...arguments].slice(1);
for(let i = 0;i<sources.length;i++){
//第i个参数
let param = sources[i];
Object.keys(param).forEach(key=>{
//param原型上有该对象或者属性
if(Object.prototype.hasOwnProperty.call(param,key)){
target[key] = param[key];
}
})
}
return target;
}
/**
* 加载单据模板
* props
* cfg:{必输项
* pagecode 必输项 参数模板的参数
* },
* callback(fn): 回调
*/
const loadTemplate = function (props, {pagecode,appcode} = cfg) {
return new Promise(resolve=>{
props.createUIDom(
{
pagecode,
appcode
},
(data) => {
resolve({...data});
}
);
})
};
/**
* 加载多语言
* @param {*} props 必输项
* @param {*} cfg:{
* moduleId: 必输项 【应用编码: 例如 38211902 @attention 这里是应用编码多语文件的名称也要以应用编码命名】
* domainName必输项 【领域编码:例如 uapbd、fi、gl等等】
* }
*/
const loadLang = function (props, {moduleId,domainName} = cfg) {
return new Promise((resolve)=>{
//请求多语
props.MultiInit.getMultiLang(
{
moduleId,
domainName,
callback: (data, success, inlt) => {
if (!success){
toast({content: '加载语言包失败', color: 'warning'});
}
resolve({lang:data,inlt});
}
}
);
})
};
/**
* 加载参照 多个参照一块加载
* @param {*} urls
* 示例:[
* {
* url:'uapbd/refer/supplier/SupplierClassTreeRef/index',
* name:'uapbd/refer/supplier/SupplierClassTreeRef/index'
* },
* {
* url:'uapbd/refer/supplier/SupplierClassTreeRef/index',
* name:'uapbd/refer/supplier/SupplierClassTreeRef/index'
* }
* ]
* @returns
*/
const loadRefer = function (urls = []) {
if(!urls || urls.length == 0){
return Promise.resolve(true);
}
let result = {};
//构造
let loads = (urls.filter((refObj,index)=>{
let {url} = refObj;
let jsname = url.includes(".")?url.substring(0, url.length - 3):url;
if(!window[jsname]){
return refObj;
}
})||[]).map((refObj)=>{
return new Promise((resolve,reject)=>{
let {url,name} = refObj;
let jsname = url.includes(".")?url.substring(0, url.length - 3):url;
let script = document.createElement('script');
let suffix = url.includes(".")?'':'.js'
script.src = '../../../../' + url+suffix;
script.type = 'text/javascript';
script.onload = () => {
result[name] = window[jsname].default || EMPTY_FN;
resolve(result);
};
script.onerror = () => {
result[name] = undefined;
reject(result);
};
document.body.appendChild(script);
})
});
//Promise 请求全部参照
return Promise.all(loads);
}
/**
* 请求资源
* @param {*} config
* props, 当前应用对象的props
* pagecode, 页面编码
* appcode, 应用编码
* moduleId, 建议使用应用编码
* domainName, 领域编码
* referObjs = [], 参照请求路径集合
* callback = EMPTY_FN 回调
*/
const loadNCCResource = function (config) {
let {
props,
pagecode,
appcode,
moduleId,
domainName,
referObjs = [],
callback = EMPTY_FN
} = config;
//加载参照
loadRefer(referObjs)
.then(()=>{
return Promise.all([
//加载模板
loadTemplate(props,{pagecode,appcode}),
//加载多语
loadLang(props,{moduleId,domainName})
]);
}).then(res=>{
callback({...res[0],...res[1]});
})
};
const isArray = function(param){
return Object.prototype.toString.call(param).slice(8, -1) === 'Array';
};
const isString = function(param) {
return Object.prototype.toString.call(param).slice(8, -1) === 'String';
};
const isObject = function(param){
return Object.prototype.toString.call(param).slice(8, -1) === 'Object';
};
const transferDataWapper = function(datas, grandsonMap){
(isObject(datas)?[datas]:datas || []).forEach((data)=>{
let {head,body,bodys} = data;
head['bodys'] = apply({},(bodys || body || {}));
data['body'] = apply({},(bodys || body || {}));
data['bodys'] = apply({},(bodys || body || {}));
grandsonMap && (data['grandsonMap'] = apply({}, grandsonMap));
})
return datas;
};
const onTransferItemSelectedWrapper = function( func ){
const fetchDataUnWapper = function(datas){
([datas] || []).forEach((data)=>{
let {head,body,bodys} = data;
data['body'] = apply({},body || head['bodys'] || bodys);
data['bodys'] = apply({},body || head['bodys'] || bodys);
})
return datas;
};
return function(record, isComplete, curActiveIndex,status){
func(fetchDataUnWapper(record), isComplete, curActiveIndex,status);
};
};
const onTransferWrapper = function( {props,fetchList}){
let {ncTabs} = fetchList;
let {tabPanes} = ncTabs;
let tables = (tabPanes || []).map(tabPane=>{
let {transferTable,headIdName,bodyIdName} = tabPane;
let {headTableId,bodyTableId,billType} = transferTable;
return {headTableId,bodyTableId,billType,headPkField:headIdName,bodyPkField:bodyIdName};
});
let data = props.transferTable.getTransferTableSelectedValue();
let records = (tables || []).map(table=>{
let {headTableId,bodyTableId,billType,headPkField,bodyPkField} = table;
let transData = data[headTableId];
let records = (transData || []).map(record=>{
let pk = record[headPkField] ? record[headPkField].value : record.head[headTableId].rows[0].values[headPkField].value
let ts = record["ts"] ? record["ts"].value : record.head[headTableId].rows[0].values["ts"].value
let children = (record.body && bodyTableId && bodyTableId.length>0 && record.body[bodyTableId]) ? (record.body[bodyTableId].rows || []).map(row=>{
return {pk:row.values[bodyPkField].value,ts:row.values["ts"].value}
}):[];
return {pk,ts,children};
});
return {billType,records};
});
return records;
};
//float类型数求和
const FloatAdd = function(arg1,arg2){
var r1,r2,m,s1 = arg1.toString(),s2 = arg2.toString();
try{
r1=s1.split(".")[1].length;
}catch(e){
r1=0
}
try{
r2=s2.split(".")[1].length;
}catch(e){
r2=0
}
m=Math.pow(10,Math.max(r1,r2));
return (arg1*m+arg2*m)/m;
};
//float类型数乘积
const FloatMultiple = function(f1,f2){
var m=0,s1=f1.toString(),s2=f2.toString();
try{
m+=s1.split(".")[1].length;
}catch(e){
}
try{
m+=s2.split(".")[1].length;
}catch(e){
}
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
};
export const Utils = {
loadNCCResource,
loadTemplate,
loadLang,
loadRefer,
apply,
transferDataWapper,
onTransferItemSelectedWrapper,
onTransferWrapper,
FloatAdd,
FloatMultiple
};