ソースを参照

审批 & 消息

zhengnaiwen_citu 5 ヶ月 前
コミット
85133cbf97

+ 2 - 1
src/components/AutoComponents/MDialog/index.vue

@@ -13,7 +13,8 @@
     <slot></slot>
     <span slot="footer" v-if="!hideFooter">
       <m-button @click="show = false">{{ option?.textCancel ?? '取 消'}}</m-button>
-      <m-button type="orange" @click="sure">{{ option?.textSure ?? '确 定'}}</m-button>
+      <m-button :type="option?.colorSure ?? 'orange'" @click="sure">{{ option?.textSure ?? '确 定'}}</m-button>
+      <slot name="button-after"></slot>
     </span>
   </el-dialog>
 </template>

+ 15 - 2
src/layout/components/LayoutNotification.vue

@@ -1,5 +1,6 @@
 <template>
   <el-popover
+    v-model="visible"
     placement="bottom"
     width="400"
     trigger="click"
@@ -33,8 +34,10 @@
       </div>
       <div
         class="message"
+        :class="{ hidden: loading }"
         v-loading="loading"
         v-infinite-scroll="onLoadMessage"
+        :infinite-scroll-distance="30"
         :infinite-scroll-disabled="total <= items.length"
       >
         <div>
@@ -50,7 +53,7 @@
             </div>
           </div>
         </div>
-        <div v-if="items.length < total">
+        <div v-if="items.length < total" class="text-center pa-3">
           <span class="el-icon-loading"></span>
         </div>
         <m-divider v-if="items.length > 0 && items.length >= total">没有更多了</m-divider>
@@ -76,6 +79,7 @@ export default {
   name: 'LayoutNotification',
   data () {
     return {
+      visible: false,
       menuActive: 0,
       menuList: [
         { text: '全部消息', icon: 'mdi mdi-email-outline', readState: null },
@@ -119,6 +123,7 @@ export default {
       this.onOpen()
     },
     onLoadMessage () {
+      console.log('onLoadMessage')
       this.pageInfo.current++
       this.onInit()
     },
@@ -170,7 +175,12 @@ export default {
       }
     },
     onTo (item) {
-      this.$message('开发中,敬请期待')
+      if (!item?.tag?.route) {
+        this.$message.error('无效的地址')
+        return
+      }
+      this.$router.push(item.tag.route)
+      this.visible = false
     },
     async onDelete ({ messageId }, index) {
       try {
@@ -250,6 +260,9 @@ export default {
   max-height: 600px;
   min-height: 400px;
   overflow: auto;
+  &.hidden {
+    overflow: hidden;
+  }
   &-box {
     &.disabled {
       opacity: .5;

+ 1 - 0
src/store/getters.js

@@ -8,6 +8,7 @@ const getters = {
   routes: state => state.menu.routes,
   refresh: state => state.menu.refresh,
   permission: state => state.menu.permission,
+  workOrder: state => state.menu.workOrder,
 
   lang: state => state.system.lang,
   systemInfo: state => state.system.systemInfo,

+ 26 - 4
src/store/modules/menu.js

@@ -4,7 +4,8 @@ import { getMenu2, saveMenu, saveMenuAll, deleteMenu } from '@/api/menu'
 const state = {
   refresh: true, // 更新路由
   routes: [],
-  permission: []
+  permission: [],
+  workOrder: {}
 }
 
 const mutations = {
@@ -13,11 +14,30 @@ const mutations = {
   },
   SET_ROUTES (state, routes) {
     state.routes = routes
-    // setRoles(routes)
   },
   SET_PERMISSION (state, permission) {
     state.permission = permission
-    // setPermission(permission)
+  },
+  SET_WORD_ORDER (state, menu) {
+    state.workOrder = getList(menu).reduce((res, item) => {
+      res[item.work] = item.path
+      return res
+    }, {})
+
+    function getList (menus, arr = []) {
+      for (const menu of menus) {
+        if (menu.hidden === 1 && menu.meta.work && menu.meta.work !== 0) {
+          arr.push({
+            work: menu.meta.work,
+            path: menu.path
+          })
+        }
+        if (menu.children && menu.children.length > 0) {
+          getList(menu.children, arr)
+        }
+      }
+      return arr
+    }
   }
 }
 
@@ -71,10 +91,12 @@ const actions = {
         if (!response.data) {
           return resolve()
         }
-        commit('SET_ROUTES', JSON.parse(JSON.stringify(response.data.routes)))
+        const menu = JSON.parse(JSON.stringify(response.data.routes))
+        commit('SET_ROUTES', menu)
         commit('SET_PERMISSION', response.data.permission)
         // 路由重新配置触发更新
         commit('SET_REFRESH', true)
+        commit('SET_WORD_ORDER', menu)
         resolve(response.data.routes)
       }).catch(reject)
     })

+ 7 - 1
src/utils/request.js

@@ -8,6 +8,7 @@ import {
 import route from '@/router'
 import qs from 'qs'
 import Vue from 'vue'
+import store from '@/store'
 // create an axios instance
 const service = axios.create({
   baseURL: process.env.VUE_APP_BASE_API,
@@ -87,7 +88,12 @@ service.interceptors.response.use(
       // 审批拦截
       try {
         await Vue.prototype.$confirm('当前操作需要执行审批流程,是否继续', '提示')
-        await instanceWorkflow(res.data)
+        const obj = store.getters.workOrder
+        await instanceWorkflow({
+          ...res.data,
+          createUserPageRoute: obj[2] ?? '/',
+          approvePageRoute: obj[1] ?? '/'
+        })
         const str = '已发起工作流,请等待审批'
         return Promise.reject(str)
       } catch (error) {

+ 1 - 1
src/views/bonus/approve/approveDetails.vue

@@ -31,7 +31,7 @@
 
       </div>
     </div>
-    <BonusTable ref="bonusTableRefs" :filter-header="filterHeader" :show-summary="true" shadow="never"></BonusTable>
+    <BonusTable ref="bonusTableRefs" clearHeader :filter-header="filterHeader" :show-summary="true" shadow="never"></BonusTable>
   </m-dialog>
 </template>
 

+ 0 - 1
src/views/humanResources/organizationStructure/index.vue

@@ -118,7 +118,6 @@ export default {
         data.collapsed = !data.collapsed
         this.graph.setOption(this.option)
       })
-      console.log(this.graph.getZr)
       // 关闭
       this.graph._zr && this.graph._zr.on('click', (event) => {
         if (event.target?.type !== 'tspan') {

+ 4 - 2
src/views/system/menu/index.vue

@@ -98,7 +98,8 @@ export default {
         sort: 0,
         hidden: 1,
         keepAlive: true,
-        panorama: false
+        panorama: false,
+        work: 0
       }, this.items, null)
     },
     async onEdit ({ id }) {
@@ -120,7 +121,8 @@ export default {
           hidden: data.hidden,
           window: meta?.window ?? false,
           keepAlive: meta?.keepAlive ?? false,
-          panorama: meta?.panorama ?? false
+          panorama: meta?.panorama ?? false,
+          work: meta?.work ?? 0
         }, this.items, data.id)
       } catch (error) {
         this.$message.error(error)

+ 14 - 1
src/views/system/menu/menuEdit.vue

@@ -175,6 +175,19 @@ export default {
               { text: '不加入', label: false }
             ]
           }
+        },
+        {
+          label: '工单路由',
+          prop: 'work',
+          type: 'radioGroup',
+          hidden: [MENU_TYPE.DIRECTORY, MENU_TYPE.BUTTON, MENU_TYPE.COMPONENT].includes(type),
+          options: {
+            items: [
+              { text: '关闭', label: 0 },
+              { text: '代办工单', label: 1 },
+              { text: '我的工单', label: 2 }
+            ]
+          }
         }
       ]
     }
@@ -197,7 +210,7 @@ export default {
         if (!valid) {
           return
         }
-        const metaProp = ['keepAlive', 'window', 'panorama']
+        const metaProp = ['keepAlive', 'window', 'panorama', 'work']
         const obj = this.editForm.reduce((res, item) => {
           if (item.hidden) {
             return res

+ 3 - 2
src/views/workOrder/approval/approvalReject.vue

@@ -1,6 +1,6 @@
 <template>
-  <m-dialog title="拒绝理由" ref="dialog" @sure="onSure">
-    <el-input v-model="approveRejectText" type="textarea" :rows="3" placeholder="请输入拒绝原因"></el-input>
+  <m-dialog title="拒绝理由" ref="dialog" @sure="onSure" width="400px">
+    <el-input v-model="approveRejectText" type="textarea" :rows="8" placeholder="请输入拒绝原因"></el-input>
   </m-dialog>
 </template>
 
@@ -19,6 +19,7 @@ export default {
   methods: {
     open (item) {
       this.workFlowInstanceId = item.workFlowInstanceId
+      this.approveRejectText = null
       this.$refs.dialog.open()
     },
     async onSure () {

+ 32 - 12
src/views/workOrder/approval/index.vue

@@ -2,16 +2,23 @@
   <div>
     <IndexPage ref="indexPageRefs" :dataType="3">
       <template #actions="{ row }">
+        <m-button type="primary" text @click="onDetails(row)">查看申请单</m-button>
         <m-button  type="primary" text @click="onApproval(row.workFlowInstanceId)">通过审核</m-button>
         <m-button type="danger" text @click="onApprovalReject(row)">拒绝通过</m-button>
       </template>
     </IndexPage>
     <ApprovalReject ref="approvalRejectRefs" @refresh="onRefresh"></ApprovalReject>
+    <ApprovalDetails ref="approvalDetailsRefs" :option="{ textSure: '通过', colorSure: 'success'}" @sure="onApproval(itemData.workFlowInstanceId)">
+      <template #button-after="{ item }">
+        <m-button type="danger" @click="onApprovalReject(item)">拒绝</m-button>
+      </template>
+    </ApprovalDetails>
   </div>
 </template>
 
 <script>
 import IndexPage from '../components/IndexPage.vue'
+import ApprovalDetails from '../components/ApprovalDetails.vue'
 import ApprovalReject from './approvalReject.vue'
 
 import {
@@ -21,23 +28,36 @@ export default {
   name: 'ApprovalPage',
   components: {
     IndexPage,
-    ApprovalReject
+    ApprovalReject,
+    ApprovalDetails
+  },
+  data () {
+    return {
+      itemData: {}
+    }
   },
   methods: {
     onRefresh () {
+      this.$refs.approvalDetailsRefs.close()
       this.$refs.indexPageRefs.onInit()
     },
-    async onApproval (workFlowInstanceId, status) {
-      try {
-        await setApproval({
-          workFlowInstanceId: workFlowInstanceId,
-          status: 1
-        })
-        this.$message.success('审批通过')
-        this.$refs.indexPageRefs.onInit()
-      } catch (error) {
-        this.$message.error(error)
-      }
+    onDetails (item) {
+      this.itemData = item
+      this.$refs.approvalDetailsRefs.open(item)
+    },
+    onApproval (workFlowInstanceId, status) {
+      this.$confirm('确定审批通过吗?', '提示').then(async _ => {
+        try {
+          await setApproval({
+            workFlowInstanceId: workFlowInstanceId,
+            status: 1
+          })
+          this.$message.success('审批通过')
+          this.$refs.indexPageRefs.onInit()
+        } catch (error) {
+          this.$message.error(error)
+        }
+      }).catch(_ => {})
     },
     onApprovalReject (item) {
       this.$refs.approvalRejectRefs.open(item)

+ 16 - 2
src/views/workOrder/approvalAlready/index.vue

@@ -1,13 +1,27 @@
 <template>
-  <IndexPage ref="indexPageRefs" :dataType="2"></IndexPage>
+  <div>
+    <IndexPage ref="indexPageRefs" :dataType="2">
+      <template #actions="{ row }">
+        <m-button type="primary" text @click="onDetails(row)">查看申请单</m-button>
+      </template>
+    </IndexPage>
+    <ApprovalDetails ref="approvalDetailsRefs"></ApprovalDetails>
+  </div>
 </template>
 
 <script>
+import ApprovalDetails from '../components/ApprovalDetails.vue'
 import IndexPage from '../components/IndexPage.vue'
 export default {
   name: 'approvalAlready',
   components: {
-    IndexPage
+    IndexPage,
+    ApprovalDetails
+  },
+  methods: {
+    onDetails (item) {
+      this.$refs.approvalDetailsRefs.open(item)
+    }
   }
 }
 </script>

+ 7 - 2
src/views/workOrder/components/ApprovalDetails.vue

@@ -1,5 +1,5 @@
 <template>
-  <m-dialog ref="dialog" title="申请单">
+  <m-dialog ref="dialog" title="申请单" v-bind="$attrs" v-on="$listeners">
     <el-form label-width="120px">
       <el-form-item label="审批功能名称">
         <el-tag type="default">{{ itemData.title }}</el-tag>
@@ -19,7 +19,9 @@
         </el-descriptions>
       </el-form-item>
     </el-form>
-
+    <template #button-after>
+      <slot name="button-after" :item="itemData"></slot>
+    </template>
   </m-dialog>
 </template>
 
@@ -38,6 +40,9 @@ export default {
     }
   },
   methods: {
+    close () {
+      this.$refs.dialog.close()
+    },
     async open (item) {
       this.itemData = item
       this.$refs.dialog.open()

+ 2 - 1
src/views/workOrder/components/ApprovalProgress.vue

@@ -1,6 +1,6 @@
 <template>
   <m-dialog ref="dialog" title="审批明细">
-    <el-steps align-center finish-status="success" v-loading="loading">
+    <el-steps align-center finish-status="success" v-loading="loading" :space="800 / items.length">
       <el-step
         v-for="(item) in items"
         :key="item.id"
@@ -32,6 +32,7 @@ export default {
   methods: {
     async open (workFlowInstanceId) {
       this.$refs.dialog.open()
+      this.items = []
       this.loading = true
       try {
         const { data } = await getApprovalProgress({ workFlowInstanceId })

+ 1 - 5
src/views/workOrder/components/IndexPage.vue

@@ -15,12 +15,10 @@
       </template>
       <template #actions="{ row }">
         <m-button type="primary" text @click="onProcess(row)">审批进度</m-button>
-        <m-button type="primary" text @click="onDetails(row)">申请单</m-button>
         <slot name="actions" :row="row"></slot>
       </template>
     </m-table>
     <ApprovalProgress ref="approvalProgressRefs"></ApprovalProgress>
-    <ApprovalDetails ref="approvalDetailsRefs"></ApprovalDetails>
   </div>
 </template>
 
@@ -29,12 +27,10 @@ import {
   getApprovalList
 } from '@/api/approval'
 import ApprovalProgress from './ApprovalProgress'
-import ApprovalDetails from './ApprovalDetails'
 export default {
   name: 'IndexPage',
   components: {
-    ApprovalProgress,
-    ApprovalDetails
+    ApprovalProgress
   },
   props: {
     dataType: {

+ 15 - 6
src/views/workOrder/myOrder/index.vue

@@ -1,22 +1,31 @@
 <template>
-  <IndexPage ref="indexPageRefs" :dataType="1">
-    <template #actions="{ row }">
-      <m-button text type="danger" @click="onUrgent(row)">加急</m-button>
-    </template>
-  </IndexPage>
+  <div>
+    <IndexPage ref="indexPageRefs" :dataType="1">
+      <template #actions="{ row }">
+        <m-button type="primary" text @click="onDetails(row)">查看申请单</m-button>
+        <m-button text type="danger" @click="onUrgent(row)">加急</m-button>
+      </template>
+    </IndexPage>
+    <ApprovalDetails ref="approvalDetailsRefs"></ApprovalDetails>
+  </div>
 </template>
 
 <script>
 import IndexPage from '../components/IndexPage.vue'
+import ApprovalDetails from '../components/ApprovalDetails.vue'
 import {
   getApprovalUrge
 } from '@/api/approval'
 export default {
   name: 'myOrder',
   components: {
-    IndexPage
+    IndexPage,
+    ApprovalDetails
   },
   methods: {
+    onDetails (item) {
+      this.$refs.approvalDetailsRefs.open(item)
+    },
     async onUrgent ({ workFlowInstanceId }) {
       try {
         await getApprovalUrge({ workFlowInstanceId })