123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506 |
- 'use strict';
- /**
- * 材料调差 - 调差工料
- *
- * @author Mai
- * @date 2019/1/16
- * @version
- */
- $(document).ready(() => {
- autoFlashHeight();
- const materialSpread = SpreadJsObj.createNewSpread($('#material-spread')[0]);
- SpreadJsObj.initSheet(materialSpread.getActiveSheet(), billsSpreadSetting);
- const paySpreadObj = {
- _checkExprValid(expr, invalidParam) {
- if (!expr) return [true, null];
- const param = [];
- let num = '', base = '';
- for (let i = 0, iLen = expr.length; i < iLen; i++) {
- if (/^[\d\.%]+/.test(expr[i])) {
- if (base !== '') {
- param.push({type: 'base', value: base});
- base = '';
- }
- num = num + expr[i];
- } else if (/^[a-z]/.test(expr[i])) {
- if (num !== '') {
- param.push({type: 'num', value: num});
- base = '';
- }
- base = base + expr[i];
- } else if (expr[i] === '(') {
- if (num !== '') {
- param.push({type: 'num', value: num});
- base = '';
- }
- if (base !== '') {
- param.push({type: 'base', value: base});
- base = '';
- }
- param.push({type: 'left', value: '('});
- } else if (expr[i] === ')') {
- if (num !== '') {
- param.push({type: 'num', value: num});
- base = '';
- }
- if (base !== '') {
- param.push({type: 'base', value: base});
- base = '';
- }
- param.push({type: 'right', value: ')'});
- } else if (/^[\+\-*\/]/.test(expr[i])) {
- if (num !== '') {
- param.push({type: 'num', value: num});
- base = '';
- }
- if (base !== '') {
- param.push({type: 'base', value: base});
- base = '';
- }
- param.push({type: 'calc', value: expr[i]});
- } else {
- return [false, '输入的表达式含有非法字符: ' + expr[i]];
- }
- }
- if (num !== '') {
- param.push({type: 'num', value: num});
- base = '';
- }
- if (base !== '') {
- param.push({type: 'base', value: base});
- base = '';
- }
- if (param.length === 0) return true;
- if (param.length > 1) {
- if (param[0].value === '-') {
- param[1].value = '-' + param[1];
- }
- param.unshift();
- }
- const iLen = param.length;
- let iLeftCount = 0, iRightCount = 0;
- for (const [i, p] of param.entries()) {
- if (p.type === 'calc') {
- if (i === 0 || i === iLen - 1)
- return [false, '输入的表达式非法:计算符号' + p.value + '前后应有数字或计算基数'];
- }
- if (p.type === 'num') {
- num = p.value.replace('%', '');
- if (p.value.length - num.length > 1)
- return [false, '输入的表达式非法:' + p.value + '不是一个有效的数字'];
- num = _.toNumber(num);
- if (num === undefined || num === null || _.isNaN(num))
- return [false, '输入的表达式非法:' + p.value + '不是一个有效的数字'];
- if (i > 0) {
- if (param[i - 1].type !== 'calc') {
- return [false, '输入的表达式非法:' + p.value + '前应有运算符'];
- } else if (param[i - 1].value === '/' && num === 0) {
- return [false, '输入的表达式非法:请勿除0'];
- }
- }
- }
- if (p.type === 'base') {
- const baseParam = _.find(calcBase, {code: p.value});
- if (!baseParam)
- return [false, '输入的表达式非法:不存在计算基数' + p.value];
- if (invalidParam && invalidParam.indexOf(p.value) >= 0)
- return [false, '不可使用计算基数' + p.value];
- if (i > 0 && param[i - 1].type === 'calc')
- return [false, '输入的表达式非法:' + p.value + '前应有运算符'];
- }
- if (p.type === 'left') {
- iLeftCount += 1;
- if (i !== 0 && param[i-1].type !== 'calc')
- return [false, '输入的表达式非法:(前应有运算符'];
- }
- if (p.type === 'right') {
- iRightCount += 1;
- if (i !== iLen - 1 && param[i+1].type !== 'calc')
- return [false, '输入的表达式非法:)后应有运算符'];
- if (iRightCount > iLeftCount)
- return [false, '输入的表达式非法:")"前无对应的"("'];
- }
- }
- if (iLeftCount > iRightCount)
- return [false, '输入的表达式非法:"("后无对应的")"'];
- return [true, ''];
- },
- _checkSExpr: function (payNode, text, data) {
- if (!payNode) return [false, '数据错误'];
- const num = text ? _.toNumber(text) : null;
- let expr = text ? (num ? null : text) : null;
- expr = expr ? expr.replace('=', '').toLowerCase(): null;
- const [valid, msg] = this._checkExprValid(expr, ['bqwc', 'ybbqwc']);
- if (!valid) return [valid, msg];
- if (payBase.isStarted(payNode)) {
- return [false, '已经开始计量,请勿修改起扣金额'];
- } else {
- if (stage.order > 1) {
- const value = expr ? payCalc.calculateExpr(expr) : num;
- if (wcPay.pre_tp && value < wcPay.pre_tp)
- return [false, '已进行到第' + stage.order + '期,起扣金额请勿少于本期完成截止上期计量金额' + wcPay.pre_tp];
- data.sprice = num;
- data.sexpr = expr;
- return [true, ''];
- } else {
- data.sprice = num;
- data.sexpr = expr;
- return [true, ''];
- }
- }
- },
- _checkRExpr: function (payNode, text, data) {
- if (!payNode) return [false, '数据错误'];
- const num = text ? _.toNumber(text) : null;
- let expr = text ? (num ? null : text) : null;
- expr = expr ? expr.replace('=', '').toLowerCase(): null;
- const [valid, msg] = this._checkExprValid(expr, ['bqwc', 'ybbqwc']);
- if (!valid) return [valid, msg];
- if (payBase.isStarted(payNode)) {
- if (payNode.pre_finish) return [false, '已达扣款限额,请勿修改'];
- const value = expr ? payCalc.calculateExpr(expr) : num;
- if (payNode.pre_tp && value < payNode.pre_tp) return [false, '截止上期已计量' + payNode.pre_tp + ',扣款限额请勿少于改值'];
- data.rprice = num;
- data.rexpr = expr;
- return [true, ''];
- } else {
- data.rprice = num;
- data.rexpr = expr;
- return [true, ''];
- }
- },
- _checkExpr: function (text, data) {
- if (text) {
- const num = _.toNumber(text);
- if (num) {
- data.tp = num;
- data.expr = null;
- } else {
- const expr = text.replace('=', '').toLowerCase();
- const [valid, msg] = this._checkExprValid(expr);
- if (!valid) return [valid, msg];
- data.expr = expr;
- data.tp = null;
- }
- } else {
- data.tp = null;
- data.expr = null;
- }
- return [true, ''];
- },
- refreshActn: function () {
- const setObjEnable = function (obj, enable) {
- if (enable) {
- obj.removeClass('disabled');
- } else {
- obj.addClass('disabled');
- }
- };
- const sheet = paySpread.getActiveSheet();
- const select = SpreadJsObj.getSelectObject(sheet);
- setObjEnable($('#add'), !readOnly);
- const delValid = payBase.isOld(select)
- ? !payBase.isStarted(select) && payBase.isYB()
- : payBase.isYB() || payBase.isOwner(select);
- setObjEnable($('#del'), !readOnly && select && delValid);
- setObjEnable($('#up-move'), !readOnly && select && !payBase.isSpecial(select) && dealPay.indexOf(select) > 3);
- setObjEnable($('#down-move'), !readOnly && select && !payBase.isSpecial(select) && dealPay.indexOf(select) < dealPay.length - 1);
- },
- add: function () {
- const sheet = billsSpread.getActiveSheet();
- postData(window.location.pathname + '/save', {type: 'add'}, function (result) {
- if (result) {
- dealPay.push(result);
- sheet.addRows(dealPay.length - 1, 1);
- SpreadJsObj.reLoadRowData(sheet, dealPay.length - 1);
- sheet.setSelection(dealPay.length - 1, 0, 1, 1);
- paySpreadObj.refreshActn();
- }
- });
- },
- del: function () {
- const sheet = billsSpread.getActiveSheet();
- const select = SpreadJsObj.getSelectObject(sheet);
- if (payBase.isNonZero(select.tp)) {
- toast('该支付(扣款)项存在数据,如需删除请先清除本期金额!');
- return;
- } else if (payBase.isOld(select)) {
- if (payBase.isStarted(select)) {
- toast('该合同支付项往期已进行计算,不允许删除');
- return;
- }
- }
- postData(window.location.pathname + '/save', {type: 'del', id: select.pid}, function (result) {
- const index = dealPay.indexOf(select);
- dealPay.splice(index, 1);
- sheet.deleteRows(index, 1);
- loadUpdateDealPays(result);
- SpreadJsObj.reLoadSheetData(paySpread.getActiveSheet());
- const sel = sheet.getSelections();
- sheet.setSelection(index > 0 ? index - 1 : 0, sel.length > 0 ? sel[0].col : 0, 1, 1);
- paySpreadObj.refreshActn();
- });
- },
- selectionChanged: function (e, info) {
- paySpreadObj.refreshActn();
- const sel = info.sheet.getSelections()[0];
- const col = info.sheet.zh_setting.cols[sel.col];
- const data = SpreadJsObj.getSelectObject(info.sheet);
- if (col.field === 'tp') {
- $('#expr').val(data.expr).attr('field', 'expr').attr('org', data.expr)
- .attr('readOnly', readOnly|| payBase.isSpecial(data));
- } else if (col.field === 'sprice') {
- $('#expr').val(data.sexpr).attr('field', 'sexpr').attr('org', data.sexpr)
- .attr('readOnly', readOnly|| payCol.readOnly.sprice(data));
- } else if (col.field === 'rprice') {
- $('#expr').val(data.rexpr).attr('field', 'rexpr').attr('org', data.rexpr)
- .attr('readOnly', readOnly|| payCol.readOnly.rprice(data));
- } else {
- $('#expr').val('').attr('readOnly', true);
- }
- },
- editEnded: function (e, info) {
- if (info.sheet.zh_setting) {
- const select = SpreadJsObj.getSelectObject(info.sheet);
- const col = info.sheet.zh_setting.cols[info.col];
- if (col.field === 'minus') {
- return;
- }
- // 未改变值则不提交
- const validText = info.editingText ? info.editingText.replace('\n', '') : null;
- let orgValue;
- if (col.field === 'tp') {
- orgValue = _.toNumber(validText) ? select.tp : select.expr;
- } else if (col.field === 'sprice') {
- orgValue = _.toNumber(validText) ? select.sprice : select.sexpr;
- } else if (col.field === 'rprice') {
- orgValue = _.toNumber(validText) ? select.rexpr : select.rexpr;
- } else {
- orgValue = select[col.field];
- }
- if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) {
- SpreadJsObj.reLoadRowData(info.sheet, info.row);
- return;
- }
- // 获取更新信息
- const data = {
- type: (col.field === 'tp' || col.field === 'name') ? 'stage' : 'info',
- updateData: {}
- };
- // 获取更新数据
- if (col.field === 'tp') {
- data.updateData.pid = select.pid;
- const [valid, msg] = paySpreadObj._checkExpr(validText, data.updateData);
- if (!valid) {
- toastr.warning(msg);
- SpreadJsObj.reLoadRowData(info.sheet, info.row);
- return;
- }
- } else if (col.field === 'name') {
- data.updateData.pid = select.pid;
- data.updateData.name = validText;
- } else {
- data.updateData.id = select.pid;
- if (validText) {
- if (col.field === 'sprice') {
- const [valid, msg] = paySpreadObj._checkSExpr(select, validText, data.updateData);
- if (!valid) {
- toastr.warning(msg);
- SpreadJsObj.reLoadRowData(info.sheet, info.row);
- return;
- }
- } else if (col.field === 'rprice') {
- const [valid, msg] = paySpreadObj._checkRExpr(select, validText, data.updateData);
- if (!valid) {
- toastr.warning(msg);
- SpreadJsObj.reLoadRowData(info.sheet, info.row);
- return;
- }
- } else {
- data.updateData[col.field] = validText;
- }
- } else {
- data.updateData[col.field] = null;
- }
- }
- // 更新至服务器
- postData(window.location.pathname + '/save', data, function (result) {
- loadUpdateDealPays(result, col.field === 'name' ? ['name'] : null);
- SpreadJsObj.reLoadSheetData(paySpread.getActiveSheet());
- }, function () {
- SpreadJsObj.reLoadRowData(info.sheet, info.row);
- });
- }
- },
- buttonClicked: function (e, info) {
- if (info.sheet.zh_setting) {
- const select = SpreadJsObj.getSelectObject(info.sheet);
- const col = info.sheet.zh_setting.cols[info.col];
- if (payCol.readOnly.minus(select)) {
- return;
- }
- if (col.field === 'minus') {
- if (info.sheet.isEditing) {
- info.sheet.endEdit(true);
- }
- // 获取更新数据
- // 获取更新信息
- const data = {
- type: 'info',
- updateData: {id: select.pid},
- };
- data.updateData.minus = info.sheet.getValue(info.row, info.col) || false;
- // 更新至服务器
- postData(window.location.pathname + '/save', data, function (result) {
- loadUpdateDealPays(result);
- SpreadJsObj.reLoadSheetData(paySpread.getActiveSheet());
- });
- }
- }
- },
- editStarting: function (e, info) {
- const col = info.sheet.zh_setting.cols[info.col];
- if (col.field === 'tp') {
- const select = SpreadJsObj.getSelectObject(info.sheet);
- if (select.expr && select.expr !== '') {
- info.sheet.getCell(info.row, info.col).text(select.expr);
- }
- } else if (col.field === 'sprice') {
- const select = SpreadJsObj.getSelectObject(info.sheet);
- if (select.sexpr && select.sexpr !== '') {
- info.sheet.getCell(info.row, info.col).text(select.sexpr);
- }
- } else if (col.field === 'rprice') {
- const select = SpreadJsObj.getSelectObject(info.sheet);
- if (select.rexpr && select.rexpr !== '') {
- info.sheet.getCell(info.row, info.col).text(select.rexpr);
- }
- }
- },
- deletePress: function (sheet) {
- if (sheet.zh_setting && sheet.zh_data) {
- const sel = sheet.getSelections()[0];
- if (!sel) return;
- const col = sheet.zh_setting.cols[sel.col];
- if (col.readOnly === true) { return; }
- if (sel.colCount > 1) {
- toast('请勿同时删除多列数据', 'warning');
- }
- const data = {type: col.field === 'tp' ? 'stage' : 'info', updateData: []};
- for (let iRow = sel.row; iRow < sel.row + sel.rowCount; iRow++) {
- const node = sheet.zh_data[iRow];
- if (node && (node.ptype === 1 || node.ptype === 3)) {
- const updateData = {};
- if (col.field === 'tp') {
- updateData.pid = node.pid;
- updateData.tp = null;
- updateData.expr = null;
- } else {
- updateData.id = node.pid;
- if (col.field === 'sprice') {
- const [valid, msg] = paySpreadObj._checkSExpr(node, null, updateData);
- if (!valid) {
- toastr.warning(msg);
- return;
- }
- } else if (col.field === 'rprice') {
- const [valid, msg] = paySpreadObj._checkRExpr(node, null, updateData);
- if (!valid) {
- toastr.warning(msg);
- return;
- }
- } else {
- updateData[col.field] = null;
- }
- }
- data.updateData.push(updateData);
- }
- }
- if (data.updateData.length > 0) {
- if (data.updateData.length === 1 && sel.rowCount === 1) {
- data.updateData = data.updateData[0];
- }
- postData(window.location.pathname + '/save', data, function (result) {
- loadUpdateDealPays(result, col.field === 'name' ? ['name'] : null);
- SpreadJsObj.reLoadSheetData(paySpread.getActiveSheet());
- })
- }
- }
- },
- clipboardPasted: function (e, info) {
- if (info.sheet.zh_setting && info.sheet.zh_data) {
- const col = info.sheet.zh_setting.cols[info.cellRange.col];
- if (col.readOnly === true) {
- SpreadJsObj.reLoadSheetData(paySpread.getActiveSheet());
- return;
- }
- if (info.cellRange.colCount > 1) {
- toast('请勿同时复制粘贴多列数据', 'warning');
- }
- const sortData = info.sheet.zh_data;
- const data = {type: col.field === 'tp' ? 'stage' : 'info', updateData: []};
- for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) {
- const curRow = info.cellRange.row + iRow;
- const node = sortData[curRow];
- if (node && (node.ptype === 1 || node.ptype === 3)) {
- const validText = info.sheet.getText(curRow, info.cellRange.col).replace('\n', '');
- const updateData = {};
- if (col.field === 'tp') {
- updateData.pid = node.pid;
- const [valid, msg] = paySpreadObj._checkExpr(validText, updateData);
- if (!valid) {
- toastr.warning(msg);
- SpreadJsObj.reLoadSheetData(paySpread.getActiveSheet());
- return;
- }
- } else {
- updateData.id = node.pid;
- if (validText) {
- if (col.field === 'sprice') {
- const [valid, msg] = paySpreadObj._checkSExpr(node, validText, updateData);
- if (!valid) {
- toastr.warning(msg);
- SpreadJsObj.reLoadSheetData(paySpread.getActiveSheet());
- return;
- }
- } else if (col.field === 'rprice') {
- const [valid, msg] = paySpreadObj._checkRExpr(node, validText, updateData);
- if (!valid) {
- toastr.warning(msg);
- SpreadJsObj.reLoadSheetData(paySpread.getActiveSheet());
- return;
- }
- } else {
- updateData[col.field] = validText;
- }
- } else {
- updateData[col.field] = null;
- }
- }
- data.updateData.push(updateData);
- }
- if (data.updateData.length > 0) {
- postData(window.location.pathname + '/save', data, function (result) {
- loadUpdateDealPays(result, col.field === 'name' ? ['name'] : null);
- SpreadJsObj.reLoadSheetData(paySpread.getActiveSheet());
- }, function () {
- SpreadJsObj.reLoadSheetData(paySpread.getActiveSheet());
- });
- }
- }
- }
- },
- };
- });
|