'use strict'; /** * 材料调差 - 调差工料 * * @author Mai * @date 2019/1/16 * @version */ function loadUpdateMaterials(newMaterial, fields) { const newMaterials = newMaterial instanceof Array ? newMaterial : [newMaterial]; for (const nm of newMaterials) { const om = _.find(materialBillsData, {id: nm.id}); for (const prop in nm) { if (!fields || fields.indexOf(prop) >= 0) { om[prop] = nm[prop]; } } } } $(document).ready(() => { autoFlashHeight(); const materialSpread = SpreadJsObj.createNewSpread($('#material-spread')[0]); const materialSpreadSetting = { cols: [ {title: '调差类型', colSpan: '1', rowSpan: '2', field: 't_type', hAlign: 0, width: 80, formatter: '@', readOnly: 'readOnly.isEdit', cellType: 'customizeCombo', comboItems: materialType.t_type, cellTypeKey: 1}, {title: '编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 60, formatter: '@', readOnly: 'readOnly.isEdit'}, {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 180, formatter: '@', readOnly: 'readOnly.isEdit'}, {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 60, formatter: '@', readOnly: 'readOnly.isEdit'}, {title: '规格', colSpan: '1', rowSpan: '2', field: 'spec', hAlign: 0, width: 180, formatter: '@', readOnly: 'readOnly.isEdit'}, {title: '工料分类', colSpan: '1', rowSpan: '2', field: 'm_type', hAlign: 0, width: 60, readOnly: 'readOnly.isEdit', cellType: 'customizeCombo', comboItems: materialType.m_type, cellTypeKey: 2}, {title: '本期应耗数量', colSpan: '1', rowSpan: '2', field: 'quantity', hAlign: 2, width: 100, type: 'Number', readOnly: true}, {title: '基准价', colSpan: '1', rowSpan: '2', field: 'basic_price', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.isEdit'}, {title: '基准时间', colSpan: '1', rowSpan: '2', field: 'basic_times', hAlign: 0, width: 60, formatter: '@', readOnly: 'readOnly.isEdit'}, {title: '本期信息价|单价', colSpan: '3|1', rowSpan: '1|1', field: 'msg_tp', hAlign: 2, width: 60, type: 'Number', readOnly: 'readOnly.isEdit'}, {title: '|时间', colSpan: '|1', rowSpan: '|1', field: 'msg_times', hAlign: 0, width: 60, formatter: '@', readOnly: 'readOnly.isEdit'}, {title: '|价差', colSpan: '1', rowSpan: '1|1', field: 'msg_spread', hAlign: 2, width: 60, type: 'Number', readOnly: true, getValue: 'getValue.msg_spread'}, {title: '本期材料调差|上涨幅度(%)', colSpan: '4|1', rowSpan: '1|1', field: 'm_up_risk', hAlign: 2, width: 100, type: 'Number', readOnly: 'readOnly.isEdit'}, {title: '|下跌幅度(%)', colSpan: '|1', rowSpan: '|1', field: 'm_down_risk', hAlign: 2, width: 100, type: 'Number', readOnly: 'readOnly.isEdit'}, {title: '|有效价差', colSpan: '|1', rowSpan: '|1', field: 'm_spread', hAlign: 2, width: 80, type: 'Number', readOnly: true, getValue: 'getValue.m_spread'}, {title: '|调整金额', colSpan: '|1', rowSpan: '1|1', field: 'm_tp', hAlign: 2, width: 80, type: 'Number', readOnly: true, getValue: 'getValue.m_tp'}, {title: '截止上期调差金额', colSpan: '1', rowSpan: '2', field: 'pre_tp', hAlign: 2, width: 120, type: 'Number', readOnly: true}, {title: '备注', colSpan: '1', rowSpan: '2', field: 'remark', hAlign: 0, width: 60, formatter: '@', readOnly: 'readOnly.remark'}, ], emptyRows: 0, headRows: 2, headRowHeight: [32, 32], defaultRowHeight: 30, headerFont: '10pt 微软雅黑', readOnly: readOnly, font: '10pt 微软雅黑', }; const materialBase = { isEdit: function (data) { return materialListData.find(function (item) { return item.mb_id === data.id; }); } } const materialCol = { getValue: { msg_spread: function (data) { return ZhCalc.round(ZhCalc.sub(data.msg_tp, data.basic_price), 2); }, m_spread : function (data) { const msg_spread = materialCol.getValue.msg_spread(data); const cor = msg_spread >= 0 ? ZhCalc.mul(data.basic_price, ZhCalc.div(data.m_up_risk, 100)) : ZhCalc.mul(data.basic_price, ZhCalc.div(data.m_down_risk, 100)); return Math.abs(msg_spread) > Math.abs(cor) ? (msg_spread > 0 ? ZhCalc.round(ZhCalc.sub(msg_spread, cor), 2) : ZhCalc.round(ZhCalc.add(msg_spread, cor), 2)) : 0; }, m_tp: function (data) { return ZhCalc.round(ZhCalc.mul(materialCol.getValue.m_spread(data), data.quantity), 2); } }, readOnly: { isEdit: function (data) { return !(readOnly || materialBase.isEdit(data) === undefined); }, remark: function () { return readOnly; }, }, }; SpreadJsObj.initSpreadSettingEvents(materialSpreadSetting, materialCol); SpreadJsObj.initSheet(materialSpread.getActiveSheet(), materialSpreadSetting); SpreadJsObj.loadSheetData(materialSpread.getActiveSheet(), SpreadJsObj.DataType.Data, materialBillsData); const materialSpreadObj = { refreshActn: function () { const setObjEnable = function (obj, enable) { if (enable) { obj.removeClass('disabled'); } else { obj.addClass('disabled'); } }; const sheet = materialSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); // 还需判断是否已被调差清单调用 setObjEnable($('#del'), !readOnly && select && materialBase.isEdit(select) === undefined); }, add: function () { const sheet = materialSpread.getActiveSheet(); postData(window.location.pathname + '/save', {type: 'add'}, function (result) { if (result) { materialBillsData.push(result); sheet.addRows(materialBillsData.length - 1, 1); SpreadJsObj.reLoadRowData(sheet, materialBillsData.length - 1); sheet.setSelection(materialBillsData.length - 1, 0, 1, 1); materialSpreadObj.refreshActn(); } }); }, del: function () { const sheet = materialSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); console.log(select); postData(window.location.pathname + '/save', {type: 'del', id: select.id}, function (result) { const index = materialBillsData.indexOf(select); materialBillsData.splice(index, 1); sheet.deleteRows(index, 1); SpreadJsObj.reLoadSheetData(materialSpread.getActiveSheet()); const sel = sheet.getSelections(); sheet.setSelection(index > 0 ? index - 1 : 0, sel.length > 0 ? sel[0].col : 0, 1, 1); materialSpreadObj.refreshActn(); }); }, selectionChanged: function (e, info) { materialSpreadObj.refreshActn(); const sel = info.sheet.getSelections()[0]; const col = info.sheet.zh_setting.cols[sel.col]; const data = SpreadJsObj.getSelectObject(info.sheet); materialSpreadObj.setReadOnly(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]; // 未改变值则不提交 const validText = info.editingText ? (typeof(info.editingText) === 'String' ? info.editingText.replace('\n', '') : info.editingText) : null; const orgValue = select[col.field]; if (orgValue == validText || ((!orgValue || orgValue === '') && (validText === ''))) { SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } // 判断部分值是否输入的是数字判断和数据计算 if (col.field === 'basic_price') { if (isNaN(validText)) { toastr.error('不能输入其它非数字类型字符'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } const num = parseFloat(validText); if (num < 0 || !/^\d+(\.\d{1,3})?$/.test(num)) { toastr.error('请输入大于0并且小于3位小数的浮点数'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } } if (col.field === 'msg_tp') { if (isNaN(validText)) { toastr.error('不能输入其它非数字类型字符'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } const num = parseFloat(validText); if (num < 0 || !/^\d+(\.\d{1,3})?$/.test(num)) { toastr.error('请输入大于0并且小于3位小数的浮点数'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } } if (col.field === 'm_up_risk') { // 只能输入正整数 if (isNaN(validText)) { toastr.error('不能输入其它非数字类型字符'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } const num = parseFloat(validText); if (num < 0 || num > 100 || !/^\d+$/.test(num)) { toastr.error('只能输入0-100的正整数'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } } if (col.field === 'm_down_risk') { // 只能输入正整数 if (isNaN(validText)) { toastr.error('不能输入其它非数字类型字符'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } const num = parseFloat(validText); if (num < 0 || num > 100 || !/^\d+$/.test(num)) { toastr.error('只能输入0-100的正整数'); SpreadJsObj.reLoadRowData(info.sheet, info.row); return; } } select[col.field] = validText; // 更新至服务器 postData(window.location.pathname + '/save', { type:'update', updateData: select }, function (result) { SpreadJsObj.reLoadRowData(info.sheet, info.row); }, function () { select[col.field] = orgValue; SpreadJsObj.reLoadRowData(info.sheet, info.row); }); } }, setReadOnly: function(readOnly) { SpreadJsObj.resetFieldReadOnly(materialSpread.getActiveSheet(), 'msg_spread', 'm_spread', 'm_tp', 'pre_tp', readOnly); } }; materialSpreadObj.refreshActn(); materialSpread.bind(spreadNS.Events.SelectionChanged, materialSpreadObj.selectionChanged); if (!readOnly) { $('#add').click(materialSpreadObj.add); $('#del').click(materialSpreadObj.del); materialSpread.bind(spreadNS.Events.EditEnded, materialSpreadObj.editEnded); // 右键菜单 $.contextMenu({ selector: '#material-spread', build: function ($trigger, e) { const target = SpreadJsObj.safeRightClickSelection($trigger, e, materialSpread); return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader; }, items: { 'create': { name: '新增材料', icon: 'fa-sign-in', callback: function (key, opt) { materialSpreadObj.add(materialSpread.getActiveSheet()); }, }, 'delete': { name: '删除材料', icon: 'fa-remove', callback: function (key, opt) { materialSpreadObj.del(materialSpread.getActiveSheet()); }, disabled: function (key, opt) { const sheet = materialSpread.getActiveSheet(); const select = SpreadJsObj.getSelectObject(sheet); materialSpreadObj.refreshActn(); if (!readOnly && select && materialBase.isEdit(select) === undefined) { return false; } else { return true; } } }, } }); } else { SpreadJsObj.forbiddenSpreadContextMenu('#material-spread', materialSpread); } $.subMenu({ menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list', toMenu: '#to-menu', toMiniMenu: '#to-mini-menu', //key: 'stage.compare.memu.1.0.0', 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(); materialSpread.refresh(); } }); });