'use strict'; /** * * * @author EllisRan * @date 2022/01/21 * @version */ $(document).ready(() => { $.subMenu({ menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list', toMenu: '#to-menu', toMiniMenu: '#to-mini-menu', key: 'menu.1.0.0', miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1', callback: function (info) { if (info.mini) { $('.panel-title').addClass('fluid'); $('#sub-menu').removeClass('panel-sidebar'); } else { $('.panel-title').removeClass('fluid'); $('#sub-menu').addClass('panel-sidebar'); } autoFlashHeight(); } }); handleFileList(fileList); $('#file-ok').click(function () { const files = Array.from($('#file-modal')[0].files) const valiData = files.map(v => { const ext = v.name.substring(v.name.lastIndexOf('.') + 1) return { size: v.size, ext } }); if (validateFiles(valiData)) { if (files.length) { const formData = new FormData(); files.forEach(file => { formData.append('name', file.name); formData.append('size', file.size); formData.append('file', file); }) postDataWithFile(preUrl + '/file/upload', formData, function (result) { handleFileList(result); $('#file-cancel').click(); }); } } }) function handleFileList(files = []) { $('#file-content').empty(); // const { uncheck, checkNo } = auditConst.status const newFiles = files.map(file => { let showDel = false; if (file.uid === cur_uid) { // if (!curAuditor) { // advance.status === uncheck && cur_uid === advance.uid && (showDel = true) // advance.status === checkNo && cur_uid === advance.uid && (showDel = true) // } else { // curAuditor.audit_id === cur_uid && (showDel = true) // } if (change.status === auditConst.status.checked) { showDel = Boolean(file.extra_upload ) } else { showDel = true } } return {...file, showDel} }) let html = change.filePermission ? `上传附件` : ''; newFiles.forEach((file, idx) => { if (file.showDel) { html += `${idx + 1}${file.filename}${file.username}${moment(file.upload_time).format('YYYY-MM-DD HH:mm:ss')}` } else { html += `${idx + 1}${file.filename}${file.username}${moment(file.upload_time).format('YYYY-MM-DD HH:mm:ss')}` } }) $('#file-content').append(html); } $('#file-content').on('click', 'a', function () { if ($(this).hasClass('file-del')) { const id = $(this).data('id'); postData(preUrl + '/file/delete', {id}, (result) => { handleFileList(result); }) } }); // 回车提交 $('#plan-table input').on('keypress', function () { if(window.event.keyCode === 13) { $(this).blur(); } }); $('#plan-table input').blur(function () { const val_name = $(this).data('name'); let val = _.trim($(this).val()) !== '' ? _.trim($(this).val()) : null; switch(val_name) { case 'code': if(!val) { toastr.error('方案编号不能为空'); $(this).val(change[val_name]); return false; } break; case 'name': if(val && val.length > 100) { toastr.error('名称超过100个字,请缩减名称'); $(this).val(change[val_name]); return false; } break; default: if(val && val.length > 255) { toastr.error('超出字段范围,请缩减'); $(this).val(change[val_name]); return false; } break; } if(change[val_name] !== val) { const _self = $(this); postData(preUrl + '/save', { name: val_name, val}, function (result) { change[val_name] = val; _self.val(change[val_name]); if (val_name === 'code') { $('#change-plan-code').text(change[val_name]); } }, function () { _self.val(change[val_name]); }) } else { $(this).val(change[val_name]); } }); $('#plan-table textarea').blur(function () { const val_name = $(this).data('name'); let val = _.trim($(this).val()) !== '' ? _.trim($(this).val()) : null; if(change[val_name] !== val) { const _self = $(this); postData(preUrl + '/save', { name: val_name, val}, function (result) { change[val_name] = val; _self.val(change[val_name]); }, function () { _self.val(change[val_name]); }) } else { $(this).val(change[val_name]); } }); $('#plan-table select').change(function () { const val_name = $(this).attr('data-name'); let val = _.trim($(this).val()) !== '' ? _.trim($(this).val()) : null; if(change[val_name] !== val) { const _self = $(this); postData(preUrl + '/save', { name: val_name, val}, function (result) { change[val_name] = val; _self.val(change[val_name]); }, function () { _self.val(change[val_name]); }) } else { $(this).val(change[val_name]); } }); const changeSpread = SpreadJsObj.createNewSpread($('#plan-spread')[0]); const changeSpreadSheet = changeSpread.getActiveSheet(); const style1 = new GC.Spread.Sheets.Style(); style1.locked = true; const changeSpreadSetting = { cols: [ {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 110, formatter: '@', readOnly: 'readOnly.isEdit'}, {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 130, formatter: '@', readOnly: 'readOnly.isEdit'}, {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 60, formatter: '@', readOnly: 'readOnly.isEdit', cellType: 'unit', comboItems: changeUnits, comboEdit: true}, {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.isEdit', getValue: 'getValue.unit_price'}, {title: '原设计|数量', colSpan: '2|1', rowSpan: '1|1', field: 'oamount', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.isEdit', getValue: 'getValue.oamount'}, {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'oa_tp', hAlign: 2, width: 80, type: 'Number', readOnly: true, getValue: 'getValue.oa_tp'}, {title: '申请变更增(+)减(-)|数量', colSpan: '2|1', rowSpan: '1|1', field: 'camount', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.isEdit', getValue: 'getValue.camount'}, {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'ca_tp', hAlign: 2, width: 80, type: 'Number', readOnly: true, getValue: 'getValue.ca_tp'}, ], emptyRows: !readOnly ? 3 : 0, headRows: 2, headRowHeight: [25, 25], defaultRowHeight: 21, headerFont: '12px 微软雅黑', font: '12px 微软雅黑', readOnly: readOnly, localCache: { key: 'changes-plan-list-spread', colWidth: true, } }; const changeCol = { getValue: { unit_price: function(data) { return ZhCalc.round(data.unit_price, unitPriceUnit); }, oa_tp: function (data) { return ZhCalc.round(ZhCalc.mul(data.unit_price, data.oamount), totalPriceUnit); }, ca_tp: function (data) { return ZhCalc.round(ZhCalc.mul(data.unit_price, data.camount), totalPriceUnit); }, oamount: function (data) { return ZhCalc.round(data.oamount, findDecimal(data.unit)); }, camount: function (data) { return ZhCalc.round(data.camount, findDecimal(data.unit)); }, }, readOnly: { isEdit: function (data) { return readOnly; }, }, }; const changeSpreadObj = { makeSjsFooter: function () { // 增加汇总行并设为锁定禁止编辑状态 changeSpreadSheet.addRows(changeSpreadSheet.getRowCount(), 1); changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 0, '合计'); changeSpreadSheet.setStyle(changeSpreadSheet.getRowCount() - 1, -1, style1); changeSpreadObj.countSum(); }, countSum: function() { const rowCount = changeSpreadSheet.getRowCount(); let oSum = 0, cSum = 0; for(var i = 0; i < rowCount - 1; i++){ oSum = ZhCalc.add(oSum, changeSpreadSheet.getValue(i, 5)); cSum = ZhCalc.add(cSum, changeSpreadSheet.getValue(i, 7)); } changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 5, oSum !== 0 ? oSum : null); changeSpreadSheet.setValue(changeSpreadSheet.getRowCount() - 1, 7, cSum !== 0 ? cSum : null); }, add: function () { postData(preUrl + '/list/save', {type: 'add'}, function (result) { if (result) { changeList.push(result); changeSpreadSheet.addRows(changeList.length - 1, 1); SpreadJsObj.reLoadRowData(changeSpreadSheet, changeList.length - 1); changeSpreadSheet.setStyle(changeSpreadSheet.getRowCount() - 1, -1, style1); changeSpreadSheet.setSelection(changeList.length - 1, 0, 1, 1); // $('#plan-spread').css('height', `${21*changeList + 100}px`); } }); }, batchAdd: function(num) { postData(preUrl + '/list/save', {type: 'batchadd', num}, function (result) { if (result) { changeList = _.concat(changeList, result); SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList); changeSpreadObj.makeSjsFooter(); } }); }, del: function () { const select = SpreadJsObj.getSelectObject(changeSpreadSheet); const index = changeList.indexOf(select); if (index > -1) { postData(preUrl + '/list/save', {type: 'del', id: select.id}, function (result) { changeList.splice(index, 1); changeSpreadSheet.deleteRows(index, 1); const sel = changeSpreadSheet.getSelections(); changeSpreadSheet.setSelection(0, 0, 1, 1); changeSpreadObj.countSum(); }); } }, selectionChanged: function (e, info) { // const sel = info.sheet.getSelections()[0]; // const col = info.sheet.zh_setting.cols[sel.col]; // // const data = SpreadJsObj.getSelectObject(info.sheet); // if (col && col.field === 'del_list') { // changeSpreadObj.del(); // } }, deletePress: function (sheet) { return; }, editEnded: function (e, info) { if (info.sheet.zh_setting) { const type = SpreadJsObj.getSelectObject(info.sheet) ? 'update' : 'add'; const select = type === 'update' ? SpreadJsObj.getSelectObject(info.sheet) : {unit: ''}; const col = info.sheet.zh_setting.cols[info.col]; // 未改变值则不提交 let validText = is_numeric(info.editingText) ? parseFloat(info.editingText) : (info.editingText ? trimInvalidChar(info.editingText) : ''); const orgValue = type === 'update' ? select[col.field] : ''; if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) { SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } if (col.field === 'oa_tp' || col.field === 'ca_tp') { SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } // 判断部分值是否输入的是数字判断和数据计算 if (col.type === 'Number') { if (isNaN(validText)) { toastr.error('不能输入其它非数字类型字符'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } if (col.field === 'unit_price') { validText = ZhCalc.round(validText, unitPriceUnit); } else { validText = ZhCalc.round(validText, findDecimal(select.unit)) || 0; } } if (col.field === 'unit') { select.camount = ZhCalc.round(select.camount, findDecimal(validText)) || 0; select.oamount = ZhCalc.round(select.oamount, findDecimal(validText)) || 0; } if(col.field === 'camount') { select.spamount = ZhCalc.round(validText, findDecimal(select.unit)) || 0; } select[col.field] = validText; console.log(select, type); delete select.waitingLoading; // 更新至服务器 postData(preUrl + '/list/save', { type, updateData: select }, function (result) { if(type === 'update') { changeList.splice(info.row, 1, select); SpreadJsObj.reLoadRowData(info.sheet, info.row); changeSpreadObj.countSum(); } else { changeList.push(result); changeSpreadSheet.addRows(changeList.length - 1, 1); SpreadJsObj.reLoadRowData(changeSpreadSheet, changeList.length - 1); changeSpreadSheet.setStyle(changeSpreadSheet.getRowCount() - 1, -1, style1); changeSpreadSheet.setSelection(changeList.length - 1, 0, 1, 1); } }, function () { select[col.field] = orgValue; if(col.field === 'camount') { select.spamount = orgValue; } SpreadJsObj.reLoadRowData(info.sheet, info.row); }); } }, clipboardPasted(e, info) { const hint = { cellError: {type: 'error', msg: '粘贴内容超出了表格范围'}, numberExpr: {type: 'error', msg: '不能粘贴其它非数字类型字符'}, }; if (info.sheet.zh_setting) { const sortData = info.sheet.zh_data || []; const range = info.cellRange; const data = []; // if (info.cellRange.row + info.cellRange.rowCount > sortData.length) { // toastMessageUniq(hint.cellError); // // SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData); // SpreadJsObj.reLoadSheetHeader(changeSpreadSheet); // SpreadJsObj.reLoadSheetData(changeSpreadSheet); // changeSpreadObj.makeSjsFooter(); // return; // } // if (sortData.length > 0 && range.col + range.colCount > 8) { // toastMessageUniq(hint.cellError); // SpreadJsObj.reLoadSheetHeader(changeSpreadSheet); // SpreadJsObj.reLoadSheetData(changeSpreadSheet); // changeSpreadObj.makeSjsFooter(); // return; // } for (let iRow = 0; iRow < range.rowCount; iRow++) { let bPaste = true; const curRow = range.row + iRow; // const materialData = JSON.parse(JSON.stringify(sortData[curRow])); const cLData = curRow >= sortData.length ? {unit: ''} : {id: sortData[curRow].id}; const hintRow = range.rowCount > 1 ? curRow : ''; let sameCol = 0; for (let iCol = 0; iCol < range.colCount; iCol++) { const curCol = range.col + iCol; const colSetting = info.sheet.zh_setting.cols[curCol]; if (!colSetting) continue; // cLData[colSetting.field] = trimInvalidChar(info.sheet.getText(curRow, curCol)); let validText = info.sheet.getText(curRow, curCol); validText = is_numeric(validText) ? parseFloat(validText) : (validText ? trimInvalidChar(validText) : ''); const orgValue = curRow >= sortData.length ? '' : sortData[curRow][colSetting.field]; if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) { sameCol++; if (range.colCount === sameCol) { bPaste = false; } continue; } if (colSetting.type === 'Number') { if (isNaN(validText)) { // toastMessageUniq(getPasteHint(hint.numberExpr, hintRow)); toastMessageUniq(hint.numberExpr); bPaste = false; continue; } if (colSetting.field === 'unit_price') { validText = ZhCalc.round(validText, unitPriceUnit); } else { validText = ZhCalc.round(validText, findDecimal(cLData.unit)) || 0; } } let unitdecimal = validText; if (colSetting.field === 'unit') { //粘贴内容要为下拉列表里所有的单位,不然为空 if (changeUnits.indexOf(validText) === -1) { unitdecimal = ''; } cLData.camount = curRow >= sortData.length ? 0 : ZhCalc.round(sortData[curRow].camount, findDecimal(unitdecimal)) || 0; cLData.oamount = curRow >= sortData.length ? 0 : ZhCalc.round(sortData[curRow].oamount, findDecimal(unitdecimal)) || 0; cLData.spamount = curRow >= sortData.length ? 0 : ZhCalc.round(sortData[curRow].camount, findDecimal(unitdecimal)) || 0; } // sortData[curRow][colSetting.field] = validText; if (colSetting.type === 'camount') { cLData.spamount = ZhCalc.round(validText, findDecimal(unitdecimal)) || 0; } cLData[colSetting.field] = validText; } if (bPaste) { data.push(cLData); // rowData.push(curRow); } else { SpreadJsObj.reLoadRowData(info.sheet, curRow); } } if (data.length === 0) { SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount); return; } console.log(data); // 更新至服务器 // postData(preUrl + '/list/save', { type:'paste', updateData: data }, function (result) { // changeList = result; // SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList); // changeSpreadObj.makeSjsFooter(); // }, function () { // SpreadJsObj.reLoadRowData(info.sheet, info.cellRange.row, info.cellRange.rowCount); // return; // }); } }, valueChanged(e, info) { // 防止ctrl+z撤销数据 SpreadJsObj.reLoadRowData(info.sheet, info.row); }, updateOamount: function () { const select = SpreadJsObj.getSelectObject(changeSpreadSheet); console.log(changeSpreadSheet); const index = changeList.indexOf(select); if (index > -1) { const dataSource = listRule.source === 1 ? gclGatherData : dealBillList; const source = _.find(dataSource, function (item) { if (item.b_code === select.code && item.name === select.name) { if (listRule.rule.length > 0) { for(const r of listRule.rule) { if (item[r] !== select[r]) { return false; } } } return true; } return false; }); if (source && source.quantity !== select.oamount) { select.oamount = source.quantity; delete select.waitingLoading; console.log(select); // 更新至服务器 postData(preUrl + '/list/save', { type:'update', updateData: select }, function (result) { changeList.splice(index, 1, select); SpreadJsObj.reLoadRowData(changeSpreadSheet, index); changeSpreadObj.countSum(); }, function () { SpreadJsObj.reLoadRowData(changeSpreadSheet, index); }); } } }, }; let changeListData; let gclGatherData; let dealBillList; const billUrl = window.location.pathname.split('/').slice(0, 4).join('/'); postData(billUrl + '/defaultBills', {}, function (result) { gclGatherModel.loadLedgerData(result.bills); gclGatherModel.loadPosData(result.pos); gclGatherData = gclGatherModel.gatherGclData(); gclGatherData = _.filter(gclGatherData, function (item) { return item.leafXmjs && item.leafXmjs.length !== 0; }); // 数组去重 dealBillList = result.dealBills; // for (const db of gclGatherData) { // const exist_index = dealBillList.findIndex(function (item) { // return item.code === db.code && item.name === db.name && item.unit === db.unit && item.unit_price === db.unit_price; // }); // if (exist_index !== -1) { // dealBillList.splice(exist_index, 1); // } // } // changeListData = gclGatherData.concat(dealBillList); changeListData = gclGatherData; console.log(changeListData, dealBillList); SpreadJsObj.initSpreadSettingEvents(changeSpreadSetting, changeCol); SpreadJsObj.initSheet(changeSpreadSheet, changeSpreadSetting); SpreadJsObj.loadSheetData(changeSpreadSheet, SpreadJsObj.DataType.Data, changeList); changeSpreadObj.makeSjsFooter(); }); if (!readOnly) { $('#add-white-btn').click(changeSpreadObj.add); changeSpread.bind(spreadNS.Events.EditEnded, changeSpreadObj.editEnded); changeSpread.bind(spreadNS.Events.SelectionChanged, changeSpreadObj.selectionChanged); changeSpread.bind(spreadNS.Events.ClipboardPasted, changeSpreadObj.clipboardPasted); changeSpread.bind(spreadNS.Events.ValueChanged, changeSpreadObj.valueChanged); SpreadJsObj.addDeleteBind(changeSpread, changeSpreadObj.deletePress); // 右键菜单 $.contextMenu({ selector: '#plan-spread', build: function ($trigger, e) { const target = SpreadJsObj.safeRightClickSelection($trigger, e, changeSpread); return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader; }, items: { 'updateOamount': { name: '原设计数量读取', icon: '', callback: function (key, opt) { changeSpreadObj.updateOamount(changeSpreadSheet); }, disabled: function (key, opt) { const select = SpreadJsObj.getSelectObject(changeSpreadSheet); const sel = changeSpreadSheet.getSelections()[0]; // console.log(select, sel); if (!readOnly && select && sel.row !== changeSpreadSheet.getRowCount() - 1) { return false; } else { return true; } } }, sprDel: '------------', 'delete': { name: '删除', icon: 'fa-remove', callback: function (key, opt) { changeSpreadObj.del(changeSpreadSheet); }, disabled: function (key, opt) { const select = SpreadJsObj.getSelectObject(changeSpreadSheet); const sel = changeSpreadSheet.getSelections()[0]; // console.log(select, sel); if (!readOnly && select && sel.row !== changeSpreadSheet.getRowCount() - 1) { return false; } else { return true; } } }, } }); $('#shuliangguize').on('show.bs.modal', function () { $('#shuliangguize input[name="data_source"][value="'+ listRule.source +'"]').prop('checked', true); $('#shuliangguize input[name="data_rule"]').prop('checked', false); for(const r of listRule.rule) { $('#shuliangguize input[name="data_rule"][value="' + r +'"]').prop('checked', true); } }); // 设置原设计数量读取 $('#setListRule').click(function () { const rule = []; $('#shuliangguize input[name="data_rule"]:checked').each(function () { rule.push($(this).val()); }); const newListRule = { source: parseInt($('#shuliangguize input[name="data_source"]:checked').val()), rule, }; postData(preUrl + '/list/save', { type: 'list_rule', postData: JSON.stringify(newListRule) }, function (result) { listRule = newListRule; $('#shuliangguize').modal('hide'); }); }) } }); /** * 校验文件大小、格式 * @param {Array} files 文件数组 */ function validateFiles(files) { if (files.length > 10) { toastr.error('至多同时上传10个文件'); return false } return files.every(file => { if (file.size > 1024 * 1024 * 30) { toastr.error('文件大小限制为30MB'); return false } if (whiteList.indexOf('.' + file.ext) === -1) { toastr.error('请上传正确的格式文件'); return false } return true }) } function findDecimal(unit) { let value = precision.other.value; const changeUnits = precision; for (const d in changeUnits) { if (changeUnits[d].unit !== undefined && changeUnits[d].unit === unit) { value = changeUnits[d].value; break; } } return value; } const is_numeric = (value) => { if (typeof(value) === 'object') { return false; } else { return !Number.isNaN(Number(value)) && value.toString().trim() !== ''; } };