123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453 |
- let unitOptions = ['m', 'm2', 'm3', 'km', 't', 'kg', '台班', '工日', '昼夜', '元', '项', '处', '个', '件',
- '根', '组', '系统', '台', '套', '株', '丛', '缸', '支', '只', '块', '座', '对', '份', '樘', '攒', '榀']
- let equipmentPurchaseObj = {
- IDMap:{},
- parentMap:{},
- setting:{
- header: [
- {headerName: "编号", headerWidth: 160, dataCode: "code", dataType: "String",formatter: "@",spanRows: [2]},
- {headerName: "设备名称", headerWidth: 200, dataCode: "name", dataType: "String",spanRows: [2]},
- {headerName: "单位", headerWidth: 60, dataCode: "unit", dataType: "String",hAlign: "center",cellType:'comboBox',editable:true,options:unitOptions,spanRows: [2]},
- {headerName: ["设备价格","设备原价"], headerWidth: 160, dataCode: "originalPrice", hAlign: "right", dataType: "Number",validator:'number',spanCols: [4,1]},
- {headerName: ["","设备运杂费"], headerWidth: 160, dataCode: "freight", hAlign: "right", dataType: "Number",validator:'number',spanCols: [0,1]},
- {headerName: ["","备品备件费"], headerWidth: 160, dataCode: "sparePartCost", hAlign: "right", dataType: "Number",validator:'number',spanCols: [0,1]},
- {headerName: ["","单价"], headerWidth: 160, dataCode: "unitPrice", hAlign: "right", dataType: "Number",validator:'number',spanCols: [0,1]},
- {headerName: "数量", headerWidth: 160, dataCode: "quantity", hAlign: "right", dataType: "Number",validator:'number',spanRows: [2]},
- {headerName: "合价", headerWidth: 160, dataCode: "totalPrice", hAlign: "right", dataType: "Number",spanRows: [2]},
- ],
- headRows:2,
- view: {
- lockColumns: ["totalPrice",'unitPrice'],
- rowHeaderWidth:40,
- }
-
- },
- sheet:null,
- initSpread:function () {
- if(this.sheet == null){
- this.spread = SheetDataHelper.createNewSpread($("#equipmentSpread")[0]);
- sheetCommonObj.spreadDefaultStyle(this.spread);
- this.sheet = this.spread.getSheet(0);
- sheetCommonObj.initSheet(this.sheet, this.setting, 0);
- this.sheet.bind(GC.Spread.Sheets.Events.ValueChanged,this.onValueChange);
- this.sheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
- this.sheet.bind(GC.Spread.Sheets.Events.SelectionChanged, function (e,args) {
- args.sheet.repaint();
- equipmentPurchaseObj.checkBtn();
- });
- if (projectReadOnly) {
- sheetCommonObj.disableSpread(this.spread);
- } else {
- this.initRightClick();
- }
- }
- },
- checkBtn:function(){
- let me = equipmentPurchaseObj;
- let selected = me.getSelected();
- let preNode = me.getPreNode(selected);
- let afterNode = me.getAfterNode(selected);
- //工具栏按钮的有效性
- me.validateBtn($('#equipment_upMove'),preNode);
- me.validateBtn($('#equipment_downMove'),afterNode);
- me.validateBtn($('#equipment_upLevel'),selected && selected.ParentID !=='-1');
- me.validateBtn($('#equipment_downLevel'),preNode);
-
- },
- validateBtn:function(btn,validate){
- if(validate){
- btn.removeClass('disabled');
- }else{
- btn.addClass('disabled');
- }
- },
- getTreeData:function(){
- let treeData = [];
- let roots = this.parentMap['-1'];
- let me = this;
- getChildren(roots,treeData);
- return treeData;
-
- function getChildren(nodes,data){
- if(nodes){
- for(let n of nodes){
- data.push(n);
- getChildren(me.parentMap[n.ID],data)
- }
- }
- }
- },
- getSelected:function(){
- let sel = this.sheet.getSelections()[0];
- let row = sel.row == -1 || sel.row == "" ? 0 : sel.row;
- if(this.data && this.data.length>0){
- return this.data[row];
- }
- return null;
- },
- getParentNode:function(node){
- if(node.ParentID === '-1') return null;
- return this.IDMap[node.ParentID];
- },
- //取前兄弟节点
- getPreNode:function(node){
- if(node){
- let nodes = this.parentMap[node.ParentID];
- let index = nodes.indexOf(node);
- return nodes[index-1]
- }
- return null;
- },
- //取后兄弟节点
- getAfterNode:function(node){
- if(node){
- let nodes = this.parentMap[node.ParentID];
- let index = nodes.indexOf(node);
- return nodes[index+1]
- }
- return null;
- },
- //取所有后兄弟节点
- getAllAfterNodes:function(node){
- let brothers = this.parentMap[node.ParentID];
- let index = brothers.indexOf(node);
- if(brothers.length >= index + 2){
- return brothers.slice(index+1);
- }
- return [];
- },
- //插入为最后一个子节点的序号
- getLastChildrenSeq:function(node){
- let seq = 1;
- let children = this.parentMap[node.ID];
- if(children && children.length > 0){
- return children[children.length-1].seq +1
- }
- return seq;
- },
- showData:function(){
- let equipment_purchase = projectObj.project.equipment_purchase;
- this.sourceData = equipment_purchase.datas;
- let data = this.sourceData.equipments;
- this.IDMap = {};
- this.parentMap = {};
- data = _.sortBy(data,'seq');
- for(let d of data){
- let node = ({...d,collapsed:false})
- this.IDMap[node.ID] = node;
- this.parentMap[node.ParentID] ?this.parentMap[node.ParentID].push(node):this.parentMap[node.ParentID]=[node];
- }
- let treeData = this.getTreeData();
- this.data = treeData;
- sheetCommonObj.showTreeData(this.sheet, this.setting,treeData);
- this.checkBtn();
- $('#equipment_total').text(this.sourceData.total);
- },
- onValueChange:function (e,info) {
- let me = equipmentPurchaseObj,row = info.row, col = info.col;
- let dataCode = me.setting.header[col].dataCode;
- let value = info.newValue;
- let equipment = me.data[row];
- if (value&&! sheetCommonObj.checkData(col,me.setting,value)) {
- alert('输入的数据类型不对,请重新输入!');
- return me.showData();
- }
- let data = {doc:{},ID:equipment.ID};
- if(dataCode == 'quantity' || dataCode == 'originalPrice'|| dataCode == 'freight'|| dataCode == 'sparePartCost'){
- value = me.calcTotalPrice(value,dataCode,data.doc,equipment);
- }
- if(equipment[dataCode] == value) return me.showData();
- data.doc[dataCode] = value;
- me.updateEquipments([data]);
- },
- calcTotalPrice:function(newValue=0,dataCode,doc,equipment){
- //设备原价
- let originalPrice = equipment.originalPrice?scMathUtil.roundForObj(equipment.originalPrice,getDecimal('glj.unitPrice')):0;
- //设备运杂费
- let freight = equipment.freight?scMathUtil.roundForObj(equipment.freight,getDecimal('glj.unitPrice')):0;
- //备品备件费
- let sparePartCost = equipment.sparePartCost?scMathUtil.roundForObj(equipment.sparePartCost,getDecimal('glj.quantity')):0;
- let quantity = equipment.quantity?scMathUtil.roundForObj(equipment.quantity,getDecimal('glj.quantity')):0;
-
- let unitPrice = 0;
- if(gljUtil.isDef(doc.originalPrice)) originalPrice = doc.originalPrice;
- if(gljUtil.isDef(doc.freight)) freight = doc.freight;
- if(gljUtil.isDef(doc.sparePartCost)) sparePartCost = doc.sparePartCost;
- if(gljUtil.isDef(doc.quantity)) quantity = doc.quantity;
- if(dataCode === 'quantity') {
- newValue = scMathUtil.roundForObj(newValue,getDecimal('glj.quantity'));
- quantity = newValue;
- }
- if(dataCode === 'originalPrice') {
- newValue = scMathUtil.roundForObj(newValue,getDecimal('glj.unitPrice'));
- originalPrice = newValue;
- }
- if(dataCode === 'freight') {
- newValue = scMathUtil.roundForObj(newValue,getDecimal('glj.unitPrice'));
- freight = newValue;
- }
- if(dataCode === 'sparePartCost') {
- newValue = scMathUtil.roundForObj(newValue,getDecimal('glj.unitPrice'));
- sparePartCost = newValue;
- }
-
- unitPrice = scMathUtil.roundForObj(originalPrice + freight,getDecimal('glj.unitPrice'));
- unitPrice = scMathUtil.roundForObj(unitPrice + sparePartCost,getDecimal('glj.unitPrice'));
- doc.unitPrice = unitPrice;
- doc.totalPrice = scMathUtil.roundForObj(quantity * unitPrice,getDecimal('glj.unitPrice'));
- return newValue;
- },
- //计算序列号,返回要改变的兄弟节点数据
- calcSeq:function(ParentID,seq){
- let data = [];
- let nodes = this.parentMap[ParentID];
- let temSeq = seq+1;
- if(nodes && nodes.length > 0){
- for(let n of nodes){
- if(n.seq >= seq){
- data.push({doc:{seq:temSeq},ID:n.ID})
- temSeq+=1;
- }
- }
- }
- return data;
- },
- onSheetRangeChange:function(e,args){
- let updateMap = {};
- let updateData = []
- let me = equipmentPurchaseObj;
- for(let c of args.changedCells){
- let dataCode = me.setting.header[c.col].dataCode;
- let value= args.sheet.getCell(c.row, c.col).text();
- let equipment = me.data[c.row];
- if (value&&!sheetCommonObj.checkData(c.col,me.setting,value)) {
- alert('输入的数据类型不对,请重新输入!');
- me.showData();
- return ;
- }
- let tem = updateMap[equipment.ID]?updateMap[equipment.ID]:{};
- if(dataCode == 'quantity' || dataCode == 'originalPrice'|| dataCode == 'freight'|| dataCode == 'sparePartCost'){
- value = me.calcTotalPrice(value,dataCode,tem,equipment);
- }
- tem[dataCode] = value;
- updateMap[equipment.ID] = tem;
- }
- for(let ID in updateMap){
- let data = {doc:updateMap[ID],ID:ID};
- updateData.push(data);
- }
- if(updateData.length > 0) me.updateEquipments(updateData);
- },
- newEquipment:function(ParentID='-1',seq=0){
- return {ID:uuid.v1(),ParentID,seq}
- },
- sumTotal: function(updateData){
- let dataMap = _.indexBy(updateData, 'ID');
- let total = 0;
- for(let d of this.data){
- let totalPrice = d.totalPrice?scMathUtil.roundForObj(d.totalPrice,getDecimal('glj.unitPrice')):0;
- let data = dataMap[d.ID];
- if(data && gljUtil.isDef(data.doc.totalPrice))totalPrice = data.doc.totalPrice;
- total =scMathUtil.roundForObj(total + totalPrice,getDecimal('glj.unitPrice'))
- }
- return total;
- },
- //上移
- moveUp:async function(node){
- let preNode = this.getPreNode(node);
- if(preNode){
- let updateData = [];
- updateData.push({doc:{seq:node.seq},ID:preNode.ID});
- updateData.push({doc:{seq:preNode.seq},ID:node.ID});
- await this.updateEquipments(updateData);
- }
- },
- updateEquipments:async function(updateData){
- try {
- $.bootstrapLoading.start();
- let projectID = projectObj.project.ID();
- let total = this.sumTotal(updateData);
- await ajaxPost('/equipmentPurchase/updateEquipments', { projectID, updateData,total });
- for(let data of updateData){
- if(data.type === 'insert'){
- this.sourceData.equipments.push(...data.documents);
- }else{
- let equipment = _.find(this.sourceData.equipments,{ID:data.ID});
- if(equipment){
- Object.assign(equipment,data.doc);
- }
- }
- }
- projectObj.project.equipment_purchase.datas.total = total;
- } catch (error) {
- alert('更新失败,请重试');
- }
- this.showData();
- $.bootstrapLoading.end();
- },
- insertEquipments:async function(equipments){
- try {
- $.bootstrapLoading.start();
- let projectID = projectObj.project.ID();
- await ajaxPost('/equipmentPurchase/insertData', { projectID, equipments });
- this.sourceData.equipments.push(...equipments)
- this.showData();
- } catch (error) {
- alert('插入失败,请重试');
- }
- $.bootstrapLoading.end();
- },
- deleteEquipment:async function(ID){
- try {
- let projectID = projectObj.project.ID();
- await ajaxPost('/equipmentPurchase/deleteEquipment', { projectID, ID });
- _.remove( this.sourceData.equipments,{ID});
- this.showData();
- } catch (error) {
- alert('删除失败,请重试');
- }
- },
- registerInputContextMenuItem:function(){
- const insertEquipmentHtml = `<span>插入 <input id='insert-equipment-number' class="menu-input" type="text" value="1" onfocus="this.select()"> 行</span>`;
- let me = this;
- return sheetCommonObj.registerInputContextMenuItem('insertEquipment', insertEquipmentHtml, 'fa-sign-in', async function () {
- const number = +$('#insert-equipment-number').val();
- if (!number) {
- return;
- }
- const newData = [];
- let row = me.rightClickTarget.row;
- let seq = 0;
- let ParentID = '-1';
- let brotherNodes = [];
- if(row == undefined){//没有选中节点的情况,添加到最后
- brotherNodes = me.parentMap['-1'];
- if(brotherNodes && brotherNodes.length > 0){
- seq = brotherNodes[brotherNodes.length -1].seq;
- }
- }else{
- let node = me.data[row];//选中节点时插入为选中的下一行
- seq = node.seq;
- ParentID = node.ParentID;
- }
- for (let i = 0; i < number; i++) {
- seq+=1;
- newData.push(me.newEquipment(ParentID,seq));
- }
- let updateData = me.calcSeq(ParentID,seq);
- updateData.push({documents:newData,type:'insert'});
- me.updateEquipments(updateData)
- });
- },
- initRightClick: function () {
- let me = this;
- $.contextMenu({
- selector: '#equipmentSpread',
- build: function ($trigger, e) {
- me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, me.spread);
- me.checkBtn();
- return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
- me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
- },
- items: {
- "insert": {
- type: me.registerInputContextMenuItem(),
- disabled: function () {
- return false;
- },
- /* callback: function (key, opt) {
- me.insertEquipments([me.newEquipment()])
- } */
- },
- "delete": {
- name: "删除",
- icon: 'fa-times',
- disabled: function () {
- return me.rightClickTarget.row === undefined;
- },
- callback: function (key, opt) {
- let row = me.rightClickTarget.row;
- me.deleteEquipment(me.data[row].ID);
- //me.preApplyInfoPrice(row);
- }
- }
- }
- });
- },
- }
- $(function () {
- $('#tab_equipment_purchase').on('shown.bs.tab', function (e) {
- sessionStorage.setItem('mainTab', '#tab_equipment_purchase');
- $(e.relatedTarget.hash).removeClass('active');
- equipmentPurchaseObj.initSpread();
- equipmentPurchaseObj.showData();
- })
- //降级
- $('#equipment_downLevel').click(function(){
- let me = equipmentPurchaseObj;
- let selected = me.getSelected();
- if(selected){
- let preNode = me.getPreNode(selected);
- if(preNode){
- let seq = me.getLastChildrenSeq(preNode);
- me.updateEquipments([{doc:{ParentID:preNode.ID,seq},ID:selected.ID}])
- }
- }
- })
- //升级 - 后兄弟节点变成子节点
- $('#equipment_upLevel').click(function(){
- let me = equipmentPurchaseObj;
- let selected = me.getSelected();
- if(selected){
- let parentNode = me.getParentNode(selected);
- if(parentNode){
- let seq = parentNode.seq+1;
- let updateData = me.calcSeq(parentNode.ParentID,seq);
- updateData.push({doc:{ParentID:parentNode.ParentID,seq},ID:selected.ID})
- let brothers = me.getAllAfterNodes(selected);
- let subSeq = 0;
- //后兄弟节点变成子节点
- for(let b of brothers){
- subSeq+=1;
- updateData.push({doc:{ParentID:selected.ID,seq:subSeq},ID:b.ID})
- }
- me.updateEquipments(updateData)
- }
- }
- })
-
- //上移
- $('#equipment_upMove').click(async function (){
- let me = equipmentPurchaseObj;
- let selected = me.getSelected();
- if(selected){
- let sel = me.sheet.getSelections()[0];
- await me.moveUp(selected);
- me.sheet.setSelection(sel.row -1 , sel.col, sel.rowCount, sel.colCount);
- }
- })
- //下移
- $('#equipment_downMove').click(async function(){
- let me = equipmentPurchaseObj;
- let selected = me.getSelected();
- if(selected){
- let sel = me.sheet.getSelections()[0];
- let node = me.getAfterNode(selected);
- if(node){
- await me.moveUp(node);
- me.sheet.setSelection(sel.row +1 , sel.col, sel.rowCount, sel.colCount);
- }
-
- }
- })
- })
|