index_view.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. /**
  2. * Created by zhang on 2019/5/28.
  3. */
  4. let indexObj= {
  5. nav_text:"工程信息指标",
  6. spread:null,
  7. engineerInfoSetting:{
  8. header: [
  9. {headerName: "名称", headerWidth: 160, dataCode: "dispName", dataType: "String"},
  10. {headerName: "内容", headerWidth: 200, dataCode: "value", dataType: "String"}
  11. ],
  12. view:{ lockColumns: ["dispName"]}
  13. },
  14. engineerFeatureSetting:{
  15. header: [
  16. {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String"},
  17. {headerName: "内容", headerWidth: 200, dataCode: "value", dataType: "String"}
  18. ],
  19. view:{ lockColumns: [0]}
  20. },
  21. engineerCostSetting:{
  22. header: [
  23. {headerName: "名称", headerWidth: 200, dataCode: "name", dataType: "String"},
  24. {headerName: "金额", headerWidth: 160, dataCode: "cost", dataType: "String", hAlign: "right"},
  25. {headerName: "单方造价", headerWidth: 160, dataCode: "unitCost", dataType: "String", hAlign: "right"},
  26. {headerName: "占造价比例", headerWidth: 160, dataCode: "per", dataType: "String", hAlign: "right"}
  27. ],
  28. view:{ lockColumns: ["name","cost","unitCost","per"]}
  29. },
  30. mainMaterialSetting:{
  31. header: [
  32. {headerName: "名称", headerWidth: 200, dataCode: "name", dataType: "String"},
  33. {headerName: "单位", headerWidth: 200, dataCode: "unit", dataType: "String"},
  34. {headerName: "综合单价", headerWidth: 160, dataCode: "unitPrice", dataType: "String", hAlign: "right"},
  35. {headerName: "数量", headerWidth: 160, dataCode: "quantity", dataType: "String", hAlign: "right"},
  36. {headerName: "单方指标", headerWidth: 160, dataCode: "unitIndex", dataType: "String", hAlign: "right"}
  37. ],
  38. view:{ lockColumns: ["name","unit","unitPrice","quantity","unitIndex"]}
  39. },
  40. economicSetting:{
  41. header: [
  42. {headerName: "分部分项", headerWidth: 200, dataCode: "name", dataType: "String"},
  43. {headerName: "分部工程造价", headerWidth: 160, dataCode: "cost", dataType: "String", hAlign: "right"},
  44. {headerName: "单方指标", headerWidth: 160, dataCode: "unitCost", dataType: "String", hAlign: "right"},
  45. {headerName: "占造价比例", headerWidth: 160, dataCode: "per", dataType: "String", hAlign: "right"}
  46. ],
  47. view:{ lockColumns: ["name","cost","unitCost","per"]}
  48. },
  49. quantitySetting:{
  50. header: [
  51. {headerName: "名称", headerWidth: 200, dataCode: "name", dataType: "String"},
  52. {headerName: "工程量指标", headerWidth: 160, dataCode: "quantity", dataType: "String", hAlign: "right"},
  53. {headerName: "单位", headerWidth: 160, dataCode: "quantityIndexUnit", dataType: "String", hAlign: "center"}
  54. ],
  55. view:{ lockColumns: ["name","quantity","quantityIndexUnit"]}
  56. },
  57. materialSetting:{
  58. header: [
  59. {headerName: "编码", headerWidth: 80, dataCode: "code", dataType: "String"},
  60. {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String"},
  61. {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
  62. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  63. {headerName: "数量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
  64. {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
  65. {headerName: "市场价合价", headerWidth: 120, dataCode: "totalPrice", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
  66. {headerName: "工料指标", headerWidth: 120, dataCode: "materialIndexType", hAlign: "center", dataType: "String",cellType:'comboBox',options:[],editable:true,maxDropDownItems:10},
  67. {headerName: "工料指标单位", headerWidth: 150, dataCode: "materialIndexUnit", hAlign: "center", dataType: "String"},
  68. {headerName: "单位转换系数", headerWidth: 150, dataCode: "materialIndexCoe", hAlign: "center", dataType: "String",validator:"number"}
  69. ],
  70. view: {
  71. lockColumns: ["code","name","specs","unit","marketPrice","quantity","materialIndexUnit"]
  72. }
  73. },
  74. ecoQuantitySetting:{
  75. header: [
  76. {headerName: "编码", headerWidth: 200, dataCode: "code", dataType: "String"},
  77. {headerName: "名称", headerWidth: 160, dataCode: "name", dataType: "String"},
  78. {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
  79. {headerName: "工程量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number"},
  80. {headerName: "综合单价", headerWidth: 70, dataCode: "unitFee", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
  81. {headerName: "综合合价", headerWidth: 120, dataCode: "totalFee", hAlign: "right", dataType: "Number",validator:"number"},//,decimalField:"glj.unitPrice"
  82. {headerName: "工程经济指标类别", headerWidth: 120, dataCode: "economicType", hAlign: "center", dataType: "String",cellType:'comboBox',options:[],editable:true,maxDropDownItems:10},
  83. {headerName: "工程量指标类别", headerWidth: 150, dataCode: "quantityIndexType", hAlign: "center", dataType: "String",cellType:'comboBox',options:[],editable:true,maxDropDownItems:10},
  84. {headerName: "工程量指标单位", headerWidth: 150, dataCode: "quantityIndexUnit", hAlign: "center", dataType: "String"},
  85. {headerName: "单位转换系数", headerWidth: 150, dataCode: "quantityIndexCoe", hAlign: "center", dataType: "String",validator:"number"}
  86. ],
  87. view: {
  88. lockColumns: ["code","name","unit","quantity","unitFee","totalFee","quantityIndexUnit"]
  89. }
  90. },
  91. engineerInfoDatas:[],
  92. engineerFeatureDatas:[],
  93. materialDatas:[],
  94. ecoQuantityDatas:[],
  95. initSpread:function () {
  96. if(!this.spread){
  97. this.spread = SheetDataHelper.createNewSpread($("#indexSpread")[0],8);
  98. sheetCommonObj.spreadDefaultStyle(this.spread);
  99. this.initEngineerInfoSheet();
  100. this.initEngineerFeatureSheet();
  101. this.initEngineerCostSheet();
  102. this.initMainMaterialSheet();
  103. this.initEconomicSheet();
  104. this.initQuantitySheet();
  105. this.initEcoQuantitySheet();
  106. this.initMaterialSheet();
  107. }
  108. // disableRightMenu("glj_from_sheet",this.spread);
  109. if(projectReadOnly){
  110. disableSpread(this.spread);
  111. }
  112. this.spread.refresh();
  113. },
  114. initEngineerInfoSheet:function () {
  115. let sheet = this.spread.getSheet(0);
  116. sheetCommonObj.initSheet(sheet,this.engineerInfoSetting,30);
  117. sheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onSelectionChange);
  118. sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onEngineerInfoValueChange);
  119. sheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onEngineerInfoRangeChange);
  120. sheet.name('engineerInfo');
  121. //sheet.setRowHeight(0, 36, 1);
  122. },
  123. initEngineerFeatureSheet:function () {
  124. let sheet = this.spread.getSheet(1);
  125. this.engineerFeatureDatas = getDatas();
  126. sheetCommonObj.initSheet(sheet,this.engineerFeatureSetting,1);
  127. sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.oEngineerFeatureValueChange);
  128. sheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onEngineerFeatureRangeChange); //
  129. sheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onSelectionChange);
  130. sheet.setRowCount(this.engineerFeatureDatas.length);
  131. function getDatas() {
  132. let datas = [];
  133. if(projectObj.project.property.engineerFeatures){
  134. for(let f of projectObj.project.property.engineerFeatures){
  135. let tem = {
  136. ID:f.ID,
  137. name:f.name,
  138. value:f.value,
  139. ParentID:f.ParentID,
  140. cellType:f.cellType,
  141. options:f.options,
  142. required:f.required,
  143. collapsed:false
  144. };
  145. if(f.required == true) tem.foreColor = "#ff2a23";
  146. datas.push(tem);
  147. }
  148. }
  149. return datas;
  150. }
  151. },
  152. initEngineerCostSheet:function () {
  153. let sheet = this.spread.getSheet(2);
  154. sheetCommonObj.initSheet(sheet,this.engineerCostSetting,30);
  155. sheet.name('engineerCost');
  156. //sheet.setRowHeight(0, 36, 1);
  157. },
  158. initMainMaterialSheet:function () {
  159. let sheet = this.spread.getSheet(3);
  160. this.setHeaderUnit(this.mainMaterialSetting,"unitIndex");
  161. sheetCommonObj.initSheet(sheet,this.mainMaterialSetting,30);
  162. sheet.name('mainMaterial');
  163. //sheet.setRowHeight(0, 36, 1);
  164. },
  165. initEconomicSheet:function () {
  166. let sheet = this.spread.getSheet(4);
  167. sheetCommonObj.initSheet(sheet,this.economicSetting,30);
  168. sheet.name('economic');
  169. //sheet.setRowHeight(0, 36, 1);
  170. },
  171. initQuantitySheet:function () {
  172. let sheet = this.spread.getSheet(5);
  173. this.setHeaderUnit(this.quantitySetting,"quantity");
  174. sheetCommonObj.initSheet(sheet,this.quantitySetting,30);
  175. sheet.name('quantity');
  176. },
  177. initEcoQuantitySheet:function () {
  178. let sheet = this.spread.getSheet(6);
  179. this.setComboOptions(projectObj.project.property.economics,this.ecoQuantitySetting,"economicType");
  180. this.setComboOptions(projectObj.project.property.mainQuantities,this.ecoQuantitySetting,"quantityIndexType");
  181. sheetCommonObj.initSheet(sheet,this.ecoQuantitySetting,1);
  182. sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onEcoQuantityValueChange);
  183. sheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onEcoQuantityRangeChange);
  184. sheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onSelectionChange);
  185. sheet.name('ecoQuantity');
  186. },
  187. initMaterialSheet:function () {
  188. let sheet = this.spread.getSheet(7);
  189. this.setComboOptions(projectObj.project.property.materials,this.materialSetting,"materialIndexType");
  190. sheetCommonObj.initSheet(sheet,this.materialSetting,30);
  191. sheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onSelectionChange);
  192. sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onMaterialChange);
  193. sheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onMaterialRangeChange);
  194. sheet.name('material');
  195. },
  196. showDatas:function(){
  197. let me = indexObj;
  198. if(me.nav_text == "工程信息指标") me.showEngineerInfo();
  199. if(me.nav_text == "工程特征指标") me.showEngineerFeature();
  200. if(me.nav_text == "工程造价指标") me.showEngineerCost();
  201. if(me.nav_text == "主要工料指标") me.showMainMaterial();
  202. if(me.nav_text == "主要经济指标") me.showEconomic();
  203. if(me.nav_text == "主要工程量指标") me.showQuantity();
  204. if(me.nav_text == "设置主要经济、工程量指标") me.showEcoQuantity();
  205. if(me.nav_text == "设置主要工料指标") me.showMaterial();
  206. },
  207. showEngineerInfo:function () {
  208. this.spread.setActiveSheetIndex(0);
  209. let sheet = this.spread.getActiveSheet();
  210. this.engineerInfoDatas = getEngineerInfoData();
  211. sheetCommonObj.showData(sheet, this.engineerInfoSetting,this.engineerInfoDatas);
  212. sheet.setRowCount(this.engineerInfoDatas.length);
  213. function getEngineerInfoData() {
  214. let datas = [];
  215. if(projectObj.project.property.engineerInfos){
  216. for(let info of projectObj.project.property.engineerInfos){
  217. let d = {
  218. dispName:info.dispName,
  219. key:info.key,
  220. value:info.value,
  221. options:info.options,
  222. cellType:info.cellType
  223. };
  224. if(info.cellType)d.dateCol = 1;
  225. datas.push(d);
  226. }
  227. }
  228. return datas;
  229. }
  230. },
  231. showEngineerFeature:function () {
  232. this.spread.setActiveSheetIndex(1);
  233. let sheet = this.spread.getActiveSheet();
  234. refreshValue();
  235. this.setRowCountAndLock(sheet,this.engineerFeatureDatas);
  236. sheetCommonObj.showTreeData(sheet, this.engineerFeatureSetting,this.engineerFeatureDatas);
  237. function refreshValue() {
  238. let map = projectObj.project.property.engineerFeatures?_.indexBy(projectObj.project.property.engineerFeatures,'ID'):{};
  239. for(let f of indexObj.engineerFeatureDatas){
  240. if(map[f.ID]) f.value = map[f.ID].value;
  241. }
  242. }
  243. },
  244. showEngineerCost:function () {
  245. this.spread.setActiveSheetIndex(2);
  246. let sheet = this.spread.getActiveSheet();
  247. let costDatas = getEngineerCostData();
  248. sheetCommonObj.showData(sheet, this.engineerCostSetting,costDatas);
  249. sheet.setRowCount(costDatas.length);
  250. function getEngineerCostData() {
  251. let datas = [];
  252. let priceIndex = exportUtil.setEngineerPriceIndex({property:projectObj.project.property},{bills:projectObj.project.Bills.datas});
  253. for(let c of priceIndex.children){
  254. let tem = {
  255. name:c.name,
  256. cost:parseFloat(c.attrs[0].value),
  257. unitCost:parseFloat(c.attrs[1].value),
  258. per:parseFloat(c.attrs[2].value)
  259. }
  260. datas.push(tem);
  261. }
  262. return datas;
  263. }
  264. },
  265. showMainMaterial:function(){
  266. this.spread.setActiveSheetIndex(3);
  267. let property = projectObj.project.property;
  268. let sheet = this.spread.getActiveSheet();
  269. let mainDatas = this.getMainMaterialDatas(property.materials,projectObj.project.projectGLJ.datas,property.calcOptions,property.decimal,false,_,scMathUtil);
  270. sheetCommonObj.showData(sheet, this.mainMaterialSetting,mainDatas);
  271. sheet.setRowCount(mainDatas.length);
  272. },
  273. showEconomic:function () {
  274. this.spread.setActiveSheetIndex(4);
  275. let sheet = this.spread.getActiveSheet();
  276. let economicDatas = this.getEconomicDatas(projectObj.project.property.economics,projectObj.project.Bills.datas);
  277. sheetCommonObj.showData(sheet, this.economicSetting,economicDatas);
  278. sheet.setRowCount(economicDatas.length);
  279. },
  280. showQuantity:function () {
  281. this.spread.setActiveSheetIndex(5);
  282. let sheet = this.spread.getActiveSheet();
  283. let quantityDatas = this.getQuantityDatas(projectObj.project.property.mainQuantities,projectObj.project.Bills.datas);
  284. sheetCommonObj.showData(sheet, this.quantitySetting,quantityDatas);
  285. sheet.setRowCount(quantityDatas.length);
  286. },
  287. getQuantityDatas:function (mainQuantities,billsList) {
  288. let datas = [];
  289. let [bills,totalFee] = exportUtil.getIndexBills(billsList);
  290. let billsGroup = _.groupBy(bills,'quantityIndexType');
  291. if(!mainQuantities) return datas;
  292. for(let m of mainQuantities){
  293. let tem = {
  294. name : m.name,
  295. quantityIndexUnit:m.unit,
  296. quantity:0
  297. };
  298. if(billsGroup[m.name]) setQuantities(billsGroup[m.name],tem);
  299. datas.push(tem);
  300. }
  301. function setQuantities(items,data) {
  302. let quantity = 0;
  303. for (let i of items){
  304. let coe = i.quantityIndexCoe && i.quantityIndexCoe!=""?parseFloat(i.quantityIndexCoe):0;
  305. i.quantity = scMathUtil.roundForObj(parseFloat(i.quantity)*coe,getDecimal("process"));
  306. quantity = scMathUtil.roundForObj(quantity + i.quantity,getDecimal("process"));
  307. }
  308. data.quantity = exportUtil.calUnitWidthCoe(quantity);
  309. }
  310. return datas;
  311. },
  312. getEconomicDatas:function (economics,billsList) {
  313. let datas = [];
  314. let [bills,totalFee] = exportUtil.getIndexBills(billsList);
  315. let billsGroup = _.groupBy(bills,'economicType');
  316. if(!economics) return datas;
  317. for(let e of economics){
  318. let tem = {
  319. name:e.name,
  320. cost:0,
  321. unitCost:0,
  322. per:0
  323. };
  324. if(billsGroup[e.name]) setEconomics(billsGroup[e.name],totalFee,tem);
  325. datas.push(tem);
  326. }
  327. function setEconomics(items,engineerCost,data) {
  328. let cost = 0;
  329. let priceDe = getDecimal("bills.totalPrice");
  330. for(let i of items){
  331. i.totalFee = scMathUtil.roundForObj(i.totalFee,priceDe);
  332. cost = scMathUtil.roundForObj(cost + i.totalFee,getDecimal("process"));
  333. }
  334. data.cost = scMathUtil.roundForObj(cost,priceDe);
  335. data.unitCost = exportUtil.calUnitWidthCoe(data.cost,true);//noNeedCoe = true 这里不需要乘以系数
  336. data.per = engineerCost?scMathUtil.roundForObj(data.cost/engineerCost * 100,2):0;
  337. }
  338. return datas;
  339. },
  340. getMainMaterialDatas:function (materials,projectGLJData,calcOptions,decimalObj,isRadio,_,scMathUtil) {
  341. let datas = [];
  342. let materialGroup = _.groupBy(projectGLJData.gljList,'materialIndexType');
  343. if(!materials) return datas;
  344. for(let m of materials){
  345. let tem = {
  346. name:m.name,
  347. unit:m.unit,
  348. unitPrice:0,
  349. quantity:0,
  350. unitIndex:0
  351. };
  352. if(materialGroup[m.name]) setMainMaterial(materialGroup[m.name],tem);
  353. datas.push(tem);
  354. }
  355. function setMainMaterial(gljs,data) {
  356. let quantity = 0 ,unitPrice=0;
  357. for(let g of gljs){
  358. if(!g.quantity || g.quantity=="") continue;
  359. let marketPrice = gljUtil.getMarketPrice(g,projectGLJData,calcOptions,decimalObj,false,_,scMathUtil); // gljOprObj.setGLJPrice(tem,g);
  360. let materialIndexCoe = g.materialIndexCoe?scMathUtil.roundForObj(g.materialIndexCoe,getDecimal("process")):0;
  361. let t_quantity = scMathUtil.roundForObj(g.quantity * materialIndexCoe,getDecimal("process"));
  362. quantity = scMathUtil.roundForObj(t_quantity + quantity,getDecimal("process"));
  363. let temPrice = scMathUtil.roundForObj(g.quantity * marketPrice,getDecimal("process"));
  364. unitPrice = scMathUtil.roundForObj(temPrice + unitPrice,getDecimal("process"));
  365. }
  366. data.quantity = scMathUtil.roundForObj(quantity,2);
  367. if(data.quantity) data.unitPrice = scMathUtil.roundForObj(unitPrice/data.quantity,2);
  368. data.unitIndex = exportUtil.calUnitWidthCoe(data.quantity);
  369. }
  370. return datas;
  371. },
  372. showEcoQuantity:function () {
  373. let parentMap = {};
  374. this.spread.setActiveSheetIndex(6);
  375. let sheet = this.spread.getActiveSheet();
  376. let sel = sheet.getSelections()[0];
  377. let oldData = sel.row<this.ecoQuantityDatas.length?this.ecoQuantityDatas[sel.row]:null;
  378. this.ecoQuantityDatas = this.getIndexBillsData(parentMap);
  379. sheet.setRowCount(0);
  380. this.setRowCountAndLock(sheet,this.ecoQuantityDatas);
  381. sheetCommonObj.showTreeData(sheet, this.ecoQuantitySetting,this.ecoQuantityDatas);
  382. sel.row = oldData?_.findIndex(this.ecoQuantityDatas,{'ID':oldData.ID}):0;
  383. sheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
  384. for(let row =0 ;row < this.ecoQuantityDatas.length;row ++){//锁定父清单
  385. if(parentMap[this.ecoQuantityDatas[row].ID]) sheet.getRange(row,-1 -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(true);
  386. }
  387. },
  388. getIndexBillsData:function (parentMap,old) {
  389. let datas = [],allNodes=[];
  390. let controller = projectObj.mainController, project = projectObj.project;
  391. let FBFX = project.Bills.getFBFXNode(controller);
  392. let IDMap = _.indexBy(this.ecoQuantityDatas,"ID");
  393. if(FBFX){
  394. allNodes.push(FBFX);
  395. controller.tree.getAllSubNode(FBFX.source,allNodes);
  396. }
  397. let org = project.Bills.getOrgNode();
  398. let mNode = project.Bills.getMeasureNode(controller);
  399. if(mNode){
  400. allNodes.push(mNode);
  401. controller.tree.getAllSubNode(mNode.source,allNodes,org?org.data.ID:null);
  402. }
  403. for(let a of allNodes){
  404. let d = a.data;
  405. let tem = {
  406. ID:d.ID,
  407. ParentID:d.ParentID,
  408. code:d.code,
  409. name:d.name,
  410. unit:d.unit,
  411. quantity:d.quantity,
  412. totalFee:d.feesIndex && d.feesIndex.common && d.feesIndex.common.totalFee?d.feesIndex.common.totalFee:0,
  413. unitFee:d.feesIndex && d.feesIndex.common && d.feesIndex.common.unitFee?d.feesIndex.common.unitFee:0,
  414. economicType:d.economicType,
  415. quantityIndexType:d.quantityIndexType,
  416. quantityIndexUnit:d.quantityIndexUnit,
  417. quantityIndexCoe:d.quantityIndexCoe,
  418. collapsed:IDMap[d.ID]?IDMap[d.ID].collapsed:false
  419. };
  420. parentMap[d.ParentID] = tem;
  421. datas.push(tem);
  422. }
  423. for(let td of datas){
  424. if(parentMap[td.ID]){
  425. td.economicType = "";
  426. td.quantityIndexType = "";
  427. td.quantityIndexUnit = "";
  428. td.quantityIndexCoe = "";
  429. }
  430. }
  431. return datas;
  432. },
  433. showMaterial:function(){
  434. this.spread.setActiveSheetIndex(7);
  435. let sheet = this.spread.getActiveSheet();
  436. let sel = sheet.getSelections()[0];
  437. let oldData = sel.row<this.materialDatas.length?this.materialDatas[sel.row]:null;
  438. this.materialDatas = getMaterialData();
  439. sheetCommonObj.showData(sheet, this.materialSetting,this.materialDatas );
  440. sel.row = oldData?_.findIndex(this.materialDatas,{'id':oldData.id}):0;
  441. sheet.setSelection(sel.row==-1?0:sel.row,sel.col,sel.rowCount,sel.colCount);
  442. this.setRowCountAndLock(sheet,this.materialDatas);
  443. function getMaterialData() {
  444. let datas = [];
  445. let gljList = projectObj.project.projectGLJ.datas.gljList;
  446. gljList = _.filter(gljList,function(item){
  447. return item.quantity !== 0 && item.quantity !== '0'
  448. });
  449. gljList = sortProjectGLJ(gljList);
  450. for(let glj of gljList){
  451. let tem = {
  452. id:glj.id,
  453. code:glj.code,
  454. name:glj.name,
  455. specs:glj.specs,
  456. unit:glj.unit,
  457. type:glj.type,
  458. quantity:glj.quantity,
  459. materialIndexType:glj.materialIndexType,
  460. materialIndexUnit:glj.materialIndexUnit,
  461. materialIndexCoe:glj.materialIndexCoe
  462. };
  463. gljOprObj.setGLJPrice(tem,glj);
  464. tem.totalPrice = scMathUtil.roundForObj(tem.marketPrice * glj.quantity,getDecimal("glj.unitPrice"))
  465. datas.push(tem);
  466. }
  467. return datas;
  468. }
  469. },
  470. setRowCountAndLock:function (sheet,datas) {
  471. let rowCount = datas.length > 0 ?datas.length+11:0;
  472. sheet.setRowCount(rowCount);
  473. sheet.getRange(datas.length, -1, 11, -1, GC.Spread.Sheets.SheetArea.viewport).locked(true);//锁定空行
  474. },
  475. setComboOptions:function (property,setting,field) {
  476. if(!property) return;
  477. let options = [""];
  478. for(let p of property){
  479. options.push(p.name);
  480. }
  481. let h = _.find(setting.header,{dataCode:field});
  482. if(h) h.options = options;
  483. },
  484. onSelectionChange:function (sender, args) {
  485. args.sheet.repaint();
  486. },
  487. onEcoQuantityValueChange:function (sender,info) {
  488. let value = info.newValue;
  489. let dataCode = indexObj.ecoQuantitySetting.header[info.col].dataCode;
  490. if(!gljUtil.isDef(info.newValue)){
  491. return;
  492. }
  493. if (value&&!sheetCommonObj.checkData(info.col,indexObj.ecoQuantitySetting, value)) {
  494. alert('输入的数据类型不对,请重新输入!');
  495. return indexObj.showDatas();
  496. }
  497. let recode = indexObj.ecoQuantityDatas[info.row];
  498. let data = indexObj.getEcoQuantityUpdateData(recode,dataCode,value);
  499. if(data == null) return indexObj.showDatas();
  500. projectObj.project.updateNodesAndRefresh([data],indexObj.showDatas)
  501. },
  502. onEngineerInfoValueChange:function (sender,info) {
  503. let value = info.newValue;
  504. value = indexObj.valueChecking(indexObj.engineerInfoDatas[info.row],value,info.sheet);
  505. let infos = projectObj.project.property.engineerInfos;
  506. let data = indexObj.getNewPropertyData([{row:info.row,value:value}],infos);
  507. if(!data) return indexObj.showDatas();
  508. indexObj.updateProjectProperty(data,"engineerInfos");
  509. },
  510. valueChecking:function (recode,value,sheet) {
  511. if(recode && recode.cellType == "date"){//日期类型要做个转换
  512. sheet.tag(value);
  513. let data = sheet.tag();
  514. value = formatDate(new Date(data), 'yyyy-MM-dd');
  515. }
  516. //to do other checking
  517. return value
  518. },
  519. oEngineerFeatureValueChange:function(sender,info){
  520. let value = info.newValue;
  521. let features = projectObj.project.property.engineerFeatures;
  522. let data = indexObj.getNewPropertyData([{row:info.row,value:value}],features);
  523. if(!data) return indexObj.showDatas();
  524. indexObj.updateProjectProperty(data,"engineerFeatures");
  525. },
  526. onEngineerFeatureRangeChange:function (sender,info) {
  527. let features = projectObj.project.property.engineerFeatures;
  528. let datas = [];
  529. for(let c of info.changedCells){
  530. let value = info.sheet.getCell(c.row, c.col).text();
  531. datas.push({row:c.row,value:value})
  532. }
  533. let data = indexObj.getNewPropertyData(datas,features);
  534. if(!data) return indexObj.showDatas();
  535. indexObj.updateProjectProperty(data,"engineerFeatures");
  536. },
  537. onEngineerInfoRangeChange:function (sender,info) {
  538. let infos = projectObj.project.property.engineerInfos;
  539. let datas = [];
  540. for(let c of info.changedCells){
  541. let value = info.sheet.getCell(c.row, c.col).text();
  542. datas.push({row:c.row,value:value})
  543. }
  544. let data = indexObj.getNewPropertyData(datas,infos);
  545. if(!data) return indexObj.showDatas();
  546. indexObj.updateProjectProperty(data,"engineerInfos");
  547. },
  548. updateProjectProperty: function(datas,field){
  549. let pfield = "property."+field;
  550. let tem ={
  551. type:'project',
  552. data:{ID:projectObj.project.ID()}
  553. };
  554. tem.data[pfield] = datas;
  555. projectObj.project.updateNodes([tem],function () {
  556. projectObj.project.property[field] = datas;
  557. indexObj.showDatas();
  558. })
  559. },
  560. getNewPropertyData:function (datas,property) {
  561. if(!property) return null;
  562. property = _.cloneDeep(property);
  563. for(let d of datas){
  564. if(property[d.row])property[d.row].value = d.value;
  565. }
  566. return property;
  567. },
  568. onMaterialChange:function (sender,info) {
  569. let value = info.newValue,updateMap = {};
  570. let dataCode = indexObj.materialSetting.header[info.col].dataCode;
  571. if(!gljUtil.isDef(info.newValue)){
  572. return;
  573. }
  574. if (value&&!sheetCommonObj.checkData(info.col,indexObj.materialSetting, value)) {
  575. alert('输入的数据类型不对,请重新输入!');
  576. return indexObj.showDatas();
  577. }
  578. let recode = indexObj.materialDatas[info.row];
  579. let data = indexObj.getMaterialUpdateData(recode,dataCode,value);
  580. if(!data) return indexObj.showDatas() ;
  581. updateMap[recode.id] = data;
  582. projectObj.project.projectGLJ.batchUpdateGLJProperty(updateMap,indexObj.showDatas);
  583. },
  584. onEcoQuantityRangeChange:function (sender,info) {
  585. let nodes = [];
  586. for(let c of info.changedCells){
  587. let dataCode = indexObj.ecoQuantitySetting.header[c.col].dataCode;
  588. let value= info.sheet.getCell(c.row, c.col).text();
  589. if (value&&!sheetCommonObj.checkData(c.col,indexObj.ecoQuantitySetting, value)) {
  590. alert('输入的数据类型不对,请重新输入!');
  591. return indexObj.showDatas();
  592. }
  593. let recode = indexObj.ecoQuantityDatas[c.row];
  594. let data = indexObj.getEcoQuantityUpdateData(recode,dataCode,value);
  595. if(data) nodes.push(data);
  596. }
  597. if(_.isEmpty(nodes)) return indexObj.showDatas();
  598. projectObj.project.updateNodesAndRefresh(nodes,indexObj.showDatas)
  599. },
  600. onMaterialRangeChange:function (sender,info) {
  601. let updateMap = {};
  602. for(let c of info.changedCells){
  603. let value= info.sheet.getCell(c.row, c.col).text();
  604. let dataCode = indexObj.materialSetting.header[c.col].dataCode;
  605. let recode = indexObj.materialDatas[c.row];
  606. if (value&&!sheetCommonObj.checkData(c.col,indexObj.materialSetting, value)) {
  607. alert('输入的数据类型不对,请重新输入!');
  608. return indexObj.showDatas();
  609. }
  610. let tem = indexObj.getMaterialUpdateData(recode,dataCode,value);
  611. if(tem) updateMap[recode.id] = tem;
  612. }
  613. if(_.isEmpty(updateMap)) return indexObj.showDatas();
  614. projectObj.project.projectGLJ.batchUpdateGLJProperty(updateMap,indexObj.showDatas);
  615. },
  616. getEcoQuantityUpdateData:function (recode,dataCode,newValue) {
  617. let tem = {
  618. type:ModuleNames.bills,
  619. data:{ID:recode.ID}
  620. };
  621. tem.data[dataCode] = newValue;
  622. if(!recode) return null;
  623. if(dataCode == "quantityIndexType"){
  624. if(newValue == ""){
  625. tem.data["quantityIndexUnit"] = "";
  626. tem.data["quantityIndexCoe"] = null;
  627. }else {
  628. let mainQuantities = projectObj.project.property.mainQuantities;
  629. if (!mainQuantities) return null;
  630. let m = _.find(mainQuantities,{name:newValue});
  631. if(!m) return null;
  632. tem.data["quantityIndexUnit"] = m.unit;
  633. tem.data["quantityIndexCoe"] = recode.unit == m.unit? 1:null;
  634. }
  635. }
  636. if(dataCode == "economicType"){//这里就主要查找输入是否是下列选项中的一个,值已经在上面设置了
  637. if(newValue != ""){
  638. let economics = projectObj.project.property.economics;
  639. if (!economics) return null;
  640. let m = _.find(economics,{name:newValue});
  641. if(!m) return null;
  642. }
  643. }
  644. return tem;
  645. },
  646. getMaterialUpdateData:function (recode,dataCode,newValue) {
  647. let data = {};
  648. data[dataCode] = newValue;
  649. if(dataCode == "materialIndexType"){
  650. if(newValue == ""){
  651. data["materialIndexUnit"] = "";
  652. data["materialIndexCoe"] = null;
  653. }else {
  654. let materials = projectObj.project.property.materials;
  655. if (!materials) return null;
  656. if(!recode) return null;
  657. let m = _.find(materials,{name:newValue});
  658. if(!m) return null;
  659. data["materialIndexUnit"] = m.unit;
  660. data["materialIndexCoe"] = recode.unit == m.unit ?1: null;
  661. if(recode.name == "水泥" && m.name == "水泥") data["materialIndexCoe"] = 0.001;
  662. }
  663. }
  664. return data
  665. },
  666. getIndexUnit:function () {
  667. let features = projectObj.project.property.engineerFeatures;
  668. if(features){
  669. for(let f of features){
  670. if(f.index == true && f.indexUnit && f.indexUnit!="") return f.indexUnit;
  671. }
  672. }
  673. return null;
  674. },
  675. setHeaderUnit:function (setting,dataCode) {
  676. let header = _.find(setting.header,{dataCode:dataCode});
  677. let unit = this.getIndexUnit();
  678. if(!unit || !header )return;
  679. header.headerName +=`(${unit})`
  680. }
  681. };
  682. $(function () {
  683. $("#index_nav").on("click","ul li a",function(e){
  684. let children = $('#index_nav a');
  685. for(let c of children){
  686. $(c).removeClass('active');
  687. }
  688. $(this).addClass('active');
  689. indexObj.nav_text = $(this).text();
  690. indexObj.showDatas();
  691. });
  692. $('#tab_index').on('shown.bs.tab', function (e) {
  693. indexObj.initSpread();
  694. indexObj.showDatas();
  695. });
  696. });
  697. function onResize() {
  698. if(indexObj.spread) indexObj.spread.refresh();
  699. }