cost_compare.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. $(document).ready(() => {
  2. autoFlashHeight();
  3. const compareUtils = {
  4. refreshSpreadSetting(roles, spreadSetting) {
  5. spreadSetting.cols = [];
  6. spreadSetting.fieldSufs = [];
  7. for (const col of spreadSetting.baseCols) {
  8. spreadSetting.cols.push(col);
  9. }
  10. for (const role of roles) {
  11. spreadSetting.fieldSufs.push(role.active_order);
  12. for (const ec of spreadSetting.extraCols) {
  13. const col = JSON.parse(JSON.stringify(ec));
  14. col.title = _.replace(col.title, '%s', role.name);
  15. col.field = col.field + '_' + role.active_order;
  16. spreadSetting.cols.push(col);
  17. }
  18. }
  19. },
  20. analysisCompareData(datas, roles, extraCols){
  21. const findHis = function (role, history) {
  22. let his = null;
  23. for (const h of history) {
  24. if (h.audit_times < role.audit_times || (h.audit_times === role.audit_times && h.active_order <= role.active_order)) {
  25. his = h;
  26. } else {
  27. break;
  28. }
  29. }
  30. return his;
  31. };
  32. for (const d of datas) {
  33. if (d.tree_id && !d.tree_is_leaf) continue;
  34. if (!d.calc_his) d.calc_his = [];
  35. d.calc_his.sort((x, y) => { return x.audit_times === y.audit_times ? x.active_order - y.active_order : x.audit_times - y.audit_times; });
  36. for (const r of roles) {
  37. if (r.latest) {
  38. for (const col of extraCols){
  39. d[col.field + '_' + r.active_order] = d[col.field];
  40. }
  41. } else {
  42. const rHis = findHis(r, d.calc_his);
  43. if (rHis) {
  44. for (const col of extraCols){
  45. d[col.field + '_' + r.active_order] = rHis[col.field];
  46. }
  47. }
  48. }
  49. }
  50. }
  51. },
  52. filterSameRoles(roles) {
  53. const result = [];
  54. for (const af of roles) {
  55. const naf = roles.find(x => { return x.audit_order === af.audit_order && x.active_order > af.active_order; });
  56. if (!naf) result.push(af);
  57. }
  58. return result;
  59. }
  60. };
  61. const converseSpreadSetting = function(setting) {
  62. setting.baseCols = [];
  63. setting.extraCols = [];
  64. let firstExtraCol;
  65. for (const col of setting.cols) {
  66. if (calcFields.indexOf(col.field) < 0) {
  67. if (firstExtraCol) continue;
  68. col.rowSpan = (setting.headRows + 1) + '';
  69. setting.baseCols.push(col);
  70. } else {
  71. if (!firstExtraCol) {
  72. firstExtraCol = col;
  73. col.title = '%s|' + col.title;
  74. col.rowSpan = '1|' + col.rowSpan;
  75. } else {
  76. col.title = '|' + col.title;
  77. col.colSpan = '|' + col.colSpan;
  78. col.rowSpan = '|' + col.rowSpan;
  79. }
  80. setting.extraCols.push(col);
  81. }
  82. }
  83. firstExtraCol.colSpan = setting.extraCols.length + '|' + firstExtraCol.colSpan;
  84. setting.headRows = setting.headRows + 1;
  85. setting.headRowHeight.unshift(setting.headRowHeight[0]);
  86. setting.cols = [...setting.baseCols];
  87. return setting;
  88. };
  89. class BillsObj {
  90. constructor() {
  91. this.spread = SpreadJsObj.createNewSpread($('#bills-spread')[0]);
  92. this.sheet = this.spread.getActiveSheet();
  93. this.treeSetting = {
  94. id: 'tree_id',
  95. pid: 'tree_pid',
  96. order: 'tree_order',
  97. level: 'tree_level',
  98. isLeaf: 'tree_is_leaf',
  99. fullPath: 'tree_full_path',
  100. rootId: -1,
  101. calcFields: ['yf_tp', 'sf_tp', 'pay_tp', 'cut_tp', 'yf_excl_tax_tp', 'sf_excl_tax_tp', 'end_yf_tp', 'end_sf_tp', 'end_pay_tp', 'end_cut_tp', 'end_yf_excl_tax_tp', 'end_sf_excl_tax_tp'],
  102. keys: ['id', 'stage_id', 'tree_id'],
  103. };
  104. this.tree = createNewPathTree('ledger', this.treeSetting);
  105. this.spreadSetting = converseSpreadSetting(bllsSpreadSetting);
  106. sjsSettingObj.setFxTreeStyle(this.spreadSetting, sjsSettingObj.FxTreeStyle.phasePay);
  107. this.ckBillsSpread = window.location.pathname + '-billsSelect';
  108. this.initSpread();
  109. }
  110. initSpread() {
  111. SpreadJsObj.initSheet(this.sheet, this.spreadSetting);
  112. this.spread.bind(spreadNS.Events.SelectionChanged, this.selectionChanged);
  113. this.spread.bind(spreadNS.Events.topRowChanged, this.topRowChanged);
  114. }
  115. loadRelaData() {
  116. SpreadJsObj.saveTopAndSelect(this.sheet, this.ckBillsSpread);
  117. const select = SpreadJsObj.getSelectObject(this.sheet);
  118. detailObj.loadDetailData(select);
  119. }
  120. initSpreadSetting(roles = []) {
  121. compareUtils.refreshSpreadSetting(roles, this.spreadSetting);
  122. SpreadJsObj.initSheet(this.sheet, this.spreadSetting);
  123. }
  124. loadData(datas, roles) {
  125. this.initSpreadSetting(roles);
  126. compareUtils.analysisCompareData(datas, roles, this.spreadSetting.extraCols);
  127. this.tree.loadDatas(datas);
  128. this.tree.setting.calcFields = [];
  129. for (const r of roles) {
  130. for (const col of this.spreadSetting.extraCols) {
  131. this.tree.setting.calcFields.push(col.field + '_' + r.active_order);
  132. }
  133. }
  134. treeCalc.calculateAll(this.tree);
  135. SpreadJsObj.loadSheetData(this.sheet, SpreadJsObj.DataType.Tree, this.tree);
  136. SpreadJsObj.loadTopAndSelect(this.sheet, this.ckBillsSpread);
  137. }
  138. // 事件
  139. selectionChanged(e, info) {
  140. if (info.newSelections) {
  141. if (!info.oldSelections || info.newSelections[0].row !== info.oldSelections[0].row) {
  142. billsObj.loadRelaData();
  143. }
  144. }
  145. }
  146. topRowChanged(e, info) {
  147. SpreadJsObj.saveTopAndSelect(info.sheet, billsObj.ckBillsSpread);
  148. }
  149. }
  150. const billsObj = new BillsObj();
  151. class DetailObj {
  152. constructor() {
  153. this.spread = SpreadJsObj.createNewSpread($('#detail-spread')[0]);
  154. this.sheet = this.spread.getActiveSheet();
  155. this.data = createAncillaryGcl({ id: 'id', masterId: 'ledger_id', sort: [['d_order', 'asc']] });
  156. this.dealSpreadSetting = converseSpreadSetting(dealSpreadSetting);
  157. this.commonSpreadSetting = converseSpreadSetting(commonSpreadSetting);
  158. this.initSpread();
  159. }
  160. initSpread() {
  161. SpreadJsObj.initSheet(this.sheet, this.commonSpreadSetting);
  162. }
  163. refreshSpreadSetting(roles, spreadSetting) {
  164. spreadSetting.cols = [];
  165. spreadSetting.fieldSufs = [];
  166. for (const col of spreadSetting.baseCols) {
  167. spreadSetting.cols.push(col);
  168. }
  169. for (const role of roles) {
  170. spreadSetting.fieldSufs.push(role.active_order);
  171. for (const ec of spreadSetting.extraCols) {
  172. const col = JSON.parse(JSON.stringify(ec));
  173. col.title = _.replace(col.title, '%s', role.name);
  174. col.field = col.field + '_' + role.active_order;
  175. spreadSetting.cols.push(col);
  176. }
  177. }
  178. }
  179. initSpreadSetting(roles = []) {
  180. this.refreshSpreadSetting(roles, this.commonSpreadSetting);
  181. this.refreshSpreadSetting(roles, this.dealSpreadSetting);
  182. SpreadJsObj.initSheet(this.sheet, this.commonSpreadSetting);
  183. }
  184. loadData(datas, roles) {
  185. this.initSpreadSetting(roles);
  186. compareUtils.analysisCompareData(datas, roles, this.dealSpreadSetting.extraCols);
  187. this.data.loadDatas(datas);
  188. this.loadDetailData(SpreadJsObj.getSelectObject(billsObj.sheet));
  189. }
  190. refreshSheet() {
  191. if (this.sheet.zh_data.length === 0) {
  192. this.reloadDetailData();
  193. } else {
  194. SpreadJsObj.reLoadSheetData(this.sheet);
  195. }
  196. }
  197. reloadDetailData() {
  198. const data = this.billsNode ? this.data.getPartData(this.billsNode.id) || [] : [];
  199. SpreadJsObj.loadSheetData(this.sheet, SpreadJsObj.DataType.Data, data);
  200. }
  201. loadDetailData(bills) {
  202. detailObj.billsNode = bills;
  203. const spreadSetting = bills && bills.is_deal ? this.dealSpreadSetting : this.commonSpreadSetting;
  204. SpreadJsObj.initSheet(this.sheet, spreadSetting);
  205. this.reloadDetailData();
  206. SpreadJsObj.locateRow(this.sheet, 0, false);
  207. }
  208. }
  209. const detailObj = new DetailObj();
  210. const searchObj = $.ledgerSearch({
  211. selector: '#search',
  212. searchRangeStr: '编号/名称',
  213. ledger: {
  214. billsTree: billsObj.tree,
  215. getLedgerPos: function(node) { return detailObj.data.getPartData(node.id); },
  216. posId: 'id',
  217. },
  218. resultSpreadSetting: {
  219. cols: [
  220. {title: '编号', field: 'code', hAlign: 0, width: 90, formatter: '@'},
  221. {title: '名称', field: 'name', width: 150, hAlign: 0, formatter: '@'},
  222. {title: '单位', field: 'unit', width: 50, hAlign: 1, formatter: '@'},
  223. ],
  224. emptyRows: 0,
  225. headRows: 1,
  226. headRowHeight: [32],
  227. headColWidth: [30],
  228. defaultRowHeight: 21,
  229. headerFont: '12px 微软雅黑',
  230. font: '12px 微软雅黑',
  231. selectedBackColor: '#fffacd',
  232. readOnly: true,
  233. },
  234. locate: function(cur) {
  235. if (!cur.lid) return;
  236. SpreadJsObj.locateTreeNode(billsObj.sheet, cur.lid, true);
  237. billsObj.loadRelaData();
  238. if (cur.pid) {
  239. const pIndex = detailObj.sheet.zh_data.findIndex(x => { return x.id === cur.pid; });
  240. if (pIndex >= 0) SpreadJsObj.locateRow(detailObj.sheet, pIndex);
  241. }
  242. },
  243. });
  244. // 加载数据
  245. postData('load', { filter: 'billsCompare;detailCompare;auditFlow' }, function(result) {
  246. const filter = true;
  247. const roles = filter ? compareUtils.filterSameRoles(result.auditFlow) : result.auditFlow;
  248. billsObj.loadData(result.billsCompare, roles);
  249. detailObj.loadData(result.detailCompare, roles);
  250. });
  251. // 展开收起标准清单
  252. $('a', '#side-menu').bind('click', function (e) {
  253. e.preventDefault();
  254. const tab = $(this), tabPanel = $(tab.attr('content'));
  255. // 展开工具栏、切换标签
  256. if (!tab.hasClass('active')) {
  257. // const close = $('.active', '#side-menu').length === 0;
  258. $('a', '#side-menu').removeClass('active');
  259. $('.tab-content .tab-select-show.tab-pane.active').removeClass('active');
  260. tab.addClass('active');
  261. tabPanel.addClass('active');
  262. // $('.tab-content .tab-pane').removeClass('active');
  263. showSideTools(tab.hasClass('active'));
  264. if (tab.attr('content') === '#search') {
  265. searchObj.spread.refresh();
  266. }
  267. } else { // 收起工具栏
  268. tab.removeClass('active');
  269. tabPanel.removeClass('active');
  270. showSideTools(tab.hasClass('active'));
  271. }
  272. billsObj.spread.refresh();
  273. detailObj.spread.refresh();
  274. });
  275. $.divResizer({
  276. select: '#detail-spr',
  277. callback: function () {
  278. billsObj.spread.refresh();
  279. detailObj.spread.refresh();
  280. }
  281. });
  282. // 工具栏spr
  283. $.divResizer({
  284. select: '#right-spr',
  285. callback: function () {
  286. billsObj.spread.refresh();
  287. detailObj.spread.refresh();
  288. searchObj.spread.refresh();
  289. }
  290. });
  291. // 导航Menu
  292. $.subMenu({
  293. menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
  294. toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
  295. key: 'menu.1.0.0',
  296. miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
  297. callback: function (info) {
  298. if (info.mini) {
  299. $('.panel-title').addClass('fluid');
  300. $('#sub-menu').removeClass('panel-sidebar');
  301. } else {
  302. $('.panel-title').removeClass('fluid');
  303. $('#sub-menu').addClass('panel-sidebar');
  304. }
  305. autoFlashHeight();
  306. billsObj.spread.refresh();
  307. detailObj.spread.refresh();
  308. }
  309. });
  310. // 显示层次
  311. (function (select, sheet) {
  312. $(select).click(function () {
  313. if (!sheet.zh_tree) return;
  314. const tag = $(this).attr('tag');
  315. const tree = sheet.zh_tree;
  316. setTimeout(() => {
  317. showWaitingView();
  318. switch (tag) {
  319. case "1":
  320. case "2":
  321. case "3":
  322. case "4":
  323. tree.expandByLevel(parseInt(tag));
  324. SpreadJsObj.refreshTreeRowVisible(sheet);
  325. break;
  326. case "last":
  327. tree.expandByCustom(() => { return true; });
  328. SpreadJsObj.refreshTreeRowVisible(sheet);
  329. break;
  330. }
  331. closeWaitingView();
  332. }, 100);
  333. });
  334. })('a[name=showLevel]', billsObj.sheet);
  335. });