project_glj_view.js 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067
  1. /**
  2. * Created by zhang on 2018/3/13.
  3. */
  4. projectGljObject={
  5. showTag:'ration',//mixRatio/machine
  6. showMixRatioMark:'',
  7. displayType:filterType.ALL,
  8. mixRatioType: [gljType.CONCRETE, gljType.MORTAR, gljType.MIX_RATIO,gljType.MAIN_MATERIAL],
  9. machineType: [gljType.GENERAL_MACHINE],
  10. projectGljSetting:{
  11. header: [
  12. {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String"},
  13. {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String"},
  14. {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String"},
  15. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  16. {headerName: "类型", headerWidth: 45, dataCode: "short_name", hAlign: "center", dataType: "String"},
  17. {headerName: "总消耗量", headerWidth: 130, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
  18. {headerName: "定额价", headerWidth: 70, dataCode: "basePrice", hAlign: "right", dataType: "Number",decimalField:'glj.unitPrice',validator:"number"},
  19. {headerName: "调整价", headerWidth: 70, dataCode: "adjustPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice"},
  20. {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice",validator:"number"},
  21. {headerName: "是否暂估", headerWidth: 60, dataCode: "is_evaluate", hAlign: "center", dataType: "String",cellType:'checkBox'},
  22. {headerName: "主要材料", headerWidth: 60, dataCode: "is_main_material", hAlign: "center", dataType: "String",cellType:'checkBox'},
  23. {headerName: "供货方式", headerWidth: 80, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
  24. {headerName: "甲供数量", headerWidth: 100, dataCode: "supply_quantity", hAlign: "right", dataType: "Number",validator:"number"},
  25. {headerName: "三材类别", headerWidth: 80, dataCode: "materialType", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:materialComboMap},
  26. {headerName: "三材系数", headerWidth: 100, dataCode: "materialCoe", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:'material'
  27. {headerName: "交货方式", headerWidth: 90, dataCode: "delivery", hAlign: "left", dataType: "String"},
  28. {headerName: "送达地点", headerWidth: 100, dataCode: "delivery_address", hAlign: "left", dataType: "String"},
  29. {headerName: "不调价", headerWidth: 55, dataCode: "is_adjust_price", dataType: "String",cellType: "checkBox"}
  30. ],
  31. view: {
  32. lockColumns: [0,1,2,3,4,5,7]
  33. }
  34. },
  35. projectGljSpread:null,
  36. projectGljSheet:null,
  37. materialTreeSheet:null,
  38. projectGljSheetData:[],
  39. mixRatioSetting:{
  40. header:[
  41. {headerName: "编码", headerWidth: 120, dataCode: "code", dataType: "String"},
  42. {headerName: "名称", headerWidth: 120, dataCode: "name", dataType: "String"},
  43. {headerName: "规格型号", headerWidth: 120, dataCode: "specs", dataType: "String"},
  44. {headerName: "单位", headerWidth: 120, dataCode: "unit", hAlign: "center", dataType: "String"},
  45. {headerName: "类型", headerWidth: 120, dataCode: "short_name", hAlign: "center", dataType: "String"},
  46. {headerName: "定额价", headerWidth: 120, dataCode: "basePrice", hAlign: "right", dataType: "Number",decimalField:'glj.unitPrice',validator:"number"},
  47. {headerName: "调整价", headerWidth: 120, dataCode: "adjustPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice"},
  48. {headerName: "市场价", headerWidth: 120, dataCode: "marketPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice",validator:"number"},
  49. {headerName: "消耗量", headerWidth: 120, dataCode: "consumption", hAlign: "right", dataType: "Number",decimalField:"glj.quantity",validator:"number"}
  50. ],
  51. view: {
  52. lockColumns: [0,1,2,3,4,5,6,7]
  53. }
  54. },
  55. materialTreeSetting:{
  56. "emptyRows":0,
  57. "headRows":1,
  58. "headRowHeight":[21],
  59. "defaultRowHeight": 21,
  60. "treeCol": 0,
  61. "cols":[]
  62. },
  63. materialSetting:{
  64. header:[
  65. {headerName: "编码", headerWidth: 200, dataCode: "code", dataType: "String"},
  66. {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String"},
  67. {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String"},
  68. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  69. {headerName: "定额价", headerWidth: 70, dataCode: "basePrice", hAlign: "right", dataType: "Number",decimalField:'glj.unitPrice',validator:"number"},
  70. {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice",validator:"number"},
  71. {headerName: "总消耗量", headerWidth: 100, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
  72. {headerName: "三材系数", headerWidth: 100, dataCode: "materialCoe", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:'material'
  73. {headerName: "三材量", headerWidth: 100, dataCode: "materialQuantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
  74. {headerName: "三材类别", headerWidth: 80, dataCode: "materialType", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:materialComboMap}
  75. ],
  76. view: {
  77. lockColumns: [0,1,2,3,6,8]
  78. }
  79. },
  80. mixRatioSpread:null,
  81. mixRatioSheet:null,
  82. mixRatioData:[],
  83. usedTenderList:[],
  84. usedUnitPriceInfo:null,
  85. initProjectGljSpread:function () {
  86. if(!this.projectGljSpread){
  87. this.projectGljSpread = SheetDataHelper.createNewSpread($("#project_glj_sheet")[0],2);
  88. }
  89. this.projectGljSpread.bind(GC.Spread.Sheets.Events.RangeChanged, this.onProjectGljRangeChange);
  90. this.initProjectGljSheet();
  91. this.initMaterialTreeSheet();
  92. },
  93. initProjectGljSheet:function () {
  94. this.projectGljSheet = this.projectGljSpread .getSheet(0);
  95. this.initSheet(this.projectGljSheet,this.projectGljSetting);
  96. this.projectGljSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onProjectGljSelectionChange);
  97. this.projectGljSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onProjectGljEditStarting);
  98. this.projectGljSheet.name('projectGljSheet');
  99. },
  100. initMixRatio:function () {
  101. let me = projectGljObject;
  102. if(me.mixRatioSpread==null){
  103. me.initMixRatioSpread();
  104. me.initRightClick();
  105. }
  106. },
  107. initMixRatioSpread:function () {
  108. this.mixRatioSpread = SheetDataHelper.createNewSpread($("#mix_ratio_sheet")[0]);
  109. this.mixRatioSheet = this.mixRatioSpread .getSheet(0);
  110. this.initSheet(this.mixRatioSheet,this.mixRatioSetting);
  111. this.mixRatioSheet.name('mixRatioSheet');
  112. },
  113. initMaterialTreeSheet:function () {
  114. this.materialTreeSheet = this.projectGljSpread.getSheet(1);
  115. this.materialTreeSetting = this.createMaterialTreeSheetSetting();
  116. this.materialTree = cacheTree.createNew(this);
  117. this.materialTreeController = TREE_SHEET_CONTROLLER.createNew(this.materialTree, this.materialTreeSheet, this.materialTreeSetting);
  118. this.materialTreeController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, this.onSelectionChange);
  119. this.materialTreeSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onProjectGljEditStarting);
  120. this.materialTreeSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onProjectGLJValueChange);
  121. this.materialTreeSheet.name('materialTreeSheet');
  122. },
  123. createMaterialTreeSheetSetting:function () {
  124. return sheetCommonObj.transferToTreeSetting(this.materialSetting,this.materialTreeSetting);
  125. },
  126. unitPriceFileInit:function() {
  127. let me = this;
  128. let projectGLJ = projectObj.project.projectGLJ;
  129. let data = projectGLJ.datas;
  130. me.usedTenderList = data.usedTenderList !== undefined ? data.usedTenderList : [];
  131. me.usedUnitPriceInfo = data.constData.usedUnitPriceInfo !== undefined ?
  132. data.constData.usedUnitPriceInfo : {};
  133. $("#current-name").text(me.usedUnitPriceInfo.name);
  134. let usedCount = me.usedTenderList.length <= 0 ? 1 : me.usedTenderList.length;
  135. $("#used-project-count").text(usedCount);
  136. },
  137. getUsedTenderInfo:function() {
  138. return projectGljObject.usedTenderList.join("<br>");
  139. },
  140. showMixRatioData:function () {
  141. let me = this,gljId = null,gljType = null;
  142. let sheet = me.projectGljSpread.getActiveSheet();
  143. let oldSel = me.mixRatioSheet.getSelections()[0];
  144. if(sheet.name() == 'projectGljSheet'){//projectGljSheet/materialSheet 工料机汇总和三材汇总表
  145. let sel = me.projectGljSheet.getSelections()[0];
  146. let srow = sel.row == -1?0:sel.row;
  147. if(me.projectGljSheetData.length>srow){
  148. gljId = me.projectGljSheetData[srow].id;
  149. gljType = me.projectGljSheetData[srow].type;
  150. }
  151. }else if(sheet.name() == 'materialTreeSheet' ){
  152. if(this.materialTree.selected){
  153. gljId = this.materialTree.selected.data.id;
  154. gljType = this.materialTree.selected.data.type;
  155. }
  156. }
  157. if(compositionTypes.indexOf(gljType)==-1){//如果不是有组成物的类型,工料机id设置为空,组成物表设置为空
  158. gljId = null
  159. }
  160. projectObj.project.projectGLJ.getRatioData(gljId,function (data) {
  161. if(gljId !== projectObj.project.projectGLJ.getRatioId){//两个id不一致说明不是最新的请求,不用往下执行。
  162. return;
  163. }
  164. let rationList =[];
  165. for(let glj of data){
  166. rationList.push(me.getMixRatioSheetData(glj)) ;
  167. }
  168. me.mixRatioData = rationList;
  169. me.mixRatioSheet.setRowCount(0);
  170. sheetCommonObj.showData(me.mixRatioSheet, me.mixRatioSetting,me.mixRatioData);
  171. me.mixRatioSheet.setRowCount(me.mixRatioData.length);
  172. me.mixRatioSheet.setSelection(oldSel.row==-1?0:oldSel.row,oldSel.col,oldSel.rowCount,oldSel.colCount);
  173. })
  174. },
  175. getMixRatioSheetData:function (glj) {
  176. let data ={
  177. id:glj.id,
  178. mix_ratio_id:glj.ratio_data.id,
  179. code:glj.code,
  180. name:glj.name,
  181. specs:glj.specs,
  182. unit:glj.unit,
  183. type:glj.type,
  184. short_name:projectObj.project.projectGLJ.getShortNameByID(glj.type),
  185. consumption:glj.ratio_data.consumption,
  186. unit_price:glj.unit_price
  187. };
  188. gljOprObj.setGLJPrice(data,glj);
  189. return data;
  190. },
  191. onProjectGljEditStarting:function (sender, args) {
  192. let me = projectGljObject;
  193. let row = args.row;
  194. let col = args.col;
  195. if(me.projectGljEditChecking(row,col)==false){
  196. args.cancel = true;
  197. }
  198. },
  199. projectGljEditChecking:function (row,col) {//return false表示不能编辑
  200. let me = projectGljObject;
  201. let data = null, setting=null;
  202. let sheet = me.projectGljSpread.getActiveSheet();
  203. if(sheet.name() == 'projectGljSheet'){
  204. data = me.projectGljSheetData[row];
  205. setting = me.projectGljSetting;
  206. }else if(sheet.name() == 'materialTreeSheet'){
  207. data = me.materialTree.selected.data;
  208. setting = me.materialSetting;
  209. }
  210. let dataCode = setting.header[col].dataCode;
  211. let lockColumns = setting.view.lockColumns;
  212. if(lockColumns.indexOf(col)!= -1){
  213. return false;
  214. }
  215. if(dataCode=='is_adjust_price'||dataCode=='is_evaluate'||dataCode=='is_main_material'){
  216. return false;
  217. }
  218. if(dataCode=='basePrice'||dataCode=='marketPrice'||dataCode=='supply'){//有组成物时,市场单价、定额价、供货方式不能修改
  219. if (data.ratio_data && data.ratio_data.length > 0){
  220. return false;
  221. }
  222. if(dataCode=='basePrice'&&data.is_add!=1){//如果不是新增,定额价不可修改。
  223. return false;
  224. }
  225. }
  226. if(dataCode == 'supply_quantity'){
  227. if (data.supply != 1) {// 如果为部分甲供则甲供数量需要可编辑,其它的都不能编辑
  228. return false;
  229. }
  230. }
  231. if(dataCode == 'materialCoe'){//三材类别为空时,三材系数应只读,不允许输入。
  232. if(data.materialType == undefined || data.materialType == null){
  233. return false;
  234. }
  235. }
  236. return true;
  237. },
  238. onSelectionChange:function (){
  239. let me = projectGljObject;
  240. me.showMixRatioData();
  241. me.materialTreeSheet.repaint();
  242. },
  243. onProjectGljSelectionChange:function (sender, args) {
  244. let me = projectGljObject;
  245. let newSel = args.newSelections[0];
  246. let oldSel = args.oldSelections?args.oldSelections[0]:{};
  247. if(newSel.row != oldSel.row){
  248. me.mixRatioSheet.getSelections()[0].row = -1;
  249. me.showMixRatioData();
  250. }
  251. me.projectGljSheet.repaint();
  252. },
  253. onProjectGljRangeChange:function (sender,info) {
  254. let me = projectGljObject;
  255. let changeInfo=[];
  256. let canChange = true;
  257. if(me.projectGljEditChecking(info.row,info.col) == false){
  258. canChange = false;
  259. }else if (info.action == GC.Spread.Sheets.RangeChangedAction.clear) {
  260. info.newValue = null;
  261. me.onProjectGLJValueChange(sender,info);
  262. return ;
  263. }
  264. for(let c of info.changedCells){
  265. let value= info.sheet.getCell(c.row, c.col).text();
  266. changeInfo.push({row:c.row,col:c.col,value:value});
  267. if(me.projectGljEditChecking(c.row,c.col)==false){//如果不能编辑
  268. canChange = false;
  269. }
  270. if (canChange==true&&!me.checkData(c.col,me.projectGljSetting,value)) {
  271. alert('输入的数据类型不对,请重新输入!');
  272. canChange = false;
  273. }
  274. }
  275. if(canChange == false){//恢复原来的值
  276. info.sheetName =="materialTreeSheet"?me.showMaterialTreeData():me.showProjectGljData();
  277. }else if(info.sheetName =="projectGljSheet"){
  278. me.batchUpdatePrice(changeInfo);
  279. }
  280. },
  281. batchUpdatePrice(changeInfo){
  282. let projectGLJ = projectObj.project.projectGLJ;
  283. let me = projectGljObject;
  284. projectGLJ.batchUpdatePrice(changeInfo,function (impactList) {
  285. let selected = me.projectGljSheet.getSelections()[0];
  286. me.showProjectGljData();
  287. me.projectGljSheet.setSelection(selected.row,selected.col,selected.rowCount,selected.colCount);
  288. });
  289. },
  290. showProjectGljData:function () {
  291. this.projectGljSpread.setActiveSheetIndex(0);
  292. let sel = this.projectGljSheet.getSelections()[0];
  293. let oldData = sel.row<this.projectGljSheetData.length?this.projectGljSheetData[sel.row]:'';
  294. let projectGljSheetData = [];
  295. let gljList = projectObj.project.projectGLJ.datas.gljList;
  296. gljList = this.filterProjectGLJ(gljList);
  297. gljList = sortProjectGLJ(gljList);
  298. for(let glj of gljList){
  299. projectGljSheetData.push(this.getSheetDataByGLJ(glj));
  300. }
  301. this.projectGljSheetData = projectGljSheetData;
  302. this.projectGljSheet.setRowCount(0);
  303. sheetCommonObj.showData(this.projectGljSheet, this.projectGljSetting,this.projectGljSheetData);
  304. this.projectGljSheet.setRowCount(this.projectGljSheetData.length);
  305. sel.row = _.findIndex(this.projectGljSheetData,{'id':oldData.id});
  306. this.projectGljSheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
  307. },
  308. showMaterialTreeData:function () {
  309. this.projectGljSpread.setActiveSheetIndex(1);
  310. let sel = this.materialTreeSheet.getSelections()[0];
  311. let oldNodeID = this.materialTree.selected.data.id;
  312. let gljList = projectObj.project.projectGLJ.datas.gljList;
  313. gljList = _.sortByAll(gljList, [ 'code']);
  314. this.createMaterialTree(gljList);
  315. this.materialTreeController.showTreeData();
  316. let newNode = this.materialTree.getNodeByID(oldNodeID);
  317. sel.row = newNode.serialNo();
  318. this.materialTreeSheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
  319. this.materialTreeController.setTreeSelected(this.materialTree.items[sel.row==-1?0:sel.row]);
  320. },
  321. refreshDataSheet:function () {
  322. let me = projectGljObject;
  323. let quantityCol = 5;
  324. if(me.displayType == filterType.FBFX){//分部分项人材机,将“总消耗量”替换显示为“分部分项总消耗量”。
  325. me.projectGljSetting.header[quantityCol].dataCode = 'subdivisionQuantity';
  326. me.projectGljSheet.setValue(0, quantityCol, "分部分项总消耗量", GC.Spread.Sheets.SheetArea.colHeader);
  327. }else if(me.displayType == filterType.TECH) {//措施项目人材机,将“总消耗量”替换显示为“措施项目总消耗量”。
  328. me.projectGljSetting.header[quantityCol].dataCode = 'techQuantity';
  329. me.projectGljSheet.setValue(0, quantityCol, "措施项目总消耗量", GC.Spread.Sheets.SheetArea.colHeader);
  330. }else {
  331. me.projectGljSetting.header[quantityCol].dataCode = 'quantity';
  332. me.projectGljSheet.setValue(0, quantityCol, "总消耗量", GC.Spread.Sheets.SheetArea.colHeader);
  333. }
  334. if(me.displayType == filterType.SCHZ){//三材汇总树节点
  335. me.showMaterialTreeData();
  336. }else {
  337. me.showProjectGljData();
  338. me.showMixRatioData();
  339. }
  340. },
  341. createMaterialTree:function (gljList) {
  342. let me = projectGljObject;
  343. let q_decimal = getDecimal("glj.quantity");
  344. let GC = {id:'GC',name:materialType[materialTypeMap.GC],code:'GC',unit:'t',ParentID:-1,NextSiblingID:'MC'};
  345. let GJ = {id:'GJ',name:materialType[materialTypeMap.GJ],code:'GJ',unit:'t',ParentID:'GC',NextSiblingID:-1};
  346. let MC = {id:'MC',name:materialType[materialTypeMap.MC],code:'MC',unit:'t',ParentID:-1,NextSiblingID:'SN'};
  347. let SN = {id:'SN',name:materialType[materialTypeMap.SN],code:'SN',unit:'m3',ParentID:-1,NextSiblingID:'SZ'};
  348. let SZ = {id:'SZ',name:materialType[materialTypeMap.SZ],code:'BZZ',unit:'千块',ParentID:-1,NextSiblingID:-1};
  349. let rootDatas= [GC,GJ,MC,SN,SZ];
  350. let parentMap = {};
  351. let sumMap = {};
  352. this.materialTree.nodes={},this.materialTree.selected = null,this.materialTree.roots = [],this.materialTree.items=[];
  353. for(let r of rootDatas){
  354. let baseNode = null;
  355. if(r.id == 'GJ'){
  356. baseNode = createMaterialNode(r,parentMap['GC'],null);//钢筋的父节点为钢材
  357. }else {
  358. baseNode = createMaterialNode(r,null,null);
  359. }
  360. parentMap[r.id] = baseNode;
  361. }
  362. for(let g of gljList){
  363. if(g.quantity !== 0 && g.quantity !== '0'){
  364. if(g.materialType){
  365. let tem = me.getMaterialSheetDataByGLJ(g);
  366. if(tem.materialQuantity){
  367. sumMap[g.materialType] = sumMap[g.materialType]?sumMap[g.materialType] + tem.materialQuantity:tem.materialQuantity;
  368. tem.materialQuantity = scMathUtil.roundToString(tem.materialQuantity,q_decimal);//转成string
  369. }
  370. if(g.materialType == materialTypeMap.GC){ //钢材的下一节点是钢筋
  371. createMaterialNode(tem,parentMap['GC'],parentMap['GJ']);
  372. }else {
  373. createMaterialNode(tem,parentMap[materialTypeMap[g.materialType]]);
  374. }
  375. }
  376. }
  377. }
  378. for(let mkey in sumMap){
  379. if(mkey == materialTypeMap.GC && sumMap[materialTypeMap.GJ]){//钢材汇总要加上钢筋的总量
  380. parentMap['GC'].data.materialQuantity = scMathUtil.roundToString(sumMap[mkey]+sumMap[materialTypeMap.GJ],q_decimal);
  381. }else {
  382. parentMap[materialTypeMap[mkey]].data.materialQuantity = scMathUtil.roundToString(sumMap[mkey],q_decimal);
  383. }
  384. }
  385. this.materialTree.sortTreeItems();
  386. function createMaterialNode(data,parent,next) {
  387. let newNode = me.materialTree.addNode(parent, next, data.id);
  388. newNode.data = data;
  389. return newNode;
  390. }
  391. },
  392. getMaterialSheetDataByGLJ:function (glj) {
  393. let q_decimal = getDecimal("glj.quantity");
  394. let m_decimal = getDecimal("material");
  395. let p_decimal = getDecimal("glj.unitPrice");
  396. let projectGLJ = projectObj.project.projectGLJ;
  397. let data ={
  398. id:glj.id,
  399. code:glj.code,
  400. name:glj.name,
  401. specs:glj.specs,
  402. unit:glj.unit,
  403. type:glj.type,
  404. short_name:projectGLJ.getShortNameByID(glj.type),
  405. quantity:scMathUtil.roundToString(glj.quantity,q_decimal),
  406. supply:glj.supply,
  407. supply_quantity:glj.supply_quantity,
  408. materialType:glj.materialType,
  409. delivery:glj.delivery,
  410. delivery_address:glj.delivery_address,
  411. is_adjust_price:glj.is_adjust_price,
  412. ratio_data:glj.ratio_data,
  413. is_add:glj.unit_price.is_add,
  414. bgColour:'white'
  415. };
  416. if(glj.materialCoe){
  417. data.materialCoe = scMathUtil.roundForObj(glj.materialCoe,m_decimal);
  418. //data.materialCoe = scMathUtil.roundToString(glj.materialCoe,m_decimal);
  419. data.materialQuantity = scMathUtil.roundForObj(glj.materialCoe * glj.quantity,q_decimal);//还要做汇总,汇总完再转成string
  420. }
  421. gljOprObj.setGLJPrice(data,glj);
  422. data.basePrice = scMathUtil.roundToString(data.basePrice,p_decimal);
  423. data.marketPrice = scMathUtil.roundToString(data.marketPrice,p_decimal);
  424. return data;
  425. },
  426. filterProjectGLJ:function (gljList) {
  427. let me = projectGljObject;
  428. if(gljList.length>0){
  429. gljList = _.filter(gljList,function (item) {
  430. return me.displayTypeFilter(item);
  431. });
  432. }
  433. return gljList;
  434. },
  435. displayTypeFilter:function (item) {
  436. let me = this;
  437. if(item.quantity !== 0 && item.quantity !== '0'){//过滤掉消耗量为0的工料机
  438. if(me.displayType == filterType.ALL){//所有工料机
  439. return true;
  440. }else if(filterTypeArray.indexOf(me.displayType) != -1){//人工、材料、机械、主材、设备
  441. let typeString = item.type+"";
  442. return typeString.startsWith(me.displayType);
  443. }else if(me.displayType == filterType.FBFX){//“分部分项总消耗量”≠0的工料机行
  444. return item.subdivisionQuantity !== 0 && item.subdivisionQuantity !== '0';
  445. }else if(me.displayType == filterType.TECH){//筛选“措施项目总消耗量”≠0的工料机行
  446. return item.techQuantity !== 0 && item.techQuantity !== '0';
  447. }else if(me.displayType == filterType.JGCL){//筛选“供货方式”=“完全甲供”或“部分甲供”的工料机行
  448. return item.supply == supplyType.WQJG || item.supply == supplyType.BFJG;
  449. }else if(me.displayType == filterType.ZGCL){//筛选“是否暂估”=“是”的工料机行。
  450. return item.is_evaluate == 1;
  451. }else if(me.displayType == filterType.ZYCL){//筛选“主要材料”=“是”的工料机行。
  452. return item.is_main_material == 1;
  453. }
  454. }
  455. return false;
  456. },
  457. getSheetDataByGLJ:function (glj) {
  458. let projectGLJ = projectObj.project.projectGLJ;
  459. let materialIdList = projectGLJ.datas.constData.materialIdList;
  460. let data ={
  461. id:glj.id,
  462. code:glj.code,
  463. name:glj.name,
  464. specs:glj.specs,
  465. unit:glj.unit,
  466. type:glj.type,
  467. short_name:projectGLJ.getShortNameByID(glj.type),
  468. quantity:glj.quantity,
  469. supply:glj.supply,
  470. supply_quantity:glj.supply_quantity,
  471. materialType:glj.materialType,
  472. materialCoe:glj.materialCoe,
  473. delivery:glj.delivery,
  474. delivery_address:glj.delivery_address,
  475. is_adjust_price:glj.is_adjust_price,
  476. ratio_data:glj.ratio_data,
  477. is_add:glj.unit_price.is_add,
  478. bgColour:'white',
  479. techQuantity:glj.techQuantity,
  480. subdivisionQuantity:glj.subdivisionQuantity
  481. };
  482. gljOprObj.setGLJPrice(data,glj);
  483. data.is_main_material = glj.is_main_material == 1?1:0;
  484. //供货方式为完全甲供时设置甲供数量为总消耗量
  485. if (data.supply == 2) {
  486. data.supply_quantity = glj.quantity;
  487. }
  488. // 只有材料才显示是否暂估
  489. if (materialIdList.indexOf(glj.type) >= 0) {
  490. data.is_evaluate = glj.is_evaluate;
  491. }
  492. if(glj.materialCoe !== null && glj.materialCoe !==undefined){
  493. data.materialCoe = scMathUtil.roundForObj(glj.materialCoe,getDecimal("material"));
  494. }
  495. //bgColour
  496. if(data.basePrice == data.marketPrice){//如果定额价等于市场价时,改底色。 优先度低于有组成物时的底色
  497. data.bgColour = "#C4CAFB";
  498. }
  499. if (notEditType.indexOf(glj.type) >= 0) {
  500. if (data.ratio_data && data.ratio_data.length > 0){//有组成物时
  501. //设置底色
  502. data.bgColour = "#E0E0E0";
  503. }
  504. }
  505. return data;
  506. },
  507. refreshProjectGljRow:function (row) {
  508. let me = projectGljObject;
  509. let rowData = me.projectGljSheetData[row];
  510. let glj = projectObj.project.projectGLJ.getByID(rowData.id);
  511. let newRow = null;
  512. if(glj){
  513. newRow = me.getSheetDataByGLJ(glj);
  514. }
  515. if(me.displayTypeFilter(newRow) == true){
  516. me.projectGljSheetData[row] = newRow;
  517. sheetCommonObj.showRowData(this.projectGljSheet, this.projectGljSetting,row,this.projectGljSheetData);
  518. }else {
  519. me.projectGljSheetData.splice(row,1);
  520. me.projectGljSheet.deleteRows(row,1);
  521. me.showMixRatioData();
  522. }
  523. //me.projectGljSheetData[row] = me.getSheetDataByGLJ(glj);
  524. },
  525. initSheet: function (sheet,setting) {
  526. var me = this;
  527. sheetCommonObj.initSheet(sheet, setting, 30);
  528. sheet.bind(GC.Spread.Sheets.Events.ValueChanged, me.onSheetValueChange);
  529. },
  530. onSheetValueChange:function (e,info) {
  531. let me = projectGljObject;
  532. if(info.sheetName=='projectGljSheet'){
  533. me.onProjectGLJValueChange(e,info);
  534. }else if(info.sheetName == 'mixRatioSheet'){
  535. me.onMixRatioValueChange(e,info);
  536. }
  537. },
  538. onMixRatioValueChange:function (e,info){
  539. let composition = projectObj.project.composition;
  540. let me = projectGljObject,row = info.row, col = info.col;
  541. let dataCode = me.mixRatioSetting.header[col].dataCode;
  542. let recode = me.mixRatioData[row];
  543. let value = info.newValue;
  544. let parentSheet = me.projectGljSpread.getActiveSheet();//三材汇总表和工料机汇总表
  545. if (!me.checkData(col,me.mixRatioSetting,value)) {
  546. alert('输入的数据类型不对,请重新输入!');
  547. me.mixRatioSheet.setValue(row, col, info.oldValue);
  548. return false;
  549. }
  550. value = scMathUtil.roundToString(value,getDecimal("glj.quantity"));
  551. let [parentMarketPrice, parentBasePrice] = me.getCompositionSumPrice('modify', row, value);
  552. let updateData ={id: recode.mix_ratio_id, field: 'mix_ratio.' + dataCode, value: value, market_price: parentMarketPrice, base_price: parentBasePrice};
  553. let prow = parentSheet.getActiveRowIndex();//取父机械或组成物的下标
  554. let prowData = parentSheet.name() == 'projectGljSheet'?me.projectGljSheetData[prow]:me.materialTree.items[prow].data;
  555. composition.updateConsumption(updateData,recode,prowData.id,function (sid) {
  556. /* if(parentSheet.name() == 'projectGljSheet'){ 之前是单行刷新,父工料机与组成物对应的工料机分开刷,发现这样比整个刷新慢所以先整个刷新,当以后数据量大的时候再测试
  557. me.refreshProjectGljRowByID(sid);
  558. }*/
  559. projectObj.project.projectGLJ.calcQuantity();
  560. me.refreshParentData(prow,prowData.id,sid);
  561. });
  562. },
  563. refreshParentData:function (row,pid,sid) {
  564. let me = this;
  565. let sheet = me.projectGljSpread.getActiveSheet();
  566. let parantData = null;
  567. if(sheet.name() == 'projectGljSheet'){
  568. me.showProjectGljData();// me.refreshProjectGljRow(row) 这里原来是分开刷新的,现在整个统一刷新,先留着
  569. //parantData = _.find(); //me.projectGljSheetData[row];
  570. }else {
  571. me.showMaterialTreeData();
  572. //parantData = me.materialTree.items[row].data;
  573. }
  574. let pglj = _.find(projectObj.project.projectGLJ.datas.gljList,{'id':pid});
  575. parantData = pglj?me.getSheetDataByGLJ(pglj):null;
  576. //projectObj.project.projectGLJ.datas.gljList
  577. // 更新组成物缓存
  578. projectObj.project.composition.loadData();
  579. //先查找使用了父项目工料机的定额工料机
  580. let updateNodes=[];
  581. let ration_gljs = _.filter(projectObj.project.ration_glj.datas,{'projectGLJID':pid});
  582. for(let rg of ration_gljs){
  583. let node = projectObj.project.mainTree.getNodeByID(rg.rationID);
  584. if(node){
  585. updateNodes.push(node);
  586. }
  587. }
  588. //或者是使用了父项目工料机的工料机类型的定额
  589. let rations = _.filter(projectObj.project.Ration.datas,{'type':3,'projectGLJID':pid});
  590. for(let r of rations){
  591. let r_node = projectObj.project.mainTree.getNodeByID(r.ID);
  592. if(r_node){
  593. r_node.data.marketUnitFee = parantData?parantData.marketPrice:'';//parentMarketPrice;//这里用显示的价格
  594. updateNodes.push(r_node);
  595. }
  596. }
  597. if(sid){
  598. let subRations = calcTools.getRationsByProjectGLJ(sid);
  599. updateNodes = updateNodes.concat(subRations);
  600. }
  601. if(updateNodes.length>0){
  602. projectObj.project.calcProgram.calcRationsAndSave(updateNodes,function () {
  603. projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
  604. });
  605. }
  606. gljOprObj.refreshView();
  607. },
  608. deleteMixRatio:function (row) {
  609. let me = this, deleteRecode = me.mixRatioData[row];
  610. let consumption = deleteRecode.consumption;
  611. let [parentMarketPrice, parentBasePrice] = me.getCompositionSumPrice('delete', row);
  612. let parentSheet = me.projectGljSpread.getActiveSheet();//三材汇总表和工料机汇总表
  613. let prow= parentSheet.getActiveRowIndex();//取父机械或组成物的下标
  614. let prowData = parentSheet.name() == 'projectGljSheet'?me.projectGljSheetData[prow]:me.materialTree.items[prow].data;
  615. let updateData = {id: deleteRecode.mix_ratio_id, field: 'mix_ratio.consumption' , value: 0, market_price: parentMarketPrice, base_price: parentBasePrice};
  616. projectObj.project.composition.deleteComposition(updateData,deleteRecode,prowData.id,function () {
  617. me.refreshParentData(prow,prowData.id);
  618. me.mixRatioSheet.deleteRows(row,1);
  619. });
  620. },
  621. getCompositionSumPrice : function(scene, affectRow, newValue = 0) {
  622. let me = this;
  623. let parentMarketPrice = 0;
  624. let parentBasePrice = 0;
  625. for(let i = 0;i < me.mixRatioData.length;i++){
  626. let ratio = me.mixRatioData[i];
  627. let marketPrice = ratio.unit_price.marketPrice;
  628. let basePrice = ratio.unit_price.base_price;
  629. // 如果是删除则忽略即将被删除的行数据
  630. if (scene === 'delete' && affectRow === i) {
  631. continue;
  632. }
  633. let consumption = i === affectRow ? newValue : ratio.consumption;
  634. parentMarketPrice += operationWithRound(consumption,marketPrice,"glj.unitPrice","*");
  635. parentBasePrice += operationWithRound(consumption,basePrice,"glj.unitPrice","*");
  636. }
  637. parentMarketPrice = parentMarketPrice.toDecimal(getDecimal("glj.unitPrice"));
  638. parentBasePrice = parentBasePrice.toDecimal(getDecimal("glj.unitPrice"));
  639. return [parentMarketPrice, parentBasePrice];
  640. },
  641. onProjectGLJValueChange:function (e,info) {//me.projectGljSetting
  642. let projectGLJ = projectObj.project.projectGLJ;
  643. let me = projectGljObject,row = info.row, col = info.col;
  644. let setting = info.sheetName =="materialTreeSheet"?me.materialSetting:me.projectGljSetting;
  645. let dataCode = setting.header[col].dataCode;
  646. let recode = info.sheetName =="materialTreeSheet"?me.materialTree.selected.data:me.projectGljSheetData[row];
  647. let value = info.newValue;
  648. if(info.newValue === undefined ){
  649. return;
  650. }
  651. if (value&&!me.checkData(col,setting,value)) {
  652. setTimeout(function () {//为了不与click事件冲突
  653. alert('输入的数据类型不对,请重新输入!');
  654. },200);
  655. info.sheetName =="materialTreeSheet"?me.materialTreeController.refreshTreeNode([me.materialTree.selected]):me.refreshProjectGljRow(row);
  656. return ;
  657. }
  658. let callback=function (impactList) {
  659. info.sheet.suspendPaint();
  660. info.sheet.suspendEvent();
  661. if(info.sheetName =="materialTreeSheet"){
  662. me.showMaterialTreeData();
  663. }else {
  664. me.refreshProjectGljRow(row);
  665. for(let g of impactList){
  666. me.refreshProjectGljRowByID(g.id,row);
  667. }
  668. }
  669. info.sheet.resumeEvent();
  670. info.sheet.resumePaint();
  671. if (dataCode === 'supply' || dataCode === 'supply_quantity'){ // basePrice、marketPrice 有自己的计算代码,无需走这里重复计算
  672. let rations = calcTools.getRationsByProjectGLJ(recode.id);
  673. projectObj.project.calcProgram.calcNodesAndSave(rations, function () {
  674. projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
  675. });
  676. }
  677. gljOprObj.refreshView();
  678. };
  679. if(dataCode=='basePrice'||dataCode=='marketPrice'){
  680. value= scMathUtil.roundForObj(value,getDecimal('glj.unitPrice'));//修改市场价和修改定额价时需要重新记算很多受影响的树节点,现在改成与定字额工料机那里调相同的方法。
  681. let editField = dataCode === 'basePrice'?"base_price":"market_price";
  682. projectObj.project.projectGLJ.updatePrice(recode,editField,value,'pg',callback);
  683. }else {
  684. let extend = {};
  685. // 如果是供货方式则需要处理数据
  686. if (dataCode === 'supply') {
  687. extend.supply_quantity = me.getSupplyQuantity(value, recode.quantity);
  688. }
  689. if(dataCode === 'supply_quantity'){//修改数量需做4舍5入
  690. value= scMathUtil.roundForObj(value,getDecimal('glj.quantity'));
  691. }
  692. if(dataCode === 'is_evaluate'||dataCode === 'is_adjust_price'||dataCode === 'is_main_material'){
  693. if(value == true){
  694. value = 1;
  695. }else if(value == false){
  696. value = 0;
  697. }
  698. }
  699. if(dataCode === 'materialType' && value == null){//删除三材类别时,清空三材系数
  700. extend.materialCoe = null;
  701. }
  702. if(dataCode == 'materialCoe'){
  703. value = scMathUtil.roundForObj(value,getDecimal("material"));
  704. }
  705. extend = Object.keys(extend).length > 0 ? JSON.stringify(extend) : '';
  706. if(recode[dataCode] == value) return;
  707. let updateData = {id: recode.id, field: dataCode, value: value, extend: extend};
  708. projectGLJ.pGljUpdate(updateData,callback);
  709. };
  710. },
  711. refreshProjectGljRowByID:function (ID,row) {//row 可以不传,如果row 和 index 相等就不刷新
  712. let me = this;
  713. let index = _.findIndex(me.projectGljSheetData, { 'id': ID});
  714. if(index>=0&&index != row){
  715. me.refreshProjectGljRow(index);
  716. }
  717. },
  718. getSupplyQuantity : function(supplyType, quantity) {
  719. // 自行采购和甲定乙供则把甲供数量设置为0,其余情况则设置为当前总消耗量
  720. let supplyQuantity = supplyType == 0 || supplyType == 3 ? 0 : quantity;
  721. supplyQuantity = parseFloat(supplyQuantity);
  722. return supplyQuantity;
  723. },
  724. checkData : function(col,setting, value) {
  725. let result = true;
  726. let validator = setting.header[col].validator !== undefined ? setting.header[col].validator : null;
  727. if (validator === null) {
  728. return result;
  729. }
  730. switch (validator) {
  731. case 'number':
  732. let regular = /^\d+(\.\d+)?$/;
  733. result = regular.test(value);
  734. break;
  735. case 'boolean':
  736. let booleanValue = [true, false];
  737. result = booleanValue.indexOf(value) >= 0;
  738. break;
  739. }
  740. return result;
  741. },
  742. initRightClick : function() {
  743. let activeSheet = this.mixRatioSheet;
  744. let me = this;
  745. $.contextMenu({
  746. selector: '#mix_ratio_sheet',
  747. build: function ($trigger, e) {
  748. me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, me.mixRatioSpread);
  749. return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
  750. me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
  751. },
  752. items: {
  753. "deleteMixRatio": {
  754. name: "删除",
  755. icon: 'fa-trash-o',
  756. disabled: function () {
  757. return me.rightClickTarget.row === undefined;
  758. },
  759. callback: function (key, opt) {
  760. let row = me.rightClickTarget.row;
  761. me.deleteMixRatio(row);
  762. }
  763. },
  764. "addMixRatio":{
  765. name: '添加',
  766. icon: 'fa-sign-in',
  767. disabled: function () {
  768. return me.rightClickTarget.row === undefined;
  769. },
  770. callback: function (key, opt) {
  771. let row = me.rightClickTarget.row;
  772. console.log(row);
  773. }
  774. }
  775. }
  776. });
  777. },
  778. changeFileCallback:function(){
  779. projectGljObject.unitPriceFileInit();
  780. projectGljObject.refreshDataSheet();
  781. gljOprObj.refreshView();
  782. projectObj.project.calcProgram.calcAllNodesAndSave();
  783. if(socketObject.roomInfo){
  784. let data ={
  785. projectID:projectObj.project.ID(),
  786. oldRoom:socketObject.roomInfo.unitFile,
  787. newRoom:socketObject.getUnitFileRoomID(),
  788. name:'unitFile'
  789. };
  790. socket.emit('changeNewRoom',data);
  791. socketObject.roomInfo.unitFile = socketObject.getUnitFileRoomID();
  792. }
  793. },
  794. calcPartASupplyFeeByProjectGLJs: function (projectGLJsArr) {
  795. for (let pGLJ of projectGLJsArr){
  796. if (pGLJ.supply == supplyType.BFJG){
  797. let rations = calcTools.getRationsByProjectGLJ(pGLJ.id);
  798. projectObj.project.calcProgram.calcNodesAndSave(rations, function () {
  799. projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
  800. });
  801. }
  802. }
  803. },
  804. checkUnitFileName:function (name,callback) {
  805. let projectGLJ = projectObj.project.projectGLJ;
  806. projectGLJ.checkUnitFileName(name,function (data) {
  807. if(data){
  808. $("#save-as-tips").text('已存在同名单价文件').show();
  809. $('#save-as-confirm').attr("disabled","disabled");
  810. }else {
  811. $("#save-as-tips").hide();
  812. $('#save-as-confirm').removeAttr("disabled");
  813. if(callback){
  814. callback();
  815. }
  816. }
  817. });
  818. }
  819. };
  820. function getProjectResizeEles() {
  821. let pojGljResizeEles = {};
  822. pojGljResizeEles.id = '#project-glj-main';
  823. pojGljResizeEles.resize = $('#project-glj-main').find('.resize');
  824. pojGljResizeEles.nearElement = $('#project-glj-main').find('.top-content');
  825. pojGljResizeEles.nearSpread = pojGljResizeEles.nearElement.children(".main-data-top");
  826. pojGljResizeEles.farElement = $('#project-glj-main').find('.bottom-content');
  827. pojGljResizeEles.farSpread = pojGljResizeEles.farElement.children().find(".main-data-bottom");
  828. pojGljResizeEles.nav = pojGljResizeEles.farElement.children('ul.nav');
  829. return pojGljResizeEles;
  830. }
  831. function loadProjectGljSize() {
  832. let me = projectGljObject;
  833. let pojGljResizeEles = getProjectResizeEles();
  834. loadSize(pojGljResizeEles, 'height', function () {
  835. me.projectGljSpread?me.projectGljSpread.refresh():'';
  836. me.mixRatioSpread?me.mixRatioSpread.refresh():'';
  837. });
  838. }
  839. $(function () {
  840. let pojGljResizeEles = getProjectResizeEles();
  841. slideResize(pojGljResizeEles, {min: 170, max: 700}, 'height', function () {
  842. projectGljObject.projectGljSpread.refresh();
  843. projectGljObject.mixRatioSpread?projectGljObject.mixRatioSpread.refresh():'';
  844. });
  845. $('#tab_project_glj').on('shown.bs.tab', function (e) {
  846. sessionStorage.setItem('mainTab', '#tab_project_glj');
  847. let me = projectGljObject;
  848. $(e.relatedTarget.hash).removeClass('active');
  849. if(me.projectGljSpread==null){
  850. me.initProjectGljSpread();
  851. }
  852. me.unitPriceFileInit();
  853. me.initMixRatio();
  854. //projectObj.project.projectGLJ.calcQuantity(); 在工程量有更新的地方调用
  855. me.refreshDataSheet();
  856. loadProjectGljSize();
  857. });
  858. /* $('#ration_link').on('shown.bs.tab', function (e) {
  859. let me = projectGljObject;
  860. me.showTag='ration';
  861. me.showProjectGljData();
  862. });
  863. $('#mix_ratio_link').on('shown.bs.tab', function (e) {
  864. let me = projectGljObject;
  865. me.showTag='mixRatio';
  866. me.showProjectGljData();
  867. me.initMixRatio();
  868. });
  869. $('#machine_ratio_link').on('shown.bs.tab', function (e) {
  870. let me = projectGljObject;
  871. me.showTag='machine';
  872. me.showProjectGljData();
  873. me.initMixRatio();
  874. });*/
  875. $('#pop-used-list').popover({
  876. placement: "bottom",
  877. html: true,
  878. trigger: "hover | focus",
  879. content: projectGljObject.getUsedTenderInfo
  880. }
  881. );
  882. // 单价文件切换弹框
  883. $('#change-unitFile').on('shown.bs.modal', function () {
  884. let rootProjectID = projectInfoObj.projectInfo.property.rootProjectID;
  885. // 获取切换单价文件相关数据
  886. $.ajax({
  887. url: '/glj/get-project-info',
  888. type: 'post',
  889. data: {project_id: scUrlUtil.GetQueryString('project'),rootProjectID:rootProjectID},
  890. dataType: 'json',
  891. success: function (response) {
  892. if (response.err === 1) {
  893. alert('数据传输错误!');
  894. return false;
  895. }
  896. let data = response.data;
  897. projectGljObject.changeInfo = data;
  898. $("#current-project-name").text(data.currentProjectName);
  899. // 本项目中的单价文件
  900. if (data.self.length > 0) {
  901. let selfFileHtml = '';
  902. for (let tmp of data.self) {
  903. let select = usedUnitPriceInfo === tmp.id ? ' selected="selected"' : '';
  904. selfFileHtml += '<option' + select + ' value="' + tmp.id + '">' + tmp.name + '</option>';
  905. }
  906. $("#self-file").html(selfFileHtml);
  907. }
  908. // 其他建设项目数据
  909. if (data.other.length > 0) {
  910. let otherProjectHtml = '';
  911. let otherFileHtml = '';
  912. for (let tmp of data.other) {
  913. otherProjectHtml += '<option value="' + tmp.ID + '">' + tmp.name + '</option>';
  914. otherFileData[tmp.ID] = tmp.unitPriceList;
  915. if (otherFileHtml !== '') {
  916. continue;
  917. }
  918. for (let unitPrice of tmp.unitPriceList) {
  919. otherFileHtml += '<option value="' + unitPrice.id + '">' + unitPrice.name + '</option>';
  920. }
  921. }
  922. $("#other-project").html(otherProjectHtml);
  923. $("#other-file").html(otherFileHtml);
  924. }
  925. }
  926. });
  927. });
  928. // 单价文件切换确认
  929. $("#change-file-confirm").click(function () {
  930. let type = $("input[name='change-type']:checked").val();
  931. type = parseInt(type);
  932. let changeUnitPriceId = 0;
  933. $('#change-unitFile').modal("hide");
  934. if (type === 0) {
  935. // 从本项目中选择
  936. changeUnitPriceId = $("#self-file").val();
  937. } else {
  938. // 从其他项目中复制
  939. changeUnitPriceId = $("#other-file").val();
  940. let newName = $("#other-file").children("option:selected").text();
  941. let currentOption = _.find(projectGljObject.changeInfo.self,{name:newName});
  942. if(currentOption){ //存在则说明有重名的文件
  943. //rename-unitFile
  944. $("#rename-unitFile").modal({show:true});
  945. $("#newUnitFileID").val(changeUnitPriceId);
  946. $("#newUnitFileName").val(newName);
  947. return;
  948. }
  949. }
  950. let data = {project_id: scUrlUtil.GetQueryString('project'), change_id: changeUnitPriceId, type: type};
  951. projectObj.project.projectGLJ.changeFile(data,function () {
  952. projectGljObject.changeFileCallback();
  953. })
  954. });
  955. // 单价文件选项切换
  956. $("input[name='change-type']").change(function () {
  957. let type = $(this).val();
  958. type = parseInt(type);
  959. $("#change-unitFile .option").hide();
  960. if (type === 0) {
  961. $(".option.select").show();
  962. } else {
  963. $(".option.copy").show();
  964. }
  965. });
  966. $("#unitFile-save-as").on('shown.bs.modal', function () {
  967. // 获取当前建设项数据
  968. $("#save-as-name").val(projectGljObject.usedUnitPriceInfo.name + '副本');
  969. projectGljObject.checkUnitFileName(projectGljObject.usedUnitPriceInfo.name + '副本');
  970. });
  971. // 从其他建设项目中复制 选择建设项目
  972. $("#other-project").change(function () {
  973. let projectId = $(this).val();
  974. if (otherFileData[projectId] === undefined) {
  975. return false;
  976. }
  977. let otherFileHtml = '';
  978. for (let unitPrice of otherFileData[projectId]) {
  979. otherFileHtml += '<option value="' + unitPrice.id + '">' + unitPrice.name + '</option>';
  980. }
  981. $("#other-file").html(otherFileHtml);
  982. });
  983. $('#save-as-name').change(function () {
  984. projectGljObject.checkUnitFileName(this.value);
  985. });
  986. $('#newUnitFileName').change(function () {
  987. let projectGLJ = projectObj.project.projectGLJ;
  988. projectGLJ.checkUnitFileName(this.value,function (data) {
  989. if(data){
  990. $("#renameError_unitFile").text('已存在同名单价文件').show();
  991. $('#renameUnitFileConfirm').attr("disabled","disabled");
  992. }else {
  993. $("#renameError_unitFile").hide();
  994. $('#renameUnitFileConfirm').removeAttr("disabled");
  995. }
  996. });
  997. });
  998. $("#renameUnitFileConfirm").click(function () {
  999. let projectGLJ = projectObj.project.projectGLJ;
  1000. let newName = $('#newUnitFileName').val();
  1001. let changeUnitPriceId = $('#newUnitFileID').val();
  1002. projectGLJ.checkUnitFileName(newName,function (data) {
  1003. if(data){
  1004. $("#renameError_unitFile").text('已存在同名单价文件').show();
  1005. $('#renameUnitFileConfirm').attr("disabled","disabled");
  1006. }else {
  1007. $("#renameError_unitFile").hide();
  1008. $('#renameUnitFileConfirm').removeAttr("disabled");
  1009. let data = {project_id: scUrlUtil.GetQueryString('project'), change_id: changeUnitPriceId, type: 1,newName:newName};
  1010. projectObj.project.projectGLJ.changeFile(data,function () {
  1011. projectGljObject.changeFileCallback();
  1012. })
  1013. }
  1014. });
  1015. });
  1016. // 单价文件另存为操作
  1017. $("#save-as-confirm").click(function () {
  1018. let projectGLJ = projectObj.project.projectGLJ;
  1019. let name = $("#save-as-name").val();
  1020. if (name === '') {
  1021. $("#save-as-tips").text('请填写单价文件名称').show();
  1022. return false;
  1023. }
  1024. let saveData = {name: name, project_id: scUrlUtil.GetQueryString('project')};
  1025. projectGljObject.checkUnitFileName(name,function () {
  1026. projectGLJ.saveAs(saveData,function () {
  1027. projectGljObject.changeFileCallback();
  1028. $("#unitFile-save-as").modal("hide");
  1029. });
  1030. });
  1031. });
  1032. $("#filterType").on("click","ul li a",function(){
  1033. let me = projectGljObject;
  1034. me.displayType = filterType[this.id];
  1035. me.refreshDataSheet();
  1036. });
  1037. });