index.vue 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207
  1. <template>
  2. <div class="box-container">
  3. <div class="box-container-top">
  4. <el-card class="card-cell middle-cell">
  5. <div slot="header" class="clearfix">
  6. <span>数据概览</span>
  7. </div>
  8. <div class="card-cell-content">
  9. <div
  10. class="card-cell-value"
  11. @click="handelRouterTo('/page-pro/project-initiation')"
  12. >
  13. <div class="img-box img1-url"></div>
  14. <div class="text-box">
  15. <span>{{ projectNum }}</span>
  16. <span>我的项目</span>
  17. </div>
  18. </div>
  19. <div
  20. class="card-cell-value"
  21. @click="handelRouterTo('/page-pro/task-manage')"
  22. >
  23. <div class="img-box img2-url"></div>
  24. <div class="text-box">
  25. <span>{{ taskNum }}</span>
  26. <span>我的任务</span>
  27. </div>
  28. </div>
  29. <div
  30. class="card-cell-value"
  31. @click="handelRouterTo('/page-wt/tickets')"
  32. >
  33. <div class="img-box img3-url"></div>
  34. <div class="text-box">
  35. <span>{{ workOrderNum }}</span>
  36. <span>我的工单</span>
  37. </div>
  38. </div>
  39. <div class="card-cell-value">
  40. <div class="img-box img4-url"></div>
  41. <div class="text-box">
  42. <span>1000</span>
  43. <span>我的绩效</span>
  44. </div>
  45. </div>
  46. </div>
  47. </el-card>
  48. <el-card class="card-cell middle-cell">
  49. <div slot="header" class="clearfix">
  50. <span>个人信息</span>
  51. </div>
  52. <div class="card-cell-info">
  53. <div class="card-cell-value">
  54. <div>
  55. <el-avatar
  56. shape="square"
  57. :size="80"
  58. src="https://empty"
  59. @error="errorHandler"
  60. >
  61. <img :src="user.info.avatarAddress" />
  62. </el-avatar>
  63. </div>
  64. <div class="text-box">
  65. <span>{{ user.info.name }}</span>
  66. <el-tooltip class="item" effect="dark" placement="top-start">
  67. <span>{{
  68. getRoleName(user.info.loginChangeGroupVOList, 1)
  69. }}</span>
  70. </el-tooltip>
  71. <span>{{
  72. getRoleName(user.info.loginChangeGroupVOList, 2)
  73. }}</span>
  74. </div>
  75. </div>
  76. <div class="card-cell-date">
  77. <span>{{ date }}</span>
  78. <span>{{ week }} </span>
  79. <span>{{ time }}</span>
  80. </div>
  81. </div>
  82. </el-card>
  83. </div>
  84. <div class="box-container-middle">
  85. <div class="box-container-middl_left">
  86. <el-card class="card-cell middle-cell">
  87. <div slot="header" class="clearfix">
  88. <span>流程待办</span>
  89. </div>
  90. <div style="height: 100%; width: 100%">
  91. <ele-pro-table
  92. ref="table"
  93. class="table-box"
  94. :columns="columns"
  95. :toolkit="[]"
  96. :datasource="datasource"
  97. cache-key="systemHomeTable5"
  98. >
  99. <template v-slot:status="{ row }">
  100. <el-tag type="success" v-if="row.suspensionState === 1"
  101. >激活</el-tag
  102. >
  103. <el-tag type="warning" v-if="row.suspensionState === 2"
  104. >挂起</el-tag
  105. >
  106. </template>
  107. <template v-slot:name="{ row }">
  108. <el-link
  109. type="primary"
  110. :underline="false"
  111. @click="handleAudit('', row)"
  112. >
  113. {{ row.name }}
  114. </el-link>
  115. </template>
  116. <!-- 操作列 -->
  117. <template v-slot:action="{ row }">
  118. <el-button
  119. size="mini"
  120. type="text"
  121. icon="el-icon-edit"
  122. @click="handleAudit('audit', row)"
  123. >处理
  124. </el-button>
  125. <!-- <el-button
  126. size="mini"
  127. type="text"
  128. icon="el-icon-edit"
  129. @click="openEdit('upDate', row)"
  130. >待办详情</el-button
  131. > -->
  132. </template>
  133. </ele-pro-table>
  134. </div>
  135. </el-card>
  136. <el-card class="card-cell middle-cell">
  137. <div slot="header" class="clearfix">
  138. <span>常用功能</span>
  139. </div>
  140. <draggable v-model="commonList" class="card-cell-content">
  141. <div
  142. v-for="(item, index) in commonList"
  143. :key="item.id"
  144. class="card-cell-content-box"
  145. @click="handleAdd(item, index)"
  146. :title="
  147. !['-999', '-1'].includes(item.id) && isDelFlag ? '点击删除' : ''
  148. "
  149. :class="
  150. !['-999', '-1'].includes(item.id) && isDelFlag ? 'div-del' : ''
  151. "
  152. >
  153. <!-- <el-popover-->
  154. <!-- v-if="item.id !=='-1'"-->
  155. <!-- placement="top-start"-->
  156. <!-- title=""-->
  157. <!-- width="10px"-->
  158. <!-- trigger="click"-->
  159. <!-- content="">-->
  160. <!-- <i style="color: red" class="el-icon-delete"></i>-->
  161. <!-- <div class="card-cell-content-div" slot="reference">-->
  162. <!-- <i :class="item.icon||'el-icon-menu'"></i>-->
  163. <!-- <span>{{ item.name }}</span>-->
  164. <!-- </div>-->
  165. <!-- </el-popover>-->
  166. <!-- <el-tooltip placement="top" effect="light" v-if="item.id !=='-1'">-->
  167. <!-- <div slot="content">-->
  168. <!-- <i style="color: red;cursor: pointer;font-size: 18px" class="el-icon-delete"-->
  169. <!-- @click="handleCommonListDel(item,index)"></i>-->
  170. <!-- </div>-->
  171. <!-- <div class="card-cell-content-div">-->
  172. <!-- <i :class="item.icon||'el-icon-s-opportunity'"></i>-->
  173. <!-- <span>{{ item.name }}</span>-->
  174. <!-- </div>-->
  175. <!-- </el-tooltip>-->
  176. <div class="card-cell-content-div">
  177. <i :class="item.icon || 'el-icon-s-opportunity'"></i>
  178. <span>{{ item.name }}</span>
  179. </div>
  180. </div>
  181. </draggable>
  182. </el-card>
  183. </div>
  184. <div class="box-container-middl_right">
  185. <el-card
  186. v-if="list.length > 0"
  187. class="card-cell middle-cell card-cell_top"
  188. >
  189. <div slot="header" class="clearfix">
  190. <span>统一门户</span>
  191. </div>
  192. <div class="list">
  193. <div
  194. v-for="(item, index) in list"
  195. :class="[(index + 1) % 3 == 0 ? 'item margin_0' : 'item']"
  196. @click="openUrl(item)"
  197. >
  198. <div><img :src="item.img" /></div>
  199. <div>{{ item.name }}</div>
  200. </div>
  201. </div>
  202. </el-card>
  203. <el-card class="card-cell middle-cell card-cell_bottom">
  204. <div slot="header" class="clearfix">
  205. <span>消息提醒</span>
  206. </div>
  207. <div>
  208. <vue-seamless-scroll
  209. class="scroll-box"
  210. v-if="messageScrollList.length"
  211. :data="messageScrollList"
  212. :class-option="defineScroll"
  213. >
  214. <el-timeline class="scroll-box-content">
  215. <el-timeline-item
  216. :hide-timestamp="false"
  217. v-for="o in messageScrollList"
  218. :key="o.id"
  219. >
  220. <template slot="dot">
  221. <span class="scroll-box-content-dot"></span>
  222. </template>
  223. <div class="scroll-box-content-item">
  224. <span class="item-date">{{ o.createTime }}</span>
  225. <span
  226. class="item-text"
  227. :title="`${o.templateNickname + ':' + o.templateContent}`"
  228. >
  229. <span style="font-size: 0.8vw">{{
  230. o.templateNickname + ':'
  231. }}</span>
  232. {{ o.templateContent }}</span
  233. >
  234. </div>
  235. </el-timeline-item>
  236. </el-timeline>
  237. </vue-seamless-scroll>
  238. <el-empty v-else description="暂无"></el-empty>
  239. </div>
  240. </el-card>
  241. </div>
  242. </div>
  243. <!-- <div class="box-container-bottom">
  244. </div> -->
  245. <handleTask ref="handleTaskRef" @reload="reload"></handleTask>
  246. <detail ref="detailRef"></detail>
  247. <commonDialog
  248. ref="commonDialogRef"
  249. v-if="commonDialogFlag"
  250. :common-dialog-flag.sync="commonDialogFlag"
  251. @reload="getUserResourceList"
  252. ></commonDialog>
  253. <handleFormParserTask
  254. v-if="formParserDialogFlag"
  255. @reload="reload"
  256. :formParserDialogFlag.sync="formParserDialogFlag"
  257. ref="formParserDialogRef"
  258. ></handleFormParserTask>
  259. </div>
  260. </template>
  261. <script>
  262. import { getTodoTaskPage, notifyMessagePageAPI } from '@/api/bpm/task';
  263. import { mapGetters } from 'vuex';
  264. import detail from '@/views/bpm/processInstance/detail.vue';
  265. import handleTask from '@/views/bpm/handleTask/index.vue';
  266. import { deepClone } from 'ele-admin/lib/utils/core';
  267. import vueSeamlessScroll from 'vue-seamless-scroll';
  268. import {
  269. projectsPageAPI,
  270. projectsTaskPageAPI,
  271. userResourceDeleteAPI,
  272. userResourceListAPI,
  273. getList
  274. } from '@/api/home';
  275. import { getWorkOrderPage } from '@/api/tickets';
  276. import { statistics } from '@/api/bpm/components/inspectionManage';
  277. import commonDialog from '@/views/home/common-dialog.vue';
  278. import xyy from '@/assets/xyy.jpg';
  279. import draggable from 'vuedraggable';
  280. import handleFormParserTask from '@/views/bpm/handleTask/formParser/formParserDialog.vue';
  281. export default {
  282. name: 'index',
  283. components: {
  284. handleFormParserTask,
  285. handleTask,
  286. detail,
  287. vueSeamlessScroll,
  288. commonDialog,
  289. draggable
  290. },
  291. data() {
  292. return {
  293. xyy,
  294. list: [],
  295. time: '',
  296. date: '',
  297. week: '',
  298. commonDialogFlag: false,
  299. formParserDialogFlag: false,
  300. updateTimer: null,
  301. projectNum: 0,
  302. taskNum: 0,
  303. workOrderNum: 0,
  304. messageScrollList: [],
  305. defineScroll: {
  306. step: 0.2, // 数值越大速度滚动越快
  307. limitMoveNum: 5, // 开始无缝滚动的数据量 this.dataList.length
  308. hoverStop: true, // 是否开启鼠标悬停stop
  309. direction: 1, // 0向下 1向上 2向左 3向右
  310. openWatch: true, // 开启数据实时监控刷新dom
  311. singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
  312. singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
  313. waitTime: 1000 // 单步运动停止的时间(默认值1000ms)
  314. },
  315. commonList: [],
  316. isDelFlag: false,
  317. columns: [
  318. {
  319. columnKey: 'index',
  320. label: '序号',
  321. type: 'index',
  322. width: 55,
  323. align: 'center',
  324. showOverflowTooltip: true
  325. },
  326. {
  327. prop: 'processInstance.processTypeName',
  328. label: '流程分类',
  329. align: 'center',
  330. showOverflowTooltip: true,
  331. minWidth: 120
  332. },
  333. {
  334. prop: 'processInstance.name',
  335. label: '流程名称',
  336. align: 'center',
  337. showOverflowTooltip: true,
  338. minWidth: 200
  339. },
  340. {
  341. prop: 'name',
  342. label: '任务名称',
  343. align: 'center',
  344. slot: 'name',
  345. showOverflowTooltip: true,
  346. minWidth: 200
  347. },
  348. {
  349. prop: 'businessCode',
  350. label: '单据编码',
  351. align: 'center',
  352. showOverflowTooltip: true,
  353. minWidth: 120
  354. },
  355. {
  356. prop: 'processInstance.startUserNickname',
  357. label: '流程发起人',
  358. align: 'center',
  359. showOverflowTooltip: true,
  360. minWidth: 120
  361. },
  362. // {
  363. // prop: 'suspensionState',
  364. // slot: 'suspensionState',
  365. // label: '状态',
  366. // align: 'center',
  367. // showOverflowTooltip: true,
  368. // minWidth: 200
  369. // },
  370. {
  371. prop: 'createTime',
  372. label: '创建时间',
  373. align: 'center',
  374. showOverflowTooltip: true,
  375. minWidth: 180
  376. },
  377. {
  378. columnKey: 'action',
  379. label: '操作',
  380. width: 200,
  381. align: 'center',
  382. resizable: false,
  383. slot: 'action',
  384. showOverflowTooltip: true
  385. }
  386. ]
  387. };
  388. },
  389. computed: {
  390. ...mapGetters(['user']),
  391. getRoleName() {
  392. const currentUser = JSON.parse(sessionStorage['currentUser']);
  393. return (list = [], type) => {
  394. const dept = list.find(
  395. (item) => item.groupId == currentUser.currentGroupId
  396. );
  397. if (type == 1) {
  398. return dept.groupName;
  399. } else {
  400. return dept.loginChangeRoleVOList.find(
  401. (item) => item.roleId == currentUser.currentRoleId
  402. )?.roleName;
  403. }
  404. };
  405. }
  406. },
  407. created() {
  408. // window.isFullscreen = false
  409. this.updateTimer = setInterval(this.updateTime, 1000);
  410. this.getMessageList();
  411. this.getProjectNum();
  412. this.getTaskNum();
  413. this.getWorkOrderNum();
  414. this.getUserResourceList();
  415. this.getPages();
  416. console.log(this.user);
  417. },
  418. methods: {
  419. openUrl(item) {
  420. window.open(item.linkUrl, '_blank');
  421. },
  422. async getPages() {
  423. let { list } = await getList({ pageNum: 1, size: 9999 });
  424. this.list = list.map((item) => {
  425. return {
  426. ...item,
  427. img:
  428. window.location.origin +
  429. '/api/main/file/getFile?objectName=' +
  430. item.iconPath
  431. };
  432. });
  433. },
  434. async getProjectNum() {
  435. const { count } = await projectsPageAPI({
  436. size: 1,
  437. pageNum: 1,
  438. parentId: '0'
  439. });
  440. this.projectNum = count;
  441. },
  442. async getTaskNum() {
  443. const { count } = await projectsTaskPageAPI({ size: 1, pageNum: 1 });
  444. this.taskNum = count;
  445. },
  446. async getWorkOrderNum() {
  447. const { total } = await statistics();
  448. this.workOrderNum = total;
  449. },
  450. async getUserResourceList() {
  451. this.commonList = await userResourceListAPI();
  452. this.commonList.unshift({
  453. name: '添加',
  454. id: '-1',
  455. icon: 'el-icon-edit'
  456. });
  457. this.commonList.push({
  458. name: '删除',
  459. id: '-999',
  460. icon: 'el-icon-delete'
  461. });
  462. },
  463. handelRouterTo(path) {
  464. window.history.pushState(null, '', path);
  465. // this.$router.push(path);
  466. },
  467. handleAdd(item, index) {
  468. if (item.id == -1) {
  469. this.commonDialogFlag = true;
  470. this.$nextTick(() => {
  471. this.$refs.commonDialogRef.init();
  472. });
  473. } else if (item.id == -999) {
  474. this.isDelFlag = !this.isDelFlag;
  475. this.commonList.pop();
  476. this.commonList.push({
  477. name: `${this.isDelFlag ? '取消删除' : '删除'}`,
  478. id: '-999',
  479. icon: 'el-icon-delete'
  480. });
  481. } else {
  482. if (this.isDelFlag) return this.handleCommonListDel(item, index);
  483. let urlPath = item.topUrl + item.url;
  484. this.handelRouterTo(urlPath);
  485. }
  486. },
  487. async handleCommonListDel(item, index) {
  488. await userResourceDeleteAPI([item.id]);
  489. this.commonList.splice(index, 1);
  490. },
  491. /* 表格数据源 */
  492. datasource({ page, limit, where, order }) {
  493. return getTodoTaskPage({
  494. pageNo: page,
  495. pageSize: limit,
  496. ...this.params
  497. });
  498. },
  499. async getMessageList() {
  500. const { list } = await notifyMessagePageAPI({
  501. pageNum: 1,
  502. size: 9999,
  503. userId: this.user.info.userId
  504. });
  505. this.messageScrollList = deepClone(list);
  506. },
  507. errorHandler(err, vm) {
  508. console.log('图片加载失败');
  509. },
  510. //实时更新日期
  511. updateTime() {
  512. let now = new Date();
  513. let hours = now.getHours();
  514. let minutes = now.getMinutes();
  515. let seconds = now.getSeconds();
  516. this.time =
  517. hours.toString().padStart(2, '0') +
  518. ':' +
  519. minutes.toString().padStart(2, '0') +
  520. ':' +
  521. seconds.toString().padStart(2, '0');
  522. let year = now.getFullYear();
  523. let month = now.getMonth() + 1;
  524. let day = now.getDate();
  525. this.date = year + '年' + month + '月' + day + '日';
  526. let weekInfo = {
  527. 1: '一',
  528. 2: '二',
  529. 3: '三',
  530. 4: '四',
  531. 5: '五',
  532. 6: '六',
  533. 0: '日'
  534. };
  535. this.week = '星期' + weekInfo[now.getDay()];
  536. },
  537. /** 处理审批按钮 */
  538. handleAudit(type, row) {
  539. if (Object.keys(row.formJson).length) {
  540. this.formParserDialogFlag = true;
  541. this.$nextTick(() => {
  542. this.$refs.formParserDialogRef.open({
  543. // id: row.processInstance.id,
  544. // taskId: row.id,
  545. // taskDefinitionKey: row.taskDefinitionKey,
  546. // formJson:row.formJson,
  547. // valueJsom:row.formJson,
  548. ...row
  549. });
  550. });
  551. } else if (type == 'audit') {
  552. this.$refs.handleTaskRef.open({
  553. id: row.processInstance.id,
  554. businessId: row.businessId,
  555. taskId: row.id,
  556. taskDefinitionKey: row.taskDefinitionKey,
  557. pcHandleRouter: row.pcHandleRouter,
  558. pcViewRouter: row.pcViewRouter
  559. });
  560. } else {
  561. this.$refs.detailRef.open(row.processInstance.id);
  562. }
  563. },
  564. /* 刷新表格 */
  565. reload(where) {
  566. this.$refs.table.reload({ page: 1, where });
  567. }
  568. },
  569. deactivated() {
  570. clearInterval(this.updateTimer);
  571. }
  572. };
  573. </script>
  574. <style scoped lang="scss">
  575. .box-container {
  576. // height: 100%;
  577. width: 100%;
  578. padding: 10px;
  579. box-sizing: border-box;
  580. display: flex;
  581. flex-direction: column;
  582. height: calc(100vh - 96px);
  583. // width: calc(100%);
  584. .box-container-top {
  585. height: 22%;
  586. width: 100%;
  587. min-height: 180px;
  588. display: flex;
  589. justify-content: space-between;
  590. .middle-cell:nth-child(1) {
  591. flex: 0 0 75%;
  592. .card-cell-content {
  593. padding: 0;
  594. height: 100%;
  595. background: #2e80ee;
  596. display: flex;
  597. align-items: center;
  598. :hover {
  599. background: #79aef5;
  600. }
  601. .card-cell-value {
  602. cursor: pointer;
  603. height: 100%;
  604. display: flex;
  605. flex: 0 0 25%;
  606. align-items: center;
  607. justify-content: center;
  608. .img1-url {
  609. background-image: url('@/assets/home-logo-1.png');
  610. }
  611. .img2-url {
  612. background-image: url('@/assets/home-logo-2.png');
  613. }
  614. .img3-url {
  615. background-image: url('@/assets/home-logo-3.png');
  616. }
  617. .img4-url {
  618. background-image: url('@/assets/home-logo-4.png');
  619. }
  620. .img-box {
  621. width: 60px;
  622. height: 60px;
  623. position: relative;
  624. background-size: contain;
  625. background-repeat: no-repeat;
  626. }
  627. .text-box {
  628. height: 70px;
  629. display: flex;
  630. flex-direction: column;
  631. justify-content: space-around;
  632. color: #ffffff;
  633. padding: 0 10px;
  634. :nth-child(1) {
  635. font-size: 1.5vw;
  636. font-family: fantasy;
  637. }
  638. :nth-child(2) {
  639. font-size: 1vw;
  640. }
  641. }
  642. }
  643. }
  644. }
  645. .middle-cell:nth-child(2) {
  646. flex: 0 0 24.2%;
  647. .card-cell-info {
  648. padding: 0 10px;
  649. height: 100%;
  650. display: flex;
  651. align-items: center;
  652. justify-content: space-between;
  653. font-weight: bold;
  654. .card-cell-value {
  655. display: flex;
  656. height: 80px;
  657. .text-box {
  658. margin: 0 10px;
  659. display: flex;
  660. flex-direction: column;
  661. justify-content: space-around;
  662. font-size: 0.7vw;
  663. color: #000000;
  664. }
  665. }
  666. .card-cell-date {
  667. height: 80px;
  668. display: flex;
  669. flex-direction: column;
  670. justify-content: space-around;
  671. align-items: flex-end;
  672. color: #000000;
  673. font-size: 0.7vw;
  674. margin: 0 10px;
  675. }
  676. }
  677. }
  678. }
  679. .box-container-middle {
  680. flex: 1 0 auto;
  681. height: 0;
  682. overflow: hidden;
  683. margin: 10px 0;
  684. display: flex;
  685. min-height: 280px;
  686. justify-content: space-between;
  687. .box-container-middl_left {
  688. flex: 0 0 75%;
  689. display: flex;
  690. flex-direction: column;
  691. min-width: 0;
  692. .middle-cell:nth-child(1) {
  693. flex: 1;
  694. margin-bottom: 10px;
  695. .table-box {
  696. height: 100%;
  697. display: flex;
  698. flex-direction: column;
  699. :deep(.el-table) {
  700. flex: 1;
  701. display: flex;
  702. flex-direction: column;
  703. .el-table__body-wrapper {
  704. flex: 1;
  705. overflow-y: auto;
  706. }
  707. }
  708. }
  709. }
  710. .middle-cell:nth-child(2) {
  711. flex: 0 0 130px;
  712. .card-cell-content {
  713. display: flex;
  714. align-items: center;
  715. justify-content: flex-start;
  716. flex-wrap: nowrap;
  717. align-content: center;
  718. height: 100%;
  719. overflow-x: auto;
  720. padding: 0 10px;
  721. .card-cell-content-box {
  722. display: flex;
  723. flex-direction: column;
  724. align-items: center;
  725. height: 80%;
  726. width: 100%;
  727. border: 1px solid #e3e5e4;
  728. justify-content: space-evenly;
  729. flex: 0 0 5.5%;
  730. padding: 8px 0;
  731. border-radius: 5px;
  732. margin-right: 10px;
  733. cursor: pointer;
  734. &:hover {
  735. background: #dee4e9;
  736. }
  737. }
  738. .card-cell-content-div {
  739. height: 100%;
  740. width: 100%;
  741. display: flex;
  742. flex-direction: column;
  743. align-items: center;
  744. justify-content: space-evenly;
  745. }
  746. .card-cell-content-div i {
  747. font-size: 2vw;
  748. }
  749. .card-cell-content-div span {
  750. letter-spacing: 2px;
  751. font-weight: 600;
  752. }
  753. }
  754. .middle-cell {
  755. flex: 0 0 100%;
  756. }
  757. }
  758. :deep(.el-card__body) {
  759. overflow: hidden;
  760. }
  761. }
  762. .box-container-middl_right {
  763. flex: 0 0 24.2%;
  764. display: flex;
  765. flex-direction: column;
  766. min-width: 0;
  767. .middle-cell:nth-child(1) {
  768. flex: 4;
  769. }
  770. .middle-cell:nth-child(2) {
  771. flex: 3;
  772. }
  773. .card-cell_top {
  774. margin-bottom: 10px;
  775. }
  776. :deep(.el-card__body) {
  777. overflow: auto;
  778. .list {
  779. flex: 1;
  780. padding: 10px;
  781. box-sizing: border-box;
  782. .item {
  783. background: url('@/assets/bg.png');
  784. background-repeat: no-repeat;
  785. background-size: 100% 100%;
  786. display: inline-block;
  787. width: 32%;
  788. margin-right: 2%;
  789. aspect-ratio: 16/19;
  790. padding: 10px;
  791. box-sizing: border-box;
  792. margin-bottom: 10px;
  793. border-radius: 5px;
  794. cursor: pointer;
  795. > div:first-child {
  796. flex: 1;
  797. display: flex;
  798. align-items: center;
  799. justify-content: center;
  800. > img {
  801. width: 100%;
  802. aspect-ratio: 16/16;
  803. }
  804. }
  805. > div:last-child {
  806. color: #1383f1;
  807. font-weight: bold;
  808. font-size: 12px;
  809. display: flex;
  810. align-items: center;
  811. justify-content: center;
  812. }
  813. }
  814. .margin_0 {
  815. margin-right: 0;
  816. }
  817. }
  818. }
  819. }
  820. .middle-cell:nth-child(1) {
  821. flex: 0 0 70%;
  822. }
  823. .middle-cell:nth-child(2) {
  824. flex: 0 0 29.2%;
  825. :deep(.el-card__body) {
  826. overflow: auto;
  827. .list {
  828. flex: 1;
  829. padding: 10px;
  830. box-sizing: border-box;
  831. .item {
  832. background: url('@/assets/bg.png');
  833. background-repeat: no-repeat;
  834. background-size: 100% 100%;
  835. display: inline-block;
  836. width: 32%;
  837. margin-right: 2%;
  838. aspect-ratio: 16/20;
  839. padding: 10px;
  840. box-sizing: border-box;
  841. margin-bottom: 10px;
  842. border-radius: 5px;
  843. cursor: pointer;
  844. > div:first-child {
  845. flex: 1;
  846. display: flex;
  847. align-items: center;
  848. justify-content: center;
  849. > img {
  850. width: 100%;
  851. aspect-ratio: 16/16;
  852. }
  853. }
  854. > div:last-child {
  855. color: #1383f1;
  856. font-weight: bold;
  857. padding: 10px;
  858. font-size: 12px;
  859. display: flex;
  860. align-items: center;
  861. justify-content: center;
  862. }
  863. }
  864. .margin_0 {
  865. margin-right: 0;
  866. }
  867. }
  868. }
  869. }
  870. // > div:first-child {
  871. // flex: 0 0 70%;
  872. // display: flex;
  873. // flex-direction: column;
  874. // .table-box {
  875. // height: 100%;
  876. // padding: 10px;
  877. // box-sizing: border-box;
  878. // display: flex;
  879. // flex-direction: column;
  880. // }
  881. // .middle-cell:nth-child(1) {
  882. // flex: 1;
  883. // margin-bottom: 10px;
  884. // }
  885. // .middle-cell:nth-child(2) {
  886. // width: 100%;
  887. // display: flex;
  888. // flex-direction: column;
  889. // height: 200px;
  890. // // min-height: 100px;
  891. // // min-width: 400px;
  892. // .card-cell-content {
  893. // display: flex;
  894. // align-items: center;
  895. // justify-content: flex-start;
  896. // flex-wrap: nowrap;
  897. // align-content: center;
  898. // height: 100%;
  899. // overflow-x: auto;
  900. // padding: 0 10px;
  901. // .card-cell-content-box {
  902. // display: flex;
  903. // flex-direction: column;
  904. // align-items: center;
  905. // height: 80%;
  906. // width: 100%;
  907. // border: 1px solid #e3e5e4;
  908. // justify-content: space-evenly;
  909. // flex: 0 0 5.5%;
  910. // padding: 8px 0;
  911. // border-radius: 5px;
  912. // margin-right: 10px;
  913. // cursor: pointer;
  914. // &:hover {
  915. // background: #dee4e9;
  916. // }
  917. // }
  918. // .card-cell-content-div {
  919. // height: 100%;
  920. // width: 100%;
  921. // display: flex;
  922. // flex-direction: column;
  923. // align-items: center;
  924. // justify-content: space-evenly;
  925. // }
  926. // .card-cell-content-div i {
  927. // font-size: 2vw;
  928. // }
  929. // .card-cell-content-div span {
  930. // letter-spacing: 2px;
  931. // font-weight: 600;
  932. // }
  933. // }
  934. // .middle-cell {
  935. // flex: 0 0 100%;
  936. // }
  937. // }
  938. // }
  939. // > div:nth-child(2) {
  940. // flex: 0 0 29.2%;
  941. // display: flex;
  942. // flex-direction: column;
  943. // .middle-cell:nth-child(1) {
  944. // flex: 1;
  945. // margin-bottom: 10px;
  946. // display: flex;
  947. // flex-direction: column;
  948. // .list {
  949. // flex: 1;
  950. // padding: 10px;
  951. // box-sizing: border-box;
  952. // .item {
  953. // display: inline-block;
  954. // width: 32%;
  955. // margin-right: 2%;
  956. // padding: 5px;
  957. // box-sizing: border-box;
  958. // margin-bottom: 10px;
  959. // border-radius: 5px;
  960. // border: 1px solid #ddd;
  961. // cursor: pointer;
  962. // > div:first-child {
  963. // flex: 1;
  964. // display: flex;
  965. // align-items: center;
  966. // justify-content: center;
  967. // > img {
  968. // height: 60px;
  969. // width: 60px;
  970. // }
  971. // }
  972. // > div:last-child {
  973. // height: 30px;
  974. // font-size: 16px;
  975. // display: flex;
  976. // align-items: center;
  977. // justify-content: center;
  978. // }
  979. // }
  980. // .margin_0 {
  981. // margin-right: 0;
  982. // }
  983. // }
  984. // }
  985. // .middle-cell:nth-child(2) {
  986. // width: 100%;
  987. // display: flex;
  988. // flex-direction: column;
  989. // height: 250px;
  990. // }
  991. // }
  992. }
  993. .box-container-bottom {
  994. width: 100%;
  995. display: flex;
  996. height: 300px;
  997. justify-content: space-between;
  998. .middle-cell:nth-child(1) {
  999. flex: 0 0 70%;
  1000. }
  1001. .middle-cell:nth-child(2) {
  1002. flex: 0 0 29.2%;
  1003. }
  1004. .card-cell-content {
  1005. display: flex;
  1006. align-items: center;
  1007. justify-content: flex-start;
  1008. flex-wrap: nowrap;
  1009. align-content: center;
  1010. height: 100%;
  1011. overflow-x: auto;
  1012. padding: 0 10px;
  1013. .card-cell-content-box {
  1014. display: flex;
  1015. flex-direction: column;
  1016. align-items: center;
  1017. height: 80%;
  1018. width: 100%;
  1019. border: 1px solid #e3e5e4;
  1020. justify-content: space-evenly;
  1021. flex: 0 0 5.5%;
  1022. padding: 8px 0;
  1023. border-radius: 5px;
  1024. margin-right: 10px;
  1025. cursor: pointer;
  1026. &:hover {
  1027. background: #dee4e9;
  1028. }
  1029. }
  1030. .card-cell-content-div {
  1031. height: 100%;
  1032. width: 100%;
  1033. display: flex;
  1034. flex-direction: column;
  1035. align-items: center;
  1036. justify-content: space-evenly;
  1037. }
  1038. .card-cell-content-div i {
  1039. font-size: 2vw;
  1040. }
  1041. .card-cell-content-div span {
  1042. letter-spacing: 2px;
  1043. font-weight: 600;
  1044. }
  1045. }
  1046. .middle-cell {
  1047. flex: 0 0 100%;
  1048. }
  1049. }
  1050. }
  1051. .el-card + .el-card {
  1052. margin-top: 0;
  1053. }
  1054. ::v-deep .el-card__header {
  1055. padding: 10px !important;
  1056. span {
  1057. font-weight: bold;
  1058. }
  1059. }
  1060. ::v-deep .el-card__body {
  1061. height: calc(100% - 40px);
  1062. padding: 0;
  1063. }
  1064. .scroll-box {
  1065. height: 80%;
  1066. width: 100%;
  1067. padding: 25px 0 0 0;
  1068. overflow: hidden;
  1069. .scroll-box-content {
  1070. height: 80%;
  1071. width: 100%;
  1072. position: relative;
  1073. left: 10px;
  1074. .scroll-box-content-dot {
  1075. width: 10px;
  1076. height: 10px;
  1077. background: #ffffff;
  1078. border-radius: 15px;
  1079. border: 2px solid #2d80ee;
  1080. }
  1081. .scroll-box-content-item {
  1082. margin-top: 5px;
  1083. width: 100%;
  1084. display: flex;
  1085. flex-direction: column;
  1086. align-items: flex-start;
  1087. justify-content: flex-start;
  1088. .item-date {
  1089. width: 30%;
  1090. color: #979c9e;
  1091. font-size: 0.7vw;
  1092. line-height: 16px;
  1093. display: inline-block;
  1094. white-space: nowrap;
  1095. overflow: hidden;
  1096. text-overflow: ellipsis;
  1097. }
  1098. .item-text {
  1099. width: 80%;
  1100. color: #555555;
  1101. font-size: 0.7vw;
  1102. line-height: 16px;
  1103. white-space: nowrap;
  1104. overflow: hidden;
  1105. text-overflow: ellipsis;
  1106. margin: 5px 0 0 0px;
  1107. }
  1108. }
  1109. }
  1110. }
  1111. .el-timeline-item {
  1112. list-style-type: none;
  1113. line-height: 19px;
  1114. }
  1115. .el-timeline-item__wrapper {
  1116. padding-left: 17px;
  1117. }
  1118. .el-empty {
  1119. padding: 0;
  1120. }
  1121. .div-del {
  1122. background: #cccccc !important;
  1123. position: relative;
  1124. }
  1125. .div-del::after {
  1126. content: '—';
  1127. position: absolute;
  1128. padding: 5px; /* 按钮的内边距 */
  1129. background-color: rgba(255, 0, 0, 0.91);
  1130. color: white;
  1131. border-radius: 50%;
  1132. }
  1133. </style>