std_bills_lib.js 19 KB

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