index.vue 35 KB

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