rpt_all_popup.ejs 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891
  1. <div class="modal fade" id="paper" data-backdrop="static">
  2. <div class="modal-dialog" role="document">
  3. <div class="modal-content">
  4. <div class="modal-header">
  5. <h5 class="modal-title">页边距(毫米)</h5>
  6. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  7. <span aria-hidden="true">&times;</span>
  8. </button>
  9. </div>
  10. <div class="modal-body">
  11. <div class="row mb-1 justify-content-center">
  12. <div class="col-3">
  13. <div class="input-group input-group-sm ">
  14. <div class="input-group-prepend">
  15. <span class="input-group-text">上</span>
  16. </div>
  17. <input type="number" class="form-control form-control-sm" id="elementMargin_Top" value="12" onchange="rptControlObj.changeMargin('Top', this)" onkeyup="rptControlObj.changeMargin('Top', this)">
  18. </div>
  19. </div>
  20. </div>
  21. <div class="row mb-1 align-items-center">
  22. <div class="col-3">
  23. <div class="input-group input-group-sm ">
  24. <div class="input-group-prepend">
  25. <span class="input-group-text">左</span>
  26. </div>
  27. <input type="number" class="form-control form-control-sm" id="elementMargin_Left" value="12" onchange="rptControlObj.changeMargin('Left', this)" onkeyup="rptControlObj.changeMargin('Left', this)">
  28. </div>
  29. </div>
  30. <div class="col-6">
  31. <h1 class="display-4 text-center"><i class="fa fa-file-o"></i></h1>
  32. </div>
  33. <div class="col-3">
  34. <div class="input-group input-group-sm ">
  35. <div class="input-group-prepend">
  36. <span class="input-group-text">右</span>
  37. </div>
  38. <input type="number" class="form-control form-control-sm" id="elementMargin_Right" value="12" onchange="rptControlObj.changeMargin('Right', this)" onkeyup="rptControlObj.changeMargin('Right', this)">
  39. </div>
  40. </div>
  41. </div>
  42. <div class="row mb-1 justify-content-center">
  43. <div class="col-3">
  44. <div class="input-group input-group-sm ">
  45. <div class="input-group-prepend">
  46. <span class="input-group-text">下</span>
  47. </div>
  48. <input type="number" class="form-control form-control-sm" id="elementMargin_Bottom"value="12" onchange="rptControlObj.changeMargin('Bottom', this)" onkeyup="rptControlObj.changeMargin('Bottom', this)">
  49. </div>
  50. </div>
  51. </div>
  52. </div>
  53. <div class="modal-footer">
  54. <button type="button" class="btn btn-link btn-sm float-left" data-dismiss="modal" onclick="rptControlObj.restoreMargine(); zTreeOprObj.changeCfg();">恢复默认值</button>
  55. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">取消</button>
  56. <a href="javascript:void(0)" class="btn btn-primary btn-sm" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</a>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. <div class="modal fade" id="format" data-backdrop="static">
  62. <div class="modal-dialog" role="document">
  63. <div class="modal-content">
  64. <div class="modal-header">
  65. <h5 class="modal-title">格式</h5>
  66. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  67. <span aria-hidden="true">&times;</span>
  68. </button>
  69. </div>
  70. <div class="modal-body">
  71. <div class="row mb-1" id="font_cfg_blank_flag"></div>
  72. <div class="row mb-1">
  73. <div class="col-3">边框线粗</div>
  74. <div class="col-4">
  75. <select class="form-control form-control-sm" id="cfg_border_thick" onchange="rptControlObj.changeBorderWeight(this)"><option>1</option><option>2</option></select>
  76. </div>
  77. </div>
  78. </div>
  79. <div class="modal-footer">
  80. <button type="button" class="btn btn-link btn-sm float-left" data-dismiss="modal" onclick="rptControlObj.restoreFormat(); zTreeOprObj.changeCfg();">恢复默认值</button>
  81. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">取消</button>
  82. <a href="javascript:void(0)" class="btn btn-primary btn-sm" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</a>
  83. </div>
  84. </div>
  85. </div>
  86. </div>
  87. <!--弹出设置-->
  88. <div class="modal fade" id="setting" data-backdrop="static">
  89. <div class="modal-dialog" role="document">
  90. <div class="modal-content">
  91. <div class="modal-header">
  92. <h5 class="modal-title">设置</h5>
  93. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  94. <span aria-hidden="true">&times;</span>
  95. </button>
  96. </div>
  97. <div class="modal-body">
  98. <div class="row mb-1">
  99. <div class="col-12 mb-1">
  100. <div class="form-check">
  101. <label class="form-check-label">
  102. <input type="checkbox" class="form-check-input" id="cfg_rpt_vertical_line" onchange="rptControlObj.changeCfgOption('showVerticalLine', this)">
  103. 报表边框竖线
  104. </label>
  105. </div>
  106. </div>
  107. <div class="col-12 mb-1">
  108. <div class="form-check">
  109. <label class="form-check-label">
  110. <input type="checkbox" class="form-check-input" id="cfg_rpt_narrow" onchange="rptControlObj.changeCfgOption('isNarrow', this)">
  111. 内容窄体输出
  112. </label>
  113. </div>
  114. </div>
  115. <div class="col-12 mb-1">
  116. <div class="form-check">
  117. <label class="form-check-label">
  118. <input type="checkbox" class="form-check-input" id="cfg_rpt_fill_zero" onchange="rptControlObj.changeCfgOption('fillZero', this)">
  119. 小数补0
  120. </label>
  121. </div>
  122. </div>
  123. <div class="col-12 mb-1" id="cfg_rpt_close_warter_mark_div" >
  124. <div class="form-check">
  125. <label class="form-check-label">
  126. <input type="checkbox" class="form-check-input" id="cfg_rpt_close_warter_mark" onchange="rptControlObj.changeCfgOption('closeWarterMark', this)">
  127. 导出Excel-不带水印
  128. </label>
  129. </div>
  130. </div>
  131. <div class="col-12 mb-1">
  132. <div class="form-check">
  133. <label class="form-check-label">
  134. <input type="checkbox" class="form-check-input" id="cfg_rpt_continuous" onchange="rptControlObj.changeCfgOption('continuousOutput', this)">
  135. 导出Excel-连续输出(仅流水内容报表有效)
  136. </label>
  137. </div>
  138. </div>
  139. </div>
  140. </div>
  141. <div class="modal-footer">
  142. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  143. <a href="javascript:void(0)" class="btn btn-primary btn-sm" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</a>
  144. </div>
  145. </div>
  146. </div>
  147. </div>
  148. <div class="modal fade" id="export_excel" data-backdrop="static">
  149. <div class="modal-dialog" role="document">
  150. <div class="modal-content">
  151. <div class="modal-header">
  152. <h5 class="modal-title">批量导出Excel</h5>
  153. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  154. <span aria-hidden="true">&times;</span>
  155. </button>
  156. </div>
  157. <div class="modal-body">
  158. <div class="row">
  159. <div class="col-6">
  160. <div class="card">
  161. <img class="card-img-top" src="/public/images/p2.png">
  162. <div class="card-body px-3">
  163. <div class="form-check">
  164. <input class="form-check-input" type="radio" name="excelExportTypeRadio" id="excelExportType_AllInOneBook" value="option1" checked>
  165. <label class="form-check-label" for="excelExportType_AllInOneBook">
  166. 多个表导出一个Excel文件
  167. </label>
  168. </div>
  169. </div>
  170. </div>
  171. </div>
  172. <div class="col-6">
  173. <div class="card">
  174. <img class="card-img-top" src="/public/images/p1.png">
  175. <div class="card-body px-3">
  176. <div class="form-check">
  177. <input class="form-check-input" type="radio" name="excelExportTypeRadio" id="excelExportType_IndividualBook" value="option2" checked>
  178. <label class="form-check-label" for="excelExportType_IndividualBook">
  179. 每个表导出一个Excel文件
  180. </label>
  181. </div>
  182. </div>
  183. </div>
  184. </div>
  185. </div>
  186. </div>
  187. <div class="modal-footer">
  188. <a onclick="rptControlObj.getExcel()" class="btn btn-primary btn-sm" data-dismiss="modal">确定导出</a>
  189. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">取消</button>
  190. </div>
  191. </div>
  192. </div>
  193. </div>
  194. <div class="modal fade" id="eSignature" data-backdrop="static">
  195. <div class="modal-dialog" role="document">
  196. <div class="modal-content">
  197. <div class="modal-header">
  198. <h5 class="modal-title">设置电子签名(审核通过后才显示)</h5>
  199. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  200. <span aria-hidden="true">&times;</span>
  201. </button>
  202. </div>
  203. <div class="modal-body" id="eSignatureBodyDiv">
  204. </div>
  205. <div class="modal-footer">
  206. <button type="button" id="btn_cross_tender" class="btn btn-sm btn-link float-left" data-dismiss="modal" data-toggle="modal" data-target="#batch-eSignature" id="batch-setupProjSignature" onclick="rptSignatureHelper.resetESignature(zTreeOprObj.currentRptPageRst, 'batch-eSignatureBodyDiv'); buildTendersTree();">批量设置其他标段</button>
  207. <!--
  208. <button type="button" class="btn btn-sm btn-link float-left" data-toggle="modal" data-target="#batch-eSignature" id="hidden_show_batch_eSignature" style="display:none"></button>
  209. <button type="button" class="btn btn-sm btn-link float-left" data-dismiss="modal" onclick="setTimeout(function(){$('#hidden_show_batch_eSignature').trigger('click');}, 50);">批量设置其他标段</button>
  210. -->
  211. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal" onclick="rptSignatureHelper.removeSelectSignature()">取消</button>
  212. <a href="javascript:void(0);" onclick="rptSignatureHelper.setupAfterSelectSignature('eSignatureBodyDiv')" class="btn btn-primary btn-sm" data-dismiss="modal">确定</a>
  213. </div>
  214. </div>
  215. </div>
  216. </div>
  217. <div class="modal fade" id="batch-eSignature" data-backdrop="static">
  218. <div class="modal-dialog modal-lg" role="document">
  219. <div class="modal-content">
  220. <div class="modal-header">
  221. <h5 class="modal-title">批量设置电子签名</h5>
  222. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  223. <span aria-hidden="true">&times;</span>
  224. </button>
  225. </div>
  226. <div class="modal-body">
  227. <div class="modal-height-300">
  228. <div class="row">
  229. <div class="col-6">
  230. <table class="table table-hover table-bordered" id="batch_tenders_individual">
  231. </table>
  232. </div>
  233. <div class="col-6" id="batch-eSignatureBodyDiv"></div>
  234. </div>
  235. </div>
  236. <div class="alert alert-warning">批量操作会覆盖已设置好的电子签名,请谨慎操作。</div>
  237. </div>
  238. <div class="modal-footer">
  239. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  240. <a href="javascript:void(0);" onclick="rptSignatureHelper.setupAfterSelectMultiTenders(SELECTED_TENDERS, 'batch-eSignatureBodyDiv')" class="btn btn-sm btn-primary" data-dismiss="modal">确定</a>
  241. </div>
  242. </div>
  243. </div>
  244. </div>
  245. <!--弹出添加签名人-->
  246. <div class="modal fade" id="add-sign" data-backdrop="static">
  247. <div class="modal-dialog modal-sm" role="document">
  248. <div class="modal-content">
  249. <div class="modal-header">
  250. <h5 class="modal-title">添加签名</h5>
  251. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  252. <span aria-hidden="true">&times;</span>
  253. </button>
  254. </div>
  255. <div class="modal-body">
  256. <ul class="nav nav-tabs justify-content-center mb-1" role="tablist">
  257. <li class="nav-item">
  258. <a class="nav-link active px-3 p-1" data-toggle="tab" href="#adst-1" role="tab">项目</a>
  259. </li>
  260. <li class="nav-item">
  261. <a class="nav-link px-3 p-1" data-toggle="tab" href="#adst-2" role="tab"><i class="fa fa-user"></i> 角色</a>
  262. </li>
  263. <li class="nav-item">
  264. <a class="nav-link px-3 p-1" data-toggle="tab" href="#adst-3" role="tab">最近使用</a>
  265. </li>
  266. </ul>
  267. <div class="tab-content">
  268. <div class="tab-pane fade show active" id="adst-1" role="tabpanel" aria-labelledby="home-tab">
  269. <div class="input-group input-group-sm mt-1 mb-2">
  270. <div class="input-group-prepend">
  271. <span class="input-group-text" id="inputGroup-sizing-sm"><i class="fa fa-search" onclick="rptSignatureHelper.buildSelectableAccount(this);"></i></span>
  272. </div>
  273. <input type="text" id="search_account" class="form-control form-control-sm" placeholder="搜索..." onkeypress="searchAccount()">
  274. </div>
  275. <div class="modal-height-300" id="project_account_select_div">
  276. </div>
  277. </div>
  278. <div class="tab-pane fade" id="adst-2" role="tabpanel" aria-labelledby="profile-tab">
  279. <a href="javascript:void(0)" onclick="rptSignatureHelper.switchAddRoleDiv(this)" class="btn btn-sm btn-link">添加角色</a>
  280. <div class="modal-height-300">
  281. <!--添加角色-->
  282. <div class="card" id="role_select_acc_div" style="display:none">
  283. <div class="p-2">
  284. <div class="input-group input-group-sm mb-1">
  285. <div class="input-group-prepend">
  286. <span class="input-group-text" id="inputGroup-sizing-sm">角色名称</span>
  287. </div>
  288. <input type="text" class="form-control form-control-sm" id="acc_role_name" placeholder="最多10个字符">
  289. </div>
  290. <div class="input-group input-group-sm mb-1">
  291. <div class="input-group-prepend">
  292. <span class="input-group-text" id="inputGroup-sizing-sm">绑定成员</span>
  293. </div>
  294. <select class="form-control form-control-sm" id="project_account_select_dom">
  295. </select>
  296. </div>
  297. <a href="javascript:void(0)" onclick="rptSignatureHelper.createNewRole(this)" class="btn btn-sm btn-primary">添加角色</a>
  298. </div>
  299. </div>
  300. <ul class="list-group p-2" id="existed_roles_ul">
  301. </ul>
  302. </div>
  303. </div>
  304. <div class="tab-pane fade" id="adst-3" role="tabpanel" aria-labelledby="contact-tab">
  305. <div class="modal-height-300">
  306. <ul class="list-group" id="account_used_select_div"></ul>
  307. </div>
  308. </div>
  309. </div>
  310. </div>
  311. </div>
  312. </div>
  313. </div>
  314. <!--选择审批人-->
  315. <div class="modal fade" id="audit-select" data-backdrop="static">
  316. <div class="modal-dialog" role="document">
  317. <div class="modal-content">
  318. <div class="modal-header">
  319. <h5 class="modal-title" id="audit-select-title">重置</h5>
  320. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  321. <span aria-hidden="true">&times;</span>
  322. </button>
  323. </div>
  324. <div class="modal-body">
  325. <table class="table table-bordered">
  326. <tr><th style="width: 50%">报表数据</th><th>审批人</th></tr>
  327. <tbody id="audit-select-list">
  328. </tbody>
  329. </table>
  330. <div id="audit-select-hint" class="text-danger">
  331. </div>
  332. </div>
  333. <div class="modal-footer">
  334. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  335. <button id="audit-select-ok" class="btn btn-primary btn-sm" onclick="rptCustomObj.resetAuditSelect(this)">确定</button>
  336. </div>
  337. </div>
  338. </div>
  339. </div>
  340. <!--选择标段-->
  341. <div class="modal fade" id="gather-select" data-backdrop="static">
  342. <div class="modal-dialog modal-lg" role="document">
  343. <div class="modal-content">
  344. <div class="modal-header">
  345. <h5 class="modal-title" id="gather-select-title">选择标段</h5>
  346. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  347. <span aria-hidden="true">&times;</span>
  348. </button>
  349. </div>
  350. <div class="modal-body">
  351. <div class="row">
  352. <div class="col-6">
  353. <h5>可选标段 </h5>
  354. <div class="modal-height-300" id="gather-source-spread" style="height: 330px">
  355. </div>
  356. </div>
  357. <div class="col-6">
  358. <h5>已选标段 </h5>
  359. <div class="modal-height-300" id="gather-result-spread">
  360. </div>
  361. <div class="mt-1" id="gather-by-month" style="width: 60%" name="gather-type">
  362. <div class="input-group input-group-sm">
  363. <div class="input-group-prepend">
  364. <span class="input-group-text">汇总年月</span>
  365. </div>
  366. <input id="gather-month" class="datepicker-here form-control form-control-sm" auto-close="true" autocomplete="off" placeholder="点击选择年月" data-view="months" data-min-view="months" data-date-format="yyyy-MM" data-language="zh" type="text" autocomplete="off">
  367. </div>
  368. </div>
  369. <div id="gather-by-zone" name="gather-type">
  370. <div class="input-group input-group-sm">
  371. <div class="input-group-prepend">
  372. <span class="input-group-text">汇总周期</span>
  373. </div>
  374. <input id="gather-zone" class="datepicker-here form-control mt-0" placeholder="点击选择周期" data-range="true" data-multiple-dates-separator=" - " data-min-view="months" data-view="months" data-date-format="yyyy-MM" data-language="zh" type="text" autocomplete="off">
  375. </div>
  376. </div>
  377. <div id="gather-by-stage" name="gather-type">
  378. <div class="input-group input-group-sm">
  379. <div class="input-group-prepend">
  380. <span class="input-group-text">选择期</span>
  381. </div>
  382. <select class="form-control" id="gather-stage">
  383. <option>第1期</option>
  384. </select>
  385. </div>
  386. </div>
  387. <div id="gather-by-stage-zone" name="gather-type">
  388. <div class="input-group input-group-sm">
  389. <div class="input-group-prepend">
  390. <span class="input-group-text">汇总</span>
  391. </div>
  392. <select class="form-control" id="gather-stage-begin">
  393. <option>第1期</option>
  394. </select>
  395. <div class="input-group-prepend">
  396. <span class="input-group-text">至</span>
  397. </div>
  398. <select class="form-control" id="gather-stage-end">
  399. <option>第5期</option>
  400. </select>
  401. </div>
  402. </div>
  403. </div>
  404. <div class="text-danger text-center ml-3" id="gather-hint">我是提示呀</div>
  405. </div>
  406. </div>
  407. <div class="modal-footer">
  408. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  409. <button class="btn btn-sm btn-primary" id="gather-select-ok">确定</button>
  410. </div>
  411. </div>
  412. </div>
  413. </div>
  414. <div class="modal fade" id="stage-select" data-backdrop="static">
  415. <div class="modal-dialog" role="document">
  416. <div class="modal-content">
  417. <div class="modal-header">
  418. <h5 class="modal-title" id="stage-select-title">选择期</h5>
  419. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  420. <span aria-hidden="true">&times;</span>
  421. </button>
  422. </div>
  423. <div class="modal-body">
  424. <div class="row">
  425. <% for (const s of stages) { %>
  426. <div class="col-3">
  427. <div class="custom-control custom-checkbox custom-control-inline">
  428. <input type="checkbox" id="stage-select-<%- s.order %>" name="stage-select-check" stage-order="<%- s.order %>" class="custom-control-input">
  429. <label class="custom-control-label" for="stage-select-<%- s.order %>">第<%- s.order %>期</label>
  430. </div>
  431. </div>
  432. <% } %>
  433. </div>
  434. <div class="alert alert-danger my-2 p-2" id="stage-select-hint">我是提示呀</div>
  435. </div>
  436. <div class="modal-footer">
  437. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  438. <button class="btn btn-sm btn-primary" id="stage-select-ok">确定</button>
  439. </div>
  440. </div>
  441. </div>
  442. </div>
  443. <!--管理推荐报表-->
  444. <div class="modal fade" id="man-c" data-backdrop="static">
  445. <div class="modal-dialog" role="document">
  446. <div class="modal-content">
  447. <div class="modal-header">
  448. <h5 class="modal-title">管理推荐报表</h5>
  449. </div>
  450. <div class="modal-body">
  451. <div class="modal-height-500" style="overflow: auto;">
  452. <table class="table table-sm table-bordered" id="report_cust_group_common">
  453. </table>
  454. </div>
  455. </div>
  456. <div class="modal-footer">
  457. <button type="button" class="btn btn-secondary" data-dismiss="modal" onclick="revertCommonCustRptCfg();">关闭</button>
  458. <!--有结果出现添加-->
  459. <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="updateCustRptCfg()">确认</button>
  460. </div>
  461. </div>
  462. </div>
  463. </div>
  464. <!--管理定制报表-->
  465. <div class="modal fade" id="man-i" data-backdrop="static">
  466. <div class="modal-dialog" role="document">
  467. <div class="modal-content">
  468. <div class="modal-header">
  469. <h5 class="modal-title">管理定制报表</h5>
  470. </div>
  471. <div class="modal-body">
  472. <div class="modal-height-500" style="overflow: auto;">
  473. <table class="table table-sm table-bordered" id="report_cust_group_individual">
  474. </table>
  475. </div>
  476. </div>
  477. <div class="modal-footer">
  478. <button type="button" class="btn btn-secondary" data-dismiss="modal" onclick="revertIndividualCustRptCfg();">关闭</button>
  479. <!--有结果出现添加-->
  480. <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="updateCustRptCfg()">确认</button>
  481. </div>
  482. </div>
  483. </div>
  484. </div>
  485. <% include ../stage/audit_modal.ejs %>
  486. <script>
  487. zTreeOprObj.getCustomerCfg();
  488. zTreeOprObj.iniFontCfgDom(CUST_CFG);
  489. buildCustRptCommon('report_cust_group_common', ORG_TOP_TREE_NODES[1], CUST_TREE_NODES.common, 'true');
  490. buildCustRptCommon('report_cust_group_individual', ORG_TOP_TREE_NODES[0], CUST_TREE_NODES.customize, 'false');
  491. let SELECTED_TENDERS = [];
  492. function buildTendersTree() {
  493. let sortedCat = [];
  494. SELECTED_TENDERS = [];
  495. for (const cat of category) {
  496. if (cat.level > 0) {
  497. sortedCat.push(cat);
  498. }
  499. }
  500. let treeCache = [];
  501. //1. 选择用户已设置的分类
  502. if (sortedCat.length > 0) {
  503. sortedCat.sort(function(i1, i2){
  504. return i1.level - i2.level;
  505. });
  506. const _createItems = function (parentItems, grpLv) {
  507. if (grpLv < sortedCat.length) {
  508. let cat = sortedCat[grpLv];
  509. for (const nv of cat.value) {
  510. let item = {
  511. name: nv.value,
  512. id : nv.id,
  513. cid : nv.cid,
  514. items: [],
  515. isParent: true
  516. };
  517. parentItems.push(item);
  518. _createItems(item.items, grpLv + 1);
  519. }
  520. }
  521. }
  522. _createItems(treeCache, 0);
  523. }
  524. //2. 建立treeNodes
  525. let hasCat = false;
  526. for (const tender of tenders) {
  527. if (tender.category && tender.category.length > 0) {
  528. hasCat = true;
  529. break;
  530. }
  531. }
  532. //3. 把标段挂上去
  533. let tmpCacheArr = []; //这个临时用来储存相应标段节点挂接信息
  534. let _putTender = function (catLv, tender, parentItems) {
  535. if (tender.lastStage !== undefined && tender.lastStage !== null) {
  536. if (hasCat) {
  537. let isSorted = false;
  538. for (let sCat of sortedCat) {
  539. if (sCat.id === tender.category[catLv].cid && sCat.level > 0) {
  540. isSorted = true;
  541. break;
  542. }
  543. }
  544. if (isSorted) {
  545. for (const item of parentItems) {
  546. if (item.cid === tender.category[catLv].cid && item.id === tender.category[catLv].value) {
  547. if (item.items.length > 0) {
  548. //递归循环
  549. _putTender(catLv + 1, tender, item.items);
  550. } else {
  551. //就是这个了
  552. let tdItem = {
  553. name: tender.name,
  554. id : -1,
  555. cid : -1,
  556. tender_id: tender.id,
  557. last_stage: tender.lastStage.order,
  558. last_stage_id: tender.lastStage.id,
  559. report_id: zTreeOprObj.currentNode.refId,
  560. signature: '',
  561. items: [],
  562. isParent: false
  563. }; //标段节点
  564. //
  565. tmpCacheArr.push([item, tdItem]);
  566. }
  567. }
  568. }
  569. }
  570. } else {
  571. // 没有设置category
  572. let tdItem = {
  573. name: tender.name,
  574. id : -1,
  575. cid : -1,
  576. tender_id: tender.id,
  577. last_stage: tender.lastStage.order,
  578. last_stage_id: tender.lastStage.id,
  579. report_id: zTreeOprObj.currentNode.refId,
  580. signature: '',
  581. items: [],
  582. isParent: false
  583. }; //标段节点
  584. //
  585. tmpCacheArr.push([null, tdItem]);
  586. }
  587. }
  588. }
  589. for (const tender of tenders) {
  590. _putTender(0, tender, treeCache);
  591. }
  592. if (hasCat) {
  593. for (const pairItem of tmpCacheArr) {
  594. pairItem[0].items.push(pairItem[1]);
  595. }
  596. }
  597. //4. 剔除空items的项
  598. if (hasCat) {
  599. let _removeEmptyItems = function (parentItem) {
  600. let rst = false;
  601. if (parentItem.items.length === 0) {
  602. if (parentItem.isParent) {
  603. rst = true;
  604. }
  605. } else {
  606. for (let idx = parentItem.items.length - 1; idx >= 0; idx--) {
  607. if (_removeEmptyItems(parentItem.items[idx])) {
  608. parentItem.items.splice(idx, 1);
  609. }
  610. }
  611. rst = parentItem.items.length === 0;
  612. }
  613. return rst;
  614. }
  615. for (let idx = treeCache.length - 1; idx >= 0; idx--) {
  616. if (hasCat) {
  617. if (_removeEmptyItems(treeCache[idx])) {
  618. treeCache.splice(idx, 1);
  619. }
  620. }
  621. }
  622. }
  623. //console.log(treeCache);
  624. //还要请求各标段的原签名数据
  625. let params = {};
  626. params.selectedTenders = [];
  627. let _getTenderRelatedInfos = function(parentItem, rstArr) {
  628. if (parentItem.items.length === 0) {
  629. if (!parentItem.isParent) {
  630. rstArr.push([parentItem.tender_id, parentItem.last_stage_id, parentItem.report_id]);
  631. }
  632. } else {
  633. for (let idx = parentItem.items.length - 1; idx >= 0; idx--) {
  634. _getTenderRelatedInfos(parentItem.items[idx], rstArr);
  635. }
  636. }
  637. };
  638. let _addHint = function(parentItem, relArr) {
  639. if (parentItem.items.length === 0) {
  640. if (!parentItem.isParent) {
  641. for (const rel of relArr) {
  642. if (rel.tender_id === parentItem.tender_id && rel.sid === parentItem.last_stage_id && rel.rpt_id === parentItem.report_id) {
  643. let hintStr = '';
  644. if (rel.rel_content instanceof Array) {
  645. for (let idx = 0; idx < rel.rel_content.length; idx++) {
  646. const dtlRel = rel.rel_content[idx];
  647. if (idx > 0) {
  648. hintStr = hintStr + '、';
  649. }
  650. hintStr = hintStr + '(' + dtlRel.signature_name + ')' + dtlRel.user_name;
  651. }
  652. }
  653. parentItem.signature = hintStr;
  654. break;
  655. }
  656. }
  657. }
  658. } else {
  659. for (let idx = parentItem.items.length - 1; idx >= 0; idx--) {
  660. _addHint(parentItem.items[idx], relArr);
  661. }
  662. }
  663. };
  664. if (hasCat) {
  665. for (let idx = treeCache.length - 1; idx >= 0; idx--) {
  666. _getTenderRelatedInfos(treeCache[idx], params.selectedTenders);
  667. }
  668. } else {
  669. for (let idx = tmpCacheArr.length - 1; idx >= 0; idx--) {
  670. _getTenderRelatedInfos(tmpCacheArr[idx][1], params.selectedTenders);
  671. treeCache.push(tmpCacheArr[idx][1]);
  672. }
  673. }
  674. $.bootstrapLoading.start();
  675. CommonAjax.postXsrfEx("/tender/report_api/getMultiRoleRelationships", params, 30000, true, getCookie('csrfToken'),
  676. function(result){
  677. $.bootstrapLoading.end();
  678. let relArr = result.data;
  679. for (const rel of relArr) {
  680. rel.rel_content = JSON.parse(rel.rel_content);
  681. }
  682. console.log(relArr);
  683. //5. 加hint
  684. for (let idx = treeCache.length - 1; idx >= 0; idx--) {
  685. _addHint(treeCache[idx], relArr);
  686. }
  687. //6. 建树
  688. _buildTenderTree('batch_tenders_individual', treeCache);
  689. }, function(err){
  690. $.bootstrapLoading.end();
  691. }, function(ex){
  692. $.bootstrapLoading.end();
  693. }
  694. );
  695. }
  696. function searchAccount() {
  697. if (event.keyCode == 13) {
  698. rptSignatureHelper.buildSelectableAccount(this);
  699. }
  700. }
  701. function _buildTenderTree(tbDomId, tendersArr) {
  702. let tbDom = $("#" + tbDomId);
  703. tbDom.empty();
  704. let domStrs = [];
  705. domStrs.push('<thead><tr><th>名称</th><th width="50">计量期</th><th width="40">签名</th><th width="40">选择</th></tr></thead>');
  706. domStrs.push('<tbody>');
  707. const _createRow = function (rowItem, lv) {
  708. let tdClassStr = 'in-' + lv;
  709. if (rowItem.isParent) {
  710. //tbDom.append('<tr><td class="' + tdClassStr + '"><i class="fa fa-folder-o"></i>&nbsp;&nbsp;' + rowItem.name + '</td><td></td><td></td><td></td></tr>');
  711. domStrs.push('<tr><td class="' + tdClassStr + '"><i class="fa fa-folder-o"></i>&nbsp;&nbsp;' + rowItem.name + '</td><td></td><td></td><td></td></tr>');
  712. } else {
  713. let hrefStr = '/tender/' + rowItem.tender_id;
  714. //<a href="biaoduan-panel.html" target="_blank">WWUJ-1</a>
  715. let lastStgStr = '';
  716. if (rowItem.last_stage === -1) {
  717. lastStgStr = '台账';
  718. } else {
  719. lastStgStr = '第' + rowItem.last_stage + '期';
  720. }
  721. if (rowItem.signature !== undefined && rowItem.signature !== null && rowItem.signature !== '') {
  722. let hintStr = '<i class="fa fa-exclamation-circle text-primary" data-container="body" data-toggle="tooltip" data-placement="bottom" data-original-title="' + rowItem.signature + '"></i>';
  723. domStrs.push('<tr><td class="' + tdClassStr + '"><a href="' + hrefStr + '" target="_blank">' + rowItem.name + '</a></td><td>' + lastStgStr + '</td><td>' + hintStr + '</td><td><input type="checkbox" onclick="changeCrossTender(this, SELECTED_TENDERS, ' + rowItem.tender_id + ', ' + rowItem.last_stage_id + ', ' + rowItem.report_id + ')' + '"></td></tr>');
  724. } else {
  725. domStrs.push('<tr><td class="' + tdClassStr + '"><a href="' + hrefStr + '" target="_blank">' + rowItem.name + '</a></td><td>' + lastStgStr + '</td><td></td><td><input type="checkbox" onclick="changeCrossTender(this, SELECTED_TENDERS, ' + rowItem.tender_id + ', ' + rowItem.last_stage_id + ', ' + rowItem.report_id + ')' + '"></td></tr>');
  726. }
  727. }
  728. if (rowItem.items && rowItem.items.length > 0) {
  729. for (const subItem of rowItem.items) {
  730. _createRow(subItem, lv + 1);
  731. }
  732. }
  733. }
  734. let grpLv = 1;
  735. for (const tItem of tendersArr) {
  736. _createRow(tItem, grpLv);
  737. }
  738. domStrs.push('</tbody>');
  739. tbDom.append(domStrs.join(''));
  740. $('[data-toggle="tooltip"]').tooltip();
  741. }
  742. function buildCustRptCommon(tbDomId, topTreeNode, checkingArr, isCommonStr) {
  743. let tbDom = $("#" + tbDomId);
  744. tbDom.empty();
  745. tbDom.append('<tr><th>类别</th><th>包含报表</th><th>显示</th></tr>');
  746. let _countAvailableTpls = function (tItem) {
  747. let rst = 0;
  748. if (tItem.nodeType === 1 && tItem.items && tItem.items.length > 0) {
  749. for (const dItem of tItem.items) {
  750. if (dItem.nodeType === 2) {
  751. if (dItem.released) rst++;
  752. } else {
  753. rst += _countAvailableTpls(dItem);
  754. }
  755. }
  756. }
  757. return rst;
  758. };
  759. let _pushRptLine = function (parentItem, rptItem, level, needChk, parentNodeIdStr, thisItemSeq) {
  760. if (rptItem.nodeType === 1) {
  761. let amt = _countAvailableTpls(rptItem);
  762. if (amt > 0) {
  763. let padding_leftStr = '';
  764. // classStr = '',
  765. if (level > 0) {
  766. // classStr = 'pl-' + (level + 3);
  767. let rem = 1.5 * level;
  768. padding_leftStr = 'padding-left: ' + rem + 'rem!important'; //不受层数限制
  769. }
  770. if (needChk) {
  771. let chkName = parentItem.name + FOLDER_SEPERATER + rptItem.name;
  772. let checkedStr = (checkingArr.indexOf(chkName) >= 0) ? ' checked' : '';
  773. let sIdStr = parentNodeIdStr + '_sub_' + thisItemSeq;
  774. // tbDom.append('<tr><td class="' + classStr + '">' + rptItem.name + '</td><td>' + amt + '</td><td><input id="' + sIdStr + '" onchange="changeFolder(this, ' + isCommonStr + ', \'' + parentNodeIdStr + '\' )" hiddenval="' + chkName + '" type="checkbox"' + checkedStr + '></td></tr>');
  775. tbDom.append('<tr><td style="' + padding_leftStr + '">' + rptItem.name + '</td><td>' + amt + '</td><td><input id="' + sIdStr + '" onchange="changeFolder(this, ' + isCommonStr + ', \'' + parentNodeIdStr + '\' )" hiddenval="' + chkName + '" type="checkbox"' + checkedStr + '></td></tr>');
  776. } else {
  777. // tbDom.append('<tr><td class="' + classStr + '">' + rptItem.name + '</td><td>' + amt + '</td><td></td></tr>');
  778. tbDom.append('<tr><td style="' + padding_leftStr + '">' + rptItem.name + '</td><td>' + amt + '</td><td></td></tr>');
  779. }
  780. if (rptItem.items && rptItem.items.length > 0) {
  781. for (const subItem of rptItem.items) {
  782. _pushRptLine(rptItem, subItem, level + 1, true, '');
  783. }
  784. }
  785. }
  786. }
  787. }
  788. let TplAmts = [];
  789. let parentIdx = 0;
  790. let subCnt = topTreeNode.items.length;
  791. for (const topItem of topTreeNode.items) {
  792. const avRpts = _countAvailableTpls(topItem);
  793. if (avRpts > 0) {
  794. TplAmts.push(avRpts);
  795. let checkedStr = (checkingArr.indexOf(topItem.name) >= 0) ? ' checked' : '';
  796. let pIdStr = tbDomId + '_' + parentIdx + '_' + subCnt;
  797. tbDom.append('<tr><td>' + topItem.name + '</td><td>' + TplAmts[TplAmts.length - 1] + '</td><td><input id="' + pIdStr + '" onchange="changeFolder(this, ' + isCommonStr + ', null)" hiddenval="' + topItem.name + '" type="checkbox"' + checkedStr + '></td></tr>');
  798. if (topItem.items && topItem.items.length > 0) {
  799. let subSeq = 0;
  800. for (const subItem of topItem.items) {
  801. _pushRptLine(topItem, subItem, 1, true, pIdStr, subSeq);
  802. }
  803. subSeq++;
  804. }
  805. parentIdx++;
  806. }
  807. }
  808. }
  809. function updateCustRptCfg(){
  810. let params = {};
  811. params.nodeItems = CUST_TREE_NODES;
  812. CommonAjax.postXsrfEx("/tender/report_api/updateCustNode", params, 60000, true, getCookie('csrfToken'),
  813. function(result){
  814. try {
  815. // console.log(result);
  816. ORG_CUST_TREE_NODES.common = JSON.parse(JSON.stringify(CUST_TREE_NODES.common));
  817. ORG_CUST_TREE_NODES.customize = JSON.parse(JSON.stringify(CUST_TREE_NODES.customize));
  818. //刷新报表模板树
  819. TOP_TREE_NODES = JSON.parse(JSON.stringify(ORG_TOP_TREE_NODES));
  820. // 移除未被选择的模板
  821. filterUnchkTplTreeNode(TOP_TREE_NODES[0], CUST_TREE_NODES.customize);
  822. filterUnchkTplTreeNode(TOP_TREE_NODES[1], CUST_TREE_NODES.common);
  823. zTreeOprObj.getReportTemplateTree();
  824. } catch(err) {
  825. }
  826. }, function(err){
  827. // hintBox.unWaitBox();
  828. }, function(ex){
  829. // hintBox.unWaitBox();
  830. }
  831. );
  832. }
  833. function revertCommonCustRptCfg(){
  834. CUST_TREE_NODES.common = JSON.parse(JSON.stringify(ORG_CUST_TREE_NODES.common));
  835. buildCustRptCommon('report_cust_group_common', ORG_TOP_TREE_NODES[1], CUST_TREE_NODES.common, 'true');
  836. }
  837. function revertIndividualCustRptCfg(){
  838. CUST_TREE_NODES.customize = JSON.parse(JSON.stringify(ORG_CUST_TREE_NODES.customize));
  839. buildCustRptCommon('report_cust_group_individual', ORG_TOP_TREE_NODES[0], CUST_TREE_NODES.customize, 'false');
  840. }
  841. function changeCrossTender(dom, rstArr, tenderId, stageId, reportId) {
  842. if (dom.checked) {
  843. let item = [tenderId, stageId, reportId];
  844. rstArr.push(item);
  845. } else {
  846. for (let idx = rstArr.length - 1; idx >= 0; idx--) {
  847. if (rstArr[idx][0] === tenderId && rstArr[idx][1] === stageId && rstArr[idx][2] === reportId) {
  848. rstArr.splice(idx, 1); //删除当前标段
  849. //这里不break,防止一些冗余数据
  850. }
  851. }
  852. }
  853. }
  854. function changeFolder(dom, isCommon, parentIdStr) {
  855. let prop = null;
  856. if (isCommon) {
  857. prop = CUST_TREE_NODES.common;
  858. } else {
  859. prop = CUST_TREE_NODES.customize;
  860. }
  861. let idx = prop.indexOf(dom.attributes['hiddenval'].value);
  862. if (dom.checked) {
  863. if (idx < 0) {
  864. prop.push(dom.attributes['hiddenval'].value);
  865. if (parentIdStr === null) {
  866. //这是父节点,需要把所有子节点都勾上
  867. //后期补上
  868. }
  869. }
  870. } else {
  871. if (idx >= 0) {
  872. prop.splice(idx, 1);
  873. if (parentIdStr === null) {
  874. //这是父节点,需要把所有子节点都uncheck
  875. //后期补上
  876. }
  877. }
  878. }
  879. }
  880. </script>