detail.ejs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. <% include ./tender_sub_menu.ejs %>
  2. <div class="panel-content">
  3. <div class="panel-title">
  4. <div class="title-main d-flex">
  5. <% include ./tender_sub_mini_menu.ejs %>
  6. <% if (tender.ledger_status !== audit.ledger.status.uncheck) { %>
  7. <h2>进行至
  8. <% if (lastStage) { %>
  9. 第<%- lastStage.order %>期<small class="<%- audit.stage.statusClass[lastStage.status] %>">(<%- audit.stage.statusString[lastStage.status] %>)</small>
  10. <% } else { %>
  11. 台账<small class="<%- audit.ledger.auditStringClass[tender.ledger_status] %>">(<%- audit.ledger.auditString[tender.ledger_status] %>)</small>
  12. <% } %>
  13. </h2>
  14. <% } %>
  15. <% if (cooperation) { %>
  16. <div>
  17. <a href="/tender/<%= tender.id %>/cooperation" class="btn btn-sm btn-light" ><i class="fa fa-users"></i> 协作办公</a>
  18. </div>
  19. <% } %>
  20. </div>
  21. </div>
  22. <div class="content-wrap">
  23. <div class="c-body">
  24. <div class="sjs-height-0">
  25. <div class="m-3">
  26. <!--金额概况-->
  27. <div class="row mx-0 mb-3">
  28. <div class="col-auto p-0">
  29. <div class="card text-center">
  30. <div class="card-body">
  31. <h5 class="card-title"><%- ctx.helper.formatMoney(tender.total_price) %></h5>
  32. <p class="card-text text-muted">0号台账</p>
  33. </div>
  34. </div>
  35. </div>
  36. <div class="col-auto pr-0">
  37. <div class="card text-center">
  38. <div class="card-body">
  39. <h5 class="card-title"><%- ctx.helper.formatMoney(tender.gather_tp) %></h5>
  40. <p class="card-text text-muted">本期完成</p>
  41. </div>
  42. </div>
  43. </div>
  44. <div class="col-auto pr-0">
  45. <div class="card text-center">
  46. <div class="card-body">
  47. <h5 class="card-title"><%- ctx.helper.formatMoney(tender.end_qc_tp) %><small class="text-danger" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="占合同比例"><%- tender.qc_ratio %>%</small></h5>
  48. <p class="card-text text-muted">截止本期变更</p>
  49. </div>
  50. </div>
  51. </div>
  52. <div class="col-auto pr-0">
  53. <div class="card text-center">
  54. <div class="card-body">
  55. <h5 class="card-title"><%- ctx.helper.formatMoney(tender.end_gather_tp) %></h5>
  56. <p class="card-text text-muted">截止本期完成</p>
  57. </div>
  58. </div>
  59. </div>
  60. <div class="col-auto pr-0">
  61. <div class="card text-center">
  62. <div class="card-body">
  63. <h5 class="card-title"><%- ctx.helper.formatMoney(tender.pre_gather_tp) %></h5>
  64. <p class="card-text text-muted">截止上期完成</p>
  65. </div>
  66. </div>
  67. </div>
  68. <div class="col-auto pr-0">
  69. <div class="card text-center">
  70. <div class="card-body">
  71. <h5 class="card-title"><%- ctx.helper.formatMoney(tender.yf_tp) %></h5>
  72. <p class="card-text text-muted">本期应付</p>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. <!--进度条-->
  78. <div class="mb-3">
  79. <div class="progress">
  80. <% if (tender.pre_ratio > 0) { %>
  81. <div class="progress-bar bg-success" style="width: <%- tender.pre_ratio %>%;" data-placement="bottom" data-toggle="tooltip" data-original-title="截止上期累计完成:¥<%- ctx.helper.formatMoney(tender.pre_gather_tp) %>"><%- tender.pre_ratio %>%</div>
  82. <% } %>
  83. <% if (tender.cur_ratio > 0) { %>
  84. <div class="progress-bar bg-info" style="width: <%- tender.cur_ratio %>%;" data-placement="bottom" data-toggle="tooltip" data-original-title="本期完成:¥<%- ctx.helper.formatMoney(tender.gather_tp) %>"><%- tender.cur_ratio %>%</div>
  85. <% } %>
  86. <% if (tender.other_ratio > 0) { %>
  87. <div class="progress-bar bg-gray" style="width: <%- tender.other_ratio %>%;" data-placement="bottom" data-toggle="tooltip" data-original-title="未完成:¥<%- ctx.helper.formatMoney(tender.other_tp) %>"><%- tender.other_ratio %>%</div>
  88. <% } %>
  89. </div>
  90. </div>
  91. <!--标段设置-->
  92. <div class="col-12 p-0 mb-3">
  93. <div class="card">
  94. <div class="card-body">
  95. <h5 class="card-title">标段设置</h5>
  96. <a href="#bd-set-1" data-toggle="modal" data-target="#bd-set-1" class="btn btn-sm btn-outline-primary">标段属性</a>
  97. <a href="#bd-set-2" data-toggle="modal" data-target="#bd-set-2" class="btn btn-sm btn-outline-primary">小数位数</a>
  98. <a href="#bd-set-3" data-toggle="modal" data-target="#bd-set-3" class="btn btn-sm btn-outline-primary">数量精度</a>
  99. <a href="#bd-set-4" data-toggle="modal" data-target="#bd-set-4" class="btn btn-sm btn-outline-primary">合同参数</a>
  100. <a href="#bd-set-5" data-toggle="modal" data-target="#bd-set-5" class="btn btn-sm btn-outline-primary">显示设置</a>
  101. <a href="#bd-set-6" data-toggle="modal" data-target="#bd-set-6" class="btn btn-sm btn-outline-primary">章节设置</a>
  102. <a href="#bd-set-7" data-toggle="modal" data-target="#bd-set-7" class="btn btn-sm btn-outline-primary">付款账号</a>
  103. <i class="mx-2">|</i>
  104. <% if (ctx.session.sessionProject.page_show !== null && parseInt(ctx.session.sessionProject.page_show.xxjd) === 1 && ctx.session.sessionUser.is_admin) { %>
  105. <a href="#xxjd-set" data-toggle="modal" data-target="#xxjd-set" class="btn btn-sm btn-outline-primary">形象进度</a>
  106. <% } %>
  107. <a href="javascript: void(0);" class="btn btn-sm btn-outline-primary" id="copyBtn">拷贝设置</a>
  108. <% if (ctx.session.sessionUser.is_admin) { %>
  109. <a href="/tender/<%- tender.id %>/shenpi" class="btn btn-sm btn-outline-primary">审批流程</a>
  110. <a href="#bd-set-9" data-toggle="modal" data-target="#bd-set-9" class="btn btn-sm btn-outline-primary">游客账号 <span id="tourist-num" <% if (tourists.length !== 0) { %>class="badge badge-secondary"<% } %>><% if (tourists.length !== 0) { %><%- tourists.length %><% } %></span></a>
  111. <a href="#bd-set-10" data-toggle="modal" data-target="#bd-set-10" class="btn btn-sm btn-outline-primary">上报控制</a>
  112. <% } %>
  113. </div>
  114. </div>
  115. </div>
  116. <!--图表-->
  117. <div class="card mb-3">
  118. <div class="card-body">
  119. <h5 class="card-title">期进度表</h5>
  120. <div id="chartContainer4" style="height: 300px; width: 100%;">
  121. </div>
  122. </div>
  123. </div>
  124. <div class="card mb-3">
  125. <div class="card-body">
  126. <h5 class="card-title">月进度表</h5>
  127. <div id="chartContainer3" style="height: 300px; width: 100%;">
  128. </div>
  129. </div>
  130. </div>
  131. </div>
  132. </div>
  133. </div>
  134. </div>
  135. </div>
  136. <script src="/public/js/sub_menu.js"></script>
  137. <script>
  138. $.subMenu({
  139. menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
  140. toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
  141. key: 'menu.1.0.0',
  142. miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
  143. callback: function (info) {
  144. if (info.mini) {
  145. $('.panel-title').addClass('fluid');
  146. $('#sub-menu').removeClass('panel-sidebar');
  147. } else {
  148. $('.panel-title').removeClass('fluid');
  149. $('#sub-menu').addClass('panel-sidebar');
  150. }
  151. autoFlashHeight();
  152. }
  153. });
  154. </script>
  155. <script type="text/javascript">
  156. const tenders = JSON.parse(unescape('<%- escape(JSON.stringify(tenders)) %>'));
  157. const category = JSON.parse(unescape('<%- escape(JSON.stringify(categoryData)) %>'));
  158. const tender = JSON.parse('<%- JSON.stringify(tender) %>');
  159. const cur_uid = parseInt('<%- ctx.session.sessionUser.accountId %>');
  160. //4 标段期数计量进度//
  161. var myChart = echarts.init(document.getElementById('chartContainer4'));
  162. var option = {
  163. color: ['#e9af68','#57b7b6','#e4575a','#959eac','#6699FF',
  164. '#d38b70','#8fb7cf','#cd5c5c','#ffa500','#40e0d0',
  165. '#1e90ff','#ff6347','#7b68ee','#00fa9a','#ffd700',
  166. '#5c616b','#ff6666','#3cb371','#b8860b','#30e0e0'],
  167. title : {
  168. text: '标段期进度'
  169. },
  170. tooltip : {
  171. trigger: 'axis',
  172. },
  173. calculable : true,
  174. legend: {
  175. data:['本期合同计量','本期数量变更计量','截至上期累计完成','本期完成计量','完成度']
  176. },
  177. dataZoom: [
  178. {show: true, start: 0, end: 100}
  179. ],
  180. xAxis : [
  181. {
  182. type : 'category',
  183. splitLine : {show : true},
  184. data : [
  185. <% for (const s of stages) {%>
  186. '第<%- s.order %>期',
  187. <% } %>
  188. ]
  189. }
  190. ],
  191. yAxis : [
  192. {
  193. type : 'value',
  194. name : '金额',
  195. position:'left',
  196. axisLabel : {
  197. <% if (ctx.tender.info.display.thousandth) { %>
  198. formatter: function (value, index) {
  199. return value.format2Str('#,##0.######') + ' 元'
  200. }
  201. <% } else { %>
  202. formatter: '{value} 元'
  203. <% } %>
  204. },
  205. splitArea : {show : true},
  206. splitLine : {show : true},
  207. },
  208. {
  209. type : 'value',
  210. name:'完成度',
  211. axisLabel : {
  212. formatter: '{value} %'
  213. },
  214. position: 'right',
  215. splitArea : {show : false},
  216. splitLine : {show : false},
  217. }
  218. ],
  219. series : [
  220. {
  221. name:'本期合同计量',
  222. type:'bar',
  223. tooltip : {
  224. trigger: 'item',
  225. <% if (ctx.tender.info.display.thousandth) { %>
  226. formatter: function (params, ticket, callback) {
  227. return params.name + '<br/>' + params.seriesName + ': ' + params.value.format2Str('#,##0.######') + ' 元';
  228. }
  229. <% } else { %>
  230. tooltip : {trigger: 'item',formatter: "{b} <br/>{a}:{c}元"},
  231. <% } %>
  232. },
  233. stack: '合同',
  234. data:[
  235. <% for (const s of stages) {%>
  236. <%- s.contract_tp %>,
  237. <% } %>
  238. ]
  239. },
  240. {
  241. name:'本期数量变更计量',
  242. type:'bar',
  243. tooltip : {
  244. trigger: 'item',
  245. <% if (ctx.tender.info.display.thousandth) { %>
  246. formatter: function (params, ticket, callback) {
  247. return params.name + '<br/>' + params.seriesName + ': ' + params.value.format2Str('#,##0.######') + ' 元';
  248. }
  249. <% } else { %>
  250. tooltip : {trigger: 'item',formatter: "{b} <br/>{a}:{c}元"},
  251. <% } %>
  252. },
  253. stack: '变更',
  254. data:[
  255. <% for (const s of stages) {%>
  256. <%- s.qc_tp %>,
  257. <% } %>
  258. ]
  259. },
  260. {
  261. name:'截至上期累计完成',
  262. type:'bar',
  263. tooltip : {
  264. trigger: 'item',
  265. <% if (ctx.tender.info.display.thousandth) { %>
  266. formatter: function (params, ticket, callback) {
  267. return params.name + '<br/>' + params.seriesName + ': ' + params.value.format2Str('#,##0.######') + ' 元';
  268. }
  269. <% } else { %>
  270. tooltip : {trigger: 'item',formatter: "{b} <br/>{a}:{c}元"},
  271. <% } %>
  272. },
  273. stack: '完成',
  274. data:[
  275. <% for (const s of stages) {%>
  276. <%- ctx.helper.add(s.pre_contract_tp, s.pre_qc_tp) %>,
  277. <% } %>
  278. ]
  279. },
  280. {
  281. name:'本期完成计量',
  282. type:'bar',
  283. tooltip : {
  284. trigger: 'item',
  285. <% if (ctx.tender.info.display.thousandth) { %>
  286. formatter: function (params, ticket, callback) {
  287. return params.name + '<br/>' + params.seriesName + ': ' + params.value.format2Str('#,##0.######') + ' 元';
  288. }
  289. <% } else { %>
  290. tooltip : {trigger: 'item',formatter: "{b} <br/>{a}:{c}元"},
  291. <% } %>
  292. },
  293. stack: '完成',
  294. data:[
  295. <% for (const s of stages) {%>
  296. <%- ctx.helper.add(s.contract_tp, s.qc_tp) %>,
  297. <% } %>
  298. ]
  299. },
  300. {
  301. name:'完成度',
  302. type:'line',
  303. tooltip : {trigger: 'axis',formatter: "{b}占总标段<br/>{a}:{c} %"},
  304. yAxisIndex: 1,
  305. data:[
  306. <% for (const s of stages) {%>
  307. <%- ctx.helper.mul(ctx.helper.div(ctx.helper.add(s.contract_tp, s.qc_tp), tender.sum, 2), 100) %>,
  308. <% } %>
  309. ]
  310. },
  311. ]
  312. };
  313. // 为echarts对象加载数据
  314. myChart.setOption(option);
  315. //4 标段期数计量进度//
  316. //3 标段月进度//
  317. // 基于准备好的dom,初始化echarts图表
  318. var myChart = echarts.init(document.getElementById('chartContainer3'));
  319. var option = {
  320. color:["#e9af68","#57b7b6"],
  321. title : {
  322. text: '标段月进度'
  323. },
  324. tooltip : {
  325. trigger: 'axis',
  326. formatter: function (params, ticket, callback) {
  327. let sHint = '';
  328. for (const param of params) {
  329. if (sHint !== '') {
  330. sHint += '<br>';
  331. }
  332. if (sHint === '' && param.name !== '') {
  333. sHint = param.name + '<br>';
  334. }
  335. sHint += '<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:' + param.color +'"></span>';
  336. if (param.data) {
  337. sHint += param.seriesName + ': ' + param.data + ' %';
  338. } else {
  339. sHint += param.seriesName + ': -';
  340. }
  341. }
  342. return sHint;
  343. },
  344. },
  345. legend: {
  346. data:['累计完成','本月完成']
  347. },
  348. toolbox: {
  349. show : true,
  350. feature : {
  351. magicType : {show: true, type: ['line', 'bar']}
  352. }
  353. },
  354. dataZoom : {
  355. show : true,
  356. start : 50,
  357. end : 100
  358. },
  359. xAxis : [
  360. {
  361. type : 'category',
  362. boundaryGap : true,
  363. data : [
  364. <% for (const mp of monthProgress) { %>
  365. '<%- mp.month %>',
  366. <% } %>
  367. ]
  368. }
  369. ],
  370. yAxis : [
  371. {
  372. type : 'value',
  373. axisLabel : {
  374. formatter: '{value} %'
  375. },
  376. splitArea : {show : true}
  377. }
  378. ],
  379. series : [
  380. {
  381. name:'累计完成',
  382. type:'line',
  383. itemStyle: {
  384. normal: {
  385. lineStyle: {
  386. shadowColor : 'rgba(0,0,0,0.4)',
  387. shadowBlur: 5,
  388. shadowOffsetX: 3,
  389. shadowOffsetY: 3
  390. }
  391. }
  392. },
  393. data:[
  394. <% for (const mp of monthProgress) { %>
  395. <%- mp.end_ratio %>,
  396. <% } %>
  397. ]
  398. },
  399. {
  400. name:'本月完成',
  401. type:'line',
  402. itemStyle: {
  403. normal: {
  404. lineStyle: {
  405. shadowColor : 'rgba(0,0,0,0.4)',
  406. shadowBlur: 5,
  407. shadowOffsetX: 3,
  408. shadowOffsetY: 3
  409. }
  410. }
  411. },
  412. data:[
  413. <% for (const mp of monthProgress) { %>
  414. <%- mp.ratio %>,
  415. <% } %>
  416. ]
  417. }
  418. ]
  419. };
  420. // 为echarts对象加载数据
  421. myChart.setOption(option);
  422. //3 标段月进度//
  423. </script>
  424. <script>
  425. </script>