project_information_modal.ejs 74 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021
  1. <!--添加附件-->
  2. <div class="modal fade" id="addfujian">
  3. <div class="modal-dialog" role="document">
  4. <div class="modal-content">
  5. <div class="modal-header">
  6. <h5 class="modal-title" id="myModalLabel">上传附件</h5>
  7. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  8. <span aria-hidden="true">&times;</span>
  9. </button>
  10. </div>
  11. <div class="modal-body">
  12. <p>单个文件大小限制:30MB,支持office等文档格式、图片格式、压缩包格式</p>
  13. <!-- <p><a href="javascript: void(0);" class="btn btn-primary" id="file-modal-target">选择文件</a></p> -->
  14. <input type="file" id="file-modal" multiple="multiple">
  15. </div>
  16. <div class="modal-footer">
  17. <button id="file-cancel" type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">取消</button>
  18. <button id="file-ok" type="button" class="btn btn-primary btn-sm">添加</button>
  19. </div>
  20. </div>
  21. </div>
  22. </div>
  23. <% if ((ctx.change.status === auditConst.status.uncheck || ctx.change.status === auditConst.status.back || ctx.change.status === auditConst.status.revise) && (ctx.session.sessionUser.accountId === ctx.change.uid || ctx.tender.isTourist)) { %>
  24. <!--上报审批-->
  25. <div class="modal fade" id="sub-sp" data-backdrop="static">
  26. <div class="modal-dialog" role="document">
  27. <div class="modal-content">
  28. <div class="modal-header">
  29. <h5 class="modal-title">上报审批</h5>
  30. </div>
  31. <div class="modal-body">
  32. <div class="dropdown text-right">
  33. <button class="btn btn-outline-primary btn-sm dropdown-toggle" type="button"
  34. id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true"
  35. aria-expanded="false">
  36. 添加审批流程
  37. </button>
  38. <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuButton"
  39. style="width:220px">
  40. <div class="mb-2 p-2"><input class="form-control form-control-sm"
  41. placeholder="姓名/手机 检索" id="gr-search" autocomplete="off"></div>
  42. <dl class="list-unstyled book-list search-user-list">
  43. <% accountGroup.forEach((group, idx) => { %>
  44. <dt><a href="javascript: void(0);" class="acc-btn" data-groupid="<%- idx %>" data-type="hide"><i class="fa fa-plus-square"></i></a> <%- group.groupName %></dt>
  45. <div class="dd-content" data-toggleid="<%- idx %>">
  46. <% group.groupList.forEach(item => { %>
  47. <% if (item.id !== ctx.session.sessionUser.accountId) { %>
  48. <dd class="border-bottom p-2 mb-0 " data-id="<%- item.id %>" >
  49. <p class="mb-0 d-flex"><span class="text-primary"><%- item.name %></span><span
  50. class="ml-auto"><%- item.mobile %></span></p>
  51. <span class="text-muted"><%- item.role %></span>
  52. </dd>
  53. <% } %>
  54. <% });%>
  55. </div>
  56. <% }) %>
  57. </dl>
  58. </div>
  59. </div>
  60. <div class="card mt-3">
  61. <div class="card-header">
  62. 审批流程
  63. </div>
  64. <div class="modal-height-500" style="overflow: auto">
  65. <ul class="list-group list-group-flush" id="auditors">
  66. <% for (let i = 0, iLen = ctx.change.auditorList.length; i < iLen; i++) { %>
  67. <li class="list-group-item" auditorId="<%- ctx.change.auditorList[i].aid %>">
  68. <% if (ctx.session.sessionUser.accountId === ctx.change.uid && !ctx.tender.isTourist) { %>
  69. <a href="javascript: void(0)" class="text-danger pull-right">移除</a>
  70. <% } %>
  71. <span><%- ctx.change.auditorList[i].order %> <%- ctx.change.auditorList[i].name %></span>
  72. <small class="text-muted"><%- ctx.change.auditorList[i].role %></small>
  73. </li>
  74. <% } %>
  75. </ul>
  76. </div>
  77. </div>
  78. </div>
  79. <form class="modal-footer" method="post" action="<%- preUrl %>/audit/start" onsubmit="return checkAuditorFrom()">
  80. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  81. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>">
  82. <% if (ctx.session.sessionUser.accountId === ctx.change.uid) { %>
  83. <button class="btn btn-primary btn-sm" type="submit">确认上报</button>
  84. <% } %>
  85. </form>
  86. </div>
  87. </div>
  88. </div>
  89. <% if (ctx.change.status === auditConst.status.revise && (ctx.session.sessionUser.accountId === ctx.change.uid || ctx.session.sessionUser.is_admin)) { %>
  90. <!--撤销修订-->
  91. <div class="modal fade" id="sub-revoke" role="dialog" aria-labelledby="myModalLabel">
  92. <div class="modal-dialog" role="document">
  93. <form id="reviseForm" class="modal-content" method="post" action="/tender/<%- tender.id %>/change/project/cancel/revise" onsubmit="return false;">
  94. <div class="modal-header">
  95. <h5 class="modal-title" id="myModalLabel">撤销修订</h5>
  96. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  97. <span aria-hidden="true">&times;</span>
  98. </button>
  99. </div>
  100. <div class="modal-body">
  101. <h5>撤销修订,所有修改的数据将全部会被还原。</h5>
  102. <h5>确认撤销修订?</h5>
  103. </div>
  104. <div class="modal-footer">
  105. <input type="hidden" name="cpid" value="<%= ctx.change.id %>">
  106. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
  107. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  108. <button type="button" id="cancel-revise-btn" class="btn btn-primary btn-sm">确认</button>
  109. </div>
  110. </form>
  111. </div>
  112. </div>
  113. <% } %>
  114. <% } %>
  115. <!--审批流程/结果-->
  116. <div class="modal fade" id="sp-list" data-backdrop="static">
  117. <div class="modal-dialog modal-lg" role="document">
  118. <div class="modal-content">
  119. <div class="modal-header">
  120. <h5 class="modal-title"><%- ctx.change.status === auditConst.status.back || ctx.change.status === auditConst.status.revise ? '重新上报' : '审批流程' %></h5>
  121. </div>
  122. <div class="modal-body">
  123. <div class="row">
  124. <div class="col-4">
  125. <% if(ctx.change.status === auditConst.status.back || ctx.change.status === auditConst.status.revise) { %>
  126. <a class="sp-list-item" href="#sub-sp" data-toggle="modal" data-target="#sub-sp" id="hideSp">修改审批流程</a>
  127. <% } %>
  128. <div class="card mt-3">
  129. <ul class="list-group list-group-flush" id="auditors-list">
  130. <% ctx.change.auditors2.forEach((item, idx) => { %>
  131. <% if (idx === 0) { %>
  132. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  133. <i class="fa fa fa-play-circle fa-rotate-90"></i> <%- item.name %>
  134. <small class="text-muted"><%- item.role %></small>
  135. <span class="pull-right">原报</span>
  136. </li>
  137. <% } else if(idx === ctx.change.auditors2.length -1 && idx !== 0) { %>
  138. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  139. <i class="fa fa fa-stop-circle"></i> <%- item.name %>
  140. <small class="text-muted"><%- item.role %></small>
  141. <span class="pull-right">终审</span>
  142. </li>
  143. <% } else {%>
  144. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  145. <i class="fa fa-chevron-circle-down"></i> <%- item.name %>
  146. <small class="text-muted"><%- item.role %></small>
  147. <span class="pull-right"><%= ctx.helper.transFormToChinese(idx) %>审</span>
  148. </li>
  149. <% } %>
  150. <% }) %>
  151. </ul>
  152. </div>
  153. </div>
  154. <div class="col-8 modal-height-500" style="overflow: auto">
  155. <% ctx.change.auditHistory.forEach((auditors, idx) => { %>
  156. <!-- 展开/收起历史流程 -->
  157. <% if(idx === ctx.change.auditHistory.length - 1 && ctx.change.auditHistory.length !== 1) { %>
  158. <div class="text-right">
  159. <a href="javascript: void(0);" id="fold-btn" data-target="show">展开历史审批流程</a>
  160. </div>
  161. <% } %>
  162. <div class="<%- idx < ctx.change.auditHistory.length - 1 ? 'fold-card' : '' %>">
  163. <div class="text-center text-muted"><%- idx+1 %>#</div>
  164. <ul class="timeline-list list-unstyled mt-2">
  165. <% auditors.forEach((auditor, index) => { %>
  166. <% if (index === 0) { %>
  167. <li class="timeline-list-item pb-2">
  168. <div class="timeline-item-date">
  169. <%- ctx.helper.formatDate(auditor.begin_time) %>
  170. </div>
  171. <div class="timeline-item-tail"></div>
  172. <div class="timeline-item-icon bg-success text-light">
  173. <i class="fa fa-caret-down"></i>
  174. </div>
  175. <div class="timeline-item-content">
  176. <div class="card">
  177. <div class="card-body p-3">
  178. <div class="card-text">
  179. <p class="mb-1"><span
  180. class="h5"><%- ctx.change.user.name %></span><span
  181. class="pull-right text-success"><%- idx !== 0 ? '重新' : '' %>上报审批</span>
  182. </p>
  183. <p class="text-muted mb-0"><%- ctx.change.user.role %></p>
  184. </div>
  185. </div>
  186. </div>
  187. </div>
  188. </li>
  189. <li class="timeline-list-item pb-2">
  190. <div class="timeline-item-date">
  191. <%- ctx.helper.formatDate(auditor.end_time) %>
  192. </div>
  193. <% if(index < auditors.length - 1) { %>
  194. <div class="timeline-item-tail"></div>
  195. <% } %>
  196. <% if(auditor.status === auditConst.status.checked || auditor.status === auditConst.status.cancelRevise) { %>
  197. <div class="timeline-item-icon bg-success text-light">
  198. <i class="fa fa-check"></i>
  199. </div>
  200. <% } else if(auditor.status === auditConst.status.back || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
  201. <div class="timeline-item-icon bg-warning text-light">
  202. <i class="fa fa-level-up"></i>
  203. </div>
  204. <% } else if(auditor.status === auditConst.status.checking) { %>
  205. <div class="timeline-item-icon bg-warning text-light">
  206. <i class="fa fa-ellipsis-h"></i>
  207. </div>
  208. <% } else if(auditor.status === auditConst.status.checkNo) { %>
  209. <div class="timeline-item-icon bg-danger text-light">
  210. <i class="fa fa-stop"></i>
  211. </div>
  212. <% } else {%>
  213. <div class="timeline-item-icon bg-secondary text-light">
  214. </div>
  215. <% } %>
  216. <div class="timeline-item-content">
  217. <div class="card">
  218. <div class="card-body p-3">
  219. <div class="card-text">
  220. <p class="mb-1"><span class="h5"><%- auditor.name %></span><span
  221. class="pull-right <%- auditConst.auditStringClass[auditor.status] %>"><%- auditConst.auditString[auditor.status] %></span>
  222. </p>
  223. <p class="text-muted mb-0"><%- auditor.role %></p>
  224. </div>
  225. </div>
  226. <!--审批意见-->
  227. <% if (auditor.opinion) { %>
  228. <div class="card-body p-3 border-top">
  229. <p style="margin: 0;"><%- auditor.opinion %></p>
  230. </div>
  231. <% } %>
  232. </div>
  233. </div>
  234. </li>
  235. <% } else {%>
  236. <li class="timeline-list-item pb-2">
  237. <div class="timeline-item-date">
  238. <%- ctx.helper.formatDate(auditor.end_time) %>
  239. </div>
  240. <% if(index < auditors.length - 1) { %>
  241. <div class="timeline-item-tail"></div>
  242. <% } %>
  243. <% if(auditor.status === auditConst.status.checked || auditor.status === auditConst.status.cancelRevise) { %>
  244. <div class="timeline-item-icon bg-success text-light">
  245. <i class="fa fa-check"></i>
  246. </div>
  247. <% } else if(auditor.status === auditConst.status.back || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
  248. <div class="timeline-item-icon bg-warning text-light">
  249. <i class="fa fa-level-up"></i>
  250. </div>
  251. <% } else if(auditor.status === auditConst.status.checking) { %>
  252. <div class="timeline-item-icon bg-warning text-light">
  253. <i class="fa fa-ellipsis-h"></i>
  254. </div>
  255. <% } else if(auditor.status === auditConst.status.checkNo) { %>
  256. <div class="timeline-item-icon bg-danger text-light">
  257. <i class="fa fa-stop"></i>
  258. </div>
  259. <% } else { %>
  260. <div class="timeline-item-icon bg-secondary text-light">
  261. </div>
  262. <% } %>
  263. <div class="timeline-item-content">
  264. <div class="card">
  265. <div class="card-body p-3">
  266. <div class="card-text">
  267. <p class="mb-1"><span class="h5"><%- auditor.name %></span>
  268. <span
  269. class="pull-right
  270. <%- auditConst.auditStringClass[auditor.status] %>"><%- auditor.status !== auditConst.status.uncheck ? auditConst.auditString[auditor.status] : ''%>
  271. <%- auditor.status === auditConst.status.back ? ctx.change.user.name : '' %>
  272. </span>
  273. </p>
  274. <p class="text-muted mb-0"><%- auditor.role %></p>
  275. </div>
  276. </div>
  277. <!--审批意见-->
  278. <% if (auditor.opinion) { %>
  279. <div class="card-body p-3 border-top">
  280. <p style="margin: 0;"><%- auditor.opinion %></p>
  281. </div>
  282. <% } %>
  283. </div>
  284. </div>
  285. </li>
  286. <% } %>
  287. <% }) %>
  288. </ul>
  289. </div>
  290. <% }) %>
  291. </div>
  292. </div>
  293. </div>
  294. <form class="modal-footer" method="post" action="<%- preUrl %>/audit/start" onsubmit="return checkAuditorFrom()">
  295. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>">
  296. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  297. <% if((ctx.change.status === auditConst.status.back || ctx.change.status === auditConst.status.revise) && ctx.session.sessionUser.accountId === ctx.change.uid) { %>
  298. <button class="btn btn-primary btn-sm sp-list-item" type="submit">确认上报</button>
  299. <% } %>
  300. </form>
  301. </div>
  302. </div>
  303. </div>
  304. <% if (ctx.change.status === auditConst.status.checking) { %>
  305. <% if (ctx.change.curAuditor && ctx.change.curAuditor.aid === ctx.session.sessionUser.accountId) { %>
  306. <!--审批通过-->
  307. <div class="modal fade sp-location-list" id="sp-done" data-backdrop="static">
  308. <div class="modal-dialog modal-lg" role="document">
  309. <form class="modal-content" action="<%- preUrl %>/audit/check" method="post" onsubmit="return auditCheck(0);">
  310. <div class="modal-header">
  311. <h5 class="modal-title">审批通过</h5>
  312. </div>
  313. <div class="modal-body">
  314. <div class="row">
  315. <div class="col-4">
  316. <div class="card mt-3">
  317. <ul class="list-group list-group-flush">
  318. <% ctx.change.auditors2.forEach((item, idx) => { %>
  319. <% if (idx === 0) { %>
  320. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  321. <i class="fa fa fa-play-circle fa-rotate-90"></i> <%- item.name %>
  322. <small class="text-muted"><%- item.role %></small>
  323. <span class="pull-right">原报</span>
  324. </li>
  325. <% } else if(idx === ctx.change.auditors2.length -1 && idx !== 0) { %>
  326. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  327. <i class="fa fa fa-stop-circle"></i> <%- item.name %>
  328. <small class="text-muted"><%- item.role %></small>
  329. <span class="pull-right">终审</span>
  330. </li>
  331. <% } else {%>
  332. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  333. <i class="fa fa-chevron-circle-down"></i> <%- item.name %>
  334. <small class="text-muted"><%- item.role %></small>
  335. <span class="pull-right"><%= ctx.helper.transFormToChinese(idx) %>审</span>
  336. </li>
  337. <% } %>
  338. <% }) %>
  339. </ul>
  340. </div>
  341. </div>
  342. <div class="col-8 modal-height-500" style="overflow: auto">
  343. <% ctx.change.auditHistory.forEach((auditors, idx) => { %>
  344. <!-- 展开/收起历史流程 -->
  345. <% if(idx === ctx.change.auditHistory.length - 1 && ctx.change.auditHistory.length !== 1) { %>
  346. <div class="text-right">
  347. <a href="javascript: void(0);" id="fold-btn" data-target="show">展开历史审批流程</a>
  348. </div>
  349. <% } %>
  350. <div class="<%- idx < ctx.change.auditHistory.length - 1 ? 'fold-card' : '' %>">
  351. <div class="text-center text-muted"><%- idx+1 %>#</div>
  352. <ul class="timeline-list list-unstyled mt-2">
  353. <% auditors.forEach((auditor, index) => { %>
  354. <% if (index === 0) { %>
  355. <li class="timeline-list-item pb-2">
  356. <div class="timeline-item-date">
  357. <%- ctx.helper.formatDate(auditor.begin_time) %>
  358. </div>
  359. <div class="timeline-item-tail"></div>
  360. <div class="timeline-item-icon bg-success text-light">
  361. <i class="fa fa-caret-down"></i>
  362. </div>
  363. <div class="timeline-item-content">
  364. <div class="card">
  365. <div class="card-body p-3">
  366. <div class="card-text">
  367. <p class="mb-1"><span
  368. class="h5"><%- ctx.change.user.name %></span><span
  369. class="pull-right text-success"><%- idx !== 0 ? '重新' : '' %>上报审批</span>
  370. </p>
  371. <p class="text-muted mb-0"><%- ctx.change.user.role %></p>
  372. </div>
  373. </div>
  374. </div>
  375. </div>
  376. </li>
  377. <li class="timeline-list-item pb-2">
  378. <div class="timeline-item-date">
  379. <%- ctx.helper.formatDate(auditor.end_time) %>
  380. </div>
  381. <% if(index < auditors.length - 1) { %>
  382. <div class="timeline-item-tail"></div>
  383. <% } %>
  384. <% if(auditor.status === auditConst.status.checked || auditor.status === auditConst.status.cancelRevise) { %>
  385. <div class="timeline-item-icon bg-success text-light">
  386. <i class="fa fa-check"></i>
  387. </div>
  388. <% } else if(auditor.status === auditConst.status.back || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
  389. <div class="timeline-item-icon bg-warning text-light">
  390. <i class="fa fa-level-up"></i>
  391. </div>
  392. <% } else if(auditor.status === auditConst.status.checking) { %>
  393. <div class="timeline-item-icon bg-warning text-light">
  394. <i class="fa fa-ellipsis-h"></i>
  395. </div>
  396. <% } else if(auditor.status === auditConst.status.checkNo) { %>
  397. <div class="timeline-item-icon bg-danger text-light">
  398. <i class="fa fa-stop"></i>
  399. </div>
  400. <% } else {%>
  401. <div class="timeline-item-icon bg-secondary text-light">
  402. </div>
  403. <% } %>
  404. <div class="timeline-item-content">
  405. <div class="card">
  406. <div class="card-body p-3">
  407. <div class="card-text">
  408. <p class="mb-1"><span class="h5"><%- auditor.name %></span><span
  409. class="pull-right <%- auditConst.auditString[auditor.status] %>"><%- auditConst.auditString[auditor.status] %></span>
  410. </p>
  411. <p class="text-muted mb-0"><%- auditor.role %></p>
  412. </div>
  413. </div>
  414. <!--审批意见-->
  415. <% if(auditor.status !== auditConst.status.uncheck) { %>
  416. <% if (ctx.change.times === idx + 1 && auditor.status === auditConst.status.checking) { %>
  417. <div class="card-body p-3 border-top">
  418. <% if (ctx.change.times === idx + 1 && auditor.status === auditConst.status.checking) { %>
  419. <label>审批意见<b class="text-danger">*</b></label>
  420. <textarea class="form-control form-control-sm"
  421. name="opinion">同意</textarea>
  422. <% } %>
  423. </div>
  424. <% } else if (auditor.opinion) { %>
  425. <div class="card-body p-3 border-top">
  426. <p style="margin: 0;"><%- auditor.opinion %></p>
  427. </div>
  428. <% } %>
  429. <% } %>
  430. </div>
  431. </div>
  432. </li>
  433. <% } else {%>
  434. <li class="timeline-list-item pb-2">
  435. <div class="timeline-item-date">
  436. <%- ctx.helper.formatDate(auditor.end_time) %>
  437. </div>
  438. <% if(index < auditors.length - 1) { %>
  439. <div class="timeline-item-tail"></div>
  440. <% } %>
  441. <% if(auditor.status === auditConst.status.checked || auditor.status === auditConst.status.cancelRevise) { %>
  442. <div class="timeline-item-icon bg-success text-light">
  443. <i class="fa fa-check"></i>
  444. </div>
  445. <% } else if(auditor.status === auditConst.status.back || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
  446. <div class="timeline-item-icon bg-warning text-light">
  447. <i class="fa fa-level-up"></i>
  448. </div>
  449. <% } else if(auditor.status === auditConst.status.checking) { %>
  450. <div class="timeline-item-icon bg-warning text-light">
  451. <i class="fa fa-ellipsis-h"></i>
  452. </div>
  453. <% } else if(auditor.status === auditConst.status.checkNo) { %>
  454. <div class="timeline-item-icon bg-danger text-light">
  455. <i class="fa fa-stop"></i>
  456. </div>
  457. <% } else { %>
  458. <div class="timeline-item-icon bg-secondary text-light">
  459. </div>
  460. <% } %>
  461. <div class="timeline-item-content">
  462. <div class="card">
  463. <div class="card-body p-3">
  464. <div class="card-text">
  465. <p class="mb-1"><span class="h5"><%- auditor.name %></span>
  466. <span
  467. class="pull-right
  468. <%- auditConst.auditStringClass[auditor.status] %>"><%- auditor.status !== auditConst.status.uncheck ? auditConst.auditString[auditor.status] : ''%>
  469. <%- auditor.status === auditConst.status.back ? ctx.change.user.name : '' %>
  470. </span>
  471. </p>
  472. <p class="text-muted mb-0"><%- auditor.role %></p>
  473. </div>
  474. </div>
  475. <!--审批意见-->
  476. <% if(auditor.status !== auditConst.status.uncheck) { %>
  477. <% if (ctx.change.times === idx + 1 && auditor.status === auditConst.status.checking) { %>
  478. <div class="card-body p-3 border-top">
  479. <% if (ctx.change.times === idx + 1 && auditor.status === auditConst.status.checking) { %>
  480. <label>审批意见<b class="text-danger">*</b></label>
  481. <textarea class="form-control form-control-sm"
  482. name="opinion">同意</textarea>
  483. <% } %>
  484. </div>
  485. <% } else if (auditor.opinion) { %>
  486. <div class="card-body p-3 border-top">
  487. <p style="margin: 0;"><%- auditor.opinion %></p>
  488. </div>
  489. <% } %>
  490. <% } %>
  491. </div>
  492. </div>
  493. </li>
  494. <% } %>
  495. <% }) %>
  496. </ul>
  497. </div>
  498. <% }) %>
  499. </div>
  500. </div>
  501. </div>
  502. <div class="modal-footer">
  503. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  504. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
  505. <input type="hidden" name="checkType" value="<%= auditConst.status.checked %>" />
  506. <button type="submit" class="btn btn-success btn-sm">确认通过</button>
  507. </div>
  508. </form>
  509. </div>
  510. </div>
  511. <!--审批退回-->
  512. <div class="modal fade sp-location-list" id="sp-back" data-backdrop="static">
  513. <div class="modal-dialog modal-lg" role="document">
  514. <form class="modal-content modal-lg" action="<%- preUrl %>/audit/check" method="post"
  515. onsubmit="return auditCheck(1);">
  516. <div class="modal-header">
  517. <h5 class="modal-title">审批退回</h5>
  518. </div>
  519. <div class="modal-body">
  520. <div class="row">
  521. <div class="col-4">
  522. <div class="card mt-3">
  523. <ul class="list-group list-group-flush">
  524. <% ctx.change.auditors2.forEach((item, idx) => { %>
  525. <% if (idx === 0) { %>
  526. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  527. <i class="fa fa fa-play-circle fa-rotate-90"></i> <%- item.name %>
  528. <small class="text-muted"><%- item.role %></small>
  529. <span class="pull-right">原报</span>
  530. </li>
  531. <% } else if(idx === ctx.change.auditors2.length -1 && idx !== 0) { %>
  532. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  533. <i class="fa fa fa-stop-circle"></i> <%- item.name %>
  534. <small class="text-muted"><%- item.role %></small>
  535. <span class="pull-right">终审</span>
  536. </li>
  537. <% } else {%>
  538. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  539. <i class="fa fa-chevron-circle-down"></i> <%- item.name %>
  540. <small class="text-muted"><%- item.role %></small>
  541. <span class="pull-right"><%= ctx.helper.transFormToChinese(idx) %>审</span>
  542. </li>
  543. <% } %>
  544. <% }) %>
  545. </ul>
  546. </div>
  547. </div>
  548. <div class="col-8 modal-height-500" style="overflow: auto">
  549. <% ctx.change.auditHistory.forEach((auditors, idx) => { %>
  550. <!-- 展开/收起历史流程 -->
  551. <% if(idx === ctx.change.auditHistory.length - 1 && ctx.change.auditHistory.length !== 1) { %>
  552. <div class="text-right">
  553. <a href="javascript: void(0);" id="fold-btn" data-target="show">展开历史审批流程</a>
  554. </div>
  555. <% } %>
  556. <div class="<%- idx < ctx.change.auditHistory.length - 1 ? 'fold-card' : '' %>">
  557. <div class="text-center text-muted"><%- idx+1 %>#</div>
  558. <ul class="timeline-list list-unstyled mt-2">
  559. <% auditors.forEach((auditor, index) => { %>
  560. <% if (index === 0) { %>
  561. <li class="timeline-list-item pb-2">
  562. <div class="timeline-item-date">
  563. <%- ctx.helper.formatDate(auditor.begin_time) %>
  564. </div>
  565. <div class="timeline-item-tail"></div>
  566. <div class="timeline-item-icon bg-success text-light">
  567. <i class="fa fa-caret-down"></i>
  568. </div>
  569. <div class="timeline-item-content">
  570. <div class="card">
  571. <div class="card-body p-3">
  572. <div class="card-text">
  573. <p class="mb-1"><span
  574. class="h5"><%- ctx.change.user.name %></span><span
  575. class="pull-right text-success"><%- idx !== 0 ? '重新' : '' %>上报审批</span>
  576. </p>
  577. <p class="text-muted mb-0"><%- ctx.change.user.role %></p>
  578. </div>
  579. </div>
  580. </div>
  581. </div>
  582. </li>
  583. <li class="timeline-list-item pb-2">
  584. <div class="timeline-item-date">
  585. <%- ctx.helper.formatDate(auditor.end_time) %>
  586. </div>
  587. <% if(index < auditors.length - 1) { %>
  588. <div class="timeline-item-tail"></div>
  589. <% } %>
  590. <% if(auditor.status === auditConst.status.checked || auditor.status === auditConst.status.cancelRevise) { %>
  591. <div class="timeline-item-icon bg-success text-light">
  592. <i class="fa fa-check"></i>
  593. </div>
  594. <% } else if(auditor.status === auditConst.status.back || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
  595. <div class="timeline-item-icon bg-warning text-light">
  596. <i class="fa fa-level-up"></i>
  597. </div>
  598. <% } else if(auditor.status === auditConst.status.checking) { %>
  599. <div class="timeline-item-icon bg-warning text-light">
  600. <i class="fa fa-ellipsis-h"></i>
  601. </div>
  602. <% } else if(auditor.status === auditConst.status.checkNo) { %>
  603. <div class="timeline-item-icon bg-danger text-light">
  604. <i class="fa fa-stop"></i>
  605. </div>
  606. <% } else {%>
  607. <div class="timeline-item-icon bg-secondary text-light">
  608. </div>
  609. <% } %>
  610. <div class="timeline-item-content">
  611. <div class="card">
  612. <div class="card-body p-3">
  613. <div class="card-text">
  614. <p class="mb-1"><span class="h5"><%- auditor.name %></span><span
  615. class="pull-right <%- auditConst.auditStringClass[auditor.status] %>"><%- auditConst.auditString[auditor.status] %></span>
  616. </p>
  617. <p class="text-muted mb-0"><%- auditor.role %></p>
  618. </div>
  619. </div>
  620. <!--审批意见-->
  621. <% if(auditor.times === ctx.change.times && auditor.status !== auditConst.status.uncheck) { %>
  622. <% if (ctx.change.times === idx + 1 && auditor.status === auditConst.status.checking) { %>
  623. <div class="card-body p-3 border-top">
  624. <label>审批意见<b class="text-danger">*</b></label>
  625. <textarea class="form-control form-control-sm"
  626. name="opinion">不同意</textarea>
  627. <% if (ctx.change.curAuditor.aid === auditor.aid) { %>
  628. <div id="reject-process" class="alert alert-warning"
  629. style="margin-top: 15px;">
  630. <div class="form-check form-check-inline">
  631. <input class="form-check-input" type="radio" name="checkType"
  632. id="inlineRadio1" value="<%- auditConst.status.back %>" checked>
  633. <label class="form-check-label" for="inlineRadio1">退回原报
  634. <%- ctx.change.user.name %></label>
  635. </div>
  636. </div>
  637. <% } %>
  638. </div>
  639. <% } else if(auditor.opinion) { %>
  640. <div class="card-body p-3 border-top">
  641. <p style="margin: 0;"><%- auditor.opinion %></p>
  642. </div>
  643. <% } %>
  644. <% } %>
  645. </div>
  646. </div>
  647. </li>
  648. <% } else {%>
  649. <li class="timeline-list-item pb-2">
  650. <div class="timeline-item-date">
  651. <%- ctx.helper.formatDate(auditor.end_time) %>
  652. </div>
  653. <% if(index < auditors.length - 1) { %>
  654. <div class="timeline-item-tail"></div>
  655. <% } %>
  656. <% if(auditor.status === auditConst.status.checked || auditor.status === auditConst.status.cancelRevise) { %>
  657. <div class="timeline-item-icon bg-success text-light">
  658. <i class="fa fa-check"></i>
  659. </div>
  660. <% } else if(auditor.status === auditConst.status.back || auditor.status === auditConst.status.revise || auditor.status === auditConst.status.checkCancel) {%>
  661. <div class="timeline-item-icon bg-warning text-light">
  662. <i class="fa fa-level-up"></i>
  663. </div>
  664. <% } else if(auditor.status === auditConst.status.checking) { %>
  665. <div class="timeline-item-icon bg-warning text-light">
  666. <i class="fa fa-ellipsis-h"></i>
  667. </div>
  668. <% } else if(auditor.status === auditConst.status.checkNo) { %>
  669. <div class="timeline-item-icon bg-danger text-light">
  670. <i class="fa fa-stop"></i>
  671. </div>
  672. <% } else { %>
  673. <div class="timeline-item-icon bg-secondary text-light">
  674. </div>
  675. <% } %>
  676. <div class="timeline-item-content">
  677. <div class="card">
  678. <div class="card-body p-3">
  679. <div class="card-text">
  680. <p class="mb-1"><span class="h5"><%- auditor.name %></span>
  681. <span
  682. class="pull-right
  683. <%- auditConst.auditStringClass[auditor.status] %>"><%- auditor.status !== auditConst.status.uncheck ? auditConst.auditString[auditor.status] : ''%>
  684. <%- auditor.status === auditConst.status.back ? ctx.change.user.name : '' %>
  685. </span>
  686. </p>
  687. <p class="text-muted mb-0"><%- auditor.role %></p>
  688. </div>
  689. </div>
  690. <!--审批意见-->
  691. <% if(auditor.times === ctx.change.times && auditor.status !== auditConst.status.uncheck) { %>
  692. <% if (ctx.change.times === idx + 1 && auditor.status === auditConst.status.checking) { %>
  693. <div class="card-body p-3 border-top">
  694. <label>审批意见<b class="text-danger">*</b></label>
  695. <textarea class="form-control form-control-sm"
  696. name="opinion">不同意</textarea>
  697. <% if (ctx.change.curAuditor.aid === auditor.aid) { %>
  698. <div id="reject-process" class="alert alert-warning"
  699. style="margin-top: 15px;">
  700. <div class="form-check form-check-inline">
  701. <input class="form-check-input" type="radio" name="checkType"
  702. id="inlineRadio1" value="<%- auditConst.status.back %>" checked>
  703. <label class="form-check-label" for="inlineRadio1">退回原报
  704. <%- ctx.change.user.name %></label>
  705. </div>
  706. </div>
  707. <% } %>
  708. </div>
  709. <% } else if(auditor.opinion) { %>
  710. <div class="card-body p-3 border-top">
  711. <p style="margin: 0;"><%- auditor.opinion %></p>
  712. </div>
  713. <% } %>
  714. <% } %>
  715. </div>
  716. </div>
  717. </li>
  718. <% } %>
  719. <% }) %>
  720. </ul>
  721. </div>
  722. <% }) %>
  723. </div>
  724. </div>
  725. </div>
  726. <div class="modal-footer">
  727. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  728. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
  729. <button type="submit" class="btn btn-warning btn-sm">确认退回</button>
  730. </div>
  731. </form>
  732. </div>
  733. </div>
  734. <!-- 终止 -->
  735. <div class="modal fade" id="stop" data-backdrop="static">
  736. <div class="modal-dialog " role="document">
  737. <form class="modal-content" action="<%- preUrl %>/audit/check" method="post" onsubmit="return auditCheck(2);">
  738. <div class="modal-header">
  739. <h5 class="modal-title">终止</h5>
  740. </div>
  741. <div class="modal-body">
  742. <div class="form-group">
  743. <label>审批意见<b class="text-danger">*</b></label>
  744. <textarea class="form-control" name="opinion" placeholder="请填写审批意见"></textarea>
  745. </div>
  746. <label class="form-text alert alert-danger m-0">审批终止,将结束本次审批。</label>
  747. </div>
  748. <div class="modal-footer">
  749. <button type="button" class="btn btn-sm btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  750. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
  751. <input type="hidden" name="checkType" value="<%= auditConst.status.checkNo %>" />
  752. <button type="submit" class="btn btn-sm btn-danger btn-sm" >确认</button>
  753. </div>
  754. </form>
  755. </div>
  756. </div>
  757. <% } %>
  758. <% } %>
  759. <!--弹出添加协审-->
  760. <div class="modal fade" id="xieshen" data-backdrop="static">
  761. <div class="modal-dialog" role="document">
  762. <div class="modal-content">
  763. <div class="modal-header">
  764. <h5 class="modal-title">添加协审</h5>
  765. </div>
  766. <div class="modal-body modal-height">
  767. <div class="mb-3">协审账号可以查看本变更,上传附件。</div>
  768. <div>
  769. <div class="dropdown mb-3">
  770. <button class="btn btn-outline-primary btn-sm dropdown-toggle" type="button"
  771. id="dropdownMenuButton2" data-toggle="dropdown" aria-haspopup="true"
  772. aria-expanded="false">
  773. 选择协审人
  774. </button>
  775. <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuButton2"
  776. style="width:220px">
  777. <div class="mb-2 p-2"><input class="form-control form-control-sm"
  778. placeholder="姓名/手机 检索" id="gr-search2" autocomplete="off"></div>
  779. <dl class="list-unstyled book-list search-user-list2">
  780. <% accountGroup.forEach((group, idx) => { %>
  781. <dt><a href="javascript: void(0);" class="acc-btn" data-groupid="<%- idx %>" data-type="hide"><i class="fa fa-plus-square"></i></a> <%- group.groupName %></dt>
  782. <div class="dd-content" data-toggleid="<%- idx %>">
  783. <% group.groupList.forEach(item => { %>
  784. <dd class="border-bottom p-2 mb-0 " data-id="<%- item.id %>" >
  785. <p class="mb-0 d-flex"><span class="text-primary"><%- item.name %></span><span
  786. class="ml-auto"><%- item.mobile %></span></p>
  787. <span class="text-muted"><%- item.role %></span>
  788. </dd>
  789. <% });%>
  790. </div>
  791. <% }) %>
  792. </dl>
  793. </div>
  794. </div>
  795. <div class="modal-height-max100" style="overflow: visible" id="xs-list">
  796. <% for (const xs of change.xsAuditors) { %>
  797. <span class="d-inline-block">
  798. <span class="badge badge-light">
  799. <%- xs.name %>
  800. <% if (ctx.helper._.indexOf(ctx.helper._.map(change.auditors2, 'aid'), ctx.session.sessionUser.accountId) !== -1) { %>
  801. <span class="dropdown">
  802. <a href="javascript:void(0)" class="btn-sm text-danger px-1" title="移除" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-remove"></i></a>
  803. <div class="dropdown-menu">
  804. <a class="dropdown-item" href="javascript:void(0);">确认移除协审人?</a>
  805. <div class="dropdown-divider"></div>
  806. <div class="px-2 py-1 text-center">
  807. <button class="btn btn-sm btn-danger" aid="<%- xs.aid %>">移除</button>
  808. <button class="btn btn-sm btn-secondary">取消</button>
  809. </div>
  810. </div>
  811. </span>
  812. <% } %>
  813. </span>
  814. </span>
  815. <% } %>
  816. </div>
  817. </div>
  818. </div>
  819. <div class="modal-footer">
  820. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  821. </div>
  822. </div>
  823. </div>
  824. </div>
  825. <% if (ctx.change.status === auditConst.status.checked && ctx.session.sessionUser.accountId === ctx.change.uid) { %>
  826. <% if (!authMobile && ctx.session.sessionUser.loginStatus === 0) { %>
  827. <!--原报修订变更-->
  828. <div class="modal fade" id="sp-down-revise" data-backdrop="static">
  829. <div class="modal-dialog" role="document">
  830. <div class="modal-content">
  831. <div class="modal-header">
  832. <h5 class="modal-title">修订变更</h5>
  833. </div>
  834. <div class="modal-body">
  835. <h5>修订变更需要您的手机短信验证</h5>
  836. <h5>您目前还没设置认证手机,请先设置。</h5>
  837. </div>
  838. <div class="modal-footer">
  839. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  840. <a href="/profile/sms" class="btn btn-sm btn-primary">去设置</a>
  841. </div>
  842. </div>
  843. </div>
  844. </div>
  845. <% } else { %>
  846. <!--修订变更-->
  847. <div class="modal fade" id="sp-down-revise" data-backdrop="static">
  848. <div class="modal-dialog" role="document">
  849. <form id="reviseForm" class="modal-content" method="post" action="/tender/<%- tender.id %>/change/project/check/revise" onsubmit="return false;">
  850. <div class="modal-header">
  851. <h5 class="modal-title">修订变更</h5>
  852. </div>
  853. <div class="modal-body">
  854. <h5>确认需要修订变更「<%= change.code %>」?</h5>
  855. <% if (ctx.session.sessionUser.loginStatus === 0) { %>
  856. <div class="form-group">
  857. <label>修订需要验证码确认,验证码将发送至尾号<%- authMobile.slice(-4) %>的手机</label>
  858. <div class="input-group input-group-sm mb-3">
  859. <input class="form-control" type="text" readonly="readonly" name="code" placeholder="输入短信中的6位验证码" />
  860. <div class="input-group-append">
  861. <button class="btn btn-outline-secondary" type="button" id="get-code">获取验证码</button>
  862. </div>
  863. </div>
  864. </div>
  865. <% } %>
  866. </div>
  867. <div class="modal-footer">
  868. <input type="hidden" name="cpid" value="<%= ctx.change.id %>">
  869. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
  870. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  871. <button type="button" id="re-shenpi-btn2" class="btn btn-warning btn-sm" <% if (ctx.session.sessionUser.loginStatus === 0) { %>disabled<% } %>>确定修订</button>
  872. </div>
  873. </form>
  874. </div>
  875. </div>
  876. <% } %>
  877. <% } %>
  878. <% if (ctx.change.cancancel) { %>
  879. <div class="modal fade" id="sp-down-cancel" data-backdrop="static">
  880. <div class="modal-dialog" role="document">
  881. <div class="modal-content">
  882. <div class="modal-header">
  883. <h5 class="modal-title">撤回</h5>
  884. </div>
  885. <div class="modal-body">
  886. <h5>撤回后将回退到你的操作状态,确定撤回?</h5>
  887. </div>
  888. <div class="modal-footer">
  889. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">取消</button>
  890. <button type="submit" class="btn btn-danger btn-sm" id="cancel-shenpi-btn">确定撤回</button>
  891. </div>
  892. </div>
  893. </div>
  894. </div>
  895. <% } %>
  896. <script>
  897. const accountGroup = JSON.parse(unescape('<%- escape(JSON.stringify(accountGroup)) %>'));
  898. const accountList = JSON.parse(unescape('<%- escape(JSON.stringify(accountList)) %>'));
  899. const cur_uid = parseInt('<%- ctx.session.sessionUser.accountId %>');
  900. const csrf = '<%= ctx.csrf %>';
  901. $('.sp-location-list').on('shown.bs.modal', function () {
  902. const scrollBox = $(this).find('div[class="col-8 modal-height-500"]');
  903. const bdiv = (scrollBox.offset() && scrollBox.offset().top) || 0;
  904. scrollBox.scrollTop(0);
  905. const hdiv = divSearch($(this).find('textarea')) ? $(this).find('textarea') : null;
  906. const hdheight = hdiv ? hdiv.parents('.timeline-item-content').offset().top : null;
  907. if (hdiv && scrollBox.length && scrollBox[0].scrollHeight > 200 && hdheight - bdiv > 200) {
  908. scrollBox.scrollTop(hdheight - bdiv);
  909. }
  910. });
  911. function divSearch(div) {
  912. if (div.length > 0) {
  913. return true;
  914. }
  915. return false;
  916. }
  917. // 展开历史审核记录
  918. $('.modal-body #fold-btn').click(function () {
  919. const type = $(this).data('target')
  920. const auditCard = $(this).parent().parent()
  921. if (type === 'show') {
  922. $(this).data('target', 'hide')
  923. auditCard.find('.fold-card').slideDown('swing', () => {
  924. auditCard.find('#fold-btn').text('收起历史审核记录')
  925. })
  926. } else {
  927. $(this).data('target', 'show')
  928. auditCard.find('.fold-card').slideUp('swing', () => {
  929. auditCard.find('#fold-btn').text('展开历史审核记录')
  930. })
  931. }
  932. });
  933. $('.sp-list-btn').click(function () {
  934. const type = $(this).data('type')
  935. if (type === 'hide') {
  936. $('.sp-list-item').hide()
  937. $('.modal-title').text('审批流程')
  938. } else {
  939. $('.sp-list-item').show()
  940. $('.modal-title').text('重新上报')
  941. }
  942. });
  943. $('#re-shenpi-btn2').click(function () {
  944. const data = {
  945. cpid: parseInt('<%- ctx.change.id %>'),
  946. };
  947. <% if (ctx.session.sessionUser.loginStatus === 0) { %>
  948. const code = $("#reviseForm input[name='code']").val();
  949. if ($(this).hasClass('disabled')) {
  950. return false;
  951. }
  952. if (code.length < 6) {
  953. // alert('请填写正确的验证码');
  954. toast('请填写正确的验证码', 'error');
  955. return false;
  956. }
  957. data.code = code;
  958. <% } %>
  959. $.ajax({
  960. url: '/tender/<%- tender.id %>/change/project/check/revise?_csrf_j=' + csrf,
  961. type: 'post',
  962. data: data,
  963. dataTye: 'json',
  964. success: function(response) {
  965. if (response.err === 0) {
  966. window.location.href = response.url;
  967. } else {
  968. toastr.error(response.msg);
  969. }
  970. }
  971. });
  972. })
  973. $('#cancel-revise-btn').click(function () {
  974. const data = {
  975. cpid: parseInt('<%- ctx.change.id %>'),
  976. };
  977. $.ajax({
  978. url: '/tender/<%- tender.id %>/change/project/cancel/revise?_csrf_j=' + csrf,
  979. type: 'post',
  980. data: data,
  981. dataTye: 'json',
  982. success: function(response) {
  983. if (response.err === 0) {
  984. window.location.href = response.url;
  985. } else {
  986. toastr.error(response.msg);
  987. }
  988. }
  989. });
  990. })
  991. <% if (ctx.change && ctx.change.cancancel) { %>
  992. $("#cancel-shenpi-btn").click(function () {
  993. const data = {
  994. cpid: parseInt('<%- ctx.change.id %>'),
  995. };
  996. $.ajax({
  997. url: '/tender/<%- tender.id %>/change/project/cancel/audit?_csrf_j=' + csrf,
  998. type: 'post',
  999. data: data,
  1000. dataTye: 'json',
  1001. success: function (response) {
  1002. if (response.err === 0) {
  1003. window.location.href = response.url;
  1004. } else {
  1005. toastr.error(response.msg);
  1006. }
  1007. }
  1008. });
  1009. });
  1010. <% } %>
  1011. </script>