rpt_all_popup.ejs 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219
  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="zTreeOprObj.changeCfg(rptControlObj.restoreMargine);">恢复默认值</button>
  55. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal" onclick="rptControlObj.cancelCfgChange()">取消</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="zTreeOprObj.changeCfg(rptControlObj.restoreFormat);">恢复默认值</button>
  81. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal" onclick="rptControlObj.cancelCfgChange()">取消</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" onclick="rptControlObj.cancelCfgChange()">取消</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 modal-lg" 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. <% if ( stg_id > 0 && pageShow !== null && parseInt(pageShow.openSign) === 1) { %>
  207. <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>
  208. <% } %>
  209. <% if (stg_id === -300) { %>
  210. <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-setupChangeSignature" onclick="rptSignatureHelper.resetESignature(zTreeOprObj.currentRptPageRst, 'batch-eSignatureBodyDiv', true); buildChangeTree();">批量设置其他变更令</button>
  211. <% } %>
  212. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal" onclick="rptSignatureHelper.removeSelectSignature()">取消</button>
  213. <a href="javascript:void(0);" onclick="rptSignatureHelper.setupAfterSelectSignature('eSignatureBodyDiv')" class="btn btn-primary btn-sm" data-dismiss="modal">确定</a>
  214. </div>
  215. </div>
  216. </div>
  217. </div>
  218. <div class="modal fade" id="batch-eSignature" data-backdrop="static">
  219. <div class="modal-dialog modal-xl" role="document">
  220. <div class="modal-content">
  221. <div class="modal-header">
  222. <h5 class="modal-title">批量设置签字</h5>
  223. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  224. <span aria-hidden="true">&times;</span>
  225. </button>
  226. </div>
  227. <div class="modal-body">
  228. <div class="row">
  229. <div class="col-5">
  230. <div class="modal-height-500" style="overflow-y:auto;">
  231. <table class="table table-hover table-bordered" id="batch_tenders_individual">
  232. </table>
  233. </div>
  234. </div>
  235. <div class="col-7">
  236. <div class="modal-height-500 ml-2" id="batch-eSignatureBodyDiv" style="overflow-y:auto;"></div>
  237. </div>
  238. </div>
  239. <% if (stg_id !== -300) { %>
  240. <div class="alert alert-warning">批量操作会覆盖已设置好的签字,请谨慎操作。</div>
  241. <% } else { %>
  242. <div class="alert alert-warning">批量操作会覆盖已设置好的签字,请谨慎操作;<b>已选签名的审核时间只对当前变更令有效</b></div>
  243. <% } %>
  244. </div>
  245. <div class="modal-footer">
  246. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  247. <% if (stg_id !== -300) { %>
  248. <a href="javascript:void(0);" onclick="rptSignatureHelper.setupAfterSelectMultiTenders(SELECTED_TENDERS, 'batch-eSignatureBodyDiv')" class="btn btn-sm btn-primary" data-dismiss="modal">确定</a>
  249. <% } else { %>
  250. <a href="javascript:void(0);" onclick="rptSignatureHelper.setupAfterSelectMultiChanges(SELECTED_CHANGES, 'batch-eSignatureBodyDiv')" class="btn btn-sm btn-primary" data-dismiss="modal">确定</a>
  251. <% } %>
  252. </div>
  253. </div>
  254. </div>
  255. </div>
  256. <!--弹出添加签名人-->
  257. <div class="modal fade" id="add-sign" data-backdrop="static">
  258. <div class="modal-dialog modal-sm" role="document">
  259. <div class="modal-content">
  260. <div class="modal-header">
  261. <h5 class="modal-title">添加签字</h5>
  262. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  263. <span aria-hidden="true">&times;</span>
  264. </button>
  265. </div>
  266. <div class="modal-body">
  267. <ul class="nav nav-tabs justify-content-center mb-1" role="tablist">
  268. <li class="nav-item">
  269. <a class="nav-link active px-3 p-1" data-toggle="tab" href="#adst-1" role="tab">项目</a>
  270. </li>
  271. <li class="nav-item">
  272. <a class="nav-link px-3 p-1" data-toggle="tab" href="#adst-2" role="tab"><i class="fa fa-user"></i> 角色</a>
  273. </li>
  274. <li class="nav-item">
  275. <a class="nav-link px-3 p-1" data-toggle="tab" href="#adst-3" role="tab">最近使用</a>
  276. </li>
  277. </ul>
  278. <div class="tab-content">
  279. <div class="tab-pane fade show active" id="adst-1" role="tabpanel" aria-labelledby="home-tab">
  280. <div class="input-group input-group-sm mt-1 mb-2">
  281. <div class="input-group-prepend">
  282. <span class="input-group-text" id="inputGroup-sizing-sm"><i class="fa fa-search" onclick="rptSignatureHelper.buildSelectableAccount(this);"></i></span>
  283. </div>
  284. <input type="text" id="search_account" class="form-control form-control-sm" placeholder="搜索..." onkeypress="searchAccount()">
  285. </div>
  286. <div class="modal-height-300" id="project_account_select_div">
  287. </div>
  288. </div>
  289. <div class="tab-pane fade" id="adst-2" role="tabpanel" aria-labelledby="profile-tab">
  290. <a href="javascript:void(0)" onclick="rptSignatureHelper.switchAddRoleDiv(this)" class="btn btn-sm btn-link">添加角色</a>
  291. <div class="modal-height-300">
  292. <!--添加角色-->
  293. <div class="card" id="role_select_acc_div" style="display:none">
  294. <div class="p-2">
  295. <div class="input-group input-group-sm mb-1">
  296. <div class="input-group-prepend">
  297. <span class="input-group-text" id="inputGroup-sizing-sm">角色名称</span>
  298. </div>
  299. <input type="text" class="form-control form-control-sm" id="acc_role_name" placeholder="最多10个字符">
  300. </div>
  301. <div class="input-group input-group-sm mb-1">
  302. <div class="input-group-prepend">
  303. <span class="input-group-text" id="inputGroup-sizing-sm">绑定成员</span>
  304. </div>
  305. <select class="form-control form-control-sm" id="project_account_select_dom">
  306. </select>
  307. </div>
  308. <a href="javascript:void(0)" onclick="rptSignatureHelper.createNewRole(this)" class="btn btn-sm btn-primary">添加角色</a>
  309. </div>
  310. </div>
  311. <ul class="list-group p-2" id="existed_roles_ul">
  312. </ul>
  313. </div>
  314. </div>
  315. <div class="tab-pane fade" id="adst-3" role="tabpanel" aria-labelledby="contact-tab">
  316. <div class="modal-height-300">
  317. <ul class="list-group" id="account_used_select_div"></ul>
  318. </div>
  319. </div>
  320. </div>
  321. </div>
  322. </div>
  323. </div>
  324. </div>
  325. <!--选择个人章-->
  326. <div class="modal fade" id="chose-private-stamp-path" data-backdrop="static">
  327. <div class="modal-dialog modal-lg" role="document">
  328. <div class="modal-content">
  329. <div class="modal-header">
  330. <h5 class="modal-title" id="select-personal-signature-title">选择个人章</h5>
  331. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  332. <span aria-hidden="true">&times;</span>
  333. </button>
  334. </div>
  335. <div class="modal-body">
  336. </div>
  337. <div class="modal-footer">
  338. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  339. <button id="audit-select-ok" class="btn btn-primary btn-sm" onclick="rptSignatureHelper.setPrivateStamp(this)">确定</button>
  340. </div>
  341. </div>
  342. </div>
  343. </div>
  344. <!--选择审批人-->
  345. <div class="modal fade" id="audit-select" data-backdrop="static">
  346. <div class="modal-dialog" role="document">
  347. <div class="modal-content">
  348. <div class="modal-header">
  349. <h5 class="modal-title" id="audit-select-title">重置</h5>
  350. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  351. <span aria-hidden="true">&times;</span>
  352. </button>
  353. </div>
  354. <div class="modal-body">
  355. <table class="table table-bordered">
  356. <tr><th style="width: 50%">报表数据</th><th>审批人</th></tr>
  357. <tbody id="audit-select-list">
  358. </tbody>
  359. </table>
  360. <div id="audit-select-hint" class="text-danger">
  361. </div>
  362. </div>
  363. <div class="modal-footer">
  364. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  365. <button id="audit-select-ok" class="btn btn-primary btn-sm" onclick="rptCustomObj.resetAuditSelect(this)">确定</button>
  366. </div>
  367. </div>
  368. </div>
  369. </div>
  370. <!--选择标段-->
  371. <div class="modal fade" id="gather-select" data-backdrop="static">
  372. <div class="modal-dialog modal-lgx" role="document">
  373. <div class="modal-content">
  374. <div class="modal-header">
  375. <h5 class="modal-title" id="gather-select-title">选择标段</h5>
  376. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  377. <span aria-hidden="true">&times;</span>
  378. </button>
  379. </div>
  380. <div class="modal-body">
  381. <div class="row">
  382. <div class="col-7">
  383. <h5>可选标段 </h5>
  384. <div class="modal-height-500" id="gather-source-spread">
  385. </div>
  386. </div>
  387. <div class="col-5">
  388. <h5>已选标段 </h5>
  389. <div class="modal-height-500" id="gather-result-spread">
  390. </div>
  391. <div class="mt-1" id="gather-by-month" style="width: 60%" name="gather-type">
  392. <div class="input-group input-group-sm">
  393. <div class="input-group-prepend">
  394. <span class="input-group-text">汇总年月</span>
  395. </div>
  396. <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">
  397. </div>
  398. </div>
  399. <div id="gather-by-zone" name="gather-type">
  400. <div class="input-group input-group-sm">
  401. <div class="input-group-prepend">
  402. <span class="input-group-text">汇总周期</span>
  403. </div>
  404. <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">
  405. </div>
  406. </div>
  407. <div id="gather-by-custom-zone" name="gather-type">
  408. <div class="input-group input-group-sm">
  409. <div class="input-group-prepend">
  410. <span class="input-group-text">汇总周期</span>
  411. </div>
  412. <input id="gather-custom-zone" class="datepicker-here form-control mt-0" placeholder="点击选择周期" data-range="true" data-multiple-dates-separator=" - " data-min-view="days" data-view="days" data-date-format="yyyy-MM-dd" data-language="zh" type="text" autocomplete="off">
  413. </div>
  414. </div>
  415. <div id="gather-by-stage" name="gather-type">
  416. <div class="input-group input-group-sm">
  417. <div class="input-group-prepend">
  418. <span class="input-group-text">选择期</span>
  419. </div>
  420. <select class="form-control" id="gather-stage">
  421. <option>第1期</option>
  422. </select>
  423. </div>
  424. </div>
  425. <div id="gather-by-stage-zone" name="gather-type">
  426. <div class="input-group input-group-sm">
  427. <div class="input-group-prepend">
  428. <span class="input-group-text">汇总</span>
  429. </div>
  430. <select class="form-control" id="gather-stage-begin">
  431. <option>第1期</option>
  432. </select>
  433. <div class="input-group-prepend">
  434. <span class="input-group-text">至</span>
  435. </div>
  436. <select class="form-control" id="gather-stage-end">
  437. <option>第5期</option>
  438. </select>
  439. </div>
  440. </div>
  441. </div>
  442. <div class="text-danger text-center ml-3" id="gather-hint">我是提示呀</div>
  443. </div>
  444. </div>
  445. <div class="modal-footer">
  446. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  447. <button class="btn btn-sm btn-primary" id="gather-select-ok">确定</button>
  448. </div>
  449. </div>
  450. </div>
  451. </div>
  452. <div class="modal fade" id="stage-select" data-backdrop="static">
  453. <div class="modal-dialog" role="document">
  454. <div class="modal-content">
  455. <div class="modal-header">
  456. <h5 class="modal-title" id="stage-select-title">选择期</h5>
  457. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  458. <span aria-hidden="true">&times;</span>
  459. </button>
  460. </div>
  461. <div class="modal-body">
  462. <div class="row">
  463. <% for (const s of stages) { %>
  464. <div class="col-3">
  465. <div class="custom-control custom-checkbox custom-control-inline">
  466. <input type="checkbox" id="stage-select-<%- s.order %>" name="stage-select-check" stage-order="<%- s.order %>" class="custom-control-input">
  467. <label class="custom-control-label" for="stage-select-<%- s.order %>">第<%- s.order %>期</label>
  468. </div>
  469. </div>
  470. <% } %>
  471. </div>
  472. <div class="alert alert-danger my-2 p-2" id="stage-select-hint">我是提示呀</div>
  473. </div>
  474. <div class="modal-footer">
  475. <div class="form-check form-check-inline mr-auto">
  476. <input class="form-check-input" type="checkbox" id="stage-select-all">
  477. <label class="form-check-label" for="stage-select-all">全选</label>
  478. </div>
  479. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  480. <button class="btn btn-sm btn-primary" id="stage-select-ok">确定</button>
  481. </div>
  482. </div>
  483. </div>
  484. </div>
  485. <div class="modal fade" id="material-sum-select" data-backdrop="static">
  486. <div class="modal-dialog" role="document">
  487. <div class="modal-content">
  488. <div class="modal-header">
  489. <h5 class="modal-title" id="material-sum-select-title">选择期(材料调差)</h5>
  490. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  491. <span aria-hidden="true">&times;</span>
  492. </button>
  493. </div>
  494. <div class="modal-body">
  495. <div class="row">
  496. <% for (const m of materialList) { %>
  497. <div class="col-3">
  498. <div class="custom-control custom-checkbox custom-control-inline">
  499. <input type="checkbox" id="material-sum-select-<%- m.order %>" name="material-sum-select-check" material-order="<%- m.order %>" class="custom-control-input">
  500. <label class="custom-control-label" for="material-sum-select-<%- m.order %>">第<%- m.order %>期</label>
  501. </div>
  502. </div>
  503. <% } %>
  504. </div>
  505. <div class="alert alert-danger my-2 p-2" id="material-sum-select-hint">我是提示呀</div>
  506. </div>
  507. <div class="modal-footer">
  508. <div class="form-check form-check-inline mr-auto">
  509. <input class="form-check-input" type="checkbox" id="material-sum-select-all">
  510. <label class="form-check-label" for="material-sum-select-all">全选</label>
  511. </div>
  512. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  513. <button class="btn btn-sm btn-primary" id="material-sum-select-ok">确定</button>
  514. </div>
  515. </div>
  516. </div>
  517. </div>
  518. <div class="modal" id="change-select" data-backdrop="static">
  519. <div class="modal-dialog modal-lg" role="document">
  520. <div class="modal-content">
  521. <div class="modal-header">
  522. <h5 class="modal-title" id="change-select-title">请选择变更令</h5>
  523. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  524. <span aria-hidden="true">&times;</span>
  525. </button>
  526. </div>
  527. <div class="modal-body">
  528. <div class="row">
  529. <div class="col-6">
  530. <h5>可选变更令 </h5>
  531. <table class="table table-bordered">
  532. <tr class="text-center"><th>选择</th><th>变更令号</th><th>工程名称</th></tr>
  533. <tbody id="change-select-list">
  534. </tbody>
  535. </table>
  536. </div>
  537. <div class="col-6">
  538. <h5>已选变更令 </h5>
  539. <table class="table table-bordered">
  540. <tr class="text-center"><th>序号</th><th>变更令号</th><th>工程名称</th></tr>
  541. <tbody id="change-select-result">
  542. </tbody>
  543. </table>
  544. </div>
  545. </div>
  546. <div class="alert alert-danger my-2 p-2" id="change-select-hint" style="display: none">我是提示呀</div>
  547. </div>
  548. <div class="modal-footer">
  549. <div class="form-check form-check-inline mr-auto">
  550. <input class="form-check-input" type="checkbox" id="change-select-all">
  551. <label class="form-check-label" for="change-select-all">全选</label>
  552. </div>
  553. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  554. <button class="btn btn-sm btn-primary" id="change-select-ok">确定</button>
  555. </div>
  556. </div>
  557. </div>
  558. </div>
  559. <div class="modal" id="select-change-rela" data-backdrop="static">
  560. <div class="modal-dialog" role="document">
  561. <div class="modal-content">
  562. <div class="modal-header">
  563. <h5 class="modal-title" id="scr-title">请选择变更令</h5>
  564. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  565. <span aria-hidden="true">&times;</span>
  566. </button>
  567. </div>
  568. <div class="modal-body" style="overflow-y: auto; height: 480px">
  569. <table class="table table-bordered">
  570. <thead id="scr-header"><tr class="text-center"><th>选择</th><th>变更令号</th><th>工程名称</th></tr></thead>
  571. <tbody id="scr-list">
  572. </tbody>
  573. </table>
  574. </div>
  575. <div class="modal-footer">
  576. <div class="form-check form-check-inline mr-auto">
  577. <input class="form-check-input" type="checkbox" id="scr-all">
  578. <label class="form-check-label" for="scr-all">全选</label>
  579. </div>
  580. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  581. <button class="btn btn-sm btn-primary" id="scr-ok" onclick="rptChangeRela.updateChangeRela();">确定</button>
  582. </div>
  583. </div>
  584. </div>
  585. </div>
  586. <div class="modal" id="select-other-stage" data-backdrop="static">
  587. <div class="modal-dialog" role="document">
  588. <div class="modal-content">
  589. <div class="modal-header">
  590. <h5 class="modal-title" id="sos-title">请选择预付款</h5>
  591. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  592. <span aria-hidden="true">&times;</span>
  593. </button>
  594. </div>
  595. <div class="modal-body" style="overflow-y: auto; height: 480px">
  596. <table class="table table-bordered">
  597. <thead id="sos-header"><tr class="text-center"><th>选择</th><th>变更令号</th><th>工程名称</th></tr></thead>
  598. <tbody id="sos-list">
  599. </tbody>
  600. </table>
  601. </div>
  602. <div class="modal-footer">
  603. <div class="form-check form-check-inline mr-auto">
  604. <input class="form-check-input" type="checkbox" id="sos-all">
  605. <label class="form-check-label" for="sos-all">全选</label>
  606. </div>
  607. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  608. <button class="btn btn-sm btn-primary" id="sos-ok" onclick="rptOtherStage.updateOtherStage();">确定</button>
  609. </div>
  610. </div>
  611. </div>
  612. </div>
  613. <div class="modal" id="select-show-level" data-backdrop="static">
  614. <div class="modal-dialog" role="document">
  615. <div class="modal-content">
  616. <div class="modal-header">
  617. <h5 class="modal-title" id="ssl-title">请选择显示层级</h5>
  618. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  619. <span aria-hidden="true">&times;</span>
  620. </button>
  621. </div>
  622. <div class="modal-body">
  623. <div class="form-group" id="ssl-list">
  624. </div>
  625. </div>
  626. <div class="modal-footer">
  627. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  628. <button class="btn btn-sm btn-primary" id="sos-ok" onclick="rptShowLevel.update();">确定</button>
  629. </div>
  630. </div>
  631. </div>
  632. </div>
  633. <!--管理推荐报表-->
  634. <div class="modal fade" id="man-c" data-backdrop="static">
  635. <div class="modal-dialog" role="document">
  636. <div class="modal-content">
  637. <div class="modal-header">
  638. <h5 class="modal-title">管理推荐报表</h5>
  639. </div>
  640. <div class="modal-body">
  641. <div class="modal-height-500" style="overflow: auto;">
  642. <table class="table table-sm table-bordered" id="report_cust_group_common">
  643. </table>
  644. </div>
  645. </div>
  646. <div class="modal-footer">
  647. <button type="button" class="btn btn-secondary" data-dismiss="modal" onclick="revertCommonCustRptCfg();">关闭</button>
  648. <!--有结果出现添加-->
  649. <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="updateCustRptCfg()">确认</button>
  650. </div>
  651. </div>
  652. </div>
  653. </div>
  654. <!--管理定制报表-->
  655. <div class="modal fade" id="man-i" data-backdrop="static">
  656. <div class="modal-dialog" role="document">
  657. <div class="modal-content">
  658. <div class="modal-header">
  659. <h5 class="modal-title">管理定制报表</h5>
  660. </div>
  661. <div class="modal-body">
  662. <div class="modal-height-500" style="overflow: auto;">
  663. <table class="table table-sm table-bordered" id="report_cust_group_individual">
  664. </table>
  665. </div>
  666. </div>
  667. <div class="modal-footer">
  668. <button type="button" class="btn btn-secondary" data-dismiss="modal" onclick="revertIndividualCustRptCfg();">关闭</button>
  669. <!--有结果出现添加-->
  670. <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="updateCustRptCfg()">确认</button>
  671. </div>
  672. </div>
  673. </div>
  674. </div>
  675. <!--弹出归档-->
  676. <div class="modal fade" id="guidang" data-backdrop="static">
  677. <div class="modal-dialog" role="document">
  678. <div class="modal-content">
  679. <div class="modal-header">
  680. <h5 class="modal-title">归档本张报表</h5>
  681. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  682. <span aria-hidden="true">&times;</span>
  683. </button>
  684. </div>
  685. <div class="modal-body">
  686. <h6>归档后,本期报表将自动导出PDF格式,不再受新一期数据影响;</h6>
  687. <h6>请确认报表数据无误(正确添加签字、设置页面格式等),继续归档操作。</h6>
  688. <div class="card">
  689. <div class="card-body" id="cardArchiveInfo">
  690. </div>
  691. </div>
  692. </div>
  693. <div class="modal-footer">
  694. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  695. <a href="javascript: void(0);" class="btn btn-sm btn-primary" data-dismiss="modal" onclick="rptArchiveObj.archiveCurrentReport(zTreeOprObj.currentRptPageRst, zTreeOprObj.currentNode)">确定归档</a>
  696. </div>
  697. </div>
  698. </div>
  699. </div>
  700. <!--全屏显示报表-->
  701. <div class="modal fade" id="fullscreen" data-backdrop="static">
  702. <div class="modal-dialog modal-full" role="document">
  703. <div class="modal-content">
  704. <div class="modal-header d-flex justify-content-between">
  705. <h5 class="modal-title" id="fullScrTitle"></h5>
  706. <div class="print-toolsbar">
  707. <!--
  708. <div class="panel">
  709. <div class="panel-body">
  710. <div class="btn-group" role="group">
  711. <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="缩小">-</button>
  712. <button class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="重置默认大小">1000%</button>
  713. <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="放大">+</button>
  714. </div>
  715. </div>
  716. </div>
  717. -->
  718. <div class="panel">
  719. <div class="panel-body">
  720. <div class="input-group input-group-sm">
  721. <div class="btn-group" role="group">
  722. <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="缩小" onclick="canvasOprObj.fullScreenChangeScale(-0.1, this)">-</button>
  723. <button id="fullScreenScaleBtn" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="重置默认大小" onclick="canvasOprObj.fullScreenChangeScale(0, this)">100%</button>
  724. <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="放大" onclick="canvasOprObj.fullScreenChangeScale(0.1, this)">+</button>
  725. </div>
  726. <div class="input-group-prepend">
  727. <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="首页" onclick="rptControlObj.firstPage(this)"><i class="fa fa-angle-double-left "></i></button>
  728. <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上一页" onclick="rptControlObj.prePage(this)"><i class="fa fa-angle-left "></i></button>
  729. </div>
  730. <input id="rpt_fullscreen_page_num" class="form-control" value="1/10" style="width:60px" onKeydown="rptControlObj.onKeydown(event, this)" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="输入页码按回车键,快速跳转">
  731. <div class="input-group-append">
  732. <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下一页" onclick="rptControlObj.nextPage(this)"><i class="fa fa-angle-right"></i></button>
  733. <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="尾页" onclick="rptControlObj.lastPage(this)"><i class="fa fa-angle-double-right"></i></button>
  734. </div>
  735. </div>
  736. </div>
  737. </div>
  738. <div class="panel">
  739. <div class="panel-body">
  740. <button type="button" class="btn btn-outline-primary btn-sm" data-dismiss="modal" ><i class="fa fa-window-close-o"></i> 退出全屏</button>
  741. </div>
  742. </div>
  743. </div>
  744. </div>
  745. <div class="modal-body">
  746. <div class="modal-fullscreen pageContainer">
  747. <canvas id="fullScrCanvas" height="100%" width="100%"></canvas>
  748. </div>
  749. </div>
  750. </div>
  751. </div>
  752. </div>
  753. <% if (![-100, -200, -300, -301, -302, -303].includes(stg_id)) { %>
  754. <% include ../stage/audit_modal.ejs %>
  755. <% } %>
  756. <script>
  757. zTreeOprObj.getCustomerCfg();
  758. zTreeOprObj.iniFontCfgDom(CUST_CFG);
  759. <% if (![-100, -300, -301, -302, -303].includes(stg_id)) { %>
  760. buildCustRptCommon('report_cust_group_common', ORG_TOP_TREE_NODES[1], CUST_TREE_NODES.common, 'true');
  761. buildCustRptCommon('report_cust_group_individual', ORG_TOP_TREE_NODES[0], CUST_TREE_NODES.customize, 'false');
  762. <% } %>
  763. let SELECTED_TENDERS = [];
  764. function buildTendersTree() {
  765. let sortedCat = [];
  766. SELECTED_TENDERS = [];
  767. for (const cat of category) {
  768. if (cat.level > 0) {
  769. sortedCat.push(cat);
  770. }
  771. }
  772. for (const tender of tenders) {
  773. if (tender.lastStage !== undefined && tender.lastStage !== null && tender.category && tender.category.length === sortedCat.length) {
  774. for (let cat of tender.category) {
  775. for (let cIdx = 0; cIdx < sortedCat.length; cIdx++) {
  776. if (cat.cid === sortedCat[cIdx].id) {
  777. cat.level = sortedCat[cIdx].level;
  778. break;
  779. }
  780. }
  781. }
  782. tender.category.sort(function(i1, i2){
  783. return i1.level - i2.level;
  784. });
  785. }
  786. }
  787. let treeCache = [];
  788. //1. 选择用户已设置的分类
  789. if (sortedCat.length > 0) {
  790. sortedCat.sort(function(i1, i2){
  791. return i1.level - i2.level;
  792. });
  793. const _createItems = function (parentItems, grpLv) {
  794. if (grpLv < sortedCat.length) {
  795. let cat = sortedCat[grpLv];
  796. for (const nv of cat.value) {
  797. let item = {
  798. name: nv.value,
  799. id : nv.id,
  800. cid : nv.cid,
  801. items: [],
  802. isParent: true
  803. };
  804. parentItems.push(item);
  805. _createItems(item.items, grpLv + 1);
  806. }
  807. }
  808. }
  809. _createItems(treeCache, 0);
  810. }
  811. //2. 建立treeNodes
  812. let hasCat = false;
  813. for (const tender of tenders) {
  814. if (tender.category && tender.category.length > 0) {
  815. hasCat = true;
  816. break;
  817. }
  818. }
  819. //3. 把标段挂上去
  820. let tmpCacheArr = []; //这个临时用来储存相应标段节点挂接信息
  821. let _createTenderItem = function (tender) {
  822. let rst = {
  823. name: tender.name,
  824. id : -1,
  825. cid : -1,
  826. tender_id: tender.id,
  827. last_stage: tender.lastStage.order,
  828. last_stage_id: tender.lastStage.id,
  829. report_id: zTreeOprObj.currentNode.refId,
  830. signature: '',
  831. items: [],
  832. isParent: false
  833. }
  834. return rst;
  835. }
  836. let _putTender = function (catLv, tender, parentItems) {
  837. if (tender.lastStage !== undefined && tender.lastStage !== null) {
  838. if (hasCat) {
  839. let isSorted = false;
  840. for (let sCat of sortedCat) {
  841. if (sCat.level <= tender.category.length && sCat.level > 0 && sCat.id === tender.category[catLv].cid) {
  842. isSorted = true;
  843. break;
  844. }
  845. }
  846. if (isSorted) {
  847. for (const item of parentItems) {
  848. if (item.cid === tender.category[catLv].cid && item.id === tender.category[catLv].value) {
  849. if (item.items.length > 0 && tender.category.length > (catLv + 1)) {
  850. //递归循环
  851. _putTender(catLv + 1, tender, item.items);
  852. } else {
  853. //就是这个了
  854. let tdItem = _createTenderItem(tender); //标段节点
  855. tmpCacheArr.push([item, tdItem]);
  856. }
  857. }
  858. }
  859. } else {
  860. //超界了
  861. //let tdItem = _createTenderItem(tender); //标段节点
  862. //tmpCacheArr.push([item, tdItem]);
  863. }
  864. } else {
  865. // 没有设置category
  866. let tdItem = _createTenderItem(tender); //标段节点
  867. tmpCacheArr.push([null, tdItem]);
  868. }
  869. }
  870. }
  871. for (const tender of tenders) {
  872. //console.log('tender.name: ' + tender.name);
  873. _putTender(0, tender, treeCache);
  874. }
  875. if (hasCat) {
  876. for (const pairItem of tmpCacheArr) {
  877. pairItem[0].items.push(pairItem[1]);
  878. }
  879. }
  880. //4. 剔除空items的项
  881. if (hasCat) {
  882. let _removeEmptyItems = function (parentItem) {
  883. let rst = false;
  884. if (parentItem.items.length === 0) {
  885. if (parentItem.isParent) {
  886. rst = true;
  887. }
  888. } else {
  889. for (let idx = parentItem.items.length - 1; idx >= 0; idx--) {
  890. if (_removeEmptyItems(parentItem.items[idx])) {
  891. parentItem.items.splice(idx, 1);
  892. }
  893. }
  894. rst = parentItem.items.length === 0;
  895. }
  896. return rst;
  897. }
  898. for (let idx = treeCache.length - 1; idx >= 0; idx--) {
  899. if (hasCat) {
  900. if (_removeEmptyItems(treeCache[idx])) {
  901. treeCache.splice(idx, 1);
  902. }
  903. }
  904. }
  905. }
  906. //console.log(treeCache);
  907. //还要请求各标段的原签名数据
  908. let params = {};
  909. params.selectedTenders = [];
  910. let _getTenderRelatedInfos = function(parentItem, rstArr) {
  911. if (parentItem.items.length === 0) {
  912. if (!parentItem.isParent) {
  913. rstArr.push([parentItem.tender_id, parentItem.last_stage_id, parentItem.report_id]);
  914. }
  915. } else {
  916. for (let idx = parentItem.items.length - 1; idx >= 0; idx--) {
  917. _getTenderRelatedInfos(parentItem.items[idx], rstArr);
  918. }
  919. }
  920. };
  921. let _addHint = function(parentItem, relArr) {
  922. if (parentItem.items.length === 0) {
  923. if (!parentItem.isParent) {
  924. for (const rel of relArr) {
  925. if (rel.tender_id === parentItem.tender_id && rel.sid === parentItem.last_stage_id && rel.rpt_id === parentItem.report_id) {
  926. let hintStr = '';
  927. if (rel.rel_content instanceof Array) {
  928. for (let idx = 0; idx < rel.rel_content.length; idx++) {
  929. const dtlRel = rel.rel_content[idx];
  930. if (idx > 0) {
  931. hintStr = hintStr + '、';
  932. }
  933. hintStr = hintStr + '(' + dtlRel.signature_name + ')' + dtlRel.user_name;
  934. }
  935. }
  936. parentItem.signature = hintStr;
  937. break;
  938. }
  939. }
  940. }
  941. } else {
  942. for (let idx = parentItem.items.length - 1; idx >= 0; idx--) {
  943. _addHint(parentItem.items[idx], relArr);
  944. }
  945. }
  946. };
  947. if (hasCat) {
  948. for (let idx = treeCache.length - 1; idx >= 0; idx--) {
  949. _getTenderRelatedInfos(treeCache[idx], params.selectedTenders);
  950. }
  951. } else {
  952. for (let idx = tmpCacheArr.length - 1; idx >= 0; idx--) {
  953. _getTenderRelatedInfos(tmpCacheArr[idx][1], params.selectedTenders);
  954. treeCache.push(tmpCacheArr[idx][1]);
  955. }
  956. }
  957. $.bootstrapLoading.start();
  958. CommonAjax.postXsrfEx("/tender/report_api/getMultiRoleRelationships", params, 30000, true, getCookie('csrfToken_j'),
  959. function(result){
  960. $.bootstrapLoading.end();
  961. let relArr = result.data;
  962. for (const rel of relArr) {
  963. rel.rel_content = JSON.parse(rel.rel_content);
  964. }
  965. console.log(relArr);
  966. //5. 加hint
  967. for (let idx = treeCache.length - 1; idx >= 0; idx--) {
  968. _addHint(treeCache[idx], relArr);
  969. }
  970. //6. 建树
  971. _buildTenderTree('batch_tenders_individual', treeCache);
  972. }, function(err){
  973. $.bootstrapLoading.end();
  974. }, function(ex){
  975. $.bootstrapLoading.end();
  976. }
  977. );
  978. }
  979. let SELECTED_CHANGES = [];
  980. function buildChangeTree() {
  981. let tbDom = $("#batch_tenders_individual");
  982. tbDom.empty();
  983. let domStrs = [];
  984. SELECTED_CHANGES = [];
  985. domStrs.push('<thead><tr><th width="30%">变更令编号</th><th>变更令名称</th><th width="10%">选择</th></tr></thead>');
  986. domStrs.push('<tbody>');
  987. const report_id = zTreeOprObj.currentNode.refId;
  988. for (const dtlChange of ALL_CHANGES) {
  989. if (dtlChange.cid !== BUSINESS_ID && dtlChange.status === 3) {
  990. domStrs.push(`<tr><td>${dtlChange.code}</td><td>${dtlChange.name}</td><td><input type="checkbox" onclick="amendChange(this, SELECTED_CHANGES, TENDER_ID, '${dtlChange.cid}', ${report_id})"></td></tr>`);
  991. }
  992. }
  993. domStrs.push('</tbody>');
  994. tbDom.append(domStrs.join(''));
  995. $('[data-toggle="tooltip"]').tooltip();
  996. }
  997. function searchAccount() {
  998. if (event.keyCode == 13) {
  999. rptSignatureHelper.buildSelectableAccount(this);
  1000. }
  1001. }
  1002. function _buildTenderTree(tbDomId, tendersArr) {
  1003. let tbDom = $("#" + tbDomId);
  1004. tbDom.empty();
  1005. let domStrs = [];
  1006. domStrs.push('<thead><tr><th>名称</th><th width="50">计量期</th><th width="40">签名</th><th width="40">选择</th></tr></thead>');
  1007. domStrs.push('<tbody>');
  1008. const _createRow = function (rowItem, lv) {
  1009. let tdClassStr = 'in-' + lv;
  1010. if (rowItem.isParent) {
  1011. //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>');
  1012. 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>');
  1013. } else {
  1014. let hrefStr = '/tender/' + rowItem.tender_id;
  1015. //<a href="biaoduan-panel.html" target="_blank">WWUJ-1</a>
  1016. let lastStgStr = '';
  1017. if (rowItem.last_stage === -1) {
  1018. lastStgStr = '台账';
  1019. } else {
  1020. lastStgStr = '第' + rowItem.last_stage + '期';
  1021. }
  1022. if (rowItem.signature !== undefined && rowItem.signature !== null && rowItem.signature !== '') {
  1023. 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>';
  1024. 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>');
  1025. } else {
  1026. 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>');
  1027. }
  1028. }
  1029. if (rowItem.items && rowItem.items.length > 0) {
  1030. for (const subItem of rowItem.items) {
  1031. _createRow(subItem, lv + 1);
  1032. }
  1033. }
  1034. }
  1035. let grpLv = 1;
  1036. for (const tItem of tendersArr) {
  1037. _createRow(tItem, grpLv);
  1038. }
  1039. domStrs.push('</tbody>');
  1040. tbDom.append(domStrs.join(''));
  1041. $('[data-toggle="tooltip"]').tooltip();
  1042. }
  1043. function buildCustRptCommon(tbDomId, topTreeNode, checkingArr, isCommonStr) {
  1044. const filterNames = ['01.支付审批报表'];
  1045. let tbDom = $("#" + tbDomId);
  1046. tbDom.empty();
  1047. tbDom.append('<tr><th>类别</th><th>包含报表</th><th>显示</th></tr>');
  1048. let _countAvailableTpls = function (tItem) {
  1049. let rst = 0;
  1050. if (tItem.nodeType === 1 && tItem.items && tItem.items.length > 0) {
  1051. for (const dItem of tItem.items) {
  1052. if (dItem.nodeType === 2) {
  1053. if (dItem.released) rst++;
  1054. } else {
  1055. rst += _countAvailableTpls(dItem);
  1056. }
  1057. }
  1058. }
  1059. return rst;
  1060. };
  1061. let _pushRptLine = function (parentItem, rptItem, level, needChk, parentNodeIdStr, thisItemSeq, pHiddenVal) {
  1062. if (rptItem.nodeType === 1) {
  1063. let amt = _countAvailableTpls(rptItem);
  1064. if (amt > 0) {
  1065. let padding_leftStr = '';
  1066. // classStr = '',
  1067. if (level > 0) {
  1068. // classStr = 'pl-' + (level + 3);
  1069. let rem = 1.5 * level;
  1070. padding_leftStr = 'padding-left: ' + rem + 'rem!important'; //不受层数限制
  1071. }
  1072. if (needChk) {
  1073. let chkName = pHiddenVal + parentItem.name + FOLDER_SEPERATER + rptItem.name;
  1074. let checkedStr = (checkingArr.indexOf(chkName) >= 0) ? ' checked' : '';
  1075. let sIdStr = parentNodeIdStr + '_sub_' + thisItemSeq;
  1076. // 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>');
  1077. 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>');
  1078. } else {
  1079. // tbDom.append('<tr><td class="' + classStr + '">' + rptItem.name + '</td><td>' + amt + '</td><td></td></tr>');
  1080. tbDom.append('<tr><td style="' + padding_leftStr + '">' + rptItem.name + '</td><td>' + amt + '</td><td></td></tr>');
  1081. }
  1082. if (rptItem.items && rptItem.items.length > 0) {
  1083. let subDtlSeq = 0;
  1084. for (const subItem of rptItem.items) {
  1085. _pushRptLine(rptItem, subItem, level + 1, true, '', subDtlSeq, parentItem.name + FOLDER_SEPERATER);
  1086. subDtlSeq++;
  1087. }
  1088. }
  1089. }
  1090. }
  1091. }
  1092. let TplAmts = [];
  1093. let parentIdx = 0;
  1094. let subCnt = topTreeNode.items.length;
  1095. for (const topItem of topTreeNode.items) {
  1096. if (!filterNames.includes(topItem.name)) {
  1097. const avRpts = _countAvailableTpls(topItem);
  1098. if (avRpts > 0) {
  1099. TplAmts.push(avRpts);
  1100. let checkedStr = (checkingArr.indexOf(topItem.name) >= 0) ? ' checked' : '';
  1101. let pIdStr = tbDomId + '_' + parentIdx + '_' + subCnt;
  1102. 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>');
  1103. if (topItem.items && topItem.items.length > 0) {
  1104. let subSeq = 0;
  1105. for (const subItem of topItem.items) {
  1106. _pushRptLine(topItem, subItem, 1, true, pIdStr, subSeq, '');
  1107. }
  1108. subSeq++;
  1109. }
  1110. parentIdx++;
  1111. }
  1112. }
  1113. }
  1114. }
  1115. function updateCustRptCfg(){
  1116. let params = {};
  1117. params.nodeItems = CUST_TREE_NODES;
  1118. params.custSelectKeys = CUST_SELECT_KEYS;
  1119. CommonAjax.postXsrfEx("/tender/report_api/updateCustNode", params, 60000, true, getCookie('csrfToken_j'),
  1120. function(result){
  1121. try {
  1122. // console.log(result);
  1123. ORG_CUST_TREE_NODES.common = JSON.parse(JSON.stringify(CUST_TREE_NODES.common));
  1124. ORG_CUST_TREE_NODES.customize = JSON.parse(JSON.stringify(CUST_TREE_NODES.customize));
  1125. //刷新报表模板树
  1126. TOP_TREE_NODES = JSON.parse(JSON.stringify(ORG_TOP_TREE_NODES));
  1127. // 移除未被选择的模板
  1128. filterUnchkTplTreeNode(TOP_TREE_NODES[0], CUST_TREE_NODES.customize);
  1129. filterUnchkTplTreeNode(TOP_TREE_NODES[1], CUST_TREE_NODES.common);
  1130. zTreeOprObj.getReportTemplateTree();
  1131. } catch(err) {
  1132. }
  1133. }, function(err){
  1134. // hintBox.unWaitBox();
  1135. }, function(ex){
  1136. // hintBox.unWaitBox();
  1137. }
  1138. );
  1139. }
  1140. function revertCommonCustRptCfg(){
  1141. CUST_TREE_NODES.common = JSON.parse(JSON.stringify(ORG_CUST_TREE_NODES.common));
  1142. buildCustRptCommon('report_cust_group_common', ORG_TOP_TREE_NODES[1], CUST_TREE_NODES.common, 'true');
  1143. }
  1144. function revertIndividualCustRptCfg(){
  1145. CUST_TREE_NODES.customize = JSON.parse(JSON.stringify(ORG_CUST_TREE_NODES.customize));
  1146. buildCustRptCommon('report_cust_group_individual', ORG_TOP_TREE_NODES[0], CUST_TREE_NODES.customize, 'false');
  1147. }
  1148. function amendChange(dom, rstArr, tenderId, changeCid, reportId) {
  1149. if (dom.checked) {
  1150. let item = [tenderId, '-300', changeCid, reportId];
  1151. rstArr.push(item);
  1152. } else {
  1153. for (let idx = rstArr.length - 1; idx >= 0; idx--) {
  1154. if (rstArr[idx][2] === changeCid) {
  1155. rstArr.splice(idx, 1); // 删除变更令选择(这里变更令cid一定是唯一的)
  1156. //这里不break,防止一些冗余数据
  1157. }
  1158. }
  1159. }
  1160. }
  1161. function changeCrossTender(dom, rstArr, tenderId, stageId, reportId) {
  1162. if (dom.checked) {
  1163. let item = [tenderId, stageId, reportId];
  1164. rstArr.push(item);
  1165. } else {
  1166. for (let idx = rstArr.length - 1; idx >= 0; idx--) {
  1167. if (rstArr[idx][0] === tenderId && rstArr[idx][1] === stageId && rstArr[idx][2] === reportId) {
  1168. rstArr.splice(idx, 1); //删除当前标段
  1169. //这里不break,防止一些冗余数据
  1170. }
  1171. }
  1172. }
  1173. }
  1174. function changeFolder(dom, isCommon, parentIdStr) {
  1175. let prop = null;
  1176. if (isCommon) {
  1177. prop = CUST_TREE_NODES.common;
  1178. } else {
  1179. prop = CUST_TREE_NODES.customize;
  1180. }
  1181. let idx = prop.indexOf(dom.attributes['hiddenval'].value);
  1182. if (dom.checked) {
  1183. if (idx < 0) {
  1184. prop.push(dom.attributes['hiddenval'].value);
  1185. if (parentIdStr === null) {
  1186. //这是父节点,需要把所有子节点都勾上
  1187. //后期补上
  1188. }
  1189. }
  1190. } else {
  1191. if (idx >= 0) {
  1192. prop.splice(idx, 1);
  1193. if (parentIdStr === null) {
  1194. //这是父节点,需要把所有子节点都uncheck
  1195. //后期补上
  1196. }
  1197. }
  1198. }
  1199. }
  1200. </script>