work.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927
  1. <template>
  2. <div class="w100">
  3. <el-row class="flex mt12"
  4. :gutter="12">
  5. <el-col :span="12">
  6. <el-card>
  7. <div slot="header"
  8. class="header">
  9. <h4>科研仪器</h4>
  10. <el-button @click="openUploadDialog">上传</el-button>
  11. </div>
  12. <ul class="cage-list">
  13. <li v-for="v in instrList"
  14. :key="v.id">
  15. <header>
  16. <p>{{ v.instName }}</p>
  17. <el-tag v-if="v.instStatus == '10'"
  18. type="primary"
  19. size="mini">
  20. 正常
  21. </el-tag>
  22. <el-tag v-else-if="v.instStatus == '20'"
  23. type="warning"
  24. size="mini">
  25. 故障
  26. </el-tag>
  27. <el-tag v-else-if="v.instStatus == '30'"
  28. type="danger"
  29. size="mini">
  30. 报废
  31. </el-tag>
  32. </header>
  33. <p>型号:{{ v.instNameEn }}</p>
  34. <p>仪器负责人:{{ v.instHeadName }}</p>
  35. </li>
  36. </ul>
  37. </el-card>
  38. </el-col>
  39. <el-col :span="12">
  40. <el-card header="通知公告">
  41. <div slot="header"
  42. class="header">
  43. <h4>通知公告</h4>
  44. </div>
  45. <div class="link-list">
  46. <ul>
  47. <li v-for="item in noticeList"
  48. :key="item.id">
  49. <div>
  50. {{ item.noticeTitle }}
  51. </div>
  52. <span>{{ item.noticeTime.split(" ")[0] }}</span>
  53. </li>
  54. </ul>
  55. </div>
  56. </el-card>
  57. </el-col>
  58. </el-row>
  59. <el-row class="flex mt12"
  60. :gutter="12">
  61. <el-col :span="12">
  62. <el-card>
  63. <div slot="header"
  64. class="header">
  65. <h4>科研平台</h4>
  66. </div>
  67. <ul class="platform-list">
  68. <li>
  69. <div class="text">
  70. <header>
  71. <p>分子生物平台</p>
  72. <span>单价:¥100/小时</span>
  73. </header>
  74. <p>位置:7栋6层-分子生物平台中心-12号终端</p>
  75. <p>有效时间:1月1日 12:00 -- 1月15日 12:00</p>
  76. </div>
  77. <div class="btn">
  78. <header>
  79. <p>剩余时长</p>
  80. <p class="remain-time">2天18小时</p>
  81. </header>
  82. 小计:¥300
  83. </div>
  84. </li>
  85. <li>
  86. <div class="text">
  87. <header>
  88. <p>分子生物平台</p>
  89. <span>单价:¥100/小时</span>
  90. </header>
  91. <p>位置:7栋6层-分子生物平台中心-12号终端</p>
  92. <p>有效时间:1月1日 12:00 -- 1月15日 12:00</p>
  93. </div>
  94. <div class="btn">
  95. <header>
  96. <p>剩余时长</p>
  97. <p class="remain-time">2天18小时</p>
  98. </header>
  99. 小计:¥300
  100. </div>
  101. </li>
  102. </ul>
  103. </el-card>
  104. <el-card class="mt12">
  105. <div slot="header"
  106. class="header">
  107. <h4>笼位管理(共3个)</h4>
  108. </div>
  109. <ul class="cage-list">
  110. <li>
  111. <header>
  112. <p>实验用小鼠-3只</p>
  113. <el-tag type="primary"
  114. size="mini">正常</el-tag>
  115. </header>
  116. <p>位置:7栋6层-602室 4区12号架 8号笼</p>
  117. <p>到期时间:2月1日(剩余10天)</p>
  118. </li>
  119. <li>
  120. <header>
  121. <p>实验用小鼠-3只-笼位申请</p>
  122. <el-tag type="warning"
  123. size="mini">待分配</el-tag>
  124. </header>
  125. <p>位置:待分配</p>
  126. <p>申请时间:2月1日</p>
  127. </li>
  128. <li>
  129. <header>
  130. <p>实验用小鼠-3只</p>
  131. <el-tag type="primary"
  132. size="mini">正常</el-tag>
  133. </header>
  134. <p>位置:7栋6层-602室 4区12号架 8号笼</p>
  135. <p>到期时间:2月1日(剩余10天)</p>
  136. </li>
  137. </ul>
  138. </el-card>
  139. </el-col>
  140. <el-col :span="12">
  141. <el-card class="calendar">
  142. <div slot="header"
  143. class="header">
  144. <h4>日程安排</h4>
  145. </div>
  146. <FullCalendar class="fullCalendar"
  147. ref="fullCalendar"
  148. :options="calendarOptions" />
  149. <ul>
  150. <li>仪器:需要进行第二期临床实验使用仪器</li>
  151. <li>平台:需要使用平台查找相应的案例</li>
  152. <li>笼位:进行第二次动物实验</li>
  153. <li>技术:约李老师进行第三次技术咨询</li>
  154. </ul>
  155. </el-card>
  156. <el-card class="mt12 cost">
  157. <div slot="header"
  158. class="header">
  159. <h4>费用统计</h4>
  160. </div>
  161. <div class="chart-container">
  162. <div class="text">
  163. <header>课题组:人血球免疫蛋白应用研究课题组</header>
  164. <ul>
  165. <li>费用账单:6条待确认</li>
  166. <li>本月支出:¥567.89</li>
  167. <li>累计支出:¥1234.56</li>
  168. </ul>
  169. </div>
  170. <div id="chart"></div>
  171. </div>
  172. </el-card>
  173. </el-col>
  174. </el-row>
  175. <el-row class="flex mt12 technical"
  176. :gutter="12">
  177. <el-col :span="24">
  178. <el-card>
  179. <div slot="header"
  180. class="header">
  181. <h4>技术服务</h4>
  182. </div>
  183. <p>技术服务 - No.123456 - 李老师</p>
  184. <ul>
  185. <li>11-20:委托发起</li>
  186. <li>11-21:项目确定</li>
  187. <li>11-23:项目开始</li>
  188. <li>11-23:阶段性结果</li>
  189. <li>当前:结尾验收</li>
  190. <li>费用结算</li>
  191. <li>结果上传</li>
  192. </ul>
  193. <p>技术服务 - No.123456 - 李老师</p>
  194. <ul>
  195. <li>11-20:委托发起</li>
  196. <li>11-21:项目确定</li>
  197. <li>11-23:项目开始</li>
  198. <li>11-23:阶段性结果</li>
  199. <li>当前:结尾验收</li>
  200. <li>费用结算</li>
  201. <li>结果上传</li>
  202. </ul>
  203. </el-card>
  204. </el-col>
  205. </el-row>
  206. <FileUploadDialog ref="fileUploadDialogRef"></FileUploadDialog>
  207. </div>
  208. </template>
  209. <script>
  210. import Banner from "../../components/Banner";
  211. import LeftTabs from "@/components/LeftTabs";
  212. import RightContent from "@/components/RightContent";
  213. import * as echarts from "echarts";
  214. import FullCalendar from "@fullcalendar/vue";
  215. import dayGridPlugin from "@fullcalendar/daygrid";
  216. import interactionPlugin from "@fullcalendar/interaction";
  217. import { getNoticeList } from "@/api/login";
  218. import {
  219. getInstrList,
  220. getInstrListByUser,
  221. userCancelAppoint,
  222. } from "@/api/instr";
  223. import { mapGetters } from "vuex";
  224. import moment from "moment";
  225. import to from "await-to-js";
  226. import { getToken } from "@/utils/auth";
  227. import PersonalInfoDialog from "@/components/PersonalInfo";
  228. import FileUploadDialog from "@/views/PersonalCenter/file-upload.vue";
  229. export default {
  230. name: "PersonalCenter",
  231. components: {
  232. Banner,
  233. LeftTabs,
  234. RightContent,
  235. FullCalendar,
  236. PersonalInfoDialog,
  237. FileUploadDialog,
  238. },
  239. data() {
  240. return {
  241. active: -1,
  242. loading: true,
  243. selectTab: {},
  244. searchForm: {
  245. pageNum: 1,
  246. pageSize: 10,
  247. },
  248. total: 0,
  249. options: [
  250. {
  251. label: "工作台",
  252. },
  253. {
  254. label: "预约信息",
  255. },
  256. ],
  257. routeList: [
  258. {
  259. name: "首页",
  260. path: "/",
  261. },
  262. {
  263. name: "个人中心",
  264. },
  265. ],
  266. breadList: [],
  267. calendarOptions: {
  268. height: 300,
  269. plugins: [dayGridPlugin, interactionPlugin], // 需要用哪个插件引入后放到这个数组里
  270. initialDate: new Date(), // 日历第一次加载时显示的初始日期。可以解析为Date的任何职包括ISO8601日期字符串,例如"2014-02-01"。
  271. initialView: "dayGridMonth", // 日历加载时的初始视图,默认值为'dayGridMonth',可以为任何可用视图的值,如例如'dayGridWeek','timeGridDay','listWeek'
  272. locale: "zh-cn", // 设置日历的语言,中文为 “zh-cn”
  273. firstDay: "1", // 设置每周的第一天,默认值取决于当前语言环境,该值为代表星期几的数字,且值必须为整数,星期日=0
  274. weekNumberCalculation: "ISO", // 指定"ISO"结果为ISO8601周数。指定"ISO"将firstDay的默认值更改为1(Monday)
  275. buttonText: {
  276. // 文本将显示在headerToolbar / footerToolbar的按钮上。不支持HTML注入。所有特殊字符将被转义。
  277. today: "今天",
  278. month: "月",
  279. week: "周",
  280. day: "天",
  281. },
  282. headerToolbar: {
  283. // 在日历顶部定义按钮和标题。将headerToolbar选项设置为false不会显示任何标题工具栏。可以为对象提供属性start/center/end或left/center/right。这些属性包含带有逗号/空格分隔值的字符串。用逗号分隔的值将相邻显示。用空格分隔的值之间会显示一个很小的间隙。
  284. right: "today prev,next",
  285. center: "title",
  286. left: "dayGridMonth,dayGridWeek,dayGridDay",
  287. },
  288. eventTimeFormat: {
  289. // 在每个事件上显示的时间的格式
  290. hour: "numeric",
  291. minute: "2-digit",
  292. hour12: false,
  293. },
  294. events: [],
  295. dateClick: this.handleDateClick, // 当用户单击日期或时间时,触发该回调,触发此回调,您必须加载interaction插件
  296. },
  297. instrList: [],
  298. noticeList: [],
  299. curSelectedDate: "w",
  300. curTime: "",
  301. appointData: [],
  302. WEEKS: [
  303. "星期日",
  304. "星期一",
  305. "星期二",
  306. "星期三",
  307. "星期四",
  308. "星期五",
  309. "星期六",
  310. ],
  311. };
  312. },
  313. computed: {
  314. ...mapGetters(["userInfo"]),
  315. },
  316. mounted() {
  317. this.curTime = this.getToday();
  318. this.initChart();
  319. this.getNotice();
  320. this.getInstr();
  321. },
  322. beforeDestroy() {
  323. this.chart && this.chart.dispose()
  324. },
  325. methods: {
  326. moment,
  327. // 獲取當前日期
  328. getToday() {
  329. return moment(moment().startOf("day").valueOf()).format("YYYY-MM-DD");
  330. },
  331. getYesterday() {
  332. this.curTime = moment(
  333. moment(this.curTime).add(-1, "days").startOf("day").valueOf()
  334. ).format("YYYY-MM-DD");
  335. },
  336. getTomorrow() {
  337. this.curTime = moment(
  338. moment(this.curTime).add(+1, "days").startOf("day").valueOf()
  339. ).format("YYYY-MM-DD");
  340. },
  341. getPrevWeekDays() {
  342. this.curTime = moment(this.curTime)
  343. .subtract(1, "week")
  344. .format("YYYY-MM-DD");
  345. },
  346. getNextWeekDays() {
  347. this.curTime = moment(this.curTime).add(1, "week").format("YYYY-MM-DD");
  348. },
  349. getPrevMonthDays() {
  350. this.curTime = moment(this.curTime)
  351. .subtract(1, "months")
  352. .format("YYYY-MM-DD");
  353. },
  354. getNextMonthDays() {
  355. this.curTime = moment(this.curTime).add(1, "months").format("YYYY-MM-DD");
  356. },
  357. getWeekDate() {
  358. // 获取当前周的周一0点
  359. var startOfWeek = moment(this.curTime)
  360. .startOf("isoWeek")
  361. .format("YYYY-MM-DD HH:mm:ss");
  362. // 获取下一周的周一0点
  363. var startOfNextWeek = moment(this.curTime)
  364. .startOf("isoWeek")
  365. .add(1, "weeks")
  366. .format("YYYY-MM-DD HH:mm:ss");
  367. return [startOfWeek, startOfNextWeek];
  368. },
  369. getMonthDate() {
  370. const date = moment(this.curTime);
  371. // 获取当前月份的最后一天
  372. return [
  373. date.startOf("month").format("YYYY-MM-DD HH:mm:ss"),
  374. date.endOf("month").add(1, "days").format("YYYY-MM-DD") + " 00:00:00",
  375. ];
  376. },
  377. // 上一周、天、月
  378. handlePrev() {
  379. if (this.curSelectedDate == "d") {
  380. this.getYesterday();
  381. } else if (this.curSelectedDate == "w") {
  382. this.getPrevWeekDays();
  383. } else if (this.curSelectedDate == "m") {
  384. this.getPrevMonthDays();
  385. }
  386. this.getAppointList();
  387. },
  388. // 下一周、天、月
  389. handleNext() {
  390. if (this.curSelectedDate == "d") {
  391. this.getTomorrow();
  392. } else if (this.curSelectedDate == "w") {
  393. this.getNextWeekDays();
  394. } else if (this.curSelectedDate == "m") {
  395. this.getNextMonthDays();
  396. }
  397. this.getAppointList();
  398. },
  399. selectDate(date) {
  400. this.curSelectedDate = date;
  401. this.getAppointList();
  402. },
  403. async getAppointList() {
  404. let startTimeStart = "";
  405. let startTimeEnd = "";
  406. if (this.curSelectedDate == "d") {
  407. startTimeStart = moment(this.curTime).format("YYYY-MM-DD HH:mm:ss");
  408. startTimeEnd = moment(this.curTime)
  409. .add(1, "days")
  410. .format("YYYY-MM-DD HH:mm:ss");
  411. } else if (this.curSelectedDate == "w") {
  412. startTimeStart = this.getWeekDate()[0];
  413. startTimeEnd = this.getWeekDate()[1];
  414. } else if (this.curSelectedDate == "m") {
  415. startTimeStart = moment(this.curTime)
  416. .startOf("month")
  417. .format("YYYY-MM-DD HH:mm:ss");
  418. startTimeEnd = this.getMonthDate()[1];
  419. }
  420. const [err, res] = await to(
  421. getInstrListByUser({
  422. startTimeStart,
  423. startTimeEnd,
  424. ...this.searchForm,
  425. })
  426. );
  427. if (err) return;
  428. this.appointData = res.data.list;
  429. this.total = res.data.total;
  430. },
  431. setStatus(key) {
  432. let str = "";
  433. switch (key) {
  434. case "10":
  435. str = "待审核";
  436. break;
  437. case "11":
  438. str = "已退回";
  439. break;
  440. case "20":
  441. str = "已通过";
  442. break;
  443. case "30":
  444. str = "已驳回";
  445. break;
  446. case "40":
  447. str = "已取消";
  448. break;
  449. case "50":
  450. str = "已上机";
  451. break;
  452. case "60":
  453. str = "已完成";
  454. break;
  455. case "70":
  456. str = "审核超时";
  457. break;
  458. case "80":
  459. str = "超时取消";
  460. break;
  461. case "90":
  462. str = "超时未上机";
  463. break;
  464. }
  465. return str;
  466. },
  467. getBreachTypes(row) {
  468. let breachTypes = [];
  469. if (row.isLate) breachTypes.push("迟到");
  470. if (row.isOvertime) breachTypes.push("超时");
  471. if (row.isLeaveEarly) breachTypes.push("早退");
  472. if (row.isAbsence) breachTypes.push("爽约");
  473. return breachTypes.join("、") || "-";
  474. },
  475. // 取消预约
  476. cancelAppoint(row) {
  477. // 删除附件
  478. this.$confirm("确认取消预约?", "提示", {
  479. confirmButtonText: "确认",
  480. cancelButtonText: "取消",
  481. type: "warning",
  482. })
  483. .then(async () => {
  484. const post = userCancelAppoint({ id: Number(row.id) });
  485. const [err] = await to(post);
  486. if (err) return;
  487. this.$message.success("取消成功");
  488. this.getAppointList();
  489. })
  490. .catch(() => {});
  491. },
  492. // 编辑预约
  493. handleEditAppoint(row) {
  494. const token = getToken();
  495. if (!token) {
  496. return this.$router.push("/login");
  497. }
  498. this.$refs.appointCreateRef.openDialog(row);
  499. },
  500. // 选择tab
  501. tabSelect(row, index) {
  502. this.active = index;
  503. this.selectTab = { ...row };
  504. this.breadList = [...this.routeList, { name: this.selectTab.label }];
  505. if (index == 1) {
  506. this.getAppointList();
  507. }
  508. },
  509. async getNotice() {
  510. const [err, res] = await to(getNoticeList());
  511. if (err) return;
  512. this.noticeList = res.data.list || [];
  513. },
  514. async getInstr() {
  515. const [err, res] = await to(getInstrList({ pageSize: 4, pageNum: 1 }));
  516. if (err) return;
  517. this.instrList = res.data.list || [];
  518. },
  519. initChart() {
  520. let chart = echarts.init(document.getElementById("chart"));
  521. const options = {
  522. series: [
  523. {
  524. type: "gauge",
  525. startAngle: 180,
  526. endAngle: 0,
  527. center: ["50%", "75%"],
  528. radius: "90%",
  529. min: 0,
  530. max: 1,
  531. splitNumber: 8,
  532. axisLine: {
  533. lineStyle: {
  534. width: 6,
  535. color: [
  536. [0.25, "#FF6E76"],
  537. [0.5, "#FDDD60"],
  538. [0.75, "#58D9F9"],
  539. [1, "#7CFFB2"],
  540. ],
  541. },
  542. },
  543. pointer: {
  544. icon: "path://M12.8,0.7l12,40.1H0.7L12.8,0.7z",
  545. length: "12%",
  546. width: 20,
  547. offsetCenter: [0, "-60%"],
  548. itemStyle: {
  549. color: "auto",
  550. },
  551. },
  552. axisTick: {
  553. length: 12,
  554. lineStyle: {
  555. color: "auto",
  556. width: 2,
  557. },
  558. },
  559. splitLine: {
  560. length: 20,
  561. lineStyle: {
  562. color: "auto",
  563. width: 5,
  564. },
  565. },
  566. axisLabel: {
  567. color: "#464646",
  568. fontSize: 14,
  569. distance: -40,
  570. rotate: "tangential",
  571. formatter: function (value) {
  572. if (value === 0.875) {
  573. return "充足";
  574. } else if (value === 0.625) {
  575. return "可控";
  576. } else if (value === 0.375) {
  577. return "紧张";
  578. } else if (value === 0.125) {
  579. return "危险";
  580. }
  581. return "";
  582. },
  583. },
  584. title: {
  585. offsetCenter: [0, "-10%"],
  586. fontSize: 14,
  587. },
  588. detail: {
  589. fontSize: 20,
  590. offsetCenter: [0, "-35%"],
  591. valueAnimation: true,
  592. formatter: function (value) {
  593. return Math.round(value * 100) + "";
  594. },
  595. color: "inherit",
  596. },
  597. data: [
  598. {
  599. value: 0.7,
  600. name: "危险预算余额",
  601. },
  602. ],
  603. },
  604. ],
  605. };
  606. chart.setOption(options);
  607. },
  608. handleDateClick(dateClickInfo) {
  609. console.log(dateClickInfo);
  610. },
  611. handleSizeChange(val) {
  612. this.searchForm.pageSize = val;
  613. this.getAppointList();
  614. },
  615. handleCurrentChange(val) {
  616. this.searchForm.pageNum = val;
  617. this.getAppointList();
  618. },
  619. openUploadDialog() {
  620. console.log('传递参数:id为申请单id')
  621. this.$refs.fileUploadDialogRef.openDialog(1);
  622. }
  623. },
  624. };
  625. </script>
  626. <style lang="scss" scoped>
  627. .center-banner {
  628. background: url(../../assets/img/center-banner.png) top no-repeat;
  629. background-size: 100% 240px;
  630. height: 240px;
  631. display: flex;
  632. justify-content: center;
  633. align-items: center;
  634. .content {
  635. height: 180px;
  636. width: 1200px;
  637. border-radius: 16px;
  638. background-color: rgba($color: #fff, $alpha: 0.5);
  639. display: flex;
  640. align-items: center;
  641. justify-content: space-between;
  642. padding: 0 40px;
  643. .user {
  644. display: flex;
  645. align-items: center;
  646. img {
  647. height: 100px;
  648. width: 100px;
  649. border-radius: 50%;
  650. }
  651. p {
  652. height: 100px;
  653. display: flex;
  654. flex-direction: column;
  655. justify-content: space-around;
  656. margin-left: 12px;
  657. span:nth-child(1) {
  658. font-weight: bold;
  659. font-size: 18px;
  660. }
  661. span:nth-child(3) {
  662. font-weight: bold;
  663. }
  664. }
  665. }
  666. .btns {
  667. display: flex;
  668. align-items: center;
  669. > p {
  670. display: flex;
  671. align-items: center;
  672. margin-right: 20px;
  673. line-height: 30px;
  674. font-weight: bold;
  675. span {
  676. font-size: 30px;
  677. font-weight: bold;
  678. color: #1d66dc;
  679. font-style: italic;
  680. }
  681. }
  682. }
  683. }
  684. }
  685. .flex {
  686. width: 100%;
  687. flex-wrap: wrap;
  688. .el-card {
  689. flex: 0 0 calc(50% - 14px);
  690. height: 400px;
  691. ::v-deep .el-card__body {
  692. padding: 10px;
  693. height: calc(100% - 79px);
  694. }
  695. &.calendar {
  696. height: 500px;
  697. ul {
  698. display: flex;
  699. flex-direction: column;
  700. justify-content: space-around;
  701. height: 130px;
  702. li {
  703. font-size: 14px;
  704. display: flex;
  705. align-items: center;
  706. &:before {
  707. content: "";
  708. display: inline-block;
  709. width: 6px;
  710. height: 6px;
  711. border-radius: 3px;
  712. background-color: #a30014;
  713. margin-right: 4px;
  714. }
  715. }
  716. }
  717. }
  718. &.cost {
  719. height: 300px;
  720. }
  721. }
  722. &.technical .el-card {
  723. height: auto;
  724. ::v-deep .el-card__body {
  725. height: auto;
  726. }
  727. }
  728. }
  729. .cage-list {
  730. display: flex;
  731. flex-wrap: wrap;
  732. list-style: none;
  733. li {
  734. height: 160px;
  735. width: 221px;
  736. font-size: 14px;
  737. border: 1px solid #ebeef5;
  738. border-radius: 6px;
  739. display: flex;
  740. flex-direction: column;
  741. justify-content: space-around;
  742. padding: 10px;
  743. &:nth-child(2n) {
  744. margin-left: 4px;
  745. }
  746. &:nth-child(n + 3) {
  747. margin-top: 4px;
  748. }
  749. header {
  750. display: flex;
  751. justify-content: space-between;
  752. p {
  753. color: #1d66dc;
  754. }
  755. }
  756. }
  757. }
  758. .platform-list {
  759. height: 100%;
  760. display: flex;
  761. flex-direction: column;
  762. li {
  763. flex: 1;
  764. display: flex;
  765. align-items: center;
  766. margin: 12px;
  767. border-radius: 8px;
  768. overflow: hidden;
  769. border: 1px solid #ebeef5;
  770. .text {
  771. flex: 1;
  772. height: 100%;
  773. padding: 12px;
  774. }
  775. .btn {
  776. width: 120px;
  777. height: 100%;
  778. color: #fff;
  779. font-size: 20px;
  780. background-color: #73b9b9;
  781. display: flex;
  782. flex-direction: column;
  783. align-items: center;
  784. justify-content: space-around;
  785. header {
  786. font-size: 14px;
  787. }
  788. .remain-time {
  789. color: #f56c6c;
  790. }
  791. }
  792. }
  793. }
  794. .chart-container {
  795. display: flex;
  796. .text {
  797. flex: 1;
  798. font-size: 14px;
  799. display: flex;
  800. flex-direction: column;
  801. header {
  802. color: #1d66dc;
  803. }
  804. ul {
  805. margin-top: 12px;
  806. flex: 1;
  807. display: flex;
  808. flex-direction: column;
  809. justify-content: space-around;
  810. }
  811. li {
  812. background-color: #e4b5bb;
  813. border-radius: 4px;
  814. padding: 4px 8px;
  815. }
  816. }
  817. #chart {
  818. width: 233px;
  819. height: 220px;
  820. }
  821. }
  822. .technical {
  823. p {
  824. font-size: 16px;
  825. height: 24px;
  826. line-height: 24px;
  827. }
  828. ul {
  829. display: flex;
  830. height: 50px;
  831. line-height: 50px;
  832. border-radius: 4px;
  833. overflow: hidden;
  834. margin: 20px 0;
  835. li {
  836. flex: 1;
  837. text-align: center;
  838. background-color: #d9fba5;
  839. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
  840. &:nth-child(2) {
  841. background-color: #98ca49;
  842. }
  843. &:nth-child(3) {
  844. background-color: #a4dffa;
  845. }
  846. &:nth-child(4) {
  847. background-color: #48bff4;
  848. }
  849. &:nth-child(5) {
  850. background-color: #b6b6f1;
  851. }
  852. &:nth-child(6) {
  853. background-color: #ebcda7;
  854. }
  855. &:nth-child(7) {
  856. background-color: #f2a4ad;
  857. }
  858. }
  859. }
  860. }
  861. .toolbar-wrap {
  862. height: 30px;
  863. display: flex;
  864. justify-content: space-between;
  865. align-items: center;
  866. // margin-bottom: 20px;
  867. .switch-date {
  868. width: 108px;
  869. height: 28px;
  870. border-radius: 2px;
  871. border: 1px solid #b5c1d8;
  872. display: flex;
  873. padding: 4px 6px 0;
  874. .btn {
  875. cursor: pointer;
  876. flex: 1;
  877. font-size: 13px;
  878. color: #585858;
  879. display: flex;
  880. align-items: center;
  881. justify-content: center;
  882. &.actived {
  883. background: #eef3fe;
  884. font-weight: bold;
  885. color: #2c78ff;
  886. }
  887. }
  888. }
  889. .date-wrap {
  890. display: flex;
  891. align-items: center;
  892. :deep(.el-button--small.is-circle) {
  893. width: 26px;
  894. height: 26px;
  895. display: flex;
  896. align-items: center;
  897. justify-content: center;
  898. }
  899. .date {
  900. margin: 0 10px;
  901. font-size: 14px;
  902. color: #585858;
  903. display: flex;
  904. align-items: center;
  905. }
  906. .week {
  907. color: #2c78ff;
  908. padding-left: 6px;
  909. }
  910. }
  911. }
  912. .table-wrap {
  913. flex: 1;
  914. margin: 20px 0 0;
  915. // overflow: hidden;
  916. }
  917. .pagination {
  918. width: 100%;
  919. height: 50px;
  920. display: flex;
  921. align-items: center;
  922. justify-content: flex-end;
  923. }
  924. </style>