123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563 |
- <!--
- * @Author: ysh
- * @Date: 2024-01-03 09:23:11
- * @LastEditors: wrh
- * @LastEditTime: 2025-02-28 09:16:34
- -->
-
- <template>
- <div class="app-container home">
- <el-row :gutter="20">
- <el-col :span="6" :xs="24">
- <div class="header">个人信息</div>
- <div class="user-wrapper">
- <div class="avatar">
- <img :src="avatar" class="user-avatar" />
- </div>
- <div class="username">
- <div>{{ user.nickName }}</div>
- <div style="font-size: 14px;color:#bbb;font-weight:lighter;">
- <el-tag type="warning">{{ post.length == 0 ? '未设置职位' : post.join(' / ') }}</el-tag>
- </div>
- </div>
- <div class="user-info">
- <el-row :gutter="20" style="margin:10px">
- <el-col :span="10" style="text-align: right;">所属部门:</el-col>
- <el-col :span="14" style="text-align: left;">{{ user.dept.deptName }}</el-col>
- </el-row>
- <el-row :gutter="20">
- <el-col :span="10" style="text-align: right;">技术职称:</el-col>
- <el-col :span="14" style="text-align: left;">{{ user.titles }}</el-col>
- </el-row>
- </div>
- </div>
- </el-col>
- <el-col :span="18" :xs="24">
- <div class="header">快捷入口</div>
- <div class="nav-wrapper">
- <div class="nav-item" v-for="nav in navItem" @click="goToPath(nav.path)" v-hasPermi="nav.privilege">
- <el-badge :value="formartBadge(nav.id)" :max="99" class="item">
- <div class="nav-logo" :style="{ 'background-color': nav.bgColor, 'box-shadow': nav.boxShadow }">
- <div class="icon">
- <svg-icon slot="prefix" :icon-class="nav.icon" class="el-input__icon input-icon" />
- </div>
- </div>
- </el-badge>
- <div class="nav-text">{{ nav.name }}</div>
- </div>
- </div>
- </el-col>
-
- </el-row>
- <el-row :gutter="20">
- <el-col :span="10" :xs="24">
- <div class="header">通知公示</div>
- <div class="notice-content">
- <el-table v-loading="noticeLoading" :data="noticeList" height="320px">
- <!-- <el-table-column label="序号" align="center" prop="noticeId" width="100" /> -->
- <el-table-column label="类型" align="center" prop="noticeType" width="100">
- <template slot-scope="scope">
- <dict-tag :options="dict.type.sys_notice_type" :value="scope.row.noticeType" />
- </template>
- </el-table-column>
- <el-table-column label="标题" align="center" prop="noticeTitle" :show-overflow-tooltip="true" />
- <el-table-column label="创建者" align="center" prop="createBy" width="100" />
- <el-table-column label="创建时间" align="center" prop="createTime" width="100">
- <template slot-scope="scope">
- <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
- </template>
- </el-table-column>
- <el-table-column label="操作" width="90" align="center">
- <template slot-scope="scope">
- <el-button size="mini" type="text" icon="el-icon-view"
- @click="handleRowClick(scope.row)">查看详情</el-button>
- </template>
- </el-table-column>
- </el-table>
- <div style="text-align: right;margin-top: 20px;">
- <el-pagination @current-change="getNotice" :current-page.sync="noticeQueryParams.pageNum"
- :page-size="noticeQueryParams.pageSize" layout="total, prev, pager, next,jumper" :total="noticeTotal">
- </el-pagination>
- </div>
-
- </div>
- </el-col>
- <el-col :span="14" :xs="24">
- <div class="header">待办任务</div>
- <div class="calendar-warpper">
- <el-table v-loading="taskLoading" :data="todoList" height="400px">
- <el-table-column type="index" label="序号" width="55" align="center" />
- <el-table-column label="流程名称" align="center" prop="procDefName" />
- <el-table-column label="标题" align="center" prop="title" show-overflow-tooltip />
- <el-table-column label="当前节点" align="center" prop="taskName" />
- <el-table-column label="流程发起人" align="center">
- <template slot-scope="scope">
- <label>{{ scope.row.startUserName }} <el-tag type="info" size="mini">{{ scope.row.startDeptName
- }}</el-tag></label>
- </template>
- </el-table-column>
- <el-table-column label="接收时间" align="center" prop="createTime" width="180" />
- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
- <template slot-scope="scope">
- <el-button size="mini" type="text" icon="el-icon-edit-outline" @click="handleProcess(scope.row)">处理
- </el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- </el-col>
- </el-row>
-
- <el-dialog title="" :visible.sync="noticeOpen" width="750px" append-to-body>
- <h2 class="text-center">{{ clickNotice.noticeTitle }}</h2>
- <div class="pre-formatted" v-html="clickNotice.noticeContent"></div>
- </el-dialog>
- </div>
- </template>
-
- <script>
- import { mapGetters } from "vuex";
- import { getUserProfile, getUser } from "@/api/system/user";
- import { listProject } from "@/api/oa/project/project";
- import { todoList } from "@/api/flowable/todo";
- import { finishedList } from "@/api/flowable/finished";
- import Calendar from '@/components/Calendar';
- import { listNotice } from "@/api/system/notice";
- import { getProcessVariables } from "@/api/flowable/definition"
- export default {
- dicts: ['sys_notice_status', 'sys_notice_type'],
- components: {
- Calendar
- },
- computed: {
- ...mapGetters(["avatar", "userId"]),
- },
- created() {
- this.getUserbyId();
- this.getDetail();
- this.getProject();
- this.getNotice();
- },
- data() {
- return {
- noticeOpen: false,
- times: new Date(),
- user: {
- dept: {}
- },
- post: [],
- noticeData: [],
- projectData: [],
- noticeList: [],// 数据
- noticeTotal: 0,
- clickNotice: {},
- todoList: [],
- noticeLoading: true,
- taskLoading: true,
- noticeQueryParams: {
- pageNum: 1,
- pageSize: 10
- },
- projectQueryParams: {
- pageNum: 1,
- pageSize: 16
- },
- projectTotal: 0,
- detail: 0,
- finish: 0,
- engineerLevel: '',
- titles: '',
- navItem: [
- {
- id: 1,
- name: '发起流程',
- icon: 'cascader',
- bgColor: '#785aee',
- boxShadow: '0 5px 20px rgba(120,90,238,0.5)',
- path: '/task/process',
- privilege: ['system:deployment:add']
- }, {
- id: 2,
- name: '待办任务',
- icon: 'log',
- bgColor: '#e66794',
- boxShadow: '0 5px 20px rgba(230,103,148,0.5)',
- path: '/task/todo',
- privilege: ['system:deployment:add']
- }, {
- id: 3,
- name: '已办任务',
- icon: 'excel',
- bgColor: '#6389f4',
- boxShadow: '0 5px 20px rgba(99,137,244,0.5)',
- path: '/task/finished',
- privilege: ['system:deployment:add']
- }, {
- id: 4,
- name: '项目台账',
- icon: 'dict',
- bgColor: '#e64c56',
- boxShadow: '0 5px 20px rgba(230,76,86,0.5)',
- path: '/product/account/project',
- privilege: ['oa:project:query']
- }, {
- id: 5,
- name: '车辆管理',
- icon: 'car',
- bgColor: '#eeb62f',
- boxShadow: '0 5px 20px rgba(238,182,47,0.5)',
- path: '/oa/car/index',
- privilege: ['oa:car:list']
- }, {
- id: 6,
- name: '设备管理',
- icon: 'lock',
- bgColor: '#0be1bd',
- boxShadow: '0 5px 20px rgba(11,225,189,0.5)',
- path: '/oa/device/equipment',
- privilege: ['oa:device:list']
- }, {
- id: 7,
- name: '承接合同',
- icon: 'contractSign',
- bgColor: '#F7C59F',
- boxShadow: '0 5px 20px rgba(247,197,159,0.5)',
- path: '/business/contract/contract',
- privilege: ['oa:contract:list']
- }, {
- id: 8,
- name: '人事管理',
- icon: 'dept',
- bgColor: '#20B2AA',
- boxShadow: '0 5px 20px rgba(32,178,170,0.5)',
- path: '/oa/staff/people',
- privilege: ['oa:salary:list']
- },{
- id: 9,
- name: '项目结算',
- icon: 'settle',
- bgColor: '#ff6f61',
- boxShadow: '0 5px 20px rgba(255,111,97,0.5)',
- path: '/product/settle/project',
- privilege: ['oa:settle:list']
- },{
- id: 10,
- name: '借款管理',
- icon: 'borrow',
- bgColor: '#001a6e',
- boxShadow: '0 5px 20px rgba(0,26,110,0.5)',
- path: '/product/budget/borrow',
- privilege: ['oa:borrow:list']
- },
- // {
- // id: 9,
- // name: '预算管理',
- // icon: 'form',
- // bgColor: '#E64A19',
- // boxShadow: '0 5px 20px rgba(230,74,25,0.5)',
- // path: '/budget'
- // }
- ]
- }
- },
- methods: {
- goToPath(path) {
- this.$router.push({ path: path });
- },
- getUserbyId() {
- getUser(this.userId).then(response => {
- this.user = response.data;
- for (let p of response.posts) {
- for (let ids of response.postIds) {
- if (p.postId == ids) {
- this.post.push(p.postName)
- }
- }
- }
- this.getDicts("sys_user_titles").then(res => {
- if (this.user.titles != "" && this.user.titles != null && this.user.titles != undefined) {
- let titles = this.user.titles.split(',');
- let arr = []
- for (let t of titles) {
- arr.push(res.data[t].dictLabel)
- }
- this.user.titles = arr.join(' / ')
- }
- })
- });
- },
- // 获取项目列表
- getProject() {
- listProject(this.projectQueryParams).then(response => {
- this.projectData = response.rows;
- this.projectTotal = response.total;
- })
- },
- // 获取考核待办
- getDetail() {
- this.taskLoading = true;
- todoList({
- pageNum: 1,
- pageSize: 999,
- name: null
- }).then(response => {
- this.detail = response.data.total;
- this.todoList = response.data.records;
- this.taskLoading = false;
- });
- },
- getFinish() {
- finishedList({
- pageNum: 1,
- pageSize: 10,
- name: null,
- category: null,
- key: null,
- tenantId: null,
- deployTime: null,
- derivedFrom: null,
- derivedFromRoot: null,
- parentDeploymentId: null,
- engineVersion: null
- }).then(response => {
- this.finish = response.data.total;
- })
- },
- // 获取列表
- getNotice() {
- listNotice(this.noticeQueryParams).then(response => {
- this.noticeList = response.rows;
- this.noticeTotal = response.total;
- this.noticeLoading = false;
- });
- },
- formartBadge(id) {
- if (id == 2) {
- return this.detail
- } else {
- return null
- }
- },
- handleRowClick(row) {
- this.clickNotice = row;
- this.clickNotice.noticeContent = this.format(row.noticeContent);
- this.noticeOpen = true;
- },
- format(html) {
- var GRT = [
- // img 样式
- ['img', "max-width:100%;height:auto;"],
- ];
- for (let i = 0; i < GRT.length; i++) {
- html = html.replace(new RegExp('<' + GRT[i][0] + '>|<' + GRT[i][0] + ' (.*?)>', 'gi'), function (word) {
- // 分析 dom 上是否带有 style=""
- if (word.indexOf('style=') != -1) {
- var regIn = new RegExp('<' + GRT[i][0] + '(.*?)style="(.*?)"(.*?)(/?)>', 'gi');
- return word.replace(regIn, '<' + GRT[i][0] + '$1style="$2 ' + GRT[i][1] + '"$3$4>');
- } else {
- var regIn = new RegExp('<' + GRT[i][0] + '(.*?)(/?)>', 'gi');
- return word.replace(regIn, '<' + GRT[i][0] + '$1 style="' + GRT[i][1] + '$2">');
- }
- });
- }
- return html;
- },
- handleProcess(row) {
- let path = this.getRoutePath(row);
- getProcessVariables(row.taskId).then(res => {
- this.$router.push({
- path: path,
- query: {
- procInsId: row.procInsId,
- executionId: row.executionId,
- deployId: row.deployId,
- taskId: row.taskId,
- taskName: row.taskName,
- startUser: row.startUserName + '-' + row.startDeptName,
- formId: res.data.formId,
- procDefName: row.procDefName
- }
- })
- })
- },
- getRoutePath(row) {
- let path;
- for (let p of this.publicData.pathRoute) {
- if (p.name == row.procDefName) {
- path = p.path
- break
- } else {
- path = '/flowable/task/todo/detail/index'
- }
- }
- return path
- }
- }
- }
- </script>
- <style scoped lang="scss">
- .home {
- padding: 20px 40px;
- background-color: #f0f4f7;
- width: 100%;
- // height: calc(100vh - 100px);
- }
-
- .header {
- font-size: 20px;
- line-height: 60px;
- }
-
- .nav-wrapper {
- display: flex;
- flex-wrap: wrap;
- gap: 15px;
-
- .nav-item {
- background-color: #ffffff;
- // max-width: 240px;
- // width: 220px;
- flex-grow: 1;
- height: 120px;
- border-radius: 10px;
- display: flex;
- align-items: center;
- padding: 0 30px;
- margin-bottom: 10px;
-
- .nav-logo {
- width: 55px;
- height: 55px;
- border-radius: 10px;
- margin-right: 20px;
- text-align: center;
- line-height: 55px;
-
- .icon {
- font-size: 27px;
- color: #ffffff;
- }
- }
-
- .nav-text {
- font-size: 18px;
-
- }
- }
-
- .nav-item:hover {
- cursor: pointer;
- box-shadow: 0 0 15px rgba($color: #242d42, $alpha: 0.1);
- }
- }
-
- .user-wrapper {
- background-color: #ffffff;
- height: 267px;
- border-radius: 10px;
-
- .avatar {
- text-align: center;
- // padding: 10px 0;
-
- .user-avatar {
- width: 100px;
- height: 100px;
- border-radius: 50%;
- }
- }
-
- .username {
- text-align: center;
- font-size: 18px;
- font-weight: bold;
- font-family: '微软雅黑';
- }
-
- .user-info {
- text-align: center;
-
- table {
- margin: 0 auto;
- }
- }
- }
-
- .notice-content {
- width: 100%;
- height: 400px;
- background-color: #ffffff;
- border-radius: 15px;
- padding: 20px 15px 0;
- }
-
- .calendar-warpper {
- padding: 10px;
- width: 100%;
- height: 400px;
- background-color: #ffffff;
- border-radius: 15px;
- }
-
- .project-content {
- width: 100%;
- height: 400px;
- background-color: #ffffff;
- border-radius: 15px;
- }
-
- .pre-formatted {
- white-space: pre-wrap;
- /* css-2.1, curent FF, Opera, Safari */
- word-wrap: break-word;
-
- /* Internet Explorer 5.5+ */
- p {
- width: 100% !important;
- height: 100% !important;
-
- img {
- width: 100%;
- height: 100%;
- }
- }
- }
-
- ::v-deep .el-calendar-table .el-calendar-day {
- height: 39px;
- text-align: center;
- line-height: 26px;
- }
-
- ::v-deep .el-calendar-table .el-calendar-day:hover {
- color: #242d42;
- }
-
- ::v-deep .el-calendar__body {
- padding: 15px 31px 10px;
- }
-
- ::v-deep .el-calendar__header {
- padding: 20px;
- }
-
- ::v-deep .el-calendar-table td.is-today {
- background-color: #1890ff;
- border-radius: 10px;
- color: #ffffff;
- box-shadow: 0 0 10px rgba($color: #1890ff, $alpha: 0.2);
- }
-
- ::v-deep .el-calendar-table td.is-selected {
- // color: #242d42;
- }
-
- ::v-deep .el-calendar-table td {
- border-right: none;
- }
-
- ::v-deep .el-table .el-table__header-wrapper th,
- .el-table .el-table__fixed-header-wrapper th {
- background-color: #ffffff;
- }
- </style>
|