GroupProgress.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. <template>
  2. <div class="group-progress">
  3. <el-collapse v-model="activeNames" @change="handleChange">
  4. <el-collapse-item name="1">
  5. <template #title>
  6. <span style="font-size: 18px; font-weight: bold;">商邀报批流程</span>
  7. </template>
  8. <div class="process-diagram">
  9. <div slot="reference" @mouseenter="item.content=='报批资料准备'?visible = true:''" @mouseleave="visible = false" :class="item.done?'process-diagram-lis':'process-diagram-li'" v-for="(item,index) in activities" :key="index">
  10. <el-popover
  11. v-if="item.content=='报批资料准备'"
  12. placement="top"
  13. title="PS"
  14. width="200"
  15. trigger="manual"
  16. content="其中包含:机构筛选、邮件对接、报批行程及请示、完成公务对接等"
  17. v-model="visible">
  18. </el-popover>
  19. <div style="font-weight: 600;font-size: 15px;">{{item.content}}</div>
  20. <div>{{item.people}}</div>
  21. <div>{{item.time}}</div>
  22. </div>
  23. </div>
  24. </el-collapse-item>
  25. <el-collapse-item name="2">
  26. <template #title>
  27. <span style="font-size: 18px; font-weight: bold;">签证流程</span>
  28. </template>
  29. <div class="progress-table">
  30. <el-table :border="true" :header-cell-style="headerCellStyle" :data="tableData" style="width: 100%">
  31. <el-table-column prop="a" label="国家" width="150">
  32. <template slot-scope="scope">
  33. <el-input style="width:100%;margin-top: 10px;" size="mini" v-model="scope.row.a"
  34. placeholder="请输入归还人"></el-input>
  35. </template>
  36. </el-table-column>
  37. <el-table-column label="进度">
  38. <template slot-scope="scope">
  39. <div class="progress-table-content">
  40. <el-checkbox v-model="scope.row.b">收集资料</el-checkbox>
  41. <el-date-picker style="width:100%;margin-top: 10px;" size="mini"
  42. v-model="scope.row.c" type="date" placeholder="选择日期">
  43. </el-date-picker>
  44. </div>
  45. </template>
  46. </el-table-column>
  47. <el-table-column label="进度">
  48. <template slot-scope="scope">
  49. <div class="progress-table-content">
  50. <el-checkbox v-model="scope.row.b">取护照资料</el-checkbox>
  51. <el-date-picker style="width:100%;margin-top: 10px;" size="mini"
  52. v-model="scope.row.c" type="date" placeholder="选择日期">
  53. </el-date-picker>
  54. </div>
  55. </template>
  56. </el-table-column>
  57. <el-table-column label="进度">
  58. <template slot-scope="scope">
  59. <div class="progress-table-content">
  60. <el-checkbox v-model="scope.row.b">填资料</el-checkbox>
  61. <el-date-picker style="width:100%;margin-top: 10px;" size="mini"
  62. v-model="scope.row.c" type="date" placeholder="选择日期">
  63. </el-date-picker>
  64. </div>
  65. </template>
  66. </el-table-column>
  67. <el-table-column label="进度">
  68. <template slot-scope="scope">
  69. <div class="progress-table-content">
  70. <el-checkbox v-model="scope.row.b">送签</el-checkbox>
  71. <el-date-picker style="width:100%;margin-top: 10px;" size="mini"
  72. v-model="scope.row.c" type="date" placeholder="选择日期">
  73. </el-date-picker>
  74. </div>
  75. </template>
  76. </el-table-column>
  77. <el-table-column label="进度">
  78. <template slot-scope="scope">
  79. <div class="progress-table-content">
  80. <el-checkbox v-model="scope.row.b">出签+取护照</el-checkbox>
  81. <el-date-picker style="width:100%;margin-top: 10px;" size="mini"
  82. v-model="scope.row.c" type="date" placeholder="选择日期">
  83. </el-date-picker>
  84. </div>
  85. </template>
  86. </el-table-column>
  87. <el-table-column label="进度">
  88. <template slot-scope="scope">
  89. <div class="progress-table-content">
  90. <el-checkbox v-model="scope.row.b">归还护照</el-checkbox>
  91. <el-date-picker style="width:100%;margin-top: 10px;" size="mini"
  92. v-model="scope.row.c" type="date" placeholder="选择日期">
  93. </el-date-picker>
  94. <el-input style="width:100%;margin-top: 10px;" size="mini" v-model="scope.row.c"
  95. placeholder="请输入归还人"></el-input>
  96. </div>
  97. </template>
  98. </el-table-column>
  99. <el-table-column label="操作" width="100">
  100. <template>
  101. <el-button style="margin-top: 10px;" size="mini" type="danger">删除</el-button>
  102. </template>
  103. </el-table-column>
  104. </el-table>
  105. <div style="margin-top: 10px; text-align: center;">
  106. <el-button size="mini" type="primary">添加一行</el-button>
  107. </div>
  108. </div>
  109. </el-collapse-item>
  110. <el-collapse-item name="3">
  111. <template #title>
  112. <span style="font-size: 18px; font-weight: bold;">机票流程</span>
  113. </template>
  114. <div class="process-diagram">
  115. <div :class="item.done?'process-diagram-twos':'process-diagram-two'" v-for="(item,index) in activitiesAir" :key="index">
  116. <div style="font-weight: 600;font-size: 15px;">{{item.content}}</div>
  117. <div>{{item.people}}</div>
  118. <div>{{item.time}}</div>
  119. </div>
  120. </div>
  121. </el-collapse-item>
  122. <el-collapse-item name="4">
  123. <template #title>
  124. <span style="font-size: 18px; font-weight: bold;">酒店流程</span>
  125. </template>
  126. <div class="process-diagram">
  127. <div :class="item.done?'process-diagram-twos':'process-diagram-two'" v-for="(item,index) in activitiesHotel" :key="index">
  128. <div style="font-weight: 600;font-size: 15px;">{{item.content}}</div>
  129. <div>{{item.people}}</div>
  130. <div>{{item.time}}</div>
  131. </div>
  132. </div>
  133. </el-collapse-item>
  134. <el-collapse-item name="5">
  135. <template #title>
  136. <span style="font-size: 18px; font-weight: bold;">地接流程</span>
  137. </template>
  138. <div class="process-diagram">
  139. <div :class="item.done?'process-diagram-sans':'process-diagram-san'" v-for="(item,index) in activitiesGuide" :key="index">
  140. <div style="font-weight: 600;font-size: 15px;">{{item.content}}</div>
  141. <div>{{item.people}}</div>
  142. <div>{{item.time}}</div>
  143. </div>
  144. </div>
  145. </el-collapse-item>
  146. <el-collapse-item name="6">
  147. <template #title>
  148. <span style="font-size: 18px; font-weight: bold;">费用结算</span>
  149. </template>
  150. <div class="process-diagram">
  151. <div :class="item.done?'process-diagram-twos':'process-diagram-two'" v-for="(item,index) in activitiesCost" :key="index">
  152. <div style="font-weight: 600;font-size: 15px;">{{item.content}}</div>
  153. <div>{{item.people}}</div>
  154. <div>{{item.time}}</div>
  155. </div>
  156. </div>
  157. </el-collapse-item>
  158. </el-collapse>
  159. </div>
  160. </template>
  161. <script>
  162. export default {
  163. data () {
  164. return {
  165. activeNames: ['1','2','3','4','5','6'],
  166. tableData: [
  167. {
  168. a:'美国',
  169. b: '',
  170. c: '',
  171. d: '',
  172. e: '',
  173. f: '',
  174. g: '',
  175. h:'',
  176. i:'',
  177. j:'',
  178. k:'',
  179. l:'',
  180. m:'',
  181. },
  182. {
  183. a:'日本',
  184. b: '',
  185. c: '',
  186. d: '',
  187. e: '',
  188. f: '',
  189. g: '',
  190. h:'',
  191. i:'',
  192. j:'',
  193. k:'',
  194. l:'',
  195. m:'',
  196. },
  197. {
  198. a:'新加坡',
  199. b: '',
  200. c: '',
  201. d: '',
  202. e: '',
  203. f: '',
  204. g: '',
  205. h:'',
  206. i:'',
  207. j:'',
  208. k:'',
  209. l:'',
  210. m:'',
  211. }
  212. ],
  213. activities:[
  214. {
  215. content: '报批资料准备',
  216. time: '2018-04-01 20:46',
  217. people: '五六七',
  218. done: true,
  219. },
  220. {
  221. content: '开始报批',
  222. people: '吉吉国王',
  223. done: true,
  224. time: '2018-04-03 20:46',
  225. },
  226. {
  227. content: '报批中',
  228. done: false,
  229. people: '',
  230. time: '',
  231. },
  232. {
  233. content: '批件已出',
  234. people: '',
  235. done: false,
  236. time: '',
  237. },
  238. ],
  239. activitiesAir:[
  240. {
  241. content: '机票占位中',
  242. time: '2018-04-01 20:46',
  243. people: '五六七',
  244. done: true,
  245. },
  246. {
  247. content: '机票已出',
  248. people: '',
  249. done: false,
  250. time: '',
  251. }
  252. ],
  253. activitiesHotel:[
  254. {
  255. content: '酒店占房中',
  256. time: '2018-04-01 20:46',
  257. people: '五六七',
  258. done: true,
  259. },
  260. {
  261. content: '酒店已定',
  262. people: '',
  263. done: false,
  264. time: '',
  265. }
  266. ],
  267. activitiesGuide:[
  268. {
  269. content: '地接对接中',
  270. time: '2018-04-01 20:46',
  271. people: '五六七',
  272. done: true,
  273. },
  274. {
  275. content: '地接已安排好',
  276. people: '吉吉国王',
  277. done: true,
  278. time: '2018-04-03 20:46',
  279. },
  280. {
  281. content: '出行物资准备完毕',
  282. people: '',
  283. done: false,
  284. time: '',
  285. }
  286. ],
  287. activitiesCost:[
  288. {
  289. content: '费用结算中',
  290. time: '2018-04-01 20:46',
  291. people: '五六七',
  292. done: true,
  293. },
  294. {
  295. content: '费用结算完毕',
  296. people: '',
  297. done: false,
  298. time: '',
  299. }
  300. ],
  301. visible: false
  302. }
  303. },
  304. methods: {
  305. handleChange(val) {
  306. console.log(val);
  307. },
  308. headerCellStyle({ row, column, rowIndex, columnIndex }) {
  309. console.log(row, column, rowIndex, columnIndex);
  310. row[0].colSpan=1;
  311. row[6].colSpan=6;
  312. row[7].colSpan=1;
  313. row[1].colSpan=0;
  314. row[2].colSpan=0;
  315. row[3].colSpan=0;
  316. row[4].colSpan=0;
  317. row[5].colSpan=0;
  318. if (columnIndex<6&&columnIndex>0) {
  319. return {display: 'none' }
  320. }
  321. }
  322. }
  323. }
  324. </script>
  325. <style>
  326. .group-progress{
  327. background-color: #fff;
  328. padding: 10px;
  329. box-shadow: 0 0 5px #0005;
  330. border-radius: 10px;
  331. min-height: 830px;
  332. }
  333. .progress-content{
  334. display: flex;
  335. justify-content: space-around;
  336. }
  337. .progress-content>div{
  338. font-size: 17px;
  339. font-weight: bold;
  340. }
  341. .progress-table-content{
  342. text-align: left;
  343. }
  344. .progress-content div{
  345. padding: 20px;
  346. border: 1px solid #ccc;
  347. border-radius: 5px;
  348. }
  349. .process-diagram{
  350. color: #606266;
  351. margin-top: 50px;
  352. display: flex;
  353. justify-content: space-around;
  354. }
  355. .process-diagram-li{
  356. width: 10%;
  357. text-align: center;
  358. position: relative;
  359. padding: 10px;
  360. border-radius: 5px;
  361. box-shadow: 0px 0px 10px #0005;
  362. }
  363. .process-diagram-li::after{
  364. position: absolute;
  365. content:'';
  366. display: block;
  367. width:10px;
  368. height:10px;
  369. background-color: #606266;
  370. left: 46%;
  371. top:-30px;
  372. border-radius: 50%
  373. }
  374. .process-diagram-li:not(:last-child)::before{
  375. position: absolute;
  376. content:'';
  377. display: block;
  378. width:210%;
  379. height:2px;
  380. background-color: #606266;
  381. left:55%;
  382. top:-26px;
  383. border-radius: 50%
  384. }
  385. .process-diagram-lis{
  386. width: 10%;
  387. text-align: center;
  388. position: relative;
  389. padding: 10px;
  390. border-radius: 5px;
  391. box-shadow: 0px 0px 10px #0005;
  392. }
  393. .process-diagram-lis::after{
  394. position: absolute;
  395. content:'';
  396. display: block;
  397. width:10px;
  398. height:10px;
  399. background-color: #67C23A;
  400. left: 46%;
  401. top:-30px;
  402. border-radius: 50%
  403. }
  404. .process-diagram-lis:not(:last-child)::before{
  405. position: absolute;
  406. content:'';
  407. display: block;
  408. width:210%;
  409. height:2px;
  410. background-color: #67C23A;
  411. left:55%;
  412. top:-26px;
  413. border-radius: 50%
  414. }
  415. .process-diagram>div{
  416. cursor: pointer;
  417. }
  418. .process-diagram .el-popover{
  419. left: 110%;
  420. top: -7px;
  421. }
  422. /*liangge*/
  423. .process-diagram-two{
  424. width: 10%;
  425. text-align: center;
  426. position: relative;
  427. padding: 10px;
  428. border-radius: 5px;
  429. box-shadow: 0px 0px 10px #0005;
  430. }
  431. .process-diagram-two::after{
  432. position: absolute;
  433. content:'';
  434. display: block;
  435. width:10px;
  436. height:10px;
  437. background-color: #606266;
  438. left: 46%;
  439. top:-30px;
  440. border-radius: 50%
  441. }
  442. .process-diagram-two:not(:last-child)::before{
  443. position: absolute;
  444. content:'';
  445. display: block;
  446. width:431%;
  447. height:2px;
  448. background-color: #606266;
  449. left:55%;
  450. top:-26px;
  451. border-radius: 50%
  452. }
  453. .process-diagram-twos{
  454. width: 10%;
  455. text-align: center;
  456. position: relative;
  457. padding: 10px;
  458. border-radius: 5px;
  459. box-shadow: 0px 0px 10px #0005;
  460. }
  461. .process-diagram-twos::after{
  462. position: absolute;
  463. content:'';
  464. display: block;
  465. width:10px;
  466. height:10px;
  467. background-color: #67C23A;
  468. left: 46%;
  469. top:-30px;
  470. border-radius: 50%
  471. }
  472. .process-diagram-twos:not(:last-child)::before{
  473. position: absolute;
  474. content:'';
  475. display: block;
  476. width:431%;
  477. height:2px;
  478. background-color: #67C23A;
  479. left:55%;
  480. top:-26px;
  481. border-radius: 50%
  482. }
  483. /*sange*/
  484. .process-diagram-san{
  485. width: 10%;
  486. text-align: center;
  487. position: relative;
  488. padding: 10px;
  489. border-radius: 5px;
  490. box-shadow: 0px 0px 10px #0005;
  491. }
  492. .process-diagram-san::after{
  493. position: absolute;
  494. content:'';
  495. display: block;
  496. width:10px;
  497. height:10px;
  498. background-color: #606266;
  499. left: 46%;
  500. top:-30px;
  501. border-radius: 50%
  502. }
  503. .process-diagram-san:not(:last-child)::before{
  504. position: absolute;
  505. content:'';
  506. display: block;
  507. width:283%;
  508. height:2px;
  509. background-color: #606266;
  510. left:55%;
  511. top:-26px;
  512. border-radius: 50%
  513. }
  514. .process-diagram-sans{
  515. width: 10%;
  516. text-align: center;
  517. position: relative;
  518. padding: 10px;
  519. border-radius: 5px;
  520. box-shadow: 0px 0px 10px #0005;
  521. }
  522. .process-diagram-sans::after{
  523. position: absolute;
  524. content:'';
  525. display: block;
  526. width:10px;
  527. height:10px;
  528. background-color: #67C23A;
  529. left: 46%;
  530. top:-30px;
  531. border-radius: 50%
  532. }
  533. .process-diagram-sans:not(:last-child)::before{
  534. position: absolute;
  535. content:'';
  536. display: block;
  537. width:283%;
  538. height:2px;
  539. background-color: #67C23A;
  540. left:55%;
  541. top:-26px;
  542. border-radius: 50%
  543. }
  544. </style>