'use strict';
/**
*
*
* @author Mai
* @date 2018/4/23
* @version
*/
$(document).ready(function () {
/**
* 判断是否是 加减乘除 符号
* @param value
* @returns {boolean}
*/
const isOperate1 = function (value) {
const operatorString = "+-*/";
return operatorString.indexOf(value) > -1;
};
// 删除规则计算参数按钮是否显示
const refreshDelParamVisible = function () {
if ($('#rule').children().length > 1) {
$('#delParam').show();
} else {
$('#delParam').hide();
}
};
// 合成新增参数的html
const addParamHtml = function (html, param) {
if (!param || param.length === 0) { return; }
html.push('');
html.push(param.text());
html.push('');
};
// 弹窗设置指标计算规则
$('a[name=setRule]').click(function () {
const isOperator = function (value) {
const operatorString = "+-*/()";
return operatorString.indexOf(value) > -1;
};
const splitByOperator = function (expr) {
const exprStack = [];
const result = [];
for(let i = 0, len = expr.length; i < len; i++){
const cur = expr[i];
if(cur !== ' ' ){
exprStack.push(cur);
}
}
let param = '', isParamBefore = false;
while(exprStack.length > 0){
const cur = exprStack.shift();
if (isOperator(cur)) {
if (isParamBefore) {
result.push(param);
param = '';
}
result.push(cur);
isParamBefore = false;
} else {
param = param + cur;
isParamBefore = true;
if (exprStack.length === 0) {
result.push(param);
param = '';
}
}
}
return result;
};
const rule = $(this).attr('value');
const index = this.parentNode.parentNode;
$('#rule').attr('curIndex', index.attributes['index_id'].nodeValue);
$('span', $('#rule')).remove();
const html = [];
const params = splitByOperator(rule);
for (let i = 0, iLen = params.length; i < iLen; i++) {
if (isOperator(params[i])) {
html.push('' + params[i] + '');
} else {
const p = $('option[value='+ params[i] +']:first');
addParamHtml(html, p);
}
}
$('#delParam').before(html.join(''));
refreshDelParamVisible();
$('#set-count').modal('show');
});
// 编辑计算规则,选择要添加的计算参数类型
$('#paramType').change(function () {
const param = this.selectedIndex === 0 ? 'globalParams' : (this.selectedIndex === 1 ? 'nodeParams' : 'calcParams');
$('div[name=param]').hide();
$('#' + param).show();
});
// 编辑计算规则,添加计算参数到规则
$('#addParam').click(function () {
const lastParam = $('#delParam').prev();
const paramType = $('#paramType')[0];
const addParam = function () {
const paramId = paramType.selectedIndex === 0 ? 'globalParams' : (paramType.selectedIndex === 1 ? 'nodeParams' : 'calcParams');
const paramSelect = $('select', $('#' + paramId))[0];
if (paramSelect.children.length > 0 && paramSelect.selectedIndex >= 0) {
const param = paramSelect.children[paramSelect.selectedIndex];
const html = [];
addParamHtml(html, $(param));
$('#delParam').before(html.join(''));
$('#paramAlert').hide();
} else {
$('#paramAlert').text('无选定参数').show();
}
};
if (lastParam && lastParam.length > 0) {
const calcSelect = $('select', $('#calcParams'))[0];
if (isOperate1(lastParam.attr('code'))) {
if (paramType.selectedIndex === 2) {
if (calcSelect.selectedIndex !== 4) {
$('#paramAlert').text('计算式后请输入参数').show();
} else {
addParam();
}
} else {
addParam();
}
} else if (lastParam.attr('code') === '(') {
if (paramType.selectedIndex === 2) {
$('#paramAlert').text('左括号后请输入参数').show();
} else {
addParam();
}
} else if (lastParam.attr('code') === ')') {
if (paramType.selectedIndex === 2) {
if (calcSelect.selectedIndex < 4) {
addParam();
} else {
$('#paramAlert').text('右括号后请输入计算式').show();
}
} else {
$('#paramAlert').text('右括号后请输入计算式').show();
}
} else {
if (paramType.selectedIndex === 2) {
if (calcSelect.selectedIndex === 4) {
$('#paramAlert').text('2个参数之间需要一个计算式').show();
} else {
addParam();
}
} else {
$('#paramAlert').text('2个参数之间需要一个计算式').show();
}
}
// if (!isOperate1(lastParam.attr('code')) && paramType.selectedIndex !== 2) {
// $('#paramAlert').text('2个参数之间需要一个计算式').show();
// } else if (isOperate1(lastParam.attr('code')) && paramType.selectedIndex === 2 ) {
// const paramSelect = $('select', $('#calcParams'));
// if (paramSelect.selectedIndex === 4) {
// addParam();
// } else if (paramSelect.selectedIndex === 5) {
// const leftBracket = $('span[code=(]');
// const rightBracket = $('span[code=)]');
// if (leftBracket.length > rightBracket.length) {
// addParam();
// } else {
// $('#paramAlert').text('添加")"前请先添加"("').show();
// }
// } else {
// $('#paramAlert').text('计算式后只可添加参数').show();
// }
// } else {
// addParam();
// }
} else if (paramType.selectedIndex === 2) {
const paramSelect = $('select', $('#calcParams'));
if (paramSelect.selectedIndex === 4) {
addParam()
} else {
$('#paramAlert').text('计算式前需含有参数').show();
}
} else {
addParam();
}
});
// 编辑计算规则,删除规则中计算参数
$('#delParam').click(function () {
$('#delParam').prev().remove();
refreshDelParamVisible();
});
// 设置指标计算规则
$('#ruleOk').click(function () {
const lastParam = $('#delParam').prev();
const leftBracket = $("span[code='(']").length, rightBracket = $("span[code=')']").length;
if (!lastParam) {
$('#paramAlert').text('未设置计算规则').show();
} else if (isOperate1(lastParam.attr('code'))) {
$('#paramAlert').text('计算式后应添加参数').show();
} else if (lastParam.attr('code') === '(' || leftBracket !== rightBracket) {
$('#paramAlert').text('计算式错误,请检查').show();
} else {
const indexRow = $('tr[index_id=' + $('#rule').attr('curIndex') + ']');
const params = $('span', $('#rule'));
const data = {
id: $('#rule').attr('curIndex'),
rule: '',
calc_rule: '',
parse_rule: '',
};
for (const p of params) {
const code = $(p).attr('code');
const name = $(p).attr('name');
data.rule = data.rule + name;
data.calc_rule = data.calc_rule + code;
data.parse_rule = code === name ? data.parse_rule + code : data.parse_rule + code + '(' + name + ')';
}
postData('/template/setIndexRule', data, function () {
$('a', indexRow).val(data.calc_rule);
$('td[name=rule]', indexRow).text(data.rule);
const aHtml = $('a', indexRow)[0].outerHTML;
$('td[name=parse_rule]', indexRow).empty();
$('td[name=parse_rule]', indexRow).append(data.parse_rule + aHtml);
$('paramAlert').hide();
$('#set-count').modal('hide');
}, function () {
$('#paramAlert').text('提交计算规则失败,请重试').show();
})
}
});
// 指标节点,绑定分项节点
$('#nodeMatchCode').blur(function () {
const self = $(this);
if (self.val() === self.attr('org-value')) { return; }
const nodeId = GetUrlQueryString('id');
postData('/template/updateNodeMatch', {
id: nodeId ? nodeId : 1,
match_key: $(this).val(),
}, function (data) {
self.attr('org-value', data.match_key);
self.attr('title', data.match_type_str);
self.attr('data-original-title', data.match_type_str);;
}, function (data) {
self.val(data.match_key);
self.attr('org-value', data.match_key);
self.attr('title', data.match_type_str);
self.attr('data-original-title', data.match_type_str);;
});
});
// 指标参数,绑定参数取值(分项编号)
$('input[name=nodeParamMatchCode]').blur(function () {
const self = $(this);
if (self.val() === self.attr('org-value')) { return; }
const nodeId = GetUrlQueryString('id');
const paramCode = $(this).parent().parent().prev().attr('code');
postData('/template/updateParamMatch', {
node_id: nodeId ? nodeId : 1,
code: paramCode,
match_key: $(this).val(),
}, function (data) {
self.attr('org-value', data.match_key);
}, function () {
self.val(self.attr('org-value'));
})
});
// 指标参数,绑定参数取值(分项编号)
$('input[name=globalParamMatchCode]').blur(function () {
const self = $(this);
if (self.val() === self.attr('org-value')) { return; }
const nodeId = GetUrlQueryString('id');
const paramCode = $(this).parent().parent().prev().attr('code');
postData('/template/updateParamMatch', {
node_id: 0,
code: paramCode,
match_key: $(this).val(),
}, function (data) {
self.attr('org-value', data.match_key);
}, function () {
self.val(self.attr('org-value'));
})
});
// 指标参数,选择取值类别
$('a[name=paramMatchNum]').click(function () {
const self = $(this);
const newMatchNum = self.attr('value');
const oldMatchNum = self.parent().prev().val();
if (newMatchNum === oldMatchNum) { return; }
const nodeId = GetUrlQueryString('id');
const paramCode = $(this).parent().parent().parent().parent().prev().attr('code');
postData('/template/updateParamMatch', {
node_id: nodeId ? nodeId : 1,
code: paramCode,
match_num: newMatchNum,
}, function (data) {
self.parent().prev().val(data.match_num);
self.parent().prev().text(data.match_num_str);
}, function (data) {
self.parent().prev().val(data.match_num);
self.parent().prev().text(data.match_num_str);
})
});
});