rpt_format_setup.js 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998
  1. const reportFormatSetupObj = {
  2. treeObj: null,
  3. templateObj: {},
  4. canvas: null,
  5. fieldParamOptions: null,
  6. maxFieldID: -1,
  7. currentRptId: -1,
  8. currentTopNode: '定制报表',
  9. onCheck: (event, treeId, treeNode) => {
  10. //
  11. },
  12. switchButtonEnables: (isSetupEnabled = true, isPermissionEnabled = false) => {
  13. $('#btn_confirm_format_setup').attr("disabled", !isSetupEnabled);
  14. $('#rpt_title_input').attr("disabled", !isSetupEnabled);
  15. $("#add_user_dropdownMenuButton").attr('disabled', !isPermissionEnabled);
  16. $("#apply_users_toOtherMenuButton")[0].style.display = !isPermissionEnabled ? 'none' : '';
  17. },
  18. onClick: (event,treeId,treeNode) => {
  19. const me = reportFormatSetupObj;
  20. if (treeNode.nodeType !== RT.NodeType.TEMPLATE) {
  21. me.currentRptId = -1;
  22. me.clearTplProperties();
  23. const jDom = $("#report-permission-div");
  24. jDom.empty();
  25. me.switchButtonEnables(false, false);
  26. return;
  27. }
  28. let pNode = treeNode;
  29. while (pNode.level > 0) {
  30. pNode = pNode.getParentNode();
  31. }
  32. me.currentTopNode = pNode.name;
  33. me.currentRptId = treeNode.refId;
  34. me.initialize(treeNode);
  35. if (me.currentTopNode === '定制报表') {
  36. me.switchButtonEnables(true, true);
  37. } else {
  38. me.switchButtonEnables(false, true);
  39. me.clearTplProperties();
  40. }
  41. },
  42. onDeleteInfo: (dom) => {
  43. // 删除表眉、表脚项
  44. // console.log(dom.parentElement.parentElement);
  45. $(dom.parentElement.parentElement).remove();
  46. },
  47. onAddInfo: (dom, lv) => {
  48. // 增加表眉、表脚细项
  49. const me = reportFormatSetupObj;
  50. const domStrs = [];
  51. domStrs.push('<tr class="text-center">');
  52. domStrs.push('<td></td>');
  53. domStrs.push(`<td>${me._createTypeSelection(0)}</td>`);
  54. domStrs.push(`<td class="text-left"><input class="form-control form-control-sm" value="" type="text"></td>`);
  55. domStrs.push(`<td class="text-left"><input class="form-control form-control-sm" value="0" type="text"></td>`);
  56. domStrs.push(`<td class="text-left"><input class="form-control form-control-sm" value="0" type="text"></td>`);
  57. domStrs.push(`<td class="text-left"><input class="form-control form-control-sm" value="" type="text"></td>`);
  58. domStrs.push(`<td class="text-left"><input class="form-control form-control-sm" value="" type="text"></td>`);
  59. domStrs.push('<td><a href="#" onclick="reportFormatSetupObj.onDeleteInfo(this)" class="text-danger mr-2" title="删除">删除</a></td>');
  60. domStrs.push('</tr>');
  61. $(dom.parentElement.parentElement).after(domStrs.join(''));
  62. },
  63. onAddLvInfo: (dom) => {
  64. // 增加表眉、表脚层次项
  65. console.log(dom);
  66. let maxCnt = 0;
  67. // for (const td of dom.parentElement.parentElement.nextElementSibling.children[0].children[1].children) {
  68. if (dom.parentElement.parentElement.parentElement.nextElementSibling.children.length > 0) {
  69. for (const td of dom.parentElement.parentElement.parentElement.nextElementSibling.children[0].children[1].children) {
  70. if (td.cells[0].innerText !== '') {
  71. const lv = parseInt(td.cells[0].innerText) || 0;
  72. if (lv > maxCnt) maxCnt = lv;
  73. }
  74. }
  75. }
  76. // dom.parentElement.parentElement.nextElementSibling.children[0].children[1]
  77. const lvDtl = [];
  78. lvDtl.push('<tr class="text-center">');
  79. lvDtl.push(`<td>${maxCnt + 1}</td>`);
  80. lvDtl.push('<td></td>');
  81. lvDtl.push('<td></td>');
  82. lvDtl.push('<td></td>');
  83. lvDtl.push('<td></td>');
  84. lvDtl.push('<td></td>');
  85. lvDtl.push('<td></td>');
  86. lvDtl.push('<td><a href="#" onclick="reportFormatSetupObj.onAddInfo(this)" class="text-primary mr-2" title="新增插入子项">新增</a></td>');
  87. lvDtl.push('</tr>');
  88. $(dom.parentElement.parentElement.parentElement.nextElementSibling.children[0].children[1]).append(lvDtl.join(''));
  89. },
  90. onTypeChange: (dom) => {
  91. const me = reportFormatSetupObj;
  92. console.log(dom);
  93. // 根据新选项清理、初始化
  94. if (dom.selectedIndex === 0) {
  95. // 文本
  96. $(dom.parentElement.nextSibling).html('<input class="form-control form-control-sm" value="" type="text">');
  97. dom.parentElement.nextSibling.nextSibling.nextSibling.nextSibling.children[0].value = '';
  98. dom.parentElement.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.children[0].value = '';
  99. } else {
  100. // 指标
  101. const curNodes = me.treeObj.getSelectedNodes();
  102. if (curNodes.length > 0) {
  103. const rptTemplate = me.templateObj[`${curNodes[0].ID}`];
  104. if (rptTemplate) {
  105. $(dom.parentElement.nextSibling).html(`${me._createSelectionFields(-1, 5010)}`);
  106. dom.parentElement.nextSibling.nextSibling.nextSibling.nextSibling.children[0].value = '';
  107. dom.parentElement.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.children[0].value = '';
  108. }
  109. }
  110. }
  111. },
  112. onAddSignature: (dom) => {
  113. const me = reportFormatSetupObj;
  114. if (me.currentRptId === -1) return;
  115. me.maxFieldID++;
  116. const newSignature = [];
  117. newSignature.push('<li class="d-flex justify-content-start align-items-center mb-3">');
  118. newSignature.push(`<span class="col-auto"><input class="form-control form-control-sm" FID="${me.maxFieldID}" value="" type="text" onchange="reportFormatSetupObj.onSignNameChange(this)"></span>`);
  119. newSignature.push('<span><a href="#" onclick="reportFormatSetupObj.onRemoveSignature(this)" class="btn-sm text-danger px-1" title="移除"><i class="fa fa-remove"></i></a></span>');
  120. newSignature.push('</li>');
  121. $(dom.parentElement).before(newSignature.join(''));
  122. me.fieldParamOptions.fields_collection.push({ FID: me.maxFieldID, name: '' });
  123. },
  124. onSignNameChange: (dom) => {
  125. const me = reportFormatSetupObj;
  126. const fid = +dom.attributes[1].value;
  127. for (const opt of me.fieldParamOptions.fields_collection) {
  128. if (opt.FID === fid) {
  129. opt.name = dom.value;
  130. break;
  131. }
  132. }
  133. },
  134. onRemoveSignature: (dom) => {
  135. $(dom.parentElement.parentElement).remove();
  136. },
  137. refreshFieldOptions: () => {
  138. // 重新更新已存在页面的指标选择下拉项
  139. },
  140. initialize: (rptNode) => {
  141. const me = reportFormatSetupObj;
  142. me.canvas = document.getElementById("rptSetupPreviewCanvas");
  143. // 1. 先清理
  144. me.clearTplProperties();
  145. // 2. 再加表标题、表眉、表脚、电子签名内容
  146. const params = { rpt_tpl_id: rptNode.refId, tender_id: TENDER_ID };
  147. const url = '/report_api/getReportTemplate';
  148. $.bootstrapLoading.start();
  149. CommonAjax.postXsrfEx(url, params, 300000, true, getCookie('csrfToken_j'),
  150. async function(result){
  151. console.log(result);
  152. me.templateObj[`${rptNode.refId}`] = result.data;
  153. if (result.data['主信息']['打印页面_信息']['方向'] === 'PORTRAIT') {
  154. me.canvas.height = 1150;
  155. me.canvas.width = 820;
  156. } else {
  157. me.canvas.height = 820;
  158. me.canvas.width = 1150;
  159. }
  160. if (result.data['主信息']['打印页面_信息']['页规格'] === 'A3') {
  161. me.canvas.height = me.canvas.height * 1.414;
  162. me.canvas.width = me.canvas.width * 1.414;
  163. }
  164. me.fieldParamOptions = me.initialSelectionFields(result.data);
  165. me.maxFieldID = me._getTheMaxFieldID(result.data);
  166. me.initialTitle(result.data);
  167. me.initialHeader(result.data);
  168. me.initialFooter(result.data);
  169. me.initialSignature(result.data);
  170. reportPermissionObj.permissions = result.permissions;
  171. reportPermissionObj.iniReportPermission();
  172. reportPermissionObj.updateSelectedMarks();
  173. $.bootstrapLoading.end();
  174. }, function(err){
  175. console.log(err);
  176. $.bootstrapLoading.end();
  177. }, function(ex){
  178. console.log(ex);
  179. $.bootstrapLoading.end();
  180. }
  181. );
  182. },
  183. clearTplProperties: () => {
  184. // 表眉
  185. $("#rpt_header_div").empty();
  186. // const str1 = '<div>表眉</div><div><input id="header_band_height_input" class="form-control form-control-sm" value="" type="text"></input></div><div><a href="#" onclick="reportFormatSetupObj.onAddLvInfo(this)" class="btn btn-sm btn-light text-primary">新增行</a></div>';
  187. const str1Arr = [];
  188. str1Arr.push('<div>表眉');
  189. str1Arr.push('</div>');
  190. str1Arr.push('<div>');
  191. str1Arr.push('<div>默认行高: ');
  192. str1Arr.push('<input id="header_band_height_input" value="" type="number" step="0.1" width="10"></input>');
  193. str1Arr.push('<a href="#" onclick="reportFormatSetupObj.onAddLvInfo(this)" class="btn btn-sm btn-light text-primary">新增行</a>');
  194. str1Arr.push('</div>');
  195. str1Arr.push('</div>');
  196. const str1 = str1Arr.join('');
  197. $("#rpt_header_div").append(str1);
  198. $("#rpt_header_table_div").empty();
  199. // 表脚
  200. $("#rpt_footer_div").empty();
  201. // const str2 = '<div>表脚</div><div><input id="footer_band_height_input" class="form-control form-control-sm" value="" type="text"></input></div><div><a href="#" onclick="reportFormatSetupObj.onAddLvInfo(this)" class="btn btn-sm btn-light text-primary">新增行</a></div>';
  202. const str2Arr = [];
  203. str2Arr.push('<div>表脚');
  204. str2Arr.push('</div>');
  205. str2Arr.push('<div>');
  206. str2Arr.push('<div>默认行高: ');
  207. str2Arr.push('<input id="footer_band_height_input" value="" type="number" step="0.1" width="10"></input>');
  208. str2Arr.push('<a href="#" onclick="reportFormatSetupObj.onAddLvInfo(this)" class="btn btn-sm btn-light text-primary">新增行</a>');
  209. str2Arr.push('</div>');
  210. str2Arr.push('</div>');
  211. const str2 = str2Arr.join('');
  212. $("#rpt_footer_div").append(str2);
  213. $("#rpt_footer_table_div").empty();
  214. // 表标题
  215. $("#rpt_title_input")[0].value = '';
  216. // 电子签名
  217. // signature_ul_list
  218. $("#signature_ul_list").empty();
  219. $("#signature_ul_list").append('<li class="pl-3" id="signature_li_list"><a href="#" onclick="reportFormatSetupObj.onAddSignature(this)"><i class="fa fa-plus"></i> 添加新签字人</a></li>');
  220. },
  221. initialHeader: (rptTpl) => {
  222. const me = reportFormatSetupObj;
  223. const bandInfo = me._getRightBandInfoObj(me._getRightInfoObj(rptTpl), 'HeaderBand');
  224. if (bandInfo) {
  225. const posArr = me._checkLevelInfo(bandInfo);
  226. const html = me._buildHeaderFooterHTML(rptTpl, bandInfo, posArr);
  227. const actBand = rptTpl['布局框_集合'].find(band => band.Name === 'HeaderBand');
  228. const dftRowHeight = +(actBand.Height || 0.6) / (posArr.length || 1);
  229. $("#header_band_height_input")[0].value = dftRowHeight;
  230. // console.log(html);
  231. // $("#rpt_header_parent_div").empty();
  232. $("#rpt_header_table_div").append(html.join(''));
  233. // rpt_header_div
  234. }
  235. },
  236. initialFooter: (rptTpl) => {
  237. const me = reportFormatSetupObj;
  238. const bandInfo = me._getRightBandInfoObj(me._getRightInfoObj(rptTpl), 'FooterBand');
  239. if (bandInfo) {
  240. const posArr = me._checkLevelInfo(bandInfo);
  241. const html = me._buildHeaderFooterHTML(rptTpl, bandInfo, posArr);
  242. const actBand = rptTpl['布局框_集合'].find(band => band.Name === 'FooterBand');
  243. const dftRowHeight = +(actBand.Height || 0.6) / (posArr.length || 1);
  244. $("#footer_band_height_input")[0].value = dftRowHeight;
  245. // console.log(html);
  246. // $("#rpt_header_parent_div").empty();
  247. $("#rpt_footer_table_div").append(html.join(''));
  248. // rpt_header_div
  249. }
  250. //
  251. },
  252. initialTitle: (rptTpl) => {
  253. const me = reportFormatSetupObj;
  254. $("#rpt_title_input")[0].value = me._getTitle(rptTpl);
  255. const curNodes = me.treeObj.getSelectedNodes();
  256. if (curNodes.length > 0) {
  257. $("#rename_rpt_confirm")[0].innerText=`确认更新报表模板「${curNodes[0].name}」?`;
  258. }
  259. },
  260. initialSignature: (rptTpl) => {
  261. const jDom = $("#signature_li_list");
  262. if (rptTpl['电子签名离散指标_集合'] && rptTpl['电子签名离散指标_集合'].length > 0) {
  263. for (const disF of rptTpl['电子签名离散指标_集合']) {
  264. const newSignature = [];
  265. newSignature.push('<li class="d-flex justify-content-start align-items-center mb-3">');
  266. newSignature.push(`<span class="col-auto"><input class="form-control form-control-sm" FID="${disF.ID}" value="${disF.Name}" type="text"></span>`);
  267. newSignature.push('<span><a href="#" onclick="reportFormatSetupObj.onRemoveSignature(this)" class="btn-sm text-danger px-1" title="移除"><i class="fa fa-remove"></i></a></span>');
  268. newSignature.push('</li>');
  269. jDom.before(newSignature.join(''));
  270. }
  271. }
  272. },
  273. _getTitle: (rptTpl) => {
  274. const me = reportFormatSetupObj;
  275. let rst = '';
  276. const bandInfo = me._getRightBandInfoObj(me._getRightInfoObj(rptTpl), 'TitleBand');
  277. if (bandInfo && bandInfo.text_s) {
  278. const titleTxt = bandInfo.text_s.find(item => item.font === 'ReportTitle_Main');
  279. if (titleTxt) {
  280. rst = titleTxt.Label;
  281. } else {
  282. rst = bandInfo.text_s[0].Label;
  283. }
  284. }
  285. return rst;
  286. },
  287. _setTitle: (rptTpl, newTitle) => {
  288. const me = reportFormatSetupObj;
  289. const bandInfo = me._getRightBandInfoObj(me._getRightInfoObj(rptTpl), 'TitleBand');
  290. if (bandInfo && bandInfo.text_s) {
  291. const titleTxt = bandInfo.text_s.find(item => item.font === 'ReportTitle_Main');
  292. if (titleTxt) {
  293. titleTxt.Label = newTitle;
  294. } else {
  295. bandInfo.text_s[0].Label = newTitle;
  296. }
  297. }
  298. },
  299. _getRightInfoObj: (rptTpl) => {
  300. let rst = null;
  301. if (rptTpl) {
  302. if (rptTpl['流水式表_信息']) {
  303. rst = rptTpl['流水式表_信息'];
  304. } else if (rptTpl['账单式表_信息']) {
  305. rst = rptTpl['账单式表_信息'];
  306. } else if (rptTpl['交叉表_信息']) {
  307. rst = rptTpl['交叉表_信息'];
  308. }
  309. }
  310. return rst;
  311. },
  312. _getRightBandInfoObj: (infoObj, bandName) => {
  313. let rst = null;
  314. if (infoObj) {
  315. for (let info of infoObj['离散信息']) {
  316. if (info['BandName'] === bandName) {
  317. rst = info;
  318. break;
  319. }
  320. }
  321. }
  322. return rst;
  323. },
  324. _checkLevelInfo: (bandInfo) => {
  325. let rst = [];
  326. if (bandInfo) {
  327. if (bandInfo.discrete_field_s) {
  328. for (const field of bandInfo.discrete_field_s) {
  329. const bt = +field.area.Bottom;
  330. if (!rst.includes(bt)) rst.push(bt);
  331. }
  332. }
  333. if (bandInfo.text_s) {
  334. for (const txt of bandInfo.text_s) {
  335. const bt = +txt.area.Bottom;
  336. if (!rst.includes(bt)) rst.push(bt);
  337. }
  338. }
  339. }
  340. rst.sort((i1, i2) => {return i1 - i2});
  341. return rst;
  342. },
  343. _createTypeSelection: (dftSelection = 0) => {
  344. const rst = [];
  345. rst.push('<select class="form-control form-control-sm" onchange="reportFormatSetupObj.onTypeChange(this)">');
  346. rst.push(`<option${dftSelection === 0 ? ' selected' : ''}>文本</option>`);
  347. rst.push(`<option${dftSelection !== 0 ? ' selected' : ''}>指标</option>`);
  348. rst.push('</select>');
  349. return rst.join('');
  350. },
  351. initialSelectionFields: (rptTpl) => {
  352. // 这里统一收集可选指标范围(有默认范围 + 报表本身特别的指标)
  353. const me = reportFormatSetupObj;
  354. const rst = { fields_collection: [], params_collection: [] };
  355. for (const param of rptTpl['离散参数_集合']) {
  356. rst.params_collection.push({ PID: + param.ID, name: param.Name, dftValue: param.Default_Value || '' });
  357. }
  358. for (const fd of rptTpl['指标_数据_映射']['离散指标_集合']) {
  359. rst.fields_collection.push({ FID: + fd.ID, name: fd.Name });
  360. }
  361. for (const fd of rptTpl['电子签名离散指标_集合']) {
  362. rst.fields_collection.push({ FID: + fd.ID, name: fd.Name });
  363. }
  364. for (const param of rptTpl['动态日期离散参数_集合']) {
  365. rst.params_collection.push({ PID: + param.ID, name: param.Name });
  366. }
  367. for (const param of rptTpl['电子签名审核意见指标_集合']) {
  368. rst.params_collection.push({ PID: + param.ID, name: param.Name });
  369. }
  370. const collectAdhocFields = (hfBandInfo) => {
  371. if (hfBandInfo && hfBandInfo.discrete_field_s) {
  372. for (const field of hfBandInfo.discrete_field_s) {
  373. if (!field.ParamID) {
  374. const selField = rst.fields_collection.find(item => item.FID === +field.FieldID);
  375. if (!selField) {
  376. const ahocSelField = me._scanField(rptTpl, field.FieldID);
  377. rst.fields_collection.push({ FID: +ahocSelField.ID, name: ahocSelField.Name });
  378. }
  379. }
  380. }
  381. }
  382. };
  383. const headerBandInfo = me._getRightBandInfoObj(me._getRightInfoObj(rptTpl), 'HeaderBand');
  384. collectAdhocFields(headerBandInfo);
  385. const footerBandInfo = me._getRightBandInfoObj(me._getRightInfoObj(rptTpl), 'FooterBand');
  386. collectAdhocFields(footerBandInfo);
  387. return rst;
  388. },
  389. _getTheMaxFieldID: (rptTpl) => {
  390. let rst = -1;
  391. if (rptTpl['无映射离散指标_集合'] && rptTpl['无映射离散指标_集合'].length > 0) {
  392. rptTpl['无映射离散指标_集合'].forEach((disF) => {
  393. if (+(disF.ID || -1) > rst) rst = +disF.ID;
  394. });
  395. }
  396. if (rptTpl['电子签名离散指标_集合'] && rptTpl['电子签名离散指标_集合'].length > 0) {
  397. rptTpl['电子签名离散指标_集合'].forEach((disF) => {
  398. if (+(disF.ID || -1) > rst) rst = +disF.ID;
  399. });
  400. }
  401. if (rptTpl['动态日期离散参数_集合'] && rptTpl['动态日期离散参数_集合'].length > 0) {
  402. rptTpl['动态日期离散参数_集合'].forEach((disF) => {
  403. if (+(disF.ID || -1) > rst) rst = +disF.ID;
  404. });
  405. }
  406. if (rptTpl['电子签名审核意见指标_集合'] && rptTpl['电子签名审核意见指标_集合'].length > 0) {
  407. rptTpl['电子签名审核意见指标_集合'].forEach((disF) => {
  408. if (+(disF.ID || -1) > rst) rst = +disF.ID;
  409. });
  410. }
  411. return rst;
  412. },
  413. _createSelectionFields_BK: (rptTpl, currentFieldID, ParamID) => {
  414. const me = reportFormatSetupObj;
  415. const rst = [];
  416. let hasSelected = false;
  417. rst.push('<select class="form-control form-control-sm">');
  418. for (const fd of rptTpl['指标_数据_映射']['离散指标_集合']) {
  419. if (!hasSelected) {
  420. hasSelected = fd.ID === currentFieldID;
  421. }
  422. const selectedStr = fd.ID === currentFieldID ? ' selected' : '';
  423. rst.push(`<option${selectedStr} FID="${fd.ID}">${fd.Name}</option>`);
  424. }
  425. if (!hasSelected) {
  426. // 如果没有在选项中,那表示是一个额外的指标(可能在: a. '电子签名离散指标_集合' b. '无映射离散指标_集合'中 etc...),需要在模板中全扫描一把
  427. // 有2种情况,一种是离散的指标,另一种是特殊参数(页码)
  428. if (ParamID) {
  429. for (const pd of rptTpl['离散参数_集合']) {
  430. if (`${pd.ID}` === `${ParamID}`) {
  431. rst.push(`<option selected PID="${ParamID}">${pd.Name}</option>`);
  432. break;
  433. }
  434. }
  435. } else {
  436. const selField = me._scanField(rptTpl, currentFieldID);
  437. if (selField) {
  438. rst.push(`<option selected FID="${currentFieldID}">${selField.Name}</option>`);
  439. }
  440. }
  441. }
  442. rst.push('</select>');
  443. return rst.join('');
  444. },
  445. _createSelectionFields: (currentFieldID, ParamID) => {
  446. const me = reportFormatSetupObj;
  447. const rst = [];
  448. let hasSelected = false;
  449. rst.push('<select class="form-control form-control-sm">');
  450. for (const fd of reportFormatSetupObj.fieldParamOptions.fields_collection) {
  451. const selectedStr = `${fd.FID}` === `${currentFieldID}` ? ' selected' : '';
  452. rst.push(`<option${selectedStr} FID="${fd.FID}">${fd.name}</option>`);
  453. }
  454. for (const pd of reportFormatSetupObj.fieldParamOptions.params_collection) {
  455. const selectedStr = `${pd.PID}` === `${ParamID}` ? ' selected' : '';
  456. rst.push(`<option${selectedStr} PID="${pd.PID}">${pd.name}</option>`);
  457. }
  458. rst.push('</select>');
  459. return rst.join('');
  460. },
  461. _scanField: (rptTpl, curFieldId) => {
  462. let rst = null;
  463. rst = rptTpl['无映射离散指标_集合'].find(item => item.ID === curFieldId);
  464. if (!rst) rst = rptTpl['电子签名离散指标_集合'].find(item => `${item.ID}` === `${curFieldId}`);
  465. if (!rst) rst = rptTpl['动态日期离散参数_集合'].find(item => `${item.ID}` === `${curFieldId}`);
  466. if (!rst) rst = rptTpl['电子签名审核意见指标_集合'].find(item => `${item.ID}` === `${curFieldId}`);
  467. if (!rst) rst = rptTpl['指标_数据_映射']['从数据指标_集合'].find(item => `${item.ID}` === `${curFieldId}`);
  468. if (!rst) rst = rptTpl['指标_数据_映射']['主数据指标_集合'].find(item => `${item.ID}` === `${curFieldId}`);
  469. return rst;
  470. },
  471. _buildHeaderFooterHTML: (rptTpl, hfBandInfo, posArr) => {
  472. const me = reportFormatSetupObj;
  473. const rst = [];
  474. if (hfBandInfo && posArr.length > 0) {
  475. // 1. 增加一些必要html
  476. rst.push(' <table class="table table-bordered">')
  477. rst.push(' <thead>');
  478. rst.push(' <tr>');
  479. rst.push(' <th width="5%" style="text-align: center;">行号</th>');
  480. rst.push(' <th width="10%" style="text-align: center;">类型</th>');
  481. rst.push(' <th width="20%" style="text-align: center;">值</th>');
  482. rst.push(' <th width="10%" style="text-align: center;">左位置</th>');
  483. rst.push(' <th width="10%" style="text-align: center;">右位置</th>');
  484. rst.push(' <th width="15%" style="text-align: center;">前缀</th>');
  485. rst.push(' <th width="15%" style="text-align: center;">后缀</th>');
  486. rst.push(' <th width="15%" style="text-align: center;">操作</th>');
  487. rst.push(' </tr>');
  488. rst.push(' </thead>');
  489. rst.push(' <tbody>')
  490. // --------
  491. const lvs = [];
  492. for (let idx = 0; idx < posArr.length; idx++) {
  493. const lvDtl = [];
  494. lvDtl.push('<tr class="text-center">');
  495. lvDtl.push(`<td>${idx + 1}</td>`);
  496. lvDtl.push('<td></td>');
  497. lvDtl.push('<td></td>');
  498. lvDtl.push('<td></td>');
  499. lvDtl.push('<td></td>');
  500. lvDtl.push('<td></td>');
  501. lvDtl.push('<td></td>');
  502. lvDtl.push('<td><a href="#" onclick="reportFormatSetupObj.onAddInfo(this)" class="text-primary mr-2" title="新增插入子项">新增</a></td>');
  503. lvDtl.push('</tr>');
  504. lvs.push(lvDtl);
  505. }
  506. if (hfBandInfo.text_s) {
  507. for (const txt of hfBandInfo.text_s) {
  508. const bt = +txt.area.Bottom;
  509. const btIdx = posArr.indexOf(bt);
  510. if (btIdx >= 0) {
  511. lvs[btIdx].push('<tr class="text-center">');
  512. lvs[btIdx].push('<td></td>');
  513. lvs[btIdx].push(`<td>${me._createTypeSelection(0)}</td>`);
  514. lvs[btIdx].push(`<td class="text-left"><input class="form-control form-control-sm" value="${txt.Label || ''}" type="text"></td>`);
  515. lvs[btIdx].push(`<td class="text-left"><input class="form-control form-control-sm" value="${txt.area.Left || '0'}" type="text"></td>`);
  516. lvs[btIdx].push(`<td class="text-left"><input class="form-control form-control-sm" value="${txt.area.Right || '0'}" type="text"></td>`);
  517. lvs[btIdx].push(`<td class="text-left"><input class="form-control form-control-sm" value="" type="text"></td>`);
  518. lvs[btIdx].push(`<td class="text-left"><input class="form-control form-control-sm" value="" type="text"></td>`);
  519. // lvs[btIdx].push('<td></td>');
  520. // lvs[btIdx].push('<td></td>');
  521. lvs[btIdx].push('<td><a href="#" onclick="reportFormatSetupObj.onDeleteInfo(this)" class="text-danger mr-2" title="删除">删除</a></td>');
  522. lvs[btIdx].push('</tr>');
  523. }
  524. }
  525. }
  526. if (hfBandInfo.discrete_field_s) {
  527. for (const field of hfBandInfo.discrete_field_s) {
  528. const bt = +field.area.Bottom;
  529. const btIdx = posArr.indexOf(bt);
  530. if (btIdx >= 0) {
  531. lvs[btIdx].push('<tr class="text-center">');
  532. lvs[btIdx].push('<td></td>');
  533. lvs[btIdx].push(`<td>${me._createTypeSelection(1)}</td>`);
  534. // lvs[btIdx].push(`<td>${me._createSelectionFields_BK(rptTpl, field.FieldID, field.ParamID)}</td>`);
  535. lvs[btIdx].push(`<td>${me._createSelectionFields(field.FieldID, field.ParamID)}</td>`);
  536. lvs[btIdx].push(`<td class="text-left"><input class="form-control form-control-sm" value="${field.area.Left || '0'}" type="text"></td>`);
  537. lvs[btIdx].push(`<td class="text-left"><input class="form-control form-control-sm" value="${field.area.Right || '0'}" type="text"></td>`);
  538. lvs[btIdx].push(`<td class="text-left"><input class="form-control form-control-sm" value="${field.Prefix || ''}" type="text"></td>`);
  539. lvs[btIdx].push(`<td class="text-left"><input class="form-control form-control-sm" value="${field.Suffix || ''}" type="text"></td>`);
  540. lvs[btIdx].push('<td><a href="#" onclick="reportFormatSetupObj.onDeleteInfo(this)" class="text-danger mr-2" title="删除">删除</a></td>');
  541. lvs[btIdx].push('</tr>');
  542. }
  543. }
  544. }
  545. //...
  546. for (const lv of lvs) {
  547. rst.push(...lv);
  548. }
  549. rst.push(' </tbody>')
  550. rst.push(' </table>')
  551. }
  552. return rst;
  553. },
  554. updateReportTemplate: () => {
  555. const me = reportFormatSetupObj;
  556. const rptTemplate = me._prepareReportTemplate();
  557. const curNodes = me.treeObj.getSelectedNodes();
  558. if (rptTemplate && curNodes.length > 0) {
  559. const params = { tplId: curNodes[0].ID, tplName: curNodes[0].name, tplObj: JSON.stringify(rptTemplate) };
  560. const url = '/report_api/updateReportTemplate';
  561. $.bootstrapLoading.start();
  562. CommonAjax.postXsrfEx(url, params, 300000, true, getCookie('csrfToken_j'),
  563. async function(result){
  564. console.log(result);
  565. $.bootstrapLoading.end();
  566. }, function(err){
  567. console.log(err);
  568. $.bootstrapLoading.end();
  569. }, function(ex){
  570. console.log(ex);
  571. $.bootstrapLoading.end();
  572. }
  573. );
  574. }
  575. },
  576. preview: () => {
  577. // alert('hi');
  578. const me = reportFormatSetupObj;
  579. const rptTemplate = me._prepareReportTemplate();
  580. if (rptTemplate) {
  581. const params = { tplObj: JSON.stringify(rptTemplate) };
  582. const url = '/report_api/getPreviewReport';
  583. $.bootstrapLoading.start();
  584. CommonAjax.postXsrfEx(url, params, 300000, true, getCookie('csrfToken_j'),
  585. async function(result){
  586. // console.log(result);
  587. JpcCanvasOutput.cleanCanvas(me.canvas);
  588. JpcCanvasOutput.drawPageBorder(result.pageRst, me.canvas, getScreenDPI());
  589. JpcCanvasOutput.highlightConflictArea(result.pageRst, 1);
  590. JpcCanvasOutput.drawToCanvas(result.pageRst, me.canvas, 1);
  591. $.bootstrapLoading.end();
  592. }, function(err){
  593. console.log(err);
  594. $.bootstrapLoading.end();
  595. }, function(ex){
  596. console.log(ex);
  597. $.bootstrapLoading.end();
  598. }
  599. );
  600. }
  601. },
  602. previewSign: () => {
  603. const me = reportFormatSetupObj;
  604. $("#dummy_sign_preview").empty();
  605. const signs = [];
  606. const domObj = $("#signature_ul_list")[0];
  607. for (let dIdx = 0; dIdx < domObj.children.length - 1; dIdx++) {
  608. const signName = domObj.children[dIdx].children[0].children[0].value; // 电子签名名称
  609. signs.push('<div class="form-group row">');
  610. signs.push(`<label for="staticEmail" class="col-sm-3 col-form-label pr-0">${signName || ''}</label>`);
  611. signs.push('<div class="col-sm-9">');
  612. signs.push('<ul class="list-group">');
  613. signs.push('<li class="list-group-item"><a class="text-muted"><i class="fa fa-plus"></i> 添加签字</a></li>');
  614. signs.push('</ul>');
  615. signs.push('</div>');
  616. signs.push('</div>');
  617. }
  618. $("#dummy_sign_preview").append(signs.join(''));
  619. },
  620. _prepareReportTemplate: () => {
  621. let rst = null;
  622. const me = reportFormatSetupObj;
  623. const curNodes = me.treeObj.getSelectedNodes();
  624. if (curNodes.length > 0) {
  625. const headers = me._createCommonCollctInfo('#rpt_header_table_div');
  626. const footers = me._createCommonCollctInfo('#rpt_footer_table_div');
  627. const signatures = me._createSignatureInfo(me.templateObj[`${curNodes[0].ID}`]);
  628. const rptTemplate = me.templateObj[`${curNodes[0].ID}`];
  629. if (rptTemplate) {
  630. me._setupTemplate(rptTemplate, headers, footers, signatures);
  631. rst = rptTemplate;
  632. }
  633. }
  634. return rst;
  635. },
  636. _createCommonCollctInfo: (containerId) => {
  637. let lvCnt = 0;
  638. const rst = { texts: [], fields: [], levels: 0 };
  639. const createAreaFromDom = (firstDom, lv) => {
  640. const rst = { Top: lv, Left: 0, Right: 0, Bottom: lv + 1, H_CalculationType: "percentage", V_CalculationType: "percentage" };
  641. rst.Left = firstDom.cells[3].childNodes[0].value || 0;
  642. rst.Right = firstDom.cells[4].childNodes[0].value || 0;
  643. return rst;
  644. };
  645. const ParamDftValMap = { '5010': '第 X 页', '5011': '共 X 页' };
  646. const domObj = $(containerId);
  647. if (domObj[0].childNodes.length > 0) {
  648. for (let idx = 0; idx < domObj[0].childNodes[1].childNodes[3].childNodes.length; idx++) {
  649. const hDom = domObj[0].childNodes[1].childNodes[3].childNodes[idx];
  650. if (hDom.innerText && hDom.innerText.includes('新增')) {
  651. let dtlCnt = 0;
  652. for (let idxN = idx + 1; idxN < domObj[0].childNodes[1].childNodes[3].childNodes.length; idxN++) {
  653. // 开始创建文本对象或指标对象
  654. const hnDom = domObj[0].childNodes[1].childNodes[3].childNodes[idxN];
  655. if (hnDom.innerText && !hnDom.innerText.includes('新增')) {
  656. dtlCnt++;
  657. const areaObj = createAreaFromDom(hnDom, lvCnt);
  658. if (hnDom.cells[1].childNodes[0][0].selected) {
  659. // 创建文本对象
  660. const txtObj = { area: areaObj, font: 'Header', control: 'Header', style: 'Default_None', Label: ''};
  661. txtObj.Label = hnDom.cells[2].childNodes[0].value || '';
  662. rst.texts.push(txtObj);
  663. } else {
  664. // 创建指标对象
  665. const fieldObj = { area: areaObj, font: 'Header', control: 'Header', style: 'Default_None', Prefix: '', Suffix: ''};
  666. fieldObj.Prefix = hnDom.cells[5].childNodes[0].value || '';
  667. fieldObj.Suffix = hnDom.cells[6].childNodes[0].value || '';
  668. for (const fIdOpt of hnDom.cells[2].childNodes[0]) {
  669. if (fIdOpt.selected) {
  670. if (fIdOpt.attributes['fid']) {
  671. fieldObj.FieldID = +fIdOpt.attributes[fIdOpt.attributes.length - 1].nodeValue;
  672. } else {
  673. let pid = +fIdOpt.attributes[fIdOpt.attributes.length - 1].nodeValue;
  674. if ([5001, 5010, 5011].includes(pid)) {
  675. pid = `${pid}`;
  676. }
  677. fieldObj.ParamID = pid;
  678. fieldObj.Default_Value = ParamDftValMap[fieldObj.ParamID] || '';
  679. }
  680. break;
  681. }
  682. }
  683. rst.fields.push(fieldObj);
  684. }
  685. } else {
  686. break;
  687. }
  688. }
  689. if (dtlCnt > 0) lvCnt++; // 有子项的才会被统计进来
  690. // lvCnt++; // 不能无条件的统计增加层次
  691. }
  692. }
  693. }
  694. if (lvCnt > 0) {
  695. // 所有rst的text、field的纵坐标都要重新整理一遍
  696. rst.levels = lvCnt;
  697. const lvH = +(100 / lvCnt).toFixed(3);
  698. for (const txt of rst.texts) {
  699. txt.area.Top = lvH * txt.area.Top;
  700. txt.area.Bottom = lvH * txt.area.Bottom;
  701. }
  702. for (const fld of rst.fields) {
  703. fld.area.Top = lvH * fld.area.Top;
  704. fld.area.Bottom = lvH * fld.area.Bottom;
  705. }
  706. }
  707. return rst;
  708. },
  709. _createSignatureInfo: (rptTpl) => {
  710. const me = reportFormatSetupObj;
  711. const rst = [[], [], []]; // 电子签名、日期、审核意见 三件套
  712. const domObj = $("#signature_ul_list")[0];
  713. const createReplaceField = (fid, name) => {
  714. return { ID: +fid, Name: name, DataType: 'string', Default_Value: '' };
  715. };
  716. for (let dIdx = 0; dIdx < domObj.children.length - 1; dIdx++) {
  717. const signName = domObj.children[dIdx].children[0].children[0].value; // 电子签名名称
  718. const signFId = +domObj.children[dIdx].children[0].children[0].attributes[1].value; // 指标ID
  719. rst[0].push(createReplaceField(signFId, signName));
  720. let dftFieldID = 0;
  721. const assField1 = rptTpl['动态日期离散参数_集合'].find(disF => disF.Name === signName + '_签字日期')
  722. if (!assField1) {
  723. me.maxFieldID++;
  724. dftFieldID = me.maxFieldID;
  725. } else {
  726. dftFieldID = +assField1.ID;
  727. }
  728. rst[1].push(createReplaceField(dftFieldID, signName + '_签字日期'));
  729. const assField2 = rptTpl['电子签名审核意见指标_集合'].find(disF => disF.Name === signName + '_审核意见')
  730. if (!assField2) {
  731. me.maxFieldID++;
  732. dftFieldID = me.maxFieldID;
  733. } else {
  734. dftFieldID = +assField2.ID;
  735. }
  736. rst[2].push(createReplaceField(dftFieldID, signName + '_审核意见'));
  737. }
  738. return rst;
  739. },
  740. _setupTemplate: (rptTpl, headersInfo, footersInfo, signatureInfo = null) => {
  741. const me = reportFormatSetupObj;
  742. me._setTitle(rptTpl, $("#rpt_title_input")[0].value);
  743. const headerBandInfo = me._getRightBandInfoObj(me._getRightInfoObj(rptTpl), 'HeaderBand');
  744. if (headerBandInfo) {
  745. const headerBand = rptTpl['布局框_集合'].find(item => item.Name === 'HeaderBand');
  746. // 1. 高度
  747. if (headerBand) {
  748. let dftHeight = $("#header_band_height_input")[0].value || 0.6;
  749. if (dftHeight === '') dftHeight = 0.6;
  750. headerBand.Height = dftHeight * headersInfo.levels;
  751. }
  752. // 2.
  753. headerBandInfo.text_s = headersInfo.texts;
  754. headerBandInfo.discrete_field_s = headersInfo.fields;
  755. }
  756. const footerBandInfo = me._getRightBandInfoObj(me._getRightInfoObj(rptTpl), 'FooterBand');
  757. if (footerBandInfo) {
  758. const footerBand = rptTpl['布局框_集合'].find(item => item.Name === 'FooterBand');
  759. // 1. 高度
  760. if (footerBand) {
  761. let dftHeight = $("#footer_band_height_input")[0].value || 1;
  762. if (dftHeight === '') dftHeight = 1; // 计量的表脚默认高度给1(签名缘故)
  763. footerBand.Height = dftHeight * footersInfo.levels;
  764. }
  765. // 2.
  766. footerBandInfo.text_s = footersInfo.texts;
  767. footerBandInfo.discrete_field_s = footersInfo.fields;
  768. }
  769. if (signatureInfo && signatureInfo.length === 3) {
  770. rptTpl['电子签名离散指标_集合'] = signatureInfo[0];
  771. rptTpl['动态日期离散参数_集合'] = signatureInfo[1];
  772. rptTpl['电子签名审核意见指标_集合'] = signatureInfo[2];
  773. }
  774. },
  775. };
  776. const reportPermissionObj = {
  777. permissions: [],
  778. selectedIdsArray: [],
  779. treeObj: null,
  780. iniReportPermission: () => {
  781. const me = reportPermissionObj;
  782. const jDom = $("#report-permission-div");
  783. jDom.empty();
  784. const permissionsHtml = [];
  785. permissionsHtml.push('<table class="table table-hover table-bordered table-sm mt-3">');
  786. permissionsHtml.push('<thead>');
  787. permissionsHtml.push('<tr>');
  788. permissionsHtml.push('<th class="text-center" width="25%">用户</th>');
  789. permissionsHtml.push('<th class="text-center" width="35%">职位/角色</th>');
  790. permissionsHtml.push('<th class="text-center" width="25%">添加时间</th>');
  791. permissionsHtml.push('<th class="text-center" width="15%">操作</th>');
  792. permissionsHtml.push('</tr>');
  793. permissionsHtml.push('</thead>');
  794. permissionsHtml.push('<tbody class="text-center"></tbody>');
  795. // ...内容
  796. me.selectedIdsArray.splice(0, me.selectedIdsArray.length);
  797. me.permissions.forEach((permission) => {
  798. const id = parseInt(permission.user_id);
  799. if (reportFormatSetupObj.currentRptId === permission.rpt_id && !me.selectedIdsArray.includes(id)) me.selectedIdsArray.push(id);
  800. });
  801. const permissionStrs = [];
  802. me.permissions.forEach(permission => {
  803. if (permission.rpt_id === reportFormatSetupObj.currentRptId) {
  804. permissionStrs.push(me.createPermissionTbStr(permission));
  805. }
  806. });
  807. if (permissionStrs.length > 0) permissionsHtml.push(permissionStrs.join(''));
  808. permissionsHtml.push('</tbody>');
  809. permissionsHtml.push('</table>');
  810. jDom.append(permissionsHtml.join(''));
  811. },
  812. beforeRemove: (dom, user_id) => {
  813. $('#remove_user_id').val(user_id);
  814. },
  815. removeUser: (dom) => {
  816. const me = reportPermissionObj;
  817. const curNodes = reportFormatSetupObj.treeObj.getSelectedNodes();
  818. if (curNodes.length > 0) {
  819. const id = parseInt($('#remove_user_id').val());
  820. const params = { user_id: id, rpt_id: curNodes[0].ID, tid: TENDER_ID };
  821. const url = '/report_api/removeReportPermission';
  822. $.bootstrapLoading.start();
  823. CommonAjax.postXsrfEx(url, params, 300000, true, getCookie('csrfToken_j'),
  824. async function(result){
  825. console.log(result);
  826. $.bootstrapLoading.end();
  827. // after remove
  828. const uId = me.selectedIdsArray.indexOf(id);
  829. if (uId >= 0) {
  830. me.selectedIdsArray.splice(uId, 1);
  831. }
  832. for (let idx = me.permissions.length - 1; idx >= 0; idx--) {
  833. if (parseInt(me.permissions[idx].user_id) === id) {
  834. me.permissions.splice(idx, 1);
  835. break;
  836. }
  837. }
  838. me.iniReportPermission();
  839. }, function(err){
  840. console.log(err);
  841. $.bootstrapLoading.end();
  842. }, function(ex){
  843. console.log(ex);
  844. $.bootstrapLoading.end();
  845. }
  846. );
  847. }
  848. },
  849. createPermissionTbStr: (permission) => {
  850. const rstArr = [];
  851. rstArr.push('<tr>');
  852. rstArr.push(`<td class="text-center">${permission.user_name || permission.name}</td>`);
  853. rstArr.push(`<td class="text-center">${permission.user_role || permission.role}</td>`);
  854. rstArr.push(`<td class="text-center">${(new Date(permission.create_time)).Format('yyyy-MM-dd hh:mm:ss')}</td>`);
  855. rstArr.push(`<td class="text-center"><a onclick="reportPermissionObj.beforeRemove(this, ${permission.user_id})" href="#remove-user1" data-toggle="modal" data-target="#remove-user" class="btn btn-sm btn-outline-danger">移除</a></td>`);
  856. rstArr.push('</tr>');
  857. return rstArr.join('');
  858. },
  859. addUser: (userId) => {
  860. const me = reportPermissionObj;
  861. let b = false;
  862. for (let grp of ACCOUNT_LIST) {
  863. for (let user of grp.groupList) {
  864. if (user.id === userId) {
  865. b = true;
  866. const newPermission = { tid: TENDER_ID, user_id: userId, rpt_id: reportFormatSetupObj.currentRptId, name: user.name, role: user.role, create_time: new Date() };
  867. me.permissions.push(newPermission);
  868. // me.createPermissionTbStr(user);
  869. me.iniReportPermission();
  870. break;
  871. }
  872. }
  873. if (b) break;
  874. }
  875. },
  876. updateSelectedMarks: (userId = null) => {
  877. // 此方法是更新下拉菜单的勾选符号(根据permissions列表)
  878. const me = reportPermissionObj;
  879. // const selectedIdsArray = [];
  880. // if (userId) selectedIdsArray.push(userId);
  881. if ($('#format-setup-add-user .book-list').length > 0) {
  882. $('.user-item').each(function() {
  883. const userIdStr = $(this).data('id');
  884. const userId = parseInt(userIdStr, 10);
  885. const $mark = $(this).find('.selected-mark');
  886. if (!isNaN(userId) && me.selectedIdsArray.includes(userId)) {
  887. $mark.show();
  888. $(this).addClass('bg-light');
  889. } else {
  890. $mark.hide();
  891. $(this).removeClass('bg-light');
  892. }
  893. });
  894. }
  895. //
  896. },
  897. iniPermissionRpts: () => {
  898. const me = reportPermissionObj;
  899. if (!me.treeObj) {
  900. zTreeHelper.createTreeDirectly(INDI_TOP_TREE_NODES, rpt_permission_setting, "rptFormatSetupTplTree2", reportPermissionObj);
  901. refreshNodes(reportPermissionObj);
  902. }
  903. },
  904. batchApplyPermissions: () => {
  905. const me = reportPermissionObj;
  906. // 1. 收集用户列表
  907. const userIds = [];
  908. me.permissions.forEach(permission => {
  909. if (permission.rpt_id === reportFormatSetupObj.currentRptId) {
  910. userIds.push(permission.user_id);
  911. }
  912. });
  913. // 2. 收集报表模板列表
  914. const rptIds = [];
  915. const curNodes = me.treeObj.getCheckedNodes(true);
  916. // if (treeNode.nodeType === RT.NodeType.TEMPLATE) {
  917. curNodes.forEach(node => {
  918. if (node.nodeType === RT.NodeType.TEMPLATE && reportFormatSetupObj.currentRptId !== node.ID) rptIds.push(node.ID);
  919. });
  920. if (userIds.length > 0 && rptIds.length > 0) {
  921. const params = { tid: TENDER_ID, userIds, rptIds };
  922. const url = '/report_api/batchApplyReportPermission';
  923. $.bootstrapLoading.start();
  924. CommonAjax.postXsrfEx(url, params, 300000, true, getCookie('csrfToken_j'),
  925. async function(result){
  926. console.log(result);
  927. $.bootstrapLoading.end();
  928. }, function(err){
  929. console.log(err);
  930. $.bootstrapLoading.end();
  931. }, function(ex){
  932. console.log(ex);
  933. $.bootstrapLoading.end();
  934. }
  935. );
  936. }
  937. },
  938. };
  939. const rpt_format_setting = {
  940. view: {
  941. selectedMulti: false
  942. },
  943. check: {
  944. enable: true
  945. },
  946. data: {
  947. keep: {
  948. parent:true,
  949. leaf:true
  950. },
  951. key: {
  952. children: "items",
  953. title: "title",
  954. isHidden: "hidden"
  955. },
  956. simpleData: {
  957. enable: true,
  958. rootPId: -1
  959. }
  960. },
  961. callback: {
  962. onCheck: reportFormatSetupObj.onCheck,
  963. onClick: reportFormatSetupObj.onClick
  964. }
  965. };
  966. const rpt_permission_setting = {
  967. view: {
  968. selectedMulti: false
  969. },
  970. check: {
  971. enable: true
  972. },
  973. data: {
  974. keep: {
  975. parent:true,
  976. leaf:true
  977. },
  978. key: {
  979. children: "items",
  980. title: "title",
  981. isHidden: "hidden"
  982. },
  983. simpleData: {
  984. enable: true,
  985. rootPId: -1
  986. }
  987. },
  988. callback: {
  989. // onCheck: reportFormatSetupObj.onCheck,
  990. // onClick: reportFormatSetupObj.onClick
  991. }
  992. };