ysc 2 лет назад
Родитель
Сommit
3bf0e94818

+ 10 - 0
src/api/meeting/meeting.js

@@ -94,3 +94,13 @@ export function confirmMeetings(id){
   })
 }
 
+/**
+ * 获取待办会议列表
+ * @returns {AxiosPromise}
+ */
+export function getTodoMeetings(){
+  return request({
+    url: '/meeting/getTodoMeetings',
+    method: 'get'
+  })
+}

+ 44 - 0
src/components/Hamburger/index.vue

@@ -0,0 +1,44 @@
+<template>
+  <div style="padding: 0 15px;" @click="toggleClick">
+    <svg
+      :class="{'is-active':isActive}"
+      class="hamburger"
+      viewBox="0 0 1024 1024"
+      xmlns="http://www.w3.org/2000/svg"
+      width="64"
+      height="64"
+    >
+      <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" />
+    </svg>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'Hamburger',
+  props: {
+    isActive: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    toggleClick() {
+      this.$emit('toggleClick')
+    }
+  }
+}
+</script>
+
+<style scoped>
+.hamburger {
+  display: inline-block;
+  vertical-align: middle;
+  width: 20px;
+  height: 20px;
+}
+
+.hamburger.is-active {
+  transform: rotate(180deg);
+}
+</style>

+ 12 - 8
src/layout/components/Navbar.vue

@@ -1,14 +1,14 @@
 <template>
   <div class="navbar">
-<!--    <hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />-->
-
-    <breadcrumb class="breadcrumb-container" />
+    <hamburger :is-active="sidebar.opened" id="hamburger-container" class="hamburger-container" @toggleClick="toggleSideBar"/>
 
+    <breadcrumb class="breadcrumb-container"/>
     <div class="right-menu">
+      <div style="margin-right: 10px;margin-bottom: 20px">{{ name }}</div>
       <el-dropdown class="avatar-container" trigger="click">
         <div class="avatar-wrapper">
           <img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar">
-          <i class="el-icon-caret-bottom" />
+          <i class="el-icon-caret-bottom"/>
         </div>
         <el-dropdown-menu slot="dropdown" class="user-dropdown">
           <router-link to="/">
@@ -26,17 +26,20 @@
 </template>
 
 <script>
-import { mapGetters } from 'vuex'
+import {mapGetters} from 'vuex'
 import Breadcrumb from '@/components/Breadcrumb'
+import Hamburger from '@/components/Hamburger'
 
 export default {
   components: {
     Breadcrumb,
+    Hamburger
   },
   computed: {
     ...mapGetters([
       'sidebar',
-      'avatar'
+      'avatar',
+      'name'
     ])
   },
   methods: {
@@ -57,7 +60,7 @@ export default {
   overflow: hidden;
   position: relative;
   background: #fff;
-  box-shadow: 0 1px 4px rgba(0,21,41,.08);
+  box-shadow: 0 1px 4px rgba(0, 21, 41, .08);
 
   .hamburger-container {
     line-height: 46px;
@@ -65,7 +68,7 @@ export default {
     float: left;
     cursor: pointer;
     transition: background .3s;
-    -webkit-tap-highlight-color:transparent;
+    -webkit-tap-highlight-color: transparent;
 
     &:hover {
       background: rgba(0, 0, 0, .025)
@@ -80,6 +83,7 @@ export default {
     float: right;
     height: 100%;
     line-height: 50px;
+    display: flex;
 
     &:focus {
       outline: none;

+ 1 - 1
src/layout/components/Sidebar/index.vue

@@ -7,7 +7,7 @@
         :collapse="isCollapse"
         :background-color="variables.menuBg"
         :text-color="variables.menuText"
-        :unique-opened="false"
+        :unique-opened="true"
         :active-text-color="variables.menuActiveText"
         :collapse-transition="false"
         mode="vertical"

+ 3 - 0
src/store/modules/app.js

@@ -10,6 +10,9 @@ const state = {
 
 const mutations = {
   TOGGLE_SIDEBAR: state => {
+    if (state.sidebar.hide) {
+      return false;
+    }
     state.sidebar.opened = !state.sidebar.opened
     state.sidebar.withoutAnimation = false
     if (state.sidebar.opened) {

+ 446 - 3
src/views/dashboard/index.vue

@@ -1,18 +1,451 @@
 <template>
-  <div class="dashboard-container">
-    <div class="dashboard-text">name: {{ name }}</div>
+  <div class="app-container">
+    <el-row :gutter="10">
+      <el-col :span="6">
+        <el-card class="card">
+          <div style="color: white;">
+            <h2>我的待办事项:{{ todoTaskList }}</h2>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :span="6">
+        <el-card class="card" style="background-color: indianred">
+          <div style="color: white">
+            <h2>我的项目</h2>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :span="6">
+        <el-card class="card" style="background-color:steelblue">
+          <div style="color: white;">
+            <h2>出勤状态:上班</h2>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :span="6">
+        <el-card class="card" style="background-color:goldenrod">
+          <div style="color: white;">
+            <h2>其他事项</h2>
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+
+    <el-row :gutter="20" style="margin-top: 50px">
+      <el-col :span="24">
+        <h3>我的待办列表</h3>
+        <el-table
+          :data="tableData"
+          style="width: 100%" border stripe size="small">
+          <el-table-column type="index" label="序号" width="80" align="center">
+          </el-table-column>
+          <el-table-column
+            prop="name"
+            label="任务名称" align="center"
+            width="180">
+          </el-table-column>
+          <el-table-column
+            prop="hname"
+            label="实施医院" align="center"
+            width="180">
+          </el-table-column>
+          <el-table-column
+            prop="hsytem"
+            label="实施系统" align="center"
+            width="160">
+          </el-table-column>
+          <el-table-column
+            prop="content"
+            label="实施内容" align="center"
+            min-width="250">
+          </el-table-column>
+          <el-table-column
+            prop="taskName"
+            label="当前处理步骤" align="center"
+            width="180">
+          </el-table-column>
+          <el-table-column
+            prop="flowType"
+            label="流程类型" align="center"
+            width="180">
+          </el-table-column>
+          <el-table-column align="center"
+                           prop="createTime"
+                           label="创建时间" width="200">
+          </el-table-column>
+          <el-table-column prop="op" width="200" label="操作" align="center">
+            <template scope="scope">
+              <el-button size="mini" type="success" @click="searchWorkFlow(scope.row)">查阅流程</el-button>
+              <el-button size="mini" type="primary" @click="auditFlow(scope.row)">处理</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <br/>
+        <el-table
+          :data="todoMeetings"
+          border
+          stripe
+          size="mini"
+          style="width: 100%">
+          <el-table-column type="index" label="序号" width="60">
+          </el-table-column>
+          <el-table-column label="会议主题" prop="meetingName">
+          </el-table-column>
+          <el-table-column label="会议类型" prop="meetingType" width="120">
+            <template scope="scope">
+              <!--会议类型(1-周例会,2-项目会议,3-实施会议,4-其他会议)-->
+              <div v-if="scope.row.meetingType===1">周例会</div>
+              <div v-else-if="scope.row.meetingType===2">项目会议</div>
+              <div v-else-if="scope.row.meetingType===3">实施会议</div>
+              <div v-else>其他会议</div>
+            </template>
+          </el-table-column>
+          <el-table-column label="会议地点" prop="meetingPlace" width="120">
+          </el-table-column>
+          <el-table-column prop="status" label="会议状态" width="120">
+            <template scope="scope">
+              <!--会议状态,0待开始,1进行中,2已结束-->
+              <div v-if="scope.row.status===0" style="color: green">待开始</div>
+              <div v-else-if="scope.row.status===1" style="color: #3A71A8">进行中</div>
+              <div v-else>已结束</div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="name" label="会议时间" width="300">
+            <template scope="scope">
+              <div>{{ scope.row.beginTime }}——{{ scope.row.endTime }}</div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="address" label="参会人员">
+            <template scope="scope">
+              <span>{{ scope.row.outAttendees }}</span>
+              <span v-if="scope.row.outAttendees!=''">、</span>
+              <span v-for="(item,index) in JSON.parse(scope.row.innerAttendees) ">
+             <template v-if="index > 0">,</template>
+             <span>{{ item.name }}</span>
+           </span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="createTime" label="创建时间" width="150">
+
+          </el-table-column>
+          <el-table-column label="操作" prop="op" width="150">
+            <template slot-scope="scope">
+              <el-button v-if="scope.row.status===2" type="primary" size="mini" @click="confirmMeeting(scope.row)">
+                结果确认
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+
+      </el-col>
+    </el-row>
+
+    <el-dialog :visible.sync="workFlowVisble" width="75%" title="实施流程明细">
+      <el-steps :active="activeFlow" finish-status="success" align-center>
+        <el-step title="开始"/>
+        <el-step title="项目启动会"/>
+        <el-step title="发货"/>
+        <el-step title="物流签收"/>
+        <el-step title="进入现场"/>
+        <el-step title="设备安装"/>
+        <el-step title="系统调试"/>
+        <el-step title="操作培训"/>
+        <el-step title="现场值守"/>
+        <el-step title="离场"/>
+        <el-step title="实施复盘"/>
+        <el-step title="文件归档"/>
+        <el-step title="结束"/>
+      </el-steps>
+    </el-dialog>
+
+    <!--处理实施工作任务--->
+    <el-dialog title="审批处理" :visible.sync="editEnforceFormVisible" width="45%" @click="closeEnforceDialog">
+      <el-form label-width="120px" :model="enforceForm">
+        <el-descriptions title="" :column="2" border>
+          <el-descriptions-item>
+            <template slot="label">
+              项目名称
+            </template>
+            {{ enforceFlow.name }}
+          </el-descriptions-item>
+          <el-descriptions-item>
+            <template slot="label">
+              项目总负责人
+            </template>
+            {{ enforceFlow.enforcer }}
+          </el-descriptions-item>
+          <el-descriptions-item>
+            <template slot="label">
+              实施医院
+            </template>
+            {{ enforceFlow.hno }}
+          </el-descriptions-item>
+          <el-descriptions-item>
+            <template slot="label">
+              实施系统
+            </template>
+            {{ enforceFlow.hsytem }}
+          </el-descriptions-item>
+          <el-descriptions-item>
+            <template slot="label">
+              实施时间
+            </template>
+            {{ enforceFlow.time }}
+          </el-descriptions-item>
+          <el-descriptions-item>
+            <template slot="label">
+              实施状态
+            </template>
+            <span style="color: darkred" v-if="enforceFlow.status===0">待开始</span>
+            <span style="color: green" v-else-if="enforceFlow.status===1">进行中</span>
+            <span style="color: darkblue" v-else="enforceFlow.status===2">已结束</span>
+          </el-descriptions-item>
+          <el-descriptions-item :span="2">
+            <template slot="label">
+              当前任务
+            </template>
+            {{ enforceFlow.flowType }}
+          </el-descriptions-item>
+          <el-descriptions-item :span="2">
+            <template slot="label">
+              实施内容
+            </template>
+            {{ enforceFlow.content }}
+          </el-descriptions-item>
+          <el-descriptions-item :span="2">
+            <template slot="label">
+              下个步骤负责人
+            </template>
+            <el-input size="small" v-model="enforceForm.director" :disabled="true" @keyup.enter.native="openUsers()">
+              <el-button @click="openUsers" icon="el-icon-search" slot="append"></el-button>
+            </el-input>
+          </el-descriptions-item>
+          <el-descriptions-item :span="2">
+            <template slot="label">
+              备注说明
+            </template>
+            <el-input size="small" v-model="enforceForm.remark" type="textarea" :rows="4"></el-input>
+          </el-descriptions-item>
+
+          <el-descriptions-item :span="2">
+            <template slot="label">
+              文件列表
+            </template>
+            <el-upload
+              ref="upload"
+              :action="fileAction"
+              :on-remove="handleRemove"
+              :on-success="handleSuccess"
+              :on-error="handleError"
+              name="file">
+              <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
+            </el-upload>
+          </el-descriptions-item>
+
+        </el-descriptions>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button size="small" @click="closeEnforceDialog">取消</el-button>
+        <el-button size="small" type="primary" class="title" @click="submitEnforceForm('editForm')">确定处理</el-button>
+      </div>
+    </el-dialog>
+
+
+    <el-dialog title="选择人员" :visible.sync="usersVisble" width="30%" @click="closeUserDialog">
+      <el-tree
+        ref="dept"
+        :data="userList"
+        node-key="id"
+        :props="{label:'name'}" default-expand-all="true">
+      </el-tree>
+      <div slot="footer" class="dialog-footer">
+        <el-button size="small" @click="closeUserDialog">取消</el-button>
+        <el-button size="small" type="primary" class="title" @click="submitUserForm('editForm')">确定</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { mapGetters } from 'vuex'
+import {mapGetters} from 'vuex'
+import Pagination from '@/components/Page/Pagination'
+import {completeTask, getPersonalTaskList} from '@/api/meeting/enforce'
+import {confirmMeetings, getTodoMeetings} from '@/api/meeting/meeting'
+import {getDeptUserTree} from '@/api/system/user'
+import {deleteFile, uploadFileUrl} from '@/api/file/file'
 
 export default {
   name: 'Dashboard',
+  components: {
+    Pagination
+  },
   computed: {
     ...mapGetters([
       'name'
     ])
+  },
+  data() {
+    return {
+      usersVisble: false,
+      userList: [],
+      pageparm: {
+        current: 1,
+        size: 10,
+        total: 0
+      },
+      tableData: [],
+      todoMeetings: [],
+      auditWin: false,
+      formData: {},
+      workFlowVisble: false,
+      activeFlow: 0,
+      todoTaskList: 0,
+      editEnforceFormVisible: false,
+      enforceForm: {
+        id: null,
+        enforceId: null,
+        director: null,
+        directorId: null,
+        remark: null,
+        taskId: null,
+        currentStep: null,
+        filess: []
+      },
+      enforceFlow: {
+        name: '',
+        enforcer: '',
+        time: null,
+        hno: null,
+        hsytem: null,
+        content: '',
+        status: 0,
+        flowType: null
+      },
+      fileAction: ''
+    }
+  },
+  mounted() {
+    this.getTaskList();
+    this.getTodoMeetingList();
+    this.getDeptUserTrees();
+    this.fileAction = uploadFileUrl()
+  },
+  methods: {
+    getDeptUserTrees() {
+      getDeptUserTree('').then(res => {
+        this.userList = res.data
+      });
+    },
+    // 分页插件事件
+    callFather(parm) {
+      this.formInline.current = parm.current
+      this.formInline.size = parm.size
+
+    },
+    getTaskList() {
+      getPersonalTaskList().then(res => {
+        this.tableData = res.data
+        this.todoTaskList = this.tableData.length
+      })
+    },
+    getTodoMeetingList() {
+      getTodoMeetings().then(res => {
+        this.todoMeetings = res.data
+      })
+    },
+    searchWorkFlow(row) {
+      this.workFlowVisble = true
+      this.activeFlow = row.step
+    },
+    closeEnforceDialog() {
+      this.editEnforceFormVisible = false
+    },
+    auditFlow(row) {
+      this.enforceFlow.name = row.name
+      this.enforceFlow.enforcer = row.enforcer
+      this.enforceFlow.hno = row.hname
+      this.enforceFlow.hsytem = row.hsytem
+      this.enforceFlow.content = row.content
+      this.enforceFlow.time = row.beginTime + "至" + row.endTime
+      this.enforceFlow.status = row.status
+      this.enforceFlow.flowType = row.taskName
+      this.enforceForm.taskId = row.taskId
+      this.enforceForm.currentStep = row.step
+      this.enforceForm.enforceId = row.id
+      this.editEnforceFormVisible = true
+    },
+    openUsers() {
+      this.usersVisble = true
+    },
+    submitUserForm() {
+      //获取选中的节点
+      let node = this.$refs.dept.getCurrentNode();
+      if (node == undefined || node == null) {
+        this.$message({
+          message: '请选择数据!',
+          type: 'warning'
+        });
+        return;
+      }
+      if (node.type !== 'u') {
+        this.$message({
+          message: '请选择人员!',
+          type: 'warning'
+        });
+        return;
+      }
+      this.enforceForm.director = node.name
+      this.enforceForm.directorId = node.id
+      this.closeUserDialog();
+    },
+    closeUserDialog() {
+      this.usersVisble = false
+    },
+    handleRemove(file, fileList) {
+      let url = file.response.data.url;
+      deleteFile(url).then(res => {
+        this.$message({
+          message: '操作成功!',
+          type: 'success'
+        });
+      });
+      this.enforceForm.filess.splice(url);
+    },
+    handleSuccess(response, file, fileList) {
+      let fileUrl = response.data.url
+      this.enforceForm.filess.push(fileUrl)
+    },
+    handleError() {
+      this.$message({
+        message: '上传失败,请稍候再试!',
+        type: 'warning'
+      });
+    },
+    submitEnforceForm() {
+      let data = this.enforceForm;
+
+      completeTask(data).then(res => {
+        this.$message({
+          message: '操作成功!',
+          type: 'success'
+        });
+        this.closeEnforceDialog();
+        this.getTaskList();
+      });
+
+    },
+    confirmMeeting(row) {
+      let id = row.id;
+      confirmMeetings(id).then(res => {
+        this.$message({
+          message: '操作成功!',
+          type: 'success'
+        });
+        this.getData(this.formInline);
+      });
+
+    },
   }
 }
 </script>
@@ -22,9 +455,19 @@ export default {
   &-container {
     margin: 30px;
   }
+
   &-text {
     font-size: 30px;
     line-height: 46px;
   }
 }
+
+.card {
+  width: 300px;
+  height: 150px;
+  background-color: #1ab394;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
 </style>