measure_compare.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. 'use strict';
  2. /**
  3. * 多期比较
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const billsSpreadSetting = {
  10. baseCols: [
  11. {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 150, formatter: '@', cellType: 'tree'},
  12. {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 80, formatter: '@'},
  13. {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 230, formatter: '@'},
  14. {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 50, formatter: '@', cellType: 'unit'},
  15. {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number'},
  16. {title: '台账|数量', colSpan: '2|1', rowSpan: '1|1', field: 'quantity', hAlign: 2, width: 60, type: 'Number', },
  17. {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 60, type: 'Number', },
  18. ],
  19. extraCols: [
  20. {title: '%s|数量', colSpan: '2|1', rowSpan: '1|1', field: '{%s}_qty{%d}', hAlign: 2, width: 60, type: 'Number', },
  21. {title: '|金额', colSpan: '|1', rowSpan: '|1', field: '{%s}_tp{%d}', hAlign: 2, width: 60, type: 'Number', },
  22. ],
  23. emptyRows: 3,
  24. headRows: 2,
  25. headRowHeight: [25, 25],
  26. headerFont: '12px 微软雅黑',
  27. font: '12px 微软雅黑',
  28. defaultRowHeight: 21,
  29. readOnly: true,
  30. selectedBackColor: '#fffacd',
  31. };
  32. const posSpreadSetting = {
  33. baseCols: [
  34. {title: '名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 230, formatter: '@'},
  35. {title: '台账数量', colSpan: '1', rowSpan: '1', field: 'quantity', hAlign: 2, width: 60},
  36. ],
  37. extraCols: [
  38. {title: '%s数量', colSpan: '1', rowSpan: '1', field: '{%s}_qty{%d}', hAlign: 2, width: 60},
  39. ],
  40. emptyRows: 3,
  41. headRows: 1,
  42. headRowHeight: [32],
  43. headColWidth: [30],
  44. defaultRowHeight: 21,
  45. headerFont: '12px 微软雅黑',
  46. font: '12px 微软雅黑',
  47. readOnly: true,
  48. selectedBackColor: '#fffacd',
  49. };
  50. const exportBillsSpreadSetting = {
  51. baseCols: [
  52. {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 150, formatter: '@', cellType: 'tree'},
  53. {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 80, formatter: '@'},
  54. {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 230, formatter: '@'},
  55. {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 50, formatter: '@', cellType: 'unit'},
  56. {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number'},
  57. {title: '台账|数量', colSpan: '2|1', rowSpan: '1|1', field: 'quantity', hAlign: 2, width: 60, type: 'Number', },
  58. {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 60, type: 'Number', },
  59. ],
  60. extraCols: [
  61. {title: '%s|数量', colSpan: '2|1', rowSpan: '1|1', field: '{%s}_qty{%d}', hAlign: 2, width: 60, type: 'Number', },
  62. {title: '|金额', colSpan: '|1', rowSpan: '|1', field: '{%s}_tp{%d}', hAlign: 2, width: 60, type: 'Number', },
  63. ],
  64. endCols: [],
  65. emptyRows: 3,
  66. headRows: 2,
  67. headRowHeight: [25, 25],
  68. headerFont: '12px 微软雅黑',
  69. font: '12px 微软雅黑',
  70. defaultRowHeight: 21,
  71. readOnly: true,
  72. selectedBackColor: '#fffacd',
  73. };
  74. const gclSpreadSetting = {
  75. baseCols: [
  76. {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 80, formatter: '@'},
  77. {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 230, formatter: '@'},
  78. {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 60, formatter: '@', cellType: 'unit'},
  79. {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number'},
  80. {title: '签约清单|数量', colSpan: '2|1', rowSpan: '1|1', field: 'deal_bills_qty', hAlign: 2, width: 60, type: 'Number'},
  81. {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'deal_bills_tp', hAlign: 2, width: 60, type: 'Number'},
  82. {title: '台账|数量', colSpan: '2|1', rowSpan: '1|1', field: 'quantity', hAlign: 2, width: 60, type: 'Number'},
  83. {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 60, type: 'Number'},
  84. ],
  85. extraCols: [
  86. {title: '%s|数量', colSpan: '2|1', rowSpan: '1|1', field: '{%s}_qty{%d}', hAlign: 2, width: 60, type: 'Number', },
  87. {title: '|金额', colSpan: '|1', rowSpan: '|1', field: '{%s}_tp{%d}', hAlign: 2, width: 60, type: 'Number', },
  88. ],
  89. emptyRows: 0,
  90. headRows: 2,
  91. headRowHeight: [25, 25],
  92. headColWidth: [30],
  93. defaultRowHeight: 21,
  94. headerFont: '12px 微软雅黑',
  95. font: '12px 微软雅黑',
  96. readOnly: true,
  97. };
  98. const leafXmjSpreadSetting = {
  99. baseCols: [
  100. {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 100, formatter: '@'},
  101. {title: '单位工程', colSpan: '1', rowSpan: '2', field: 'dwgc', hAlign: 0, width: 80, formatter: '@'},
  102. {title: '分部工程', colSpan: '1', rowSpan: '2', field: 'fbgc', hAlign: 0, width: 80, formatter: '@'},
  103. {title: '分项工程', colSpan: '1', rowSpan: '2', field: 'fxgc', hAlign: 0, width: 80, formatter: '@'},
  104. {title: '细目', colSpan: '1', rowSpan: '2', field: 'jldy', hAlign: 0, width: 80, formatter: '@'},
  105. {title: '计量单元', colSpan: '1', rowSpan: '2', field: 'bwmx', hAlign: 0, width: 80, formatter: '@'},
  106. {title: '图册号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 80, formatter: '@'},
  107. {title: '台账数量', colSpan: '1', rowSpan: '2', field: 'quantity', hAlign: 2, width: 60, type: 'Number'},
  108. ],
  109. extraCols: [
  110. {title: '%s数量', colSpan: '1', rowSpan: '2', field: '{%s}_qty{%d}', hAlign: 2, width: 60},
  111. ],
  112. emptyRows: 0,
  113. headRows: 2,
  114. headRowHeight: [25, 25],
  115. headColWidth: [30],
  116. defaultRowHeight: 21,
  117. headerFont: '12px 微软雅黑',
  118. font: '12px 微软雅黑',
  119. readOnly: true,
  120. };
  121. const exportGclSpreadSetting = {
  122. baseCols: [
  123. {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 80, formatter: '@'},
  124. {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 230, formatter: '@'},
  125. {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 100, formatter: '@'},
  126. {title: '单位工程', colSpan: '1', rowSpan: '2', field: 'dwgc', hAlign: 0, width: 80, formatter: '@'},
  127. {title: '分部工程', colSpan: '1', rowSpan: '2', field: 'fbgc', hAlign: 0, width: 80, formatter: '@'},
  128. {title: '分项工程', colSpan: '1', rowSpan: '2', field: 'fxgc', hAlign: 0, width: 80, formatter: '@'},
  129. {title: '细目', colSpan: '1', rowSpan: '2', field: 'jldy', hAlign: 0, width: 80, formatter: '@'},
  130. {title: '计量单元', colSpan: '1', rowSpan: '2', field: 'bwmx', hAlign: 0, width: 80, formatter: '@'},
  131. {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 60, formatter: '@', cellType: 'unit'},
  132. {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number'},
  133. {title: '签约清单|数量', colSpan: '2|1', rowSpan: '1|1', field: 'deal_bills_qty', hAlign: 2, width: 60, type: 'Number'},
  134. {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'deal_bills_tp', hAlign: 2, width: 60, type: 'Number'},
  135. {title: '台账|数量', colSpan: '2|1', rowSpan: '1|1', field: 'quantity', hAlign: 2, width: 60, type: 'Number'},
  136. {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 60, type: 'Number'},
  137. ],
  138. extraCols: [
  139. {title: '%s|数量', colSpan: '2|1', rowSpan: '1|1', field: '{%s}_qty{%d}', hAlign: 2, width: 60, type: 'Number', },
  140. {title: '|金额', colSpan: '|1', rowSpan: '|1', field: '{%s}_tp{%d}', hAlign: 2, width: 60, type: 'Number', },
  141. ],
  142. endCols: [
  143. {title: '图册号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 80, formatter: '@'},
  144. ],
  145. emptyRows: 0,
  146. headRows: 2,
  147. headRowHeight: [25, 25],
  148. headColWidth: [30],
  149. defaultRowHeight: 21,
  150. headerFont: '12px 微软雅黑',
  151. font: '12px 微软雅黑',
  152. readOnly: true,
  153. };
  154. function initSpreadSettingWithRoles(compareRoles) {
  155. function setSpreadSettingCols(setting, fieldSufs, Roles) {
  156. function addExtraCols(fieldSuf, Role) {
  157. const sourceType = $('[name=compare-data]:checked').val();
  158. for (const ec of setting.extraCols) {
  159. const col = JSON.parse(JSON.stringify(ec));
  160. col.title = _.replace(col.title, '%s', Role);
  161. col.field = _.replace(_.replace(col.field, '{%s}', sourceType), '{%d}', fieldSuf);
  162. setting.cols.push(col);
  163. }
  164. }
  165. setting.cols = [];
  166. for (const col of setting.baseCols) {
  167. setting.cols.push(col);
  168. }
  169. setting.frozenColCount = setting.baseCols.length;
  170. setting.frozenLineColor = '#93b5e4';
  171. for (const index in fieldSufs) {
  172. addExtraCols(fieldSufs[index], Roles[index]);
  173. }
  174. if (setting.endCols) {
  175. for (const col of setting.endCols) {
  176. setting.cols.push(col);
  177. }
  178. }
  179. }
  180. const fieldSufs = [], roles = [], trs = $('tr[stage-id]');
  181. for (let r of compareRoles) {
  182. if (r > 0) {
  183. const tr = trs[r-1];
  184. if (tr) {
  185. fieldSufs.push(r + '');
  186. roles.push(tr.children[0].textContent);
  187. }
  188. }
  189. }
  190. setSpreadSettingCols(billsSpreadSetting, fieldSufs, roles);
  191. setSpreadSettingCols(posSpreadSetting, fieldSufs, roles);
  192. setSpreadSettingCols(exportBillsSpreadSetting, fieldSufs, roles);
  193. setSpreadSettingCols(gclSpreadSetting, fieldSufs, roles);
  194. setSpreadSettingCols(leafXmjSpreadSetting, fieldSufs, roles);
  195. setSpreadSettingCols(exportGclSpreadSetting, fieldSufs, roles);
  196. }
  197. function calculateStageLedgerData(datas) {
  198. for (const d of datas) {
  199. d.gather_qty = ZhCalc.add(d.contract_qty, d.qc_qty);
  200. d.gather_tp = ZhCalc.sum([d.contract_tp, d.qc_tp, d.pc_tp]);
  201. // d.pc_tp = ZhCalc.add(d.qc_tp, d.qc_pc_tp);
  202. // d.contract_tp = ZhCalc.add(d.contract_tp, d.contract_pc_tp);
  203. }
  204. }
  205. function calculateStagePosData(datas) {
  206. for (const d of datas) {
  207. d.gather_qty = ZhCalc.add(d.contract_qty, d.qc_qty);
  208. }
  209. }
  210. $(document).ready(() => {
  211. autoFlashHeight();
  212. initSpreadSettingWithRoles([]);
  213. const billsSpread = SpreadJsObj.createNewSpread($('#bills-spread')[0]);
  214. const billsSheet = billsSpread.getActiveSheet();
  215. sjsSettingObj.setFxTreeStyle(billsSpreadSetting, sjsSettingObj.FxTreeStyle.jz);
  216. if (thousandth) sjsSettingObj.setTpThousandthFormat(billsSpreadSetting);
  217. SpreadJsObj.initSheet(billsSheet, billsSpreadSetting);
  218. const posSpread = SpreadJsObj.createNewSpread($('#pos-spread')[0]);
  219. const posSheet = posSpread.getActiveSheet();
  220. if (thousandth) sjsSettingObj.setTpThousandthFormat(posSpreadSetting);
  221. SpreadJsObj.initSheet(posSheet, posSpreadSetting);
  222. let gclGatherData;
  223. const gclSpread = SpreadJsObj.createNewSpread($('#gcl-spread')[0]);
  224. const gclSheet = gclSpread.getActiveSheet();
  225. sjsSettingObj.setFxTreeStyle(gclSpreadSetting, sjsSettingObj.FxTreeStyle.jz);
  226. if (thousandth) sjsSettingObj.setTpThousandthFormat(gclSpreadSetting);
  227. SpreadJsObj.initSheet(gclSheet, gclSpreadSetting);
  228. const leafXmjSpread = SpreadJsObj.createNewSpread($('#leaf-xmj-spread')[0]);
  229. const leafXmjSheet = leafXmjSpread.getActiveSheet();
  230. if (thousandth) sjsSettingObj.setTpThousandthFormat(leafXmjSpreadSetting);
  231. SpreadJsObj.initSheet(leafXmjSheet, leafXmjSpreadSetting);
  232. $.subMenu({
  233. menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
  234. toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
  235. key: 'menu.1.0.0',
  236. miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
  237. callback: function (info) {
  238. if (info.mini) {
  239. $('.panel-title').addClass('fluid');
  240. $('#sub-menu').removeClass('panel-sidebar');
  241. } else {
  242. $('.panel-title').removeClass('fluid');
  243. $('#sub-menu').addClass('panel-sidebar');
  244. }
  245. autoFlashHeight();
  246. billsSpread.refresh();
  247. posSpread.refresh();
  248. }
  249. });
  250. // 上下窗口resizer
  251. $.divResizer({
  252. select: '#main-resize',
  253. callback: function () {
  254. billsSpread.refresh();
  255. let bcontent = $("#main-bottom").length > 0 ? $("#main-bottom").height() : 0;
  256. $("#pos-spread").height(bcontent-30);
  257. posSpread.refresh();
  258. }
  259. });
  260. $.divResizer({
  261. select: '#gcl-resize',
  262. callback: function () {
  263. gclSpread.refresh();
  264. let bcontent = $("#leafxmj-bottom").length > 0 ? $("#leafxmj-bottom").height() : 0;
  265. $("#leaf-xmj-spread").height(bcontent-30);
  266. leafXmjSpread.refresh();
  267. }
  268. });
  269. const cTree = createNewPathTree('master', {
  270. id: 'ledger_id',
  271. pid: 'ledger_pid',
  272. order: 'order',
  273. level: 'level',
  274. rootId: -1,
  275. keys: ['id', 'tender_id', 'ledger_id'],
  276. masterId: 'id',
  277. minorId: 'lid',
  278. calcFields: ['total_price'],
  279. markFoldKey: 'bills-fold',
  280. markFoldSubKey: window.location.pathname.split('/')[2],
  281. });
  282. const cPos = new MasterPosData({
  283. id: 'id', ledgerId: 'lid', masterId: 'id', minorId: 'pid',
  284. calcFun: function (pos) {
  285. pos.gather_qty = ZhCalc.add(pos.contract_qty, pos.qc_qty);
  286. }
  287. });
  288. postData(window.location.pathname + '/load', {main: true}, function (result) {
  289. cTree.loadDatas(result.main.ledger);
  290. treeCalc.calculateAll(cTree);
  291. cPos.loadDatas(result.main.pos);
  292. SpreadJsObj.loadSheetData(billsSheet, SpreadJsObj.DataType.Tree, cTree);
  293. loadPosData(0);
  294. const checkField = function (x) {
  295. if (x === 'quantity') return true;
  296. if (x === 'total_price') return true;
  297. if (x.indexOf('_qty') >= 0) return true;
  298. if (x.indexOf('_tp') >= 0) return true;
  299. return false;
  300. };
  301. gclGatherModel.loadGatherField(checkField, checkField);
  302. gclGatherModel.loadLedgerData(result.main.ledger);
  303. gclGatherModel.loadPosData(result.main.pos);
  304. gclGatherModel.loadDealBillsData(result.main.deal);
  305. gclGatherData = gclGatherModel.gatherGclData();
  306. SpreadJsObj.loadSheetData(gclSheet, SpreadJsObj.DataType.Data, gclGatherData);
  307. loadLeafXmjData(0);
  308. }, null, true);
  309. function loadPosData(iRow) {
  310. const node = iRow ? billsSheet.zh_tree.nodes[iRow] : SpreadJsObj.getSelectObject(billsSheet);
  311. const posRange = node ? (cPos.getLedgerPos(node.id) || []) : [];
  312. SpreadJsObj.loadSheetData(posSheet, SpreadJsObj.DataType.Data, posRange);
  313. SpreadJsObj.resetTopAndSelect(posSheet);
  314. }
  315. function loadLeafXmjData(iRow) {
  316. const gcl = iRow ? gclSheet.zh_data[iRow] : SpreadJsObj.getSelectObject(gclSheet);
  317. if (gcl) {
  318. SpreadJsObj.loadSheetData(leafXmjSheet, SpreadJsObj.DataType.Data, gcl.leafXmjs);
  319. } else {
  320. SpreadJsObj.loadSheetData(leafXmjSheet, SpreadJsObj.DataType.Data, []);
  321. }
  322. SpreadJsObj.resetTopAndSelect(leafXmjSheet);
  323. }
  324. billsSheet.bind(spreadNS.Events.SelectionChanged, function (e, info) {
  325. console.log(SpreadJsObj.getSelectObject(info.sheet));
  326. if (info.newSelections) {
  327. const iNewRow = info.newSelections[0].row;
  328. if (info.oldSelections) {
  329. const iOldRow = info.oldSelections[0].row;
  330. if (iNewRow !== iOldRow) {
  331. SpreadJsObj.resetTopAndSelect(posSheet);
  332. loadPosData(iNewRow);
  333. }
  334. } else {
  335. SpreadJsObj.resetTopAndSelect(leafXmjSheet);
  336. loadPosData(iNewRow);
  337. }
  338. }
  339. });
  340. gclSheet.bind(spreadNS.Events.SelectionChanged, function (e, info) {
  341. if (info.newSelections) {
  342. const iNewRow = info.newSelections[0].row;
  343. if (info.oldSelections) {
  344. const iOldRow = info.oldSelections[0].row;
  345. if (iNewRow !== iOldRow) {
  346. SpreadJsObj.resetTopAndSelect(leafXmjSheet);
  347. loadLeafXmjData(iNewRow);
  348. }
  349. } else {
  350. SpreadJsObj.resetTopAndSelect(leafXmjSheet);
  351. loadLeafXmjData(iNewRow);
  352. }
  353. }
  354. });
  355. const compareStages = [];
  356. $('#select-qi-ok').click(function () {
  357. function refreshView () {
  358. compareStages.length = 0;
  359. for (let order = 0, iLength = trs.length; order < iLength; order++) {
  360. const tr = trs[order];
  361. if ($('input', tr)[0].checked) {
  362. compareStages.push(order + 1);
  363. }
  364. }
  365. // setLocalCache(cCacheKey, compareStages.join(','));
  366. initSpreadSettingWithRoles(compareStages);
  367. SpreadJsObj.initSheet(billsSheet, billsSpreadSetting);
  368. treeCalc.calculateAll(cTree);
  369. SpreadJsObj.loadSheetData(billsSheet, SpreadJsObj.DataType.Tree, cTree);
  370. SpreadJsObj.initSheet(posSheet, posSpreadSetting);
  371. loadPosData();
  372. SpreadJsObj.reLoadSheetHeader(gclSheet);
  373. SpreadJsObj.reLoadSheetHeader(leafXmjSheet);
  374. gclGatherModel.loadLedgerData(cTree.datas);
  375. gclGatherModel.loadPosData(cPos.datas);
  376. gclGatherData = gclGatherModel.gatherGclData();
  377. SpreadJsObj.loadSheetData(gclSheet, SpreadJsObj.DataType.Data, gclGatherData);
  378. loadLeafXmjData(0);
  379. }
  380. let loadData = [], showData = [], trs = $('tr[stage-id]');
  381. for (let order = 0, iLength = trs.length; order < iLength; order++) {
  382. const tr = trs[order];
  383. if ($('input[type=checkbox]', tr)[0].checked) {
  384. if (!cTree.minorData[order + 1]) {
  385. loadData.push(order + 1);
  386. }
  387. showData.push(order + 1);
  388. }
  389. }
  390. if (loadData.length > 0) {
  391. postData(window.location.pathname + '/load', {stages: loadData}, function (result) {
  392. for (const aData of result.stages) {
  393. calculateStageLedgerData(aData.bills);
  394. cTree.loadMinorData(aData.bills, aData.order + '', ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp'], ['contract_tp', 'qc_tp', 'gather_tp']);
  395. treeCalc.calculateAll(cTree);
  396. calculateStagePosData(aData.pos);
  397. cPos.loadMinorData(aData.pos, aData.order + '', ['contract_qty', 'qc_qty', 'gather_qty']);
  398. }
  399. refreshView();
  400. $('#select-qi').modal('hide');
  401. }, null, true);
  402. } else {
  403. refreshView();
  404. $('#select-qi').modal('hide');
  405. }
  406. });
  407. (function (select, sheet) {
  408. $(select).click(function () {
  409. if (!sheet.zh_tree) return;
  410. const tag = $(this).attr('tag');
  411. const tree = sheet.zh_tree;
  412. switch (tag) {
  413. case "1":
  414. case "2":
  415. case "3":
  416. case "4":
  417. case "5":
  418. tree.expandByLevel(parseInt(tag));
  419. SpreadJsObj.refreshTreeRowVisible(sheet);
  420. break;
  421. case "last":
  422. tree.expandByCustom(() => { return true; });
  423. SpreadJsObj.refreshTreeRowVisible(sheet);
  424. break;
  425. case "leafXmj":
  426. tree.expandToLeafXmj();
  427. SpreadJsObj.refreshTreeRowVisible(sheet);
  428. break;
  429. }
  430. });
  431. })('a[name=showLevel]', billsSheet);
  432. $('#exportExcel').click(function () {
  433. const exportLedger = function () {
  434. const data = [];
  435. if (!billsSheet.zh_tree) return;
  436. for (const node of billsSheet.zh_tree.nodes) {
  437. data.push(node);
  438. const posRange = cPos.getLedgerPos(node.id);
  439. if (posRange && posRange.length > 0) {
  440. for (const pr of posRange) {
  441. data.push(pr);
  442. }
  443. }
  444. }
  445. SpreadExcelObj.exportSimpleXlsxSheet(exportBillsSpreadSetting, data, $('.sidebar-title').attr('data-original-title') + "-多期比较.xlsx");
  446. };
  447. const exportGcl = function () {
  448. const data = [];
  449. if (!gclSheet.zh_data) return;
  450. for (const node of gclSheet.zh_data) {
  451. data.push(node);
  452. for (const leafXmj of node.leafXmjs) {
  453. data.push(leafXmj);
  454. }
  455. }
  456. SpreadExcelObj.exportSimpleXlsxSheet(exportGclSpreadSetting, data, $('.sidebar-title').attr('data-original-title') + "-多期比较.xlsx");
  457. };
  458. const cur = $('.active[name=compareType]').attr('href');
  459. if (cur.indexOf('gcl') >= 0) {
  460. exportGcl();
  461. } else {
  462. exportLedger();
  463. }
  464. });
  465. $('[name=compare-data]').click(function () {
  466. initSpreadSettingWithRoles(compareStages);
  467. SpreadJsObj.reLoadSheetHeader(billsSheet);
  468. SpreadJsObj.reloadColData(billsSheet, billsSpreadSetting.baseCols.length, compareStages.length * billsSpreadSetting.extraCols.length);
  469. SpreadJsObj.reLoadSheetHeader(posSheet);
  470. SpreadJsObj.reloadColData(posSheet, posSpreadSetting.baseCols.length, compareStages.length * posSpreadSetting.extraCols.length);
  471. SpreadJsObj.reLoadSheetHeader(gclSheet);
  472. SpreadJsObj.reloadColData(gclSheet, gclSpreadSetting.baseCols.length, compareStages.length * gclSpreadSetting.extraCols.length);
  473. SpreadJsObj.reLoadSheetHeader(leafXmjSheet);
  474. SpreadJsObj.reloadColData(leafXmjSheet, leafXmjSpreadSetting.baseCols.length, compareStages.length * leafXmjSpreadSetting.extraCols.length);
  475. });
  476. $('[name=compareType]').click(function () {
  477. $('[name=compareType]').removeClass('active');
  478. $(this).addClass('active');
  479. $('#compareType').children().removeClass('active');
  480. $(this.getAttribute('href')).addClass('active');
  481. billsSpread.refresh();
  482. posSpread.refresh();
  483. gclSpread.refresh();
  484. leafXmjSpread.refresh();
  485. });
  486. $('#select-qi-all').click(function() {
  487. const check = this.checked;
  488. $('input', 'tr[stage-id]').each((i, x) => {
  489. x.checked = check;
  490. })
  491. });
  492. });