audit_modal.ejs 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864
  1. <% if ((ctx.detail.status === auditConst.status.uncheck || ctx.detail.status === auditConst.status.checkNo) && ctx.session.sessionUser.accountId === ctx.detail.uid) { %>
  2. <!--上报审批-->
  3. <div class="modal fade" id="sub-sp" data-backdrop="static">
  4. <div class="modal-dialog modal-lg" role="document">
  5. <div class="modal-content">
  6. <div class="modal-header">
  7. <h5 class="modal-title">上报审批</h5>
  8. </div>
  9. <div class="modal-body">
  10. <div class="row">
  11. <% if (trInfo.type !== paymentConst.modes_value_object.safe) { %>
  12. <div class="col-5">
  13. <% if (trInfo.sp_status !== shenpiConst.sp_status.gdspl && ctx.session.sessionUser.accountId === ctx.detail.uid) { %>
  14. <div class="dropdown text-right pt-1">&nbsp;</div>
  15. <% } %>
  16. <div class="card mt-3">
  17. <div class="card-header">
  18. 报表表单角色
  19. </div>
  20. <ul class="list-group list-group-flush">
  21. <% for (const [index, ra] of ctx.detail.rptAudits.entries()) { %>
  22. <li class="list-group-item">
  23. <div class="row">
  24. <span class="col-2"><%- index+1 %></span>
  25. <span class="col-6"><%- ra.signature_name %></span>
  26. <span class="col-4"><%- ra.user_name %></span>
  27. </div>
  28. </li>
  29. <% } %>
  30. </ul>
  31. </div>
  32. </div>
  33. <% } %>
  34. <div class="col" style="overflow: auto">
  35. <div class="dropdown text-right">
  36. <% if (trInfo.sp_status !== shenpiConst.sp_status.gdspl && ctx.session.sessionUser.accountId === ctx.detail.uid) { %>
  37. <% if (trInfo.type !== paymentConst.modes_value_object.safe) { %>
  38. <button class="btn btn-sm btn-primary mr-2" id="follow_rpt_audit_btn">同步表单角色</button>
  39. <% } %>
  40. <button class="btn btn-outline-primary btn-sm dropdown-toggle" type="button"
  41. id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true"
  42. aria-expanded="false">
  43. 添加审批流程
  44. </button>
  45. <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuButton"
  46. style="width:220px">
  47. <div class="mb-2 p-2"><input class="form-control form-control-sm"
  48. placeholder="姓名/手机 检索" id="gr-search" autocomplete="off"></div>
  49. <dl class="list-unstyled book-list">
  50. <% accountGroup.forEach((group, idx) => { %>
  51. <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>
  52. <div class="dd-content" data-toggleid="<%- idx %>">
  53. <% group.groupList.forEach(item => { %>
  54. <% if (item.id !== ctx.session.sessionUser.accountId) { %>
  55. <dd class="border-bottom p-2 mb-0 " data-id="<%- item.id %>" >
  56. <p class="mb-0 d-flex"><span class="text-primary"><%- item.name %></span> <% if (ctx.helper._.findIndex(ctx.detail.rptAudits, { uid: item.id }) !== -1) { %>&nbsp;(<%- ctx.helper._.find(ctx.detail.rptAudits, { uid: item.id }).signature_name %>)<% } %><span
  57. class="ml-auto"><%- item.mobile %></span></p>
  58. <span class="text-muted"><%- item.role %></span>
  59. </dd>
  60. <% } %>
  61. <% });%>
  62. </div>
  63. <% }) %>
  64. </dl>
  65. </div>
  66. <% } %>
  67. </div>
  68. <div class="card mt-3">
  69. <div class="card-header">
  70. 审批流程
  71. </div>
  72. <div class="modal-height-500" style="overflow: auto">
  73. <ul class="list-group list-group-flush" id="auditors">
  74. <% for (let i = 0, iLen = ctx.detail.auditorList.length; i < iLen; i++) { %>
  75. <li class="list-group-item" auditorId="<%- ctx.detail.auditorList[i].aid %>">
  76. <% if ((trInfo.sp_status === shenpiConst.sp_status.sqspr ||
  77. (trInfo.sp_status === shenpiConst.sp_status.gdzs && i+1 !== iLen)) && ctx.session.sessionUser.accountId === ctx.detail.uid) { %>
  78. <a href="javascript: void(0)" class="text-danger pull-right">移除</a>
  79. <% } %>
  80. <span><%- ctx.detail.auditorList[i].order %> <%- ctx.detail.auditorList[i].name %></span>
  81. <% if (ctx.helper._.findIndex(ctx.detail.rptAudits, { uid: ctx.detail.auditorList[i].aid }) !== -1) { %>&nbsp;(<%- ctx.helper._.find(ctx.detail.rptAudits, { uid: ctx.detail.auditorList[i].aid }).signature_name %>)<% } %>
  82. <small class="text-muted"><%- ctx.detail.auditorList[i].role %></small>
  83. </li>
  84. <% } %>
  85. </ul>
  86. </div>
  87. </div>
  88. </div>
  89. </div>
  90. </div>
  91. <form class="modal-footer" method="post" action="<%- preUrl %>/audit/start" onsubmit="return checkAuditorFrom()">
  92. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  93. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>">
  94. <% if (ctx.session.sessionUser.accountId === ctx.detail.uid) { %>
  95. <button class="btn btn-primary btn-sm" type="submit">确认上报</button>
  96. <% } %>
  97. </form>
  98. </div>
  99. </div>
  100. </div>
  101. <% } %>
  102. <!--审批流程/结果-->
  103. <div class="modal fade" id="sp-list" data-backdrop="static">
  104. <div class="modal-dialog modal-lg" role="document">
  105. <div class="modal-content">
  106. <div class="modal-header">
  107. <h5 class="modal-title"><%- ctx.detail.status === auditConst.status.checking ? '审批流程' : '重新上报' %></h5>
  108. </div>
  109. <div class="modal-body">
  110. <div class="row">
  111. <div class="col-4">
  112. <% if(ctx.detail.status === auditConst.status.checkNo) { %>
  113. <a class="sp-list-item" href="#sub-sp" data-toggle="modal" data-target="#sub-sp" id="hideSp">修改审批流程</a>
  114. <% } %>
  115. <div class="card mt-3">
  116. <ul class="list-group list-group-flush" id="auditors-list">
  117. <% ctx.detail.auditors2.forEach((item, idx) => { %>
  118. <% if (idx === 0) { %>
  119. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  120. <i class="fa fa fa-play-circle fa-rotate-90"></i> <%- item.name %>
  121. <small class="text-muted"><%- item.role %></small>
  122. <span class="pull-right">原报</span>
  123. </li>
  124. <% } else if(idx === ctx.detail.auditors2.length -1 && idx !== 0) { %>
  125. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  126. <i class="fa fa fa-stop-circle"></i> <%- item.name %>
  127. <small class="text-muted"><%- item.role %></small>
  128. <span class="pull-right">终审</span>
  129. </li>
  130. <% } else {%>
  131. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  132. <i class="fa fa-chevron-circle-down"></i> <%- item.name %>
  133. <small class="text-muted"><%- item.role %></small>
  134. <span class="pull-right"><%= ctx.helper.transFormToChinese(idx) %>审</span>
  135. </li>
  136. <% } %>
  137. <% }) %>
  138. </ul>
  139. </div>
  140. </div>
  141. <div class="col-8 modal-height-500" style="overflow: auto">
  142. <% ctx.detail.auditHistory.forEach((auditors, idx) => { %>
  143. <!-- 展开/收起历史流程 -->
  144. <% if(idx === ctx.detail.auditHistory.length - 1 && ctx.detail.auditHistory.length !== 1) { %>
  145. <div class="text-right">
  146. <a href="javascript: void(0);" id="fold-btn" data-target="show">展开历史审批流程</a>
  147. </div>
  148. <% } %>
  149. <div class="<%- idx < ctx.detail.auditHistory.length - 1 ? 'fold-card' : '' %>">
  150. <div class="text-center text-muted"><%- idx+1 %>#</div>
  151. <ul class="timeline-list list-unstyled mt-2">
  152. <% auditors.forEach((auditor, index) => { %>
  153. <% if (index === 0) { %>
  154. <li class="timeline-list-item pb-2">
  155. <div class="timeline-item-date">
  156. <%- ctx.helper.formatDate(auditor.begin_time) %>
  157. </div>
  158. <div class="timeline-item-tail"></div>
  159. <div class="timeline-item-icon bg-success text-light">
  160. <i class="fa fa-caret-down"></i>
  161. </div>
  162. <div class="timeline-item-content">
  163. <div class="card">
  164. <div class="card-body p-3">
  165. <div class="card-text">
  166. <p class="mb-1"><span
  167. class="h5"><%- ctx.detail.user.name %></span><span
  168. class="pull-right text-success"><%- idx !== 0 ? '重新' : '' %>上报审批</span>
  169. </p>
  170. <p class="text-muted mb-0"><%- ctx.detail.user.role %></p>
  171. </div>
  172. </div>
  173. </div>
  174. </div>
  175. </li>
  176. <li class="timeline-list-item pb-2">
  177. <div class="timeline-item-date">
  178. <%- ctx.helper.formatDate(auditor.end_time) %>
  179. </div>
  180. <% if(index < auditors.length - 1) { %>
  181. <div class="timeline-item-tail"></div>
  182. <% } %>
  183. <% if(auditor.status === auditConst.status.checked) { %>
  184. <div class="timeline-item-icon bg-success text-light">
  185. <i class="fa fa-check"></i>
  186. </div>
  187. <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.checkNoPre) {%>
  188. <div class="timeline-item-icon bg-warning text-light">
  189. <i class="fa fa-level-up"></i>
  190. </div>
  191. <% } else if(auditor.status === auditConst.status.checking) { %>
  192. <div class="timeline-item-icon bg-warning text-light">
  193. <i class="fa fa-ellipsis-h"></i>
  194. </div>
  195. <% } else {%>
  196. <div class="timeline-item-icon bg-secondary text-light">
  197. </div>
  198. <% } %>
  199. <div class="timeline-item-content">
  200. <div class="card">
  201. <div class="card-body p-3">
  202. <div class="card-text">
  203. <p class="mb-1"><span class="h5"><%- auditor.name %></span><span
  204. class="pull-right <%- auditConst.statusClass[auditor.status] %>"><%- auditConst.statusString[auditor.status] %></span>
  205. </p>
  206. <p class="text-muted mb-0"><%- auditor.role %></p>
  207. </div>
  208. </div>
  209. <!--审批意见-->
  210. <% if (auditor.opinion) { %>
  211. <div class="card-body p-3 border-top">
  212. <p style="margin: 0;"><%- auditor.opinion %></p>
  213. </div>
  214. <% } %>
  215. </div>
  216. </div>
  217. </li>
  218. <% } else {%>
  219. <li class="timeline-list-item pb-2">
  220. <div class="timeline-item-date">
  221. <%- ctx.helper.formatDate(auditor.end_time) %>
  222. </div>
  223. <% if(index < auditors.length - 1) { %>
  224. <div class="timeline-item-tail"></div>
  225. <% } %>
  226. <% if(auditor.status === auditConst.status.checked) { %>
  227. <div class="timeline-item-icon bg-success text-light">
  228. <i class="fa fa-check"></i>
  229. </div>
  230. <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.checkNoPre) {%>
  231. <div class="timeline-item-icon bg-warning text-light">
  232. <i class="fa fa-level-up"></i>
  233. </div>
  234. <% } else if(auditor.status === auditConst.status.checking) { %>
  235. <div class="timeline-item-icon bg-warning text-light">
  236. <i class="fa fa-ellipsis-h"></i>
  237. </div>
  238. <% } else { %>
  239. <div class="timeline-item-icon bg-secondary text-light">
  240. </div>
  241. <% } %>
  242. <div class="timeline-item-content">
  243. <div class="card">
  244. <div class="card-body p-3">
  245. <div class="card-text">
  246. <p class="mb-1"><span class="h5"><%- auditor.name %></span>
  247. <span
  248. class="pull-right
  249. <%- auditConst.statusClass[auditor.status] %>"><%- auditor.status !== auditConst.status.uncheck ? auditConst.statusString[auditor.status] : ''%>
  250. <%- auditor.status === auditConst.status.checkNo ? ctx.detail.user.name : '' %>
  251. <%- auditor.status === auditConst.status.checkNoPre ? auditors.find(item => item.sort === auditor.sort-1).name : '' %>
  252. </span>
  253. </p>
  254. <p class="text-muted mb-0"><%- auditor.role %></p>
  255. </div>
  256. </div>
  257. <!--审批意见-->
  258. <% if (auditor.opinion) { %>
  259. <div class="card-body p-3 border-top">
  260. <p style="margin: 0;"><%- auditor.opinion %></p>
  261. </div>
  262. <% } %>
  263. </div>
  264. </div>
  265. </li>
  266. <% } %>
  267. <% }) %>
  268. </ul>
  269. </div>
  270. <% }) %>
  271. </div>
  272. </div>
  273. </div>
  274. <form class="modal-footer" method="post" action="<%- preUrl %>/audit/start" onsubmit="return checkAuditorFrom()">
  275. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>">
  276. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  277. <% if(ctx.detail.status === auditConst.status.checkNo && ctx.session.sessionUser.accountId === ctx.detail.uid) { %>
  278. <button class="btn btn-primary btn-sm sp-list-item" type="submit">确认上报</button>
  279. <% } %>
  280. </form>
  281. </div>
  282. </div>
  283. </div>
  284. <% if (ctx.detail.status === auditConst.status.checking || ctx.detail.status === auditConst.status.checkNoPre) { %>
  285. <% if (ctx.detail.curAuditor && ctx.detail.curAuditor.aid === ctx.session.sessionUser.accountId) { %>
  286. <!--审批通过-->
  287. <div class="modal fade sp-location-list" id="sp-done" data-backdrop="static">
  288. <div class="modal-dialog modal-lg" role="document">
  289. <form class="modal-content" action="<%- preUrl %>/audit/check" method="post" onsubmit="return auditCheck(0);">
  290. <div class="modal-header">
  291. <h5 class="modal-title">审批通过</h5>
  292. </div>
  293. <div class="modal-body">
  294. <div class="row">
  295. <div class="col-4">
  296. <div class="card mt-3">
  297. <ul class="list-group list-group-flush">
  298. <% ctx.detail.auditors2.forEach((item, idx) => { %>
  299. <% if (idx === 0) { %>
  300. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  301. <i class="fa fa fa-play-circle fa-rotate-90"></i> <%- item.name %>
  302. <small class="text-muted"><%- item.role %></small>
  303. <span class="pull-right">原报</span>
  304. </li>
  305. <% } else if(idx === ctx.detail.auditors2.length -1 && idx !== 0) { %>
  306. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  307. <i class="fa fa fa-stop-circle"></i> <%- item.name %>
  308. <small class="text-muted"><%- item.role %></small>
  309. <span class="pull-right">终审</span>
  310. </li>
  311. <% } else {%>
  312. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  313. <i class="fa fa-chevron-circle-down"></i> <%- item.name %>
  314. <small class="text-muted"><%- item.role %></small>
  315. <span class="pull-right"><%= ctx.helper.transFormToChinese(idx) %>审</span>
  316. </li>
  317. <% } %>
  318. <% }) %>
  319. </ul>
  320. </div>
  321. </div>
  322. <div class="col-8 modal-height-500" style="overflow: auto">
  323. <% ctx.detail.auditHistory.forEach((auditors, idx) => { %>
  324. <!-- 展开/收起历史流程 -->
  325. <% if(idx === ctx.detail.auditHistory.length - 1 && ctx.detail.auditHistory.length !== 1) { %>
  326. <div class="text-right">
  327. <a href="javascript: void(0);" id="fold-btn" data-target="show">展开历史审批流程</a>
  328. </div>
  329. <% } %>
  330. <div class="<%- idx < ctx.detail.auditHistory.length - 1 ? 'fold-card' : '' %>">
  331. <div class="text-center text-muted"><%- idx+1 %>#</div>
  332. <ul class="timeline-list list-unstyled mt-2">
  333. <% auditors.forEach((auditor, index) => { %>
  334. <% if (index === 0) { %>
  335. <li class="timeline-list-item pb-2">
  336. <div class="timeline-item-date">
  337. <%- ctx.helper.formatDate(auditor.begin_time) %>
  338. </div>
  339. <div class="timeline-item-tail"></div>
  340. <div class="timeline-item-icon bg-success text-light">
  341. <i class="fa fa-caret-down"></i>
  342. </div>
  343. <div class="timeline-item-content">
  344. <div class="card">
  345. <div class="card-body p-3">
  346. <div class="card-text">
  347. <p class="mb-1"><span
  348. class="h5"><%- ctx.detail.user.name %></span><span
  349. class="pull-right text-success"><%- idx !== 0 ? '重新' : '' %>上报审批</span>
  350. </p>
  351. <p class="text-muted mb-0"><%- ctx.detail.user.role %></p>
  352. </div>
  353. </div>
  354. </div>
  355. </div>
  356. </li>
  357. <li class="timeline-list-item pb-2">
  358. <div class="timeline-item-date">
  359. <%- ctx.helper.formatDate(auditor.end_time) %>
  360. </div>
  361. <% if(index < auditors.length - 1) { %>
  362. <div class="timeline-item-tail"></div>
  363. <% } %>
  364. <% if(auditor.status === auditConst.status.checked) { %>
  365. <div class="timeline-item-icon bg-success text-light">
  366. <i class="fa fa-check"></i>
  367. </div>
  368. <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.checkNoPre) {%>
  369. <div class="timeline-item-icon bg-warning text-light">
  370. <i class="fa fa-level-up"></i>
  371. </div>
  372. <% } else if(auditor.status === auditConst.status.checking) { %>
  373. <div class="timeline-item-icon bg-warning text-light">
  374. <i class="fa fa-ellipsis-h"></i>
  375. </div>
  376. <% } else {%>
  377. <div class="timeline-item-icon bg-secondary text-light">
  378. </div>
  379. <% } %>
  380. <div class="timeline-item-content">
  381. <div class="card">
  382. <div class="card-body p-3">
  383. <div class="card-text">
  384. <p class="mb-1"><span class="h5"><%- auditor.name %></span><span
  385. class="pull-right <%- auditConst.statusClass[auditor.status] %>"><%- auditConst.statusString[auditor.status] %></span>
  386. </p>
  387. <p class="text-muted mb-0"><%- auditor.role %></p>
  388. </div>
  389. </div>
  390. <!--审批意见-->
  391. <% if(auditor.status !== auditConst.status.uncheck) { %>
  392. <% if (ctx.detail.times === idx + 1 && auditor.status === auditConst.status.checking) { %>
  393. <div class="card-body p-3 border-top">
  394. <label>审批意见<b class="text-danger">*</b></label>
  395. <textarea class="form-control form-control-sm"
  396. name="opinion">同意</textarea>
  397. </div>
  398. <% } else if (auditor.opinion) { %>
  399. <div class="card-body p-3 border-top">
  400. <p style="margin: 0;"><%- auditor.opinion %></p>
  401. </div>
  402. <% } %>
  403. <% } %>
  404. </div>
  405. </div>
  406. </li>
  407. <% } else {%>
  408. <li class="timeline-list-item pb-2">
  409. <div class="timeline-item-date">
  410. <%- ctx.helper.formatDate(auditor.end_time) %>
  411. </div>
  412. <% if(index < auditors.length - 1) { %>
  413. <div class="timeline-item-tail"></div>
  414. <% } %>
  415. <% if(auditor.status === auditConst.status.checked) { %>
  416. <div class="timeline-item-icon bg-success text-light">
  417. <i class="fa fa-check"></i>
  418. </div>
  419. <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.checkNoPre) {%>
  420. <div class="timeline-item-icon bg-warning text-light">
  421. <i class="fa fa-level-up"></i>
  422. </div>
  423. <% } else if(auditor.status === auditConst.status.checking) { %>
  424. <div class="timeline-item-icon bg-warning text-light">
  425. <i class="fa fa-ellipsis-h"></i>
  426. </div>
  427. <% } else { %>
  428. <div class="timeline-item-icon bg-secondary text-light">
  429. </div>
  430. <% } %>
  431. <div class="timeline-item-content">
  432. <div class="card">
  433. <div class="card-body p-3">
  434. <div class="card-text">
  435. <p class="mb-1"><span class="h5"><%- auditor.name %></span>
  436. <span
  437. class="pull-right
  438. <%- auditConst.statusClass[auditor.status] %>"><%- auditor.status !== auditConst.status.uncheck ? auditConst.statusString[auditor.status] : ''%>
  439. <%- auditor.status === auditConst.status.checkNo ? ctx.detail.user.name : '' %>
  440. <%- auditor.status === auditConst.status.checkNoPre ? auditors.find(item => item.sort === auditor.sort-1).name : '' %>
  441. </span>
  442. </p>
  443. <p class="text-muted mb-0"><%- auditor.role %></p>
  444. </div>
  445. </div>
  446. <!--审批意见-->
  447. <% if(auditor.status !== auditConst.status.uncheck) { %>
  448. <% if (ctx.detail.times === idx + 1 && auditor.status === auditConst.status.checking) { %>
  449. <div class="card-body p-3 border-top">
  450. <label>审批意见<b class="text-danger">*</b></label>
  451. <textarea class="form-control form-control-sm"
  452. name="opinion">同意</textarea>
  453. </div>
  454. <% } else if (auditor.opinion) { %>
  455. <div class="card-body p-3 border-top">
  456. <p style="margin: 0;"><%- auditor.opinion %></p>
  457. </div>
  458. <% } %>
  459. <% } %>
  460. </div>
  461. </div>
  462. </li>
  463. <% } %>
  464. <% }) %>
  465. </ul>
  466. </div>
  467. <% }) %>
  468. </div>
  469. </div>
  470. </div>
  471. <div class="modal-footer">
  472. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  473. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
  474. <input type="hidden" name="checkType" value="<%= auditConst.status.checked %>" />
  475. <button type="submit" class="btn btn-success btn-sm">确认通过</button>
  476. </div>
  477. </form>
  478. </div>
  479. </div>
  480. <!--审批退回-->
  481. <div class="modal fade sp-location-list" id="sp-back" data-backdrop="static">
  482. <div class="modal-dialog modal-lg" role="document">
  483. <form class="modal-content modal-lg" action="<%- preUrl %>/audit/check" method="post"
  484. onsubmit="return auditCheck(1);">
  485. <div class="modal-header">
  486. <h5 class="modal-title">审批退回</h5>
  487. </div>
  488. <div class="modal-body">
  489. <div class="row">
  490. <div class="col-4">
  491. <div class="card mt-3">
  492. <ul class="list-group list-group-flush">
  493. <% ctx.detail.auditors2.forEach((item, idx) => { %>
  494. <% if (idx === 0) { %>
  495. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  496. <i class="fa fa fa-play-circle fa-rotate-90"></i> <%- item.name %>
  497. <small class="text-muted"><%- item.role %></small>
  498. <span class="pull-right">原报</span>
  499. </li>
  500. <% } else if(idx === ctx.detail.auditors2.length -1 && idx !== 0) { %>
  501. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  502. <i class="fa fa fa-stop-circle"></i> <%- item.name %>
  503. <small class="text-muted"><%- item.role %></small>
  504. <span class="pull-right">终审</span>
  505. </li>
  506. <% } else {%>
  507. <li class="list-group-item" data-auditorId="<%- item.aid %>">
  508. <i class="fa fa-chevron-circle-down"></i> <%- item.name %>
  509. <small class="text-muted"><%- item.role %></small>
  510. <span class="pull-right"><%= ctx.helper.transFormToChinese(idx) %>审</span>
  511. </li>
  512. <% } %>
  513. <% }) %>
  514. </ul>
  515. </div>
  516. </div>
  517. <div class="col-8 modal-height-500" style="overflow: auto">
  518. <% ctx.detail.auditHistory.forEach((auditors, idx) => { %>
  519. <!-- 展开/收起历史流程 -->
  520. <% if(idx === ctx.detail.auditHistory.length - 1 && ctx.detail.auditHistory.length !== 1) { %>
  521. <div class="text-right">
  522. <a href="javascript: void(0);" id="fold-btn" data-target="show">展开历史审批流程</a>
  523. </div>
  524. <% } %>
  525. <div class="<%- idx < ctx.detail.auditHistory.length - 1 ? 'fold-card' : '' %>">
  526. <div class="text-center text-muted"><%- idx+1 %>#</div>
  527. <ul class="timeline-list list-unstyled mt-2">
  528. <% auditors.forEach((auditor, index) => { %>
  529. <% if (index === 0) { %>
  530. <li class="timeline-list-item pb-2">
  531. <div class="timeline-item-date">
  532. <%- ctx.helper.formatDate(auditor.begin_time) %>
  533. </div>
  534. <div class="timeline-item-tail"></div>
  535. <div class="timeline-item-icon bg-success text-light">
  536. <i class="fa fa-caret-down"></i>
  537. </div>
  538. <div class="timeline-item-content">
  539. <div class="card">
  540. <div class="card-body p-3">
  541. <div class="card-text">
  542. <p class="mb-1"><span
  543. class="h5"><%- ctx.detail.user.name %></span><span
  544. class="pull-right text-success"><%- idx !== 0 ? '重新' : '' %>上报审批</span>
  545. </p>
  546. <p class="text-muted mb-0"><%- ctx.detail.user.role %></p>
  547. </div>
  548. </div>
  549. </div>
  550. </div>
  551. </li>
  552. <li class="timeline-list-item pb-2">
  553. <div class="timeline-item-date">
  554. <%- ctx.helper.formatDate(auditor.end_time) %>
  555. </div>
  556. <% if(index < auditors.length - 1) { %>
  557. <div class="timeline-item-tail"></div>
  558. <% } %>
  559. <% if(auditor.status === auditConst.status.checked) { %>
  560. <div class="timeline-item-icon bg-success text-light">
  561. <i class="fa fa-check"></i>
  562. </div>
  563. <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.checkNoPre) {%>
  564. <div class="timeline-item-icon bg-warning text-light">
  565. <i class="fa fa-level-up"></i>
  566. </div>
  567. <% } else if(auditor.status === auditConst.status.checking) { %>
  568. <div class="timeline-item-icon bg-warning text-light">
  569. <i class="fa fa-ellipsis-h"></i>
  570. </div>
  571. <% } else {%>
  572. <div class="timeline-item-icon bg-secondary text-light">
  573. </div>
  574. <% } %>
  575. <div class="timeline-item-content">
  576. <div class="card">
  577. <div class="card-body p-3">
  578. <div class="card-text">
  579. <p class="mb-1"><span class="h5"><%- auditor.name %></span><span
  580. class="pull-right <%- auditConst.statusClass[auditor.status] %>"><%- auditConst.statusString[auditor.status] %></span>
  581. </p>
  582. <p class="text-muted mb-0"><%- auditor.role %></p>
  583. </div>
  584. </div>
  585. <!--审批意见-->
  586. <% if(auditor.times === ctx.detail.times && auditor.status !== auditConst.status.uncheck) { %>
  587. <div class="card-body p-3 border-top">
  588. <% if (ctx.detail.times === idx + 1 && auditor.status === auditConst.status.checking) { %>
  589. <label>审批意见<b class="text-danger">*</b></label>
  590. <textarea class="form-control form-control-sm"
  591. name="opinion">不同意</textarea>
  592. <% if (ctx.detail.curAuditor.aid === auditor.aid) { %>
  593. <div id="reject-process" class="alert alert-warning"
  594. style="margin-top: 15px;">
  595. <div class="form-check form-check-inline">
  596. <input class="form-check-input" type="radio" name="checkType"
  597. id="inlineRadio1" value="<%- auditConst.status.checkNo %>">
  598. <label class="form-check-label" for="inlineRadio1">退回原报
  599. <%- ctx.detail.user.name %></label>
  600. </div>
  601. <% if (auditor.order > 1 && auditor.aid !== auditors[0].aid) { %>
  602. <div class="form-check form-check-inline">
  603. <input class="form-check-input" type="radio" name="checkType"
  604. id="inlineRadio2"
  605. value="<%- auditConst.status.checkNoPre %>">
  606. <label class="form-check-label" for="inlineRadio2">退回上一审批人
  607. <%- auditors.find(item => item.sort === auditor.sort-1).name %></label>
  608. </div>
  609. <% } %>
  610. </div>
  611. <% } %>
  612. <% } else if(auditor.status === auditConst.status.checked && auditor.opinion){ %>
  613. <p style="margin: 0;"><%- auditor.opinion %></p>
  614. <% } %>
  615. </div>
  616. <% } %>
  617. </div>
  618. </div>
  619. </li>
  620. <% } else {%>
  621. <li class="timeline-list-item pb-2">
  622. <div class="timeline-item-date">
  623. <%- ctx.helper.formatDate(auditor.end_time) %>
  624. </div>
  625. <% if(index < auditors.length - 1) { %>
  626. <div class="timeline-item-tail"></div>
  627. <% } %>
  628. <% if(auditor.status === auditConst.status.checked) { %>
  629. <div class="timeline-item-icon bg-success text-light">
  630. <i class="fa fa-check"></i>
  631. </div>
  632. <% } else if(auditor.status === auditConst.status.checkNo || auditor.status === auditConst.status.checkNoPre) {%>
  633. <div class="timeline-item-icon bg-warning text-light">
  634. <i class="fa fa-level-up"></i>
  635. </div>
  636. <% } else if(auditor.status === auditConst.status.checking) { %>
  637. <div class="timeline-item-icon bg-warning text-light">
  638. <i class="fa fa-ellipsis-h"></i>
  639. </div>
  640. <% } else { %>
  641. <div class="timeline-item-icon bg-secondary text-light">
  642. </div>
  643. <% } %>
  644. <div class="timeline-item-content">
  645. <div class="card">
  646. <div class="card-body p-3">
  647. <div class="card-text">
  648. <p class="mb-1"><span class="h5"><%- auditor.name %></span>
  649. <span
  650. class="pull-right
  651. <%- auditConst.statusClass[auditor.status] %>"><%- auditor.status !== auditConst.status.uncheck ? auditConst.statusString[auditor.status] : ''%>
  652. <%- auditor.status === auditConst.status.checkNo ? ctx.detail.user.name : '' %>
  653. <%- auditor.status === auditConst.status.checkNoPre ? auditors.find(item => item.sort === auditor.sort-1).name : '' %>
  654. </span>
  655. </p>
  656. <p class="text-muted mb-0"><%- auditor.role %></p>
  657. </div>
  658. </div>
  659. <!--审批意见-->
  660. <% if(auditor.times === ctx.detail.times && auditor.status !== auditConst.status.uncheck) { %>
  661. <div class="card-body p-3 border-top">
  662. <% if (ctx.detail.times === idx + 1 && auditor.status === auditConst.status.checking) { %>
  663. <label>审批意见<b class="text-danger">*</b></label>
  664. <textarea class="form-control form-control-sm"
  665. name="opinion">不同意</textarea>
  666. <% if (ctx.detail.curAuditor.aid === auditor.aid ) { %>
  667. <div id="reject-process" class="alert alert-warning"
  668. style="margin-top: 15px;">
  669. <div class="form-check form-check-inline">
  670. <input class="form-check-input" type="radio" name="checkType"
  671. id="inlineRadio1" value="<%- auditConst.status.checkNo %>">
  672. <label class="form-check-label" for="inlineRadio1">退回原报
  673. <%- ctx.detail.user.name %></label>
  674. </div>
  675. <% if (auditor.order > 1 && auditor.aid !== auditors[0].aid) { %>
  676. <div class="form-check form-check-inline">
  677. <input class="form-check-input" type="radio" name="checkType"
  678. id="inlineRadio2"
  679. value="<%- auditConst.status.checkNoPre %>">
  680. <label class="form-check-label" for="inlineRadio2">退回上一审批人
  681. <%- auditors.find(item => item.sort === auditor.sort-1).name %></label>
  682. </div>
  683. <% } %>
  684. </div>
  685. <% } %>
  686. <% } else if (auditor.opinion) { %>
  687. <p style="margin: 0;"><%- auditor.opinion %></p>
  688. <% } %>
  689. </div>
  690. <% } %>
  691. </div>
  692. </div>
  693. </li>
  694. <% } %>
  695. <% }) %>
  696. </ul>
  697. </div>
  698. <% }) %>
  699. </div>
  700. </div>
  701. </div>
  702. <div class="modal-footer">
  703. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  704. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>" />
  705. <button type="submit" class="btn btn-warning btn-sm">确认退回</button>
  706. </div>
  707. </form>
  708. </div>
  709. </div>
  710. <% } %>
  711. <% } %>
  712. <% if (ctx.detail.auditors !== undefined && ctx.detail.auditors.length !== 0 && ctx.detail.auditors[ctx.detail.auditors.length-1].aid === ctx.session.sessionUser.accountId && ctx.detail.status === auditConst.status.checked && ctx.detail.order === ctx.detail.highOrder) { %>
  713. <% if (ctx.detail && !ctx.detail.authMobile && ctx.session.sessionUser.loginStatus === 0) { %>
  714. <!--终审重新审批-->
  715. <div class="modal fade" id="sp-down-back" data-backdrop="static">
  716. <div class="modal-dialog" role="document">
  717. <div class="modal-content">
  718. <div class="modal-header">
  719. <h5 class="modal-title">重新审批</h5>
  720. </div>
  721. <div class="modal-body">
  722. <h5>重新审批需要您的手机短信验证</h5>
  723. <h5>您目前还没设置认证手机,请先设置。</h5>
  724. </div>
  725. <div class="modal-footer">
  726. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  727. <a href="/profile/sms" class="btn btn-sm btn-primary">去设置</a>
  728. </div>
  729. </div>
  730. </div>
  731. </div>
  732. <% } else { %>
  733. <div class="modal fade" id="sp-down-back" data-backdrop="static">
  734. <div class="modal-dialog" role="document">
  735. <div class="modal-content">
  736. <div class="modal-header">
  737. <h5 class="modal-title">重新审批</h5>
  738. </div>
  739. <div class="modal-body">
  740. <h5>确认由「终审-<%= ctx.detail.auditors[ctx.detail.auditors.length-1].name %>」重新审批「第<%= ctx.detail.order %>期」?
  741. </h5>
  742. <% if (ctx.session.sessionUser.loginStatus === 0) { %>
  743. <div class="form-group">
  744. <label>重审需要验证码确认,验证码将发送至尾号<%- ctx.detail.authMobile.slice(-4) %>的手机</label>
  745. <div class="input-group input-group-sm mb-3">
  746. <input class="form-control" type="text" readonly="readonly" name="code"
  747. placeholder="输入短信中的6位验证码" />
  748. <div class="input-group-append">
  749. <button class="btn btn-outline-secondary" type="button" id="get-code">获取验证码</button>
  750. </div>
  751. </div>
  752. </div>
  753. <% } %>
  754. </div>
  755. <div class="modal-footer">
  756. <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
  757. <!--<a href="<%- preUrl %>/audit/check/again" disabled class="btn btn-warning btn-sm">确定重审</a>-->
  758. <button <% if (ctx.session.sessionUser.loginStatus === 0) { %>disabled<% } %> id="re-shenpi-btn"
  759. class="btn btn-warning btn-sm">确定重审</button>
  760. </div>
  761. </div>
  762. </div>
  763. </div>
  764. <% } %>
  765. <% } %>
  766. <script type="text/javascript">
  767. const csrf = '<%= ctx.csrf %>';
  768. const authMobile = '<%= ctx.detail.authMobile %>';
  769. </script>
  770. <% if (ctx.session.sessionUser.accountId === ctx.detail.uid && (ctx.detail.status === auditConst.status.uncheck || ctx.detail.status === auditConst.status.checkNo)) { %>
  771. <script>
  772. const accountGroup = JSON.parse(unescape('<%- escape(JSON.stringify(accountGroup)) %>'));
  773. const accountList = JSON.parse(unescape('<%- escape(JSON.stringify(accountList)) %>'));
  774. const shenpi_status = <%- trInfo.sp_status %>;
  775. const shenpiConst = JSON.parse('<%- JSON.stringify(shenpiConst) %>');
  776. const rptAuditList = JSON.parse(unescape('<%- escape(JSON.stringify(ctx.detail.rptAudits)) %>'));
  777. </script>
  778. <% } %>
  779. <script>const cur_uid = parseInt('<%- ctx.session.sessionUser.accountId %>');</script>
  780. <script>
  781. $('.sp-location-list').on('shown.bs.modal', function () {
  782. const scrollBox = $(this).find('div[class="col-8 modal-height-500"]');
  783. const bdiv = (scrollBox.offset() && scrollBox.offset().top) || 0;
  784. scrollBox.scrollTop(0);
  785. const hdiv = divSearch($(this).find('textarea')) ? $(this).find('textarea') : null;
  786. const hdheight = hdiv ? hdiv.parents('.timeline-item-content').offset().top : null;
  787. if (hdiv && scrollBox.length && scrollBox[0].scrollHeight > 200 && hdheight - bdiv > 200) {
  788. scrollBox.scrollTop(hdheight - bdiv);
  789. }
  790. });
  791. function divSearch(div) {
  792. if (div.length > 0) {
  793. return true;
  794. }
  795. return false;
  796. }
  797. // 展开历史审核记录
  798. $('.modal-body #fold-btn').click(function () {
  799. const type = $(this).data('target')
  800. const auditCard = $(this).parent().parent()
  801. if (type === 'show') {
  802. $(this).data('target', 'hide')
  803. auditCard.find('.fold-card').slideDown('swing', () => {
  804. auditCard.find('#fold-btn').text('收起历史审核记录')
  805. })
  806. } else {
  807. $(this).data('target', 'show')
  808. auditCard.find('.fold-card').slideUp('swing', () => {
  809. auditCard.find('#fold-btn').text('展开历史审核记录')
  810. })
  811. }
  812. });
  813. $('.sp-list-btn').click(function () {
  814. const type = $(this).data('type')
  815. if (type === 'hide') {
  816. $('.sp-list-item').hide()
  817. $('.modal-title').text('审批流程')
  818. } else {
  819. $('.sp-list-item').show()
  820. $('.modal-title').text('重新上报')
  821. }
  822. });
  823. // 重新审批按钮
  824. $("#re-shenpi-btn").click(function () {
  825. const data = {
  826. };
  827. <% if (ctx.session.sessionUser.loginStatus === 0) { %>
  828. const code = $("#sp-down-back input[name='code']").val();
  829. if ($(this).hasClass('disabled')) {
  830. return false;
  831. }
  832. if (code.length < 6) {
  833. // alert('请填写正确的验证码');
  834. toastr.error('请填写正确的验证码');
  835. return false;
  836. }
  837. data.code = code;
  838. <% } %>
  839. $.ajax({
  840. url: '<%- preUrl %>/audit/check/again',
  841. type: 'get',
  842. data: data,
  843. dataTye: 'json',
  844. success: function (response) {
  845. if (response.err === 0) {
  846. window.location.href = response.url;
  847. } else {
  848. toastr.error(response.msg);
  849. }
  850. }
  851. });
  852. });
  853. </script>