std_bills_lib.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. /**
  2. * Standard Bills Lib
  3. * Created by Mai on 2017/5/16.
  4. */
  5. var billsLibObj = {
  6. stdBillsTree: null,
  7. stdBillsSpread: null,
  8. stdBillsJobSpread: null,
  9. stdBillsFeatureSpread: null,
  10. refreshSettingForHint: function () {
  11. TREE_SHEET_HELPER.initSetting($('#stdBillsSpread')[0], billsLibObj.stdBillsTreeSetting);
  12. },
  13. checkBillsSpread: function () {
  14. if (!this.stdBillsSpread) {
  15. this.stdBillsSpread = SheetDataHelper.createNewSpread($('#stdBillsSpread')[0]);
  16. this.stdBillsSpread.getSheet(0).name('stdBillsLib_bills');
  17. // 刷新setting中记录的spread的位置
  18. this.refreshSettingForHint();
  19. }
  20. },
  21. refreshBillsSpread: function () {
  22. if (this.stdBillsSpread) {
  23. this.stdBillsSpread.refresh();
  24. }
  25. },
  26. checkBillsRelaSpread: function () {
  27. if (!this.stdBillsJobSpread) {
  28. this.stdBillsJobSpread = SheetDataHelper.createNewSpread($('#stdBillsJobs')[0]);
  29. }
  30. if (!this.stdBillsFeatureSpread) {
  31. this.stdBillsFeatureSpread = SheetDataHelper.createNewSpread($('#stdBillsFeatures')[0]);
  32. }
  33. },
  34. refreshBillsRelaSpread: function () {
  35. if (this.stdBillsJobSpread) {
  36. this.stdBillsJobSpread.refresh();
  37. }
  38. if (this.stdBillsFeatureSpread) {
  39. this.stdBillsFeatureSpread.refresh();
  40. }
  41. },
  42. clearHighLight: function (spread) {
  43. if (spread) {
  44. let sheet = spread.getActiveSheet();
  45. sheet.suspendPaint();
  46. sheet.getRange(0, -1, sheet.getRowCount(), -1, GC.Spread.Sheets.SheetArea.viewport).backColor(undefined);
  47. sheet.resumePaint();
  48. }
  49. },
  50. setTagForHint: function (datas) {
  51. let sheet = this.stdBillsSpread.getActiveSheet();
  52. sheet.suspendPaint();
  53. sheet.suspendEvent();
  54. for(let i = 0, len = sheet.getRowCount(); i < len; i++){
  55. sheet.setTag(i, 2, '');
  56. }
  57. for(let i = 0, len = datas.length; i < len; i++){
  58. sheet.setTag(i, 2, datas[i].ruleText ? datas[i].ruleText : '');
  59. }
  60. sheet.resumePaint();
  61. sheet.resumeEvent();
  62. },
  63. loadStdBillsLib: function () {
  64. let i, select = $('#stdBillsLibSelect');
  65. select.empty();
  66. let bills_lib = projectInfoObj.projectInfo.engineeringInfo.bill_lib;
  67. let selectedBillsLib = sessionStorage.getItem('stdBillsLib');
  68. bills_lib.forEach(function (data) {
  69. var option = $('<option>').val(data.id).text(data.name);
  70. if(selectedBillsLib && data.id == selectedBillsLib){
  71. option.attr('selected', 'selected');
  72. }
  73. select.append(option);
  74. });
  75. if (select.children.length !== 0) {
  76. billsLibObj.loadStdBills(select.val());
  77. }
  78. },
  79. loadStdBills: function (stdBillsLibID) {
  80. var that = this;
  81. var stdBillsJobData, stdBillsFeatureData, stdBills;
  82. if(that.stdBillsTree){
  83. that.stdBillsTree = null;
  84. }
  85. that.stdBillsTree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: true});
  86. var stdBillsTreeController = TREE_SHEET_CONTROLLER.createNew(that.stdBillsTree, billsLibObj.stdBillsSpread.getActiveSheet(), billsLibObj.stdBillsTreeSetting);
  87. var findData = function (value, field, Array) {
  88. var i = 0;
  89. for (i = 0; i < Array.length; i++) {
  90. if (value[field] == Array[i][field]) {
  91. return Array[i];
  92. }
  93. }
  94. return null;
  95. };
  96. let sortJobsAndFeatures = function (arr) {
  97. arr.sort(function (a, b) {
  98. let rst = 0;
  99. if(a.serialNo > b.serialNo) rst = 1;
  100. else if(a.serialNo < b.serialNo) rst = -1;
  101. return rst;
  102. });
  103. };
  104. var getBillsJobs = function (node) {
  105. var jobs = [], i, jobData = null;
  106. if (stdBillsJobData && node && node.data.jobs) {
  107. for (i = 0; i < node.data.jobs.length; i++) {
  108. jobData = findData(node.data.jobs[i], 'id', stdBillsJobData);
  109. if (jobData) {
  110. jobData.serialNo = node.data.jobs[i].serialNo;
  111. jobs.push(jobData);
  112. }
  113. }
  114. }
  115. sortJobsAndFeatures(jobs);
  116. return jobs;
  117. };
  118. var getBillsFeatures = function (node) {
  119. var features = [], i, featureData = null;
  120. if (stdBillsFeatureData && node && node.data.items) {
  121. for (i = 0; i < node.data.items.length; i++) {
  122. featureData = findData(node.data.items[i], 'id', stdBillsFeatureData);
  123. if (featureData) {
  124. featureData.serialNo = node.data.items[i].serialNo;
  125. features.push(featureData);
  126. }
  127. }
  128. }
  129. sortJobsAndFeatures(features);
  130. return features;
  131. };
  132. var showJobs = function (jobs) {
  133. SheetDataHelper.loadSheetHeader(billsLibObj.jobsSetting, billsLibObj.stdBillsJobSpread.getActiveSheet());
  134. SheetDataHelper.loadSheetData(billsLibObj.jobsSetting, billsLibObj.stdBillsJobSpread.getActiveSheet(), jobs);
  135. };
  136. var showFeatures = function (features) {
  137. SheetDataHelper.loadSheetHeader(billsLibObj.featuresSetting, billsLibObj.stdBillsFeatureSpread.getActiveSheet());
  138. SheetDataHelper.loadSheetData(billsLibObj.featuresSetting, billsLibObj.stdBillsFeatureSpread.getActiveSheet(), features);
  139. };
  140. var showJobsAndFeatures = function (node) {
  141. $('#stdBillsJobTab').show();
  142. $('#stdBillsRemarkTab').hide();
  143. billsLibObj.refreshBillsRelaSpread();
  144. billsLibObj.checkBillsRelaSpread();
  145. sortJobsAndFeatures(getBillsJobs(node));
  146. showJobs(getBillsJobs(node));
  147. showFeatures(getBillsFeatures(node));
  148. };
  149. var showBillsRemark = function (node) {
  150. $('#stdBillsJobTab').hide();
  151. $('#stdBillsRemarkTab').show();
  152. $('#stdBillsRemark').text(node && node.data.recharge ? node.data.recharge : '');
  153. };
  154. var showBillsRela = function (node) {
  155. if (node && node.children.length === 0) {
  156. showJobsAndFeatures(node);
  157. } else {
  158. showBillsRemark(node);
  159. }
  160. };
  161. CommonAjax.post('/stdBillsEditor/getJobContent', {userId: userID, billsLibId: stdBillsLibID}, function (datas) {
  162. stdBillsJobData = datas;
  163. }, function () {
  164. stdBillsJobData = [];
  165. });
  166. CommonAjax.post('/stdBillsEditor/getItemCharacter', {userId: userID, billsLibId: stdBillsLibID}, function (datas) {
  167. stdBillsFeatureData = datas;
  168. }, function () {
  169. stdBillsFeatureData = [];
  170. });
  171. CommonAjax.post('/stdBillsEditor/getBills', {userId: userID, billsLibId: stdBillsLibID}, function (datas) {
  172. stdBills = datas;
  173. that.stdBillsTree.loadDatas(stdBills);
  174. //读取展开收起状态
  175. let currentExpState = sessionStorage.getItem('stdBillsLibExpState');
  176. if(currentExpState){
  177. that.stdBillsTree.setExpandedByState(that.stdBillsTree.items, currentExpState);
  178. }
  179. //非叶子节点默认收起
  180. else{
  181. that.stdBillsTree.setRootExpanded(that.stdBillsTree.roots, false);
  182. }
  183. stdBillsTreeController.showTreeData();
  184. billsLibObj.setTagForHint(datas);
  185. showBillsRela(that.stdBillsTree.firstNode());
  186. stdBillsTreeController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, showBillsRela);
  187. that.stdBillsSpread.unbind(GC.Spread.Sheets.Events.CellDoubleClick);
  188. that.stdBillsSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, function (sender, args) {
  189. let selectNode = that.stdBillsTree.items[args.row];
  190. let name = selectNode.data.name;
  191. if (that.stdBillsTree.items[args.row].children.length === 0) {
  192. if(projectInfoObj.projectInfo.property.lockBills == true){
  193. return;
  194. }
  195. //特征及内容转化
  196. pageCCOprObj.setItemContentNode(that.stdBillsTree.items[args.row], getBillsJobs(that.stdBillsTree.items[args.row]), getBillsFeatures(that.stdBillsTree.items[args.row]), name);
  197. if (/\//.test(selectNode.data.unit)) {
  198. let existB = projectObj.project.Bills.sameStdCodeBillsData(selectNode.data.code);
  199. if (existB) {
  200. let std = JSON.parse(JSON.stringify(selectNode.data));
  201. std.unit = existB.unit;
  202. ProjectController.addBills(projectObj.project, projectObj.mainController, std);
  203. } else {
  204. ConfirmModal.stdBillsUnit.check(selectNode.data, function (std) {
  205. ProjectController.addBills(projectObj.project, projectObj.mainController, std);
  206. });
  207. }
  208. } else {
  209. ProjectController.addBills(projectObj.project, projectObj.mainController, selectNode.data);
  210. }
  211. }
  212. else{
  213. let me = billsLibObj;
  214. let node = that.stdBillsTree.items[args.row];
  215. if (!node || node.children.length === 0)
  216. return;
  217. node.setExpanded(!node.expanded);
  218. //设置展开收起状态
  219. sessionStorage.setItem('stdBillsLibExpState', that.stdBillsTree.getExpState(that.stdBillsTree.items));
  220. TREE_SHEET_HELPER.massOperationSheet(args.sheet, function () {
  221. let iCount = node.posterityCount(), i, child;
  222. for (i = 0; i < iCount; i++) {
  223. child = that.stdBillsTree.items[args.row + i + 1];
  224. args.sheet.setRowVisible(args.row + i + 1, child.visible, args.sheetArea);
  225. }
  226. args.sheet.invalidateLayout();
  227. });
  228. args.sheet.repaint();
  229. }
  230. });
  231. }, function () {
  232. that.stdBillsSpread.unbind(GC.Spread.Sheets.Events.CellDoubleClick);
  233. });
  234. $('#stdBillsSearch>span>button').click(function () {
  235. var keyword = $('#stdBillsSearch>input').val();
  236. if (!keyword || keyword === '') {return}
  237. var result = that.stdBillsTree.items.filter(function (item) {
  238. var codeIs = item.data.code ? item.data.code.indexOf(keyword) !== -1 : false;
  239. var nameIs = item.data.name ? item.data.name.indexOf(keyword) !== -1 : false;
  240. return codeIs || nameIs;
  241. });
  242. result.sort(function (x, y) {
  243. return x.serialNo() - y.serialNo();
  244. });
  245. if (result.length !== 0) {
  246. var sel = billsLibObj.stdBillsSpread.getActiveSheet().getSelections();
  247. stdBillsTreeController.setTreeSelected(result[0]);
  248. billsLibObj.stdBillsSpread.getActiveSheet().setSelection(result[0].serialNo(), sel[0].col, 1, 1);
  249. for (let node of result) {
  250. billsLibObj.stdBillsSpread.getActiveSheet().getRange(node.serialNo(), -1, 1, -1).backColor('lemonChiffon');
  251. }
  252. $('#nextStdBills').show();
  253. $('#nextStdBills').click(function () {
  254. var cur = that.stdBillsTree.selected, resultIndex = result.indexOf(cur), sel = billsLibObj.stdBillsSpread.getActiveSheet().getSelections();
  255. if (resultIndex === result.length - 1) {
  256. stdBillsTreeController.setTreeSelected(result[0]);
  257. billsLibObj.stdBillsSpread.getActiveSheet().setSelection(result[0].serialNo(), sel[0].col, 1, 1);
  258. } else {
  259. stdBillsTreeController.setTreeSelected(result[resultIndex + 1]);
  260. billsLibObj.stdBillsSpread.getActiveSheet().setSelection(result[resultIndex + 1].serialNo(), sel[0].col, 1, 1);
  261. }
  262. });
  263. } else {
  264. billsLibObj.clearHighLight(billsLibObj.stdBillsSpread);
  265. $('#nextStdBills').hide();
  266. }
  267. $('#stdBillsSearchResultCount').text('搜索结果:' + result.length);
  268. $('#stdBillsSearchResult').show();
  269. });
  270. },
  271. stdBillsTreeSetting: {
  272. "treeCol": 0,
  273. "emptyRows":0,
  274. "headRows":1,
  275. "headRowHeight":[
  276. 40
  277. ],
  278. "defaultRowHeight": 21,
  279. "cols":[{
  280. "width":160,
  281. "readOnly": true,
  282. "head":{
  283. "titleNames":["项目编码"],
  284. "spanCols":[1],
  285. "spanRows":[1],
  286. "vAlign":[1],
  287. "hAlign":[1],
  288. "font":["Arial"]
  289. },
  290. "data":{
  291. "field":"code",
  292. "vAlign":1,
  293. "hAlign":0,
  294. "font":"Arial"
  295. }
  296. }, {
  297. "width":220,
  298. "readOnly": true,
  299. "head":{
  300. "titleNames":["项目名称"],
  301. "spanCols":[1],
  302. "spanRows":[1],
  303. "vAlign":[1],
  304. "hAlign":[1],
  305. "font":["Arial"]
  306. },
  307. "data":{
  308. "field":"name",
  309. "vAlign":1,
  310. "hAlign":0,
  311. "font":"Arial"
  312. }
  313. }, {
  314. "width":45,
  315. "readOnly": true,
  316. "showHint": true,
  317. "head":{
  318. "titleNames":["计量单位"],
  319. "spanCols":[1],
  320. "spanRows":[1],
  321. "vAlign":[1],
  322. "hAlign":[1],
  323. "font":["Arial"],
  324. "wordWrap": true
  325. },
  326. "data":{
  327. "field":"unit",
  328. "vAlign":1,
  329. "hAlign":1,
  330. "font":"Arial"
  331. }
  332. }/*, {
  333. "width":100,
  334. "readOnly": true,
  335. "showHint": true,
  336. "head":{
  337. "titleNames":["工程量计算规则"],
  338. "spanCols":[1],
  339. "spanRows":[1],
  340. "vAlign":[1],
  341. "hAlign":[1],
  342. "font":["Arial"]
  343. },
  344. "data":{
  345. "field":"ruleText",
  346. "vAlign":1,
  347. "hAlign":0,
  348. "font":"Arial"
  349. }
  350. }*/]
  351. },
  352. jobsSetting: {
  353. "emptyRows":0,
  354. "headRows":1,
  355. "headRowHeight":[25],
  356. "defaultRowHeight": 21,
  357. "cols":[{
  358. "width":160,
  359. "readOnly":true,
  360. "head":{
  361. "titleNames":["工作内容"],
  362. "spanCols":[1],
  363. "spanRows":[1],
  364. "vAlign":[1],
  365. "hAlign":[1],
  366. "font":["Arial"]
  367. },
  368. "data":{
  369. "field":"content",
  370. "vAlign":0,
  371. "hAlign":3,
  372. "font":"Arial"
  373. }
  374. }]
  375. },
  376. featuresSetting: {
  377. "emptyRows":0,
  378. "headRows":1,
  379. "headRowHeight":[25],
  380. "defaultRowHeight": 21,
  381. "cols":[{
  382. "width":160,
  383. "readOnly":true,
  384. "head":{
  385. "titleNames":["项目特征"],
  386. "spanCols":[1],
  387. "spanRows":[1],
  388. "vAlign":[1],
  389. "hAlign":[1],
  390. "font":["Arial"]
  391. },
  392. "data":{
  393. "field":"content",
  394. "vAlign":0,
  395. "hAlign":3,
  396. "font":"Arial"
  397. }
  398. }]
  399. }
  400. };
  401. function addEventOnResize(fn){
  402. let originFn = window.onresize;
  403. window.onresize =function () {
  404. originFn && originFn();
  405. fn();
  406. }
  407. }
  408. addEventOnResize(billsLibObj.refreshSettingForHint);
  409. //赋初始高度
  410. if($('#stdBillsSpread').height() === 0 || $('#qd').find('.bottom-content').height() === 0){
  411. $('#stdBillsSpread').height($(window).height()-$(".header").height()-$(".toolsbar").height()-$(".tools-bar-height-q").height()-312);
  412. $('#qd').find('.bottom-content').find('.p-0').height(270);
  413. }
  414. $('#stdBillsTab').bind('click', function () {
  415. refreshSubSpread();//subSpread、jobSpread、itemSpread显示问题
  416. //$(".main-data-side-q").height($(window).height() - $(".header").height() - $(".toolsbar").height() - $(".tools-bar-height-q").height() - 202);
  417. var select = $('#stdBillsLibSelect');
  418. billsLibObj.refreshBillsSpread();
  419. billsLibObj.refreshBillsRelaSpread();
  420. billsLibObj.checkBillsSpread();
  421. if (select[0].options.length === 0) {
  422. billsLibObj.loadStdBillsLib();
  423. };
  424. });
  425. $('#stdBillsLibSelect').change(function () {
  426. $('#stdBillsSearchResult').hide();
  427. //$(".main-data-side-q").height($(window).height() - $(".header").height() - $(".toolsbar").height() - $(".tools-bar-height-q").height() - 202);
  428. billsLibObj.clearHighLight(billsLibObj.stdBillsSpread);
  429. var select = $(this);
  430. if (this.children.length !== 0) {
  431. //设置sessionStorage
  432. let billsLibId = select.val();
  433. sessionStorage.setItem('stdBillsLib', billsLibId);
  434. //清除展开收起状态sessionStorage
  435. sessionStorage.removeItem('stdBillsLibExpState');
  436. billsLibObj.loadStdBills(billsLibId);
  437. }
  438. });
  439. // 关闭搜索结果
  440. $('#closeSearchStdBills').click(function () {
  441. $('#stdBillsSearchResult').hide();
  442. $(".main-data-side-q").height($(window).height() - $(".header").height() - $(".toolsbar").height() - $(".tools-bar-height-q").height() - 202);
  443. billsLibObj.clearHighLight(billsLibObj.stdBillsSpread);
  444. });